summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOle Loots <ole@monochrom.net>2014-09-12 23:22:26 +0200
committerOle Loots <ole@monochrom.net>2014-09-12 23:22:26 +0200
commita9ac9c00fc2c73705db242a459160f14d279cdcd (patch)
tree5f9aa630340bad67934e6fdbfda7f239f0fade57
parent181bc41a9aa200cfac5bf4b84175003639fce488 (diff)
parent9e6b0fb8b07cd3147b0a2727d3644860cf7c8c7e (diff)
downloadnetsurf-a9ac9c00fc2c73705db242a459160f14d279cdcd.tar.gz
netsurf-a9ac9c00fc2c73705db242a459160f14d279cdcd.tar.bz2
Merge branch 'master' of git://git.netsurf-browser.org/netsurf
Conflicts: atari/gui.h
-rw-r--r--[-rwxr-xr-x]!NetSurf/Resources/ca-bundle469
-rw-r--r--!NetSurf/Resources/en/licence.html,faf34
-rw-r--r--!NetSurf/Resources/it/licence.html,faf37
-rw-r--r--.gitignore1
-rw-r--r--Docs/BUILDING-AmigaCross4
-rw-r--r--Docs/BUILDING-AmigaOS54
-rw-r--r--Docs/BUILDING-BeOS4
-rw-r--r--Docs/BUILDING-Framebuffer225
-rw-r--r--Docs/BUILDING-GTK187
-rw-r--r--Docs/BUILDING-Monkey104
-rw-r--r--Docs/BUILDING-RISC_OS121
-rw-r--r--Docs/BUILDING-ROCross2
-rw-r--r--Docs/Doxyfile13
-rw-r--r--Docs/QUICK-START72
-rw-r--r--Docs/env.sh114
-rw-r--r--Docs/source-object-backing-store204
-rw-r--r--Makefile121
-rw-r--r--Makefile.config.example7
-rw-r--r--Makefile.defaults18
-rw-r--r--README3
-rw-r--r--amiga/Makefile.defaults79
-rw-r--r--amiga/Makefile.target16
-rw-r--r--[-rwxr-xr-x]amiga/agclass/amigaguide_class.c167
-rwxr-xr-xamiga/agclass/amigaguide_class.h7
-rw-r--r--amiga/arexx.c27
-rw-r--r--amiga/bitmap.c6
-rwxr-xr-xamiga/bitmap.h1
-rw-r--r--amiga/clipboard.c50
-rwxr-xr-xamiga/clipboard.h5
-rw-r--r--amiga/context_menu.c101
-rwxr-xr-xamiga/context_menu.h3
-rwxr-xr-xamiga/dist/Install339
-rwxr-xr-xamiga/dist/NetSurf.guide11
-rwxr-xr-xamiga/dist/netsurf.readme14
-rw-r--r--amiga/download.c76
-rwxr-xr-xamiga/download.h5
-rw-r--r--amiga/drag.c15
-rw-r--r--amiga/drag.h3
-rw-r--r--amiga/dt_anim.c14
-rw-r--r--amiga/dt_picture.c8
-rw-r--r--amiga/dt_sound.c4
-rw-r--r--amiga/file.c41
-rw-r--r--amiga/filetype.c37
-rw-r--r--amiga/filetype.h3
-rwxr-xr-xamiga/font.c73
-rw-r--r--amiga/font_scan.c6
-rwxr-xr-xamiga/font_scan.h2
-rw-r--r--amiga/gui.c1477
-rwxr-xr-xamiga/gui.h12
-rwxr-xr-xamiga/gui_options.c89
-rwxr-xr-xamiga/gui_options.h7
-rwxr-xr-xamiga/help.c21
-rwxr-xr-xamiga/help.h6
-rwxr-xr-xamiga/history_local.c21
-rw-r--r--amiga/icon.c16
-rw-r--r--amiga/iff_dr2d.c14
-rwxr-xr-xamiga/launch.c26
-rwxr-xr-xamiga/launch.h3
-rwxr-xr-xamiga/login.c4
-rwxr-xr-xamiga/login.h4
-rw-r--r--amiga/menu.c168
-rwxr-xr-xamiga/misc.c319
-rw-r--r--amiga/misc.h5
-rw-r--r--amiga/options.h3
-rwxr-xr-xamiga/plotters.c552
-rwxr-xr-xamiga/plotters.h7
-rw-r--r--amiga/plugin_hack.c2
-rw-r--r--amiga/plugin_hack.h2
-rw-r--r--amiga/print.c9
-rw-r--r--amiga/resources/Resource.map2
-rw-r--r--amiga/resources/Themes/AISS/Resource.map1
-rwxr-xr-xamiga/schedule.c220
-rwxr-xr-xamiga/schedule.h38
-rwxr-xr-xamiga/search.c24
-rwxr-xr-xamiga/search.h4
-rw-r--r--amiga/sslcert.h5
-rwxr-xr-xamiga/stringview/stringview.c1
-rw-r--r--amiga/theme.c113
-rw-r--r--amiga/theme.h7
-rwxr-xr-xamiga/thumbnail.c3
-rw-r--r--amiga/tree.c22
-rwxr-xr-xamiga/utf8.c71
-rwxr-xr-xamiga/utf8.h7
-rw-r--r--amiga/version.c9
-rw-r--r--atari/Makefile.defaults79
-rw-r--r--atari/Makefile.target8
-rw-r--r--atari/about.c21
-rw-r--r--atari/certview.c568
-rw-r--r--atari/clipboard.c130
-rw-r--r--atari/cookies.c55
-rw-r--r--atari/ctxmenu.c493
-rw-r--r--atari/deskmenu.c637
-rwxr-xr-xatari/download.c414
-rwxr-xr-xatari/download.h2
-rw-r--r--atari/encoding.c22
-rw-r--r--atari/encoding.h47
-rwxr-xr-xatari/filetype.c121
-rw-r--r--atari/filetype.h (renamed from framebuffer/login.c)13
-rwxr-xr-xatari/findfile.c53
-rwxr-xr-xatari/findfile.h3
-rw-r--r--atari/gemtk/guiwin.c6
-rw-r--r--atari/gemtk/objc.c3
-rw-r--r--atari/gemtk/utils.c33
-rw-r--r--atari/gui.c298
-rwxr-xr-xatari/gui.h9
-rw-r--r--atari/history.c45
-rw-r--r--atari/hotlist.c42
-rw-r--r--atari/hotlist.h7
-rwxr-xr-xatari/login.c4
-rwxr-xr-xatari/misc.c512
-rw-r--r--atari/osspec.c227
-rwxr-xr-xatari/plot/font_freetype.c1
-rw-r--r--atari/plot/font_internal.c2
-rwxr-xr-xatari/plot/font_vdi.c460
-rwxr-xr-xatari/plot/plot.c21
-rwxr-xr-xatari/rootwin.c41
-rwxr-xr-xatari/rootwin.h2
-rwxr-xr-xatari/schedule.c126
-rwxr-xr-xatari/schedule.h28
-rw-r--r--atari/search.c414
-rw-r--r--atari/search.h3
-rw-r--r--atari/settings.c10
-rwxr-xr-xatari/statusbar.c426
-rw-r--r--atari/toolbar.c619
-rw-r--r--atari/toolbar.h3
-rw-r--r--atari/treeview.c39
-rwxr-xr-xatari/verify_ssl.c541
-rw-r--r--beos/Makefile.defaults42
-rw-r--r--beos/Makefile.target64
-rw-r--r--beos/about.cpp114
-rw-r--r--beos/download.cpp20
-rw-r--r--beos/download.h1
-rw-r--r--beos/fetch_rsrc.cpp28
-rw-r--r--beos/filetype.cpp6
-rw-r--r--beos/filetype.h1
-rw-r--r--beos/font.cpp1
-rw-r--r--beos/gui.cpp527
-rw-r--r--beos/gui.h8
-rw-r--r--beos/gui_options.cpp1
-rw-r--r--beos/login.cpp2
-rw-r--r--beos/plotters.cpp1
-rw-r--r--beos/res.h12
-rw-r--r--beos/res.rdef249
l---------beos/res/credits.html1
l---------beos/res/de/welcome.html1
l---------beos/res/en1
l---------beos/res/en/credits.html (renamed from gtk/res/C/credits.html)0
l---------beos/res/en/licence.html (renamed from gtk/res/C/licence.html)0
l---------beos/res/en/welcome.html (renamed from gtk/res/C/welcome.html)0
l---------beos/res/favicon.png1
l---------beos/res/icons (renamed from beos/res/Icons)0
l---------beos/res/it/credits.html1
l---------beos/res/it/licence.html1
l---------beos/res/it/welcome.html1
l---------beos/res/ja/welcome.html1
l---------beos/res/licence.html1
l---------beos/res/welcome.html1
-rw-r--r--beos/scaffolding.cpp396
-rw-r--r--beos/scaffolding.h10
-rw-r--r--beos/schedule.cpp28
-rw-r--r--beos/schedule.h7
-rw-r--r--beos/window.cpp169
-rw-r--r--beos/window.h8
-rw-r--r--cocoa/BookmarksController.m8
-rw-r--r--cocoa/BrowserView.m47
-rw-r--r--cocoa/BrowserViewController.m44
-rw-r--r--cocoa/BrowserWindowController.m7
-rw-r--r--cocoa/DownloadWindowController.h2
-rw-r--r--cocoa/DownloadWindowController.m19
-rw-r--r--cocoa/FormSelectMenu.m4
-rw-r--r--cocoa/HistoryView.m17
-rw-r--r--cocoa/Makefile.defaults65
-rw-r--r--cocoa/Makefile.target77
-rw-r--r--cocoa/NetSurfAppDelegate.m14
-rw-r--r--cocoa/NetsurfApp.m25
-rw-r--r--cocoa/PreferencesWindowController.m1
-rw-r--r--cocoa/SearchWindowController.h2
-rw-r--r--cocoa/SearchWindowController.m10
-rw-r--r--cocoa/apple_image.m11
-rw-r--r--cocoa/fetch.h19
-rw-r--r--cocoa/fetch.m34
-rw-r--r--cocoa/gui.h4
-rw-r--r--cocoa/gui.m169
-rw-r--r--cocoa/schedule.h19
-rw-r--r--cocoa/schedule.m22
-rw-r--r--cocoa/selection.h19
-rw-r--r--cocoa/selection.m21
-rw-r--r--cocoa/url.m34
-rw-r--r--cocoa/utf8.m41
-rw-r--r--cocoa/utils.m13
-rw-r--r--content/Makefile9
-rw-r--r--content/backing_store.h100
-rw-r--r--content/content.c26
-rw-r--r--content/content.h28
-rw-r--r--content/content_protected.h8
-rw-r--r--content/content_type.h3
-rw-r--r--content/dirlist.c9
-rw-r--r--content/dirlist.h2
-rw-r--r--content/fetch.c838
-rw-r--r--content/fetch.h147
-rw-r--r--content/fetchers.h152
-rw-r--r--content/fetchers/Makefile2
-rw-r--r--content/fetchers/about.c43
-rw-r--r--content/fetchers/about.h2
-rw-r--r--content/fetchers/curl.c169
-rw-r--r--content/fetchers/data.c34
-rw-r--r--content/fetchers/data.h2
-rw-r--r--content/fetchers/file.c231
-rw-r--r--content/fetchers/file.h2
-rw-r--r--content/fetchers/resource.c49
-rw-r--r--content/fetchers/resource.h2
-rw-r--r--content/fs_backing_store.c1256
-rw-r--r--content/hlcache.c866
-rw-r--r--content/hlcache.h47
-rw-r--r--content/llcache.c1551
-rw-r--r--content/llcache.h107
-rw-r--r--content/mimesniff.c6
-rw-r--r--content/no_backing_store.c68
-rw-r--r--content/urldb.c20
-rw-r--r--content/urldb.h3
-rw-r--r--css/css.c46
-rw-r--r--css/dump.c29
-rw-r--r--css/select.c18
-rw-r--r--desktop/Makefile6
-rw-r--r--desktop/browser.c607
-rw-r--r--desktop/browser.h205
-rw-r--r--desktop/browser_history.c (renamed from desktop/local_history.c)845
-rw-r--r--desktop/browser_history.h141
-rw-r--r--desktop/browser_private.h17
-rw-r--r--desktop/cookie_manager.c10
-rw-r--r--desktop/cookie_manager.h4
-rw-r--r--desktop/download.c34
-rw-r--r--desktop/download.h11
-rw-r--r--desktop/frames.c14
-rw-r--r--desktop/global_history.c40
-rw-r--r--desktop/global_history.h4
-rw-r--r--desktop/gui.h604
-rw-r--r--desktop/gui_factory.c705
-rw-r--r--desktop/gui_factory.h (renamed from render/list.h)27
-rw-r--r--desktop/hotlist.c33
-rw-r--r--desktop/hotlist.h4
-rw-r--r--desktop/knockout.c7
-rw-r--r--desktop/local_history.h131
-rw-r--r--desktop/mouse.h17
-rw-r--r--desktop/netsurf.c143
-rw-r--r--desktop/netsurf.h30
-rw-r--r--desktop/options.h2
-rw-r--r--desktop/plotters.h5
-rw-r--r--desktop/save_complete.c109
-rw-r--r--desktop/save_text.c16
-rw-r--r--desktop/scrollbar.c7
-rw-r--r--desktop/search.c64
-rw-r--r--desktop/search.h56
-rw-r--r--desktop/searchweb.c703
-rw-r--r--desktop/searchweb.h112
-rw-r--r--desktop/selection.c10
-rw-r--r--desktop/sslcert_viewer.c27
-rw-r--r--desktop/sslcert_viewer.h1
-rw-r--r--desktop/system_colour.c36
-rw-r--r--desktop/system_colour.h (renamed from desktop/401login.h)25
-rw-r--r--desktop/textarea.c85
-rw-r--r--desktop/textarea.h7
-rw-r--r--desktop/textinput.c9
-rw-r--r--desktop/tree.c16
-rw-r--r--desktop/tree.h13
-rw-r--r--desktop/treeview.c209
-rw-r--r--desktop/treeview.h12
-rw-r--r--desktop/version.c6
-rw-r--r--framebuffer/Makefile.defaults84
-rw-r--r--framebuffer/Makefile.target60
-rw-r--r--framebuffer/clipboard.c18
-rw-r--r--framebuffer/clipboard.h (renamed from windows/login.c)11
-rw-r--r--framebuffer/convert_font.c1222
-rw-r--r--framebuffer/convert_image.c1
-rw-r--r--framebuffer/fbtk.h28
-rw-r--r--framebuffer/fbtk/event.c7
-rw-r--r--framebuffer/fbtk/fbtk.c27
-rw-r--r--framebuffer/fbtk/scroll.c41
-rw-r--r--framebuffer/fbtk/text.c2
-rw-r--r--framebuffer/fetch.c (renamed from framebuffer/filetype.c)58
-rw-r--r--framebuffer/fetch.h (renamed from image/mng.h)12
-rw-r--r--framebuffer/findfile.c68
-rw-r--r--framebuffer/font.h2
-rw-r--r--framebuffer/font_freetype.c33
-rw-r--r--framebuffer/font_internal.c400
-rw-r--r--framebuffer/font_internal.h31
-rw-r--r--framebuffer/framebuffer.c131
-rw-r--r--framebuffer/framebuffer.h1
-rw-r--r--framebuffer/gui.c720
-rw-r--r--framebuffer/gui.h12
-rw-r--r--framebuffer/localhistory.c33
-rw-r--r--framebuffer/misc.c38
-rw-r--r--framebuffer/nsfont_bold.c556
-rw-r--r--framebuffer/nsfont_italic.c556
-rw-r--r--framebuffer/nsfont_italic_bold.c556
-rw-r--r--framebuffer/nsfont_regular.c556
l---------framebuffer/res/Messages (renamed from framebuffer/res/messages)0
-rw-r--r--framebuffer/res/fonts/glyph_data9489
-rw-r--r--framebuffer/schedule.c103
-rw-r--r--framebuffer/schedule.h20
-rw-r--r--framebuffer/thumbnail.c2
-rw-r--r--gtk/Makefile.defaults51
-rw-r--r--gtk/Makefile.target40
-rw-r--r--gtk/bitmap.c135
-rw-r--r--gtk/compat.h2
-rw-r--r--gtk/dialogs/about.c85
-rw-r--r--gtk/dialogs/about.h4
-rw-r--r--gtk/dialogs/preferences.c158
-rw-r--r--gtk/dialogs/source.c540
-rw-r--r--gtk/dialogs/source.h28
-rw-r--r--gtk/download.c55
-rw-r--r--gtk/download.h2
-rw-r--r--gtk/fetch.c (renamed from gtk/filetype.c)103
-rw-r--r--gtk/fetch.h (renamed from gtk/filetype.h)11
-rw-r--r--gtk/font_pango.c8
-rw-r--r--gtk/gui.c914
-rw-r--r--gtk/gui.h14
-rw-r--r--gtk/hotlist.c6
-rw-r--r--gtk/login.c2
-rw-r--r--gtk/menu.c201
-rw-r--r--gtk/menu.h70
-rw-r--r--gtk/options.h4
-rw-r--r--gtk/plotters.c5
l---------gtk/res/C/Messages1
l---------gtk/res/Messages1
-rw-r--r--gtk/res/SearchEngines14
l---------gtk/res/credits.html1
-rw-r--r--gtk/res/gtkdefault.css2
l---------gtk/res/licence.html1
-rw-r--r--gtk/res/options.gtk2.ui927
-rw-r--r--gtk/res/options.gtk3.ui81
-rw-r--r--gtk/res/viewdata.gtk2.ui (renamed from gtk/res/source.gtk2.ui)28
-rw-r--r--gtk/res/viewdata.gtk3.ui (renamed from gtk/res/source.gtk3.ui)64
l---------gtk/res/welcome.html1
-rw-r--r--gtk/scaffolding.c1364
-rw-r--r--gtk/scaffolding.h153
-rw-r--r--gtk/schedule.c23
-rw-r--r--gtk/schedule.h3
-rw-r--r--gtk/search.c206
-rw-r--r--gtk/search.h15
-rw-r--r--gtk/selection.c27
-rw-r--r--gtk/selection.h3
-rw-r--r--gtk/tabs.c2
-rw-r--r--gtk/tabs.h2
-rw-r--r--gtk/theme.c32
-rw-r--r--gtk/theme.h2
-rw-r--r--gtk/toolbar.c126
-rw-r--r--gtk/toolbar.h17
-rw-r--r--gtk/treeview.c75
-rw-r--r--gtk/treeview.h12
-rw-r--r--gtk/viewdata.c988
-rw-r--r--gtk/viewdata.h48
-rw-r--r--gtk/viewsource.c76
-rw-r--r--gtk/viewsource.h25
-rw-r--r--gtk/window.c358
-rw-r--r--gtk/window.h8
-rw-r--r--image/Makefile1
-rw-r--r--image/gif.c17
-rw-r--r--image/image.c13
-rw-r--r--image/image_cache.c16
-rw-r--r--image/image_cache.h2
-rw-r--r--image/mng.c832
-rw-r--r--javascript/Makefile4
-rw-r--r--javascript/fetcher.c238
-rw-r--r--javascript/fetcher.h28
-rw-r--r--javascript/jsapi/location.bnd7
-rw-r--r--monkey/401login.c3
-rw-r--r--monkey/401login.h9
-rw-r--r--monkey/Makefile.defaults18
-rw-r--r--monkey/Makefile.target30
-rw-r--r--monkey/browser.c167
-rw-r--r--monkey/browser.h4
-rw-r--r--monkey/cert.c9
-rw-r--r--monkey/cert.h4
-rw-r--r--monkey/dispatch.c25
-rw-r--r--monkey/download.c25
-rw-r--r--monkey/fetch.c52
-rw-r--r--monkey/fetch.h19
-rw-r--r--monkey/filetype.c37
-rw-r--r--monkey/filetype.h5
-rw-r--r--monkey/main.c103
-rw-r--r--monkey/plot.c4
-rw-r--r--monkey/poll.c81
-rw-r--r--monkey/poll.h2
-rw-r--r--monkey/schedule.c26
-rw-r--r--monkey/schedule.h3
-rw-r--r--monkey/utils.c104
-rw-r--r--render/Makefile5
-rw-r--r--render/box.c452
-rw-r--r--render/box.h4
-rw-r--r--render/box_construct.c269
-rw-r--r--render/box_normalise.c66
-rw-r--r--render/box_textarea.c23
-rw-r--r--render/form.c846
-rw-r--r--render/form.h24
-rw-r--r--render/html.c253
-rw-r--r--render/html.h9
-rw-r--r--render/html_css.c21
-rw-r--r--render/html_css_fetcher.c21
-rw-r--r--render/html_interaction.c93
-rw-r--r--render/html_internal.h4
-rw-r--r--render/html_object.c55
-rw-r--r--render/html_redraw.c126
-rw-r--r--render/html_script.c30
-rw-r--r--render/imagemap.c553
-rw-r--r--render/layout.c238
-rw-r--r--render/list.c483
-rw-r--r--render/search.c67
-rw-r--r--render/search.h3
-rw-r--r--render/table.c8
-rw-r--r--render/textplain.c56
-rw-r--r--resources/FatMessages212
-rw-r--r--riscos/401login.c10
-rw-r--r--riscos/Makefile.defaults42
-rw-r--r--riscos/Makefile.target4
-rw-r--r--riscos/buffer.c21
-rw-r--r--riscos/configure.c22
-rw-r--r--riscos/configure/con_cache.c44
-rw-r--r--riscos/configure/con_content.c9
-rw-r--r--riscos/configure/con_fonts.c11
-rw-r--r--riscos/configure/con_home.c8
-rw-r--r--riscos/configure/con_image.c17
-rw-r--r--riscos/configure/con_inter.c7
-rw-r--r--riscos/configure/con_language.c10
-rw-r--r--riscos/configure/con_secure.c9
-rw-r--r--riscos/configure/con_theme.c6
-rw-r--r--riscos/content-handlers/artworks.h5
-rw-r--r--riscos/content-handlers/draw.h5
-rw-r--r--riscos/content-handlers/sprite.h5
-rw-r--r--riscos/cookies.c1
-rw-r--r--riscos/dialog.c111
-rw-r--r--riscos/dialog.h7
-rw-r--r--riscos/distribution/!Boot/Resources/!Cache/!Boot,feb3
-rw-r--r--riscos/distribution/!Boot/Resources/!Cache/!Help,feb2
-rw-r--r--riscos/distribution/!Boot/Resources/!Cache/!Run,feb10
-rw-r--r--riscos/distribution/!Boot/Resources/!Cache/!RunImage,ffbbin0 -> 2985 bytes
-rw-r--r--riscos/distribution/!Boot/Resources/!Cache/!Sprites,ff9bin0 -> 864 bytes
-rw-r--r--riscos/distribution/!Boot/Resources/!Cache/!Sprites22,ff9bin0 -> 2504 bytes
-rw-r--r--riscos/distribution/!Boot/Resources/!Cache/Caches/Blank1
-rw-r--r--riscos/distribution/!Boot/Resources/!Cache/Resources/MultiError,ffbbin0 -> 24031 bytes
-rw-r--r--riscos/distribution/!Boot/Resources/!Cache/Resources/ResFind,ffbbin0 -> 1930 bytes
-rw-r--r--riscos/distribution/!Boot/Resources/!Cache/Resources/UK/!Meta9
-rw-r--r--riscos/distribution/!Boot/Resources/!Cache/Resources/UK/Help60
-rw-r--r--riscos/distribution/!Boot/Resources/!Cache/Resources/UK/Messages8
-rw-r--r--riscos/distribution/!Boot/Resources/!Cache/Resources/UK/Templates,fecbin0 -> 541 bytes
-rw-r--r--riscos/download.c319
-rw-r--r--riscos/filetype.c78
-rw-r--r--riscos/filetype.h128
-rw-r--r--riscos/font.c16
-rw-r--r--riscos/font.h43
-rw-r--r--riscos/global_history.c2
-rw-r--r--riscos/gui.c2949
-rw-r--r--riscos/gui.h77
-rw-r--r--riscos/gui/button_bar.c30
-rw-r--r--riscos/gui/progress_bar.c48
-rw-r--r--riscos/gui/status_bar.c20
-rw-r--r--riscos/gui/throbber.c2
-rw-r--r--riscos/gui/url_bar.c94
-rw-r--r--riscos/gui/url_bar.h1
-rw-r--r--riscos/help.c56
-rw-r--r--riscos/history.c31
-rw-r--r--riscos/hotlist.c32
-rw-r--r--riscos/hotlist.h9
-rw-r--r--riscos/iconbar.c28
-rw-r--r--riscos/image.c13
-rw-r--r--riscos/menus.c100
-rw-r--r--riscos/menus.h7
-rw-r--r--riscos/message.c6
-rw-r--r--riscos/mouse.c35
-rw-r--r--riscos/mouse.h8
-rw-r--r--riscos/plotters.c30
-rw-r--r--riscos/print.c39
-rw-r--r--riscos/print.h5
-rw-r--r--riscos/query.c22
-rw-r--r--riscos/query.h22
-rw-r--r--riscos/save.c40
-rw-r--r--riscos/save.h12
-rw-r--r--riscos/save_draw.c15
-rw-r--r--riscos/schedule.c100
-rw-r--r--riscos/search.c82
-rw-r--r--riscos/sslcert.c7
-rw-r--r--riscos/sslcert.h2
-rw-r--r--riscos/templates/de138
-rw-r--r--riscos/templates/en128
-rw-r--r--riscos/templates/fr128
-rw-r--r--riscos/templates/nl130
-rw-r--r--riscos/textarea.c34
-rw-r--r--riscos/textselection.c50
-rw-r--r--riscos/textselection.h5
-rw-r--r--riscos/theme.c3
-rw-r--r--riscos/theme_install.c25
-rw-r--r--riscos/thumbnail.c3
-rw-r--r--riscos/toolbar.c19
-rw-r--r--riscos/treeview.c16
-rw-r--r--riscos/ucstables.c72
-rw-r--r--riscos/ucstables.h5
-rw-r--r--riscos/uri.c3
-rw-r--r--riscos/url_complete.c36
-rw-r--r--riscos/url_protocol.c3
-rw-r--r--riscos/url_suggest.c13
-rw-r--r--riscos/wimp.c13
-rw-r--r--riscos/wimp_event.c32
-rw-r--r--riscos/window.c688
-rw-r--r--riscos/window.h12
-rw-r--r--test/Makefile6
-rw-r--r--test/nsurl.c39
-rw-r--r--utils/DerivedJoiningType.txt318
-rw-r--r--utils/Makefile3
-rw-r--r--utils/base64.c3
-rw-r--r--utils/config.h18
-rw-r--r--utils/container.c68
-rw-r--r--utils/corestrings.c128
-rw-r--r--utils/corestrings.h51
-rw-r--r--utils/errors.h14
-rw-r--r--utils/file.c305
-rw-r--r--utils/file.h175
-rw-r--r--utils/filename.c6
-rw-r--r--utils/filename.h4
-rw-r--r--utils/filepath.c18
-rw-r--r--utils/filepath.h36
-rw-r--r--utils/git-testament.pl1
-rw-r--r--utils/idna-derived-props-gen.pl96
-rw-r--r--utils/idna-tables-5.2.0-properties.csv2322
-rw-r--r--utils/idna.c735
-rw-r--r--utils/idna.h54
-rw-r--r--utils/idna_props.h2634
-rwxr-xr-xutils/jenkins-build.sh44
-rw-r--r--utils/libdom.c249
-rw-r--r--utils/libdom.h10
-rw-r--r--utils/log.c3
-rw-r--r--utils/log.h5
-rw-r--r--utils/nsoption.h3
-rw-r--r--utils/nsurl.c243
-rw-r--r--utils/punycode.c280
-rw-r--r--utils/punycode.h167
-rw-r--r--utils/schedule.h32
-rw-r--r--utils/time.h53
-rw-r--r--utils/types.h6
-rw-r--r--utils/url.c518
-rw-r--r--utils/url.h102
-rw-r--r--utils/utf8.c235
-rw-r--r--utils/utf8.h127
-rw-r--r--utils/utf8proc.c594
-rw-r--r--utils/utf8proc.h393
-rw-r--r--utils/utf8proc_data.c13383
-rw-r--r--utils/utils.c243
-rw-r--r--utils/utils.h175
-rw-r--r--utils/utsname.h26
-rwxr-xr-xutils/warning-blame.sh64
-rw-r--r--windows/Makefile.defaults29
-rw-r--r--windows/Makefile.target8
-rw-r--r--windows/download.c51
-rw-r--r--windows/download.h2
-rw-r--r--windows/drawable.c54
-rw-r--r--windows/filetype.c8
-rw-r--r--windows/filetype.h24
-rw-r--r--windows/findfile.c59
-rw-r--r--windows/findfile.h1
-rw-r--r--windows/font.c17
-rw-r--r--windows/font.h2
-rw-r--r--windows/gui.c565
-rw-r--r--windows/gui.h7
-rw-r--r--windows/localhistory.c18
-rw-r--r--windows/main.c54
-rw-r--r--windows/misc.c39
-rw-r--r--windows/schedule.c101
-rw-r--r--windows/schedule.h16
567 files changed, 61641 insertions, 24011 deletions
diff --git a/!NetSurf/Resources/ca-bundle b/!NetSurf/Resources/ca-bundle
index 93d3d2dbf..67f696abc 100755..100644
--- a/!NetSurf/Resources/ca-bundle
+++ b/!NetSurf/Resources/ca-bundle
@@ -1,12 +1,12 @@
##
## ca-bundle.crt -- Bundle of CA Root Certificates
##
-## Certificate data from Mozilla as of: Sat Dec 29 20:03:40 2012
+## Certificate data from Mozilla as of: Tue Jan 28 09:38:07 2014
##
## This is a bundle of X.509 certificates of public Certificate Authorities
## (CA). These were automatically extracted from Mozilla's root certificates
## file (certdata.txt). This file can be found in the mozilla source tree:
-## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1
+## http://mxr.mozilla.org/mozilla-release/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1
##
## It contains the certificates in PEM format and therefore
## can be directly used with curl / libcurl / php_curl, or with
@@ -14,7 +14,6 @@
## Just configure this file as the SSLCACertificateFile.
##
-# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.87 $ $Date: 2012/12/29 16:32:45 $
GTE CyberTrust Global Root
==========================
@@ -91,46 +90,6 @@ BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
70+sB3c4
-----END CERTIFICATE-----
-Digital Signature Trust Co. Global CA 1
-=======================================
------BEGIN CERTIFICATE-----
-MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
-ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy
-MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
-IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA
-A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE
-NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i
-o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
-BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
-dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
-IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY
-MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM
-BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
-ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq
-kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4
-RbyhkwS7hp86W0N6w4pl
------END CERTIFICATE-----
-
-Digital Signature Trust Co. Global CA 3
-=======================================
------BEGIN CERTIFICATE-----
-MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
-ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy
-MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
-IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA
-A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD
-VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS
-xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
-BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
-dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
-IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY
-MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM
-BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
-AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi
-up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1
-mPnHfxsb1gYgAlihw6ID
------END CERTIFICATE-----
-
Verisign Class 3 Public Primary Certification Authority
=======================================================
-----BEGIN CERTIFICATE-----
@@ -344,11 +303,11 @@ n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
Entrust.net Premium 2048 Secure Server CA
=========================================
-----BEGIN CERTIFICATE-----
-MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
+MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
-NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
+NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
@@ -356,14 +315,13 @@ MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
-VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC
-AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER
-gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B
-AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
-oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS
-o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z
-2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX
-OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ==
+VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ
+KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy
+T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
+zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT
+J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e
+nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=
-----END CERTIFICATE-----
Baltimore CyberTrust Root
@@ -421,26 +379,6 @@ lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+
KpYrtWKmpj29f5JZzVoqgrI3eQ==
-----END CERTIFICATE-----
-Equifax Secure eBusiness CA 2
-=============================
------BEGIN CERTIFICATE-----
-MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE
-ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y
-MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT
-DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB
-nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn
-2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5
-BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG
-A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx
-JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG
-A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e
-uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB
-Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1
-jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia
-78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm
-V+GRMOrN
------END CERTIFICATE-----
-
AddTrust Low-Value Services Root
================================
-----BEGIN CERTIFICATE-----
@@ -1405,29 +1343,6 @@ wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm
VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA=
-----END CERTIFICATE-----
-Wells Fargo Root CA
-===================
------BEGIN CERTIFICATE-----
-MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV
-BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
-MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl
-bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv
-MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX
-x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3
-E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5
-OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j
-sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj
-YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF
-BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD
-ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv
-m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R
-OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx
-x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023
-tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=
------END CERTIFICATE-----
-
Swisscom Root CA 1
==================
-----BEGIN CERTIFICATE-----
@@ -2803,29 +2718,6 @@ YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
kpeDMdmztcpHWD9f
-----END CERTIFICATE-----
-TC TrustCenter Universal CA III
-===============================
------BEGIN CERTIFICATE-----
-MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
-IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe
-Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU
-QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex
-KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB
-AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt
-QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO
-juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut
-CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1
-M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G
-A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
-BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA
-g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+
-KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK
-BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV
-CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq
-woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==
------END CERTIFICATE-----
-
Autoridad de Certificacion Firmaprofesional CIF A62634068
=========================================================
-----BEGIN CERTIFICATE-----
@@ -3552,3 +3444,342 @@ uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
dcGWxZ0=
-----END CERTIFICATE-----
+
+TURKTRUST Certificate Services Provider Root 2007
+=================================================
+-----BEGIN CERTIFICATE-----
+MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
+MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
+QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X
+DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl
+a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN
+BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
+bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N
+YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv
+KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya
+KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT
+rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC
+AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s
+Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
+aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO
+Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb
+BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK
+poRq0Tl9
+-----END CERTIFICATE-----
+
+D-TRUST Root Class 3 CA 2 2009
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe
+Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE
+LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD
+ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA
+BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv
+KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z
+p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC
+AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ
+4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y
+eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw
+MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G
+PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw
+OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm
+2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
+o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV
+dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph
+X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=
+-----END CERTIFICATE-----
+
+D-TRUST Root Class 3 CA 2 EV 2009
+=================================
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
+OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
+OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS
+egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh
+zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T
+7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60
+sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35
+11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv
+cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v
+ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El
+MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp
+b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh
+c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+
+PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
+nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX
+ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA
+NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv
+w9y4AyHqnxbxLFS1
+-----END CERTIFICATE-----
+
+PSCProcert
+==========
+-----BEGIN CERTIFICATE-----
+MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk
+ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ
+MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz
+dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl
+cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw
+IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw
+MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w
+DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD
+ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp
+Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC
+wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA
+3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh
+RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO
+EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2
+0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH
+0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU
+td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw
+Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp
+r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/
+AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz
+Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId
+xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp
+ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH
+EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h
+Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k
+ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG
+9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG
+MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG
+LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52
+ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy
+YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v
+Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o
+dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq
+T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN
+g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q
+uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1
+n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn
+FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo
+5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq
+3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5
+poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y
+eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km
+-----END CERTIFICATE-----
+
+China Internet Network Information Center EV Certificates Root
+==============================================================
+-----BEGIN CERTIFICATE-----
+MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV
+BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D
+aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg
+Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG
+A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM
+PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl
+cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y
+jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV
+98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H
+klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23
+KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC
+7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD
+glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5
+0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM
+7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws
+ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0
+5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8=
+-----END CERTIFICATE-----
+
+Swisscom Root CA 2
+==================
+-----BEGIN CERTIFICATE-----
+MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQG
+EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
+dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2
+MjUwNzM4MTRaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
+aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIIC
+IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvErjw0DzpPM
+LgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r0rk0X2s682Q2zsKwzxNo
+ysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJ
+wDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVPACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpH
+Wrumnf2U5NGKpV+GY3aFy6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1a
+SgJA/MTAtukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL6yxS
+NLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0uPoTXGiTOmekl9Ab
+mbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrALacywlKinh/LTSlDcX3KwFnUey7QY
+Ypqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velhk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3
+qPyZ7iVNTA6z00yPhOgpD/0QVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
+HQYDVR0hBBYwFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O
+BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqhb97iEoHF8Twu
+MA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4RfbgZPnm3qKhyN2abGu2sEzsO
+v2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ
+82YqZh6NM4OKb3xuqFp1mrjX2lhIREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLz
+o9v/tdhZsnPdTSpxsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcs
+a0vvaGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciATwoCqISxx
+OQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99nBjx8Oto0QuFmtEYE3saW
+mA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5Wt6NlUe07qxS/TFED6F+KBZvuim6c779o
++sjaC+NCydAXFJy3SuCvkychVSa1ZC+N8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TC
+rvJcwhbtkj6EPnNgiLx29CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX
+5OfNeOI5wSsSnqaeG8XmDtkx2Q==
+-----END CERTIFICATE-----
+
+Swisscom Root EV CA 2
+=====================
+-----BEGIN CERTIFICATE-----
+MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAwZzELMAkGA1UE
+BhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdpdGFsIENlcnRpZmljYXRlIFNl
+cnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcN
+MzEwNjI1MDg0NTA4WjBnMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT
+HERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYg
+Q0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7BxUglgRCgz
+o3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD1ycfMQ4jFrclyxy0uYAy
+Xhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPHoCE2G3pXKSinLr9xJZDzRINpUKTk4Rti
+GZQJo/PDvO/0vezbE53PnUgJUmfANykRHvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8Li
+qG12W0OfvrSdsyaGOx9/5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaH
+Za0zKcQvidm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHLOdAG
+alNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaCNYGu+HuB5ur+rPQa
+m3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f46Fq9mDU5zXNysRojddxyNMkM3Ox
+bPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCBUWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDi
+xzgHcgplwLa7JSnaFp6LNYth7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/
+BAQDAgGGMB0GA1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED
+MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWBbj2ITY1x0kbB
+bkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6xXCX5145v9Ydkn+0UjrgEjihL
+j6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98TPLr+flaYC/NUn81ETm484T4VvwYmneTwkLbU
+wp4wLh/vx3rEUMfqe9pQy3omywC0Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7
+XwgiG/W9mR4U9s70WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH
+59yLGn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm7JFe3VE/
+23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4Snr8PyQUQ3nqjsTzyP6Wq
+J3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VNvBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyA
+HmBR3NdUIR7KYndP+tiPsys6DXhyyWhBWkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/gi
+uMod89a2GQ+fYWVq6nTIfI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuW
+l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc=
+-----END CERTIFICATE-----
+
+CA Disig Root R1
+================
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw
+EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
+ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx
+EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
+c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy
+3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8
+u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2
+m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk
+CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa
+YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6
+vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL
+LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX
+ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is
+XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ
+04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR
+xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B
+LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM
+CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb
+VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85
+YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS
+ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix
+lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N
+UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ
+a7+h89n07eLw4+1knj0vllJPgFOL
+-----END CERTIFICATE-----
+
+CA Disig Root R2
+================
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw
+EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
+ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx
+EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
+c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC
+w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia
+xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7
+A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S
+GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV
+g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa
+5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE
+koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A
+Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i
+Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u
+Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
+tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV
+sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je
+dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8
+1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx
+mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01
+utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0
+sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg
+UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV
+7+ZtsH8tZ/3zbBt1RqPlShfppNcL
+-----END CERTIFICATE-----
+
+ACCVRAIZ1
+=========
+-----BEGIN CERTIFICATE-----
+MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB
+SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1
+MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH
+UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM
+jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0
+RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD
+aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ
+0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG
+WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7
+8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR
+5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J
+9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK
+Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw
+Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu
+Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
+VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM
+Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA
+QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh
+AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA
+YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj
+AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA
+IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk
+aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0
+dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2
+MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI
+hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E
+R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN
+YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49
+nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ
+TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3
+sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
+I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg
+Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd
+3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p
+EfbRD0tVNEYqi4Y7
+-----END CERTIFICATE-----
+
+TWCA Global Root CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT
+CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD
+QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK
+EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg
+Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C
+nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV
+r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR
+Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV
+tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W
+KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99
+sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p
+yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn
+kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI
+zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g
+cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
+LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M
+8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg
+/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg
+lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP
+A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m
+i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8
+EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3
+zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=
+-----END CERTIFICATE-----
diff --git a/!NetSurf/Resources/en/licence.html,faf b/!NetSurf/Resources/en/licence.html,faf
index 6375c56da..7b3aef628 100644
--- a/!NetSurf/Resources/en/licence.html,faf
+++ b/!NetSurf/Resources/en/licence.html,faf
@@ -158,12 +158,6 @@ version.</p>
<span><a href="#mit">MIT</a></span>
</dd>
-<dt><a href="http://www.libmng.com">libmng</a></dt>
-<dd>
-<span>&copy; 2000&ndash;2007 Gerard Juyn, Glenn Randers-Pehrson</span>
-<span><a href="#mng">MNG</a></span>
-</dd>
-
<dt><a href="http://ro-oslib.sourceforge.net/">OSLib</a></dt>
<dd>
<span>&copy; 1994&ndash;1998 Jonathan Coxhead and contributors</span>
@@ -642,34 +636,6 @@ ltmain.sh). Another support script, install-sh, is copyright by X Consortium
but is also freely distributable.
</div>
-<a name="mng" />
-<h3>MNG Licence</h3>
-<div class="licence">The MNG Library is supplied "AS IS". The Contributing Authors
-disclaim all warranties, expressed or implied, including, without
-limitation, the warranties of merchantability and of fitness for any
-purpose. The Contributing Authors assume no liability for direct,
-indirect, incidental, special, exemplary, or consequential damages,
-which may result from the use of the MNG Library, even if advised of
-the possibility of such damage.
-
-Permission is hereby granted to use, copy, modify, and distribute this
-source code, or portions hereof, for any purpose, without fee, subject
-to the following restrictions:
-
-1. The origin of this source code must not be misrepresented;
- you must not claim that you wrote the original software.
-
-2. Altered versions must be plainly marked as such and must not be
- misrepresented as being the original source.
-
-3. This Copyright notice may not be removed or altered from any source
- or altered source distribution.
-
-The Contributing Authors specifically permit, without fee, and
-encourage the use of this source code as a component to supporting
-the MNG and JNG file format in commercial products. If you use this
-source code in a product, acknowledgment would be highly appreciated.
-</div>
<a name="oslib" />
<h3>OSLib Licence</h3>
diff --git a/!NetSurf/Resources/it/licence.html,faf b/!NetSurf/Resources/it/licence.html,faf
index 1fa93b39e..b0a6c8ae3 100644
--- a/!NetSurf/Resources/it/licence.html,faf
+++ b/!NetSurf/Resources/it/licence.html,faf
@@ -150,13 +150,7 @@ dl.components > dd > span + span {
<span><a href="#mit">MIT</a></span>
</dd>
-<dt><a href="http://www.libmng.com">libmng</a></dt>
-<dd>
-<span>&copy; 2000&ndash;2007 Gerard Juyn, Glenn Randers-Pehrson</span>
-<span><a href="#mng">MNG</a></span>
-</dd>
-
-<dt><a href="http://ro-oslib.sourceforge.net/">OSLib</a></dt>
+q<dt><a href="http://ro-oslib.sourceforge.net/">OSLib</a></dt>
<dd>
<span>&copy; 1994&ndash;1998 Jonathan Coxhead and contributors</span>
<span><a href="#oslib">OSLib</a></span>
@@ -631,35 +625,6 @@ ltmain.sh). Another support script, install-sh, is copyright by X Consortium
but is also freely distributable.
</div>
-<a name="mng" />
-<h3>Licenza MNG</h3>
-<div class="licence">The MNG Library is supplied "AS IS". The Contributing Authors
-disclaim all warranties, expressed or implied, including, without
-limitation, the warranties of merchantability and of fitness for any
-purpose. The Contributing Authors assume no liability for direct,
-indirect, incidental, special, exemplary, or consequential damages,
-which may result from the use of the MNG Library, even if advised of
-the possibility of such damage.
-
-Permission is hereby granted to use, copy, modify, and distribute this
-source code, or portions hereof, for any purpose, without fee, subject
-to the following restrictions:
-
-1. The origin of this source code must not be misrepresented;
- you must not claim that you wrote the original software.
-
-2. Altered versions must be plainly marked as such and must not be
- misrepresented as being the original source.
-
-3. This Copyright notice may not be removed or altered from any source
- or altered source distribution.
-
-The Contributing Authors specifically permit, without fee, and
-encourage the use of this source code as a component to supporting
-the MNG and JNG file format in commercial products. If you use this
-source code in a product, acknowledgment would be highly appreciated.
-</div>
-
<a name="oslib" />
<h3>Licenza OSLib</h3>
<div class="licence">The copyright holder has granted a small relaxation of the
diff --git a/.gitignore b/.gitignore
index 82d6b6ce1..7088130af 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,7 +16,6 @@ test/nsoption
test/nsurl
test/urldbtest
test/llcache
-utils/testament.h
codedocs
nsgtk
nsfb
diff --git a/Docs/BUILDING-AmigaCross b/Docs/BUILDING-AmigaCross
index da2e2adf0..32762cd5b 100644
--- a/Docs/BUILDING-AmigaCross
+++ b/Docs/BUILDING-AmigaCross
@@ -70,10 +70,6 @@ openssl
libpng
-libmng
-http://www.aminet.net/dev/lib/libmng_so.lha
-http://www.aminet.net/dev/lib/libmng.lha
-
liblcms
http://www.aminet.net/dev/lib/liblcms_so.lha
http://www.aminet.net/dev/lib/liblcms_so.lha
diff --git a/Docs/BUILDING-AmigaOS b/Docs/BUILDING-AmigaOS
index 4dabf4f11..3f05b9caf 100644
--- a/Docs/BUILDING-AmigaOS
+++ b/Docs/BUILDING-AmigaOS
@@ -1,5 +1,5 @@
--------------------------------------------------------------------------------
- Build Instructions for AmigaOS NetSurf 13 February 2010
+ Build Instructions for AmigaOS NetSurf 02 May 2014
--------------------------------------------------------------------------------
This document provides instructions for building the AmigaOS version of
@@ -59,19 +59,9 @@
To build and install these libraries, simply enter each of their directories
and run:
- 1> gmake install
+ 1> gmake PREFIX=/path/to/buildsystem
- | Note: We advise enabling iconv() support in libparserutils, which vastly
- | increases the number of supported character sets. To do this,
- | create a file called Makefile.config.override in the libparserutils
- | directory, containing the following lines:
- |
- | CFLAGS += -DWITH_ICONV_FILTER
- | LDFLAGS += -liconv
- |
- | This requires libiconv as iconv support in newlib.library is buggy.
- |
- | For more information, consult the libparserutils README file.
+ The path MUST be in UNIX format and point to directory containing "share".
| Note: Building libsvgtiny requires gperf, which is available from Aminet:
|
@@ -83,21 +73,17 @@
A version of libcurl built for newlib is available from Aminet
- http://www.aminet.net/package/dev/lib/libcurl
-
- There is a shared object version included with some OWB releases. To use
- this when compiling with Cairo support, a link must be made:
+ http://www.os4depot.net/share/development/library/misc/libcurl.lha
- 1> makelink sdk:local/newlib/lib/libcurl.so sobjs:libcurl-7.16.so soft
- libmng
+ libpng
--------
- NetSurf uses libMNG to display MNG and PNG files.
- It builds without any problems on OS4, or available from Aminet:
+ NetSurf uses libPNG to display PNG files.
+ It builds without any problems on OS4, or available from OS4Depot:
- http://www.aminet.net/package/dev/lib/libmng_so
+ http://www.os4depot.net/share/development/library/graphics/libpng.lha
OpenSSL
@@ -107,12 +93,6 @@
http://www.os4depot.net/share/development/library/misc/libopenssl.lha
- There is a shared object version included with some OWB releases. To use
- this when compiling with Cairo support, a link must be made:
-
- 1> makelink sdk:local/newlib/lib/libssl.so sobjs:libssl-0.9.8.so soft
- 1> makelink sdk:local/newlib/lib/libcrypto.so sobjs:libssl-0.9.8.so soft
-
Libharu
---------
@@ -141,19 +121,9 @@
http://www.aminet.net/package/comm/www/OpenURL-OS4
- General requirements
-----------------------
-
- SDK:newlib/include/strings.h needs to be modified by adding the following:
-
- extern int strcasecmp(const char *, const char *);
- extern int strncasecmp(const char *, const char *, size_t);
+ Spidermonkey
+--------------
- amiga/version.c is generated by version.rexx using the SVN command. If
- the source has not been checked out from SVN, or is being cross-compiled,
- this file will need to be created by hand. See the end of version.rexx
- for the variables that are defined in the file.
+ Experimental Javascript support requires Spidermonkey. The patches to
+ build v1.7 are available from the NetSurf toolchains Git repository.
- Please note that building with Cairo (option NETSURF_AMIGA_USE_CAIRO) will
- link NetSurf against shared objects, and require the OS4.1 SDK to build and
- AmigaOS 4.1 to run.
diff --git a/Docs/BUILDING-BeOS b/Docs/BUILDING-BeOS
index 83ced0e93..8d33a6808 100644
--- a/Docs/BUILDING-BeOS
+++ b/Docs/BUILDING-BeOS
@@ -89,10 +89,10 @@
TODO
- libmng
+ libpng
--------
- NetSurf uses libMNG to display MNG and PNG files.
+ NetSurf uses libPNG to display PNG files.
It should build just fine on BeOS.
diff --git a/Docs/BUILDING-Framebuffer b/Docs/BUILDING-Framebuffer
index 63ef02dd6..8e695c4a9 100644
--- a/Docs/BUILDING-Framebuffer
+++ b/Docs/BUILDING-Framebuffer
@@ -1,5 +1,5 @@
--------------------------------------------------------------------------------
- Build Instructions for Framebuffer NetSurf 13 February 2010
+ Build Instructions for Framebuffer NetSurf 16 March 2014
--------------------------------------------------------------------------------
This document provides instructions for building the Framebuffer version of
@@ -7,8 +7,153 @@
Framebuffer NetSurf has been tested on Ubuntu and Debian.
+ Depending on the framebuffer frontend selected the build may need specific
+ libraries installed, e.g. the SDL port requires SDL1.2 or later
+
+ There are two ways to get NetSurf building. The QUICK-START (recommended),
+ and the manual build. Whichever you choose, you should read both the
+ "Fonts", and "Selecting a frontend and appropriate options" sections below.
+
+
+ Quick Start
+=============
+
+ See the QUICK-START document, which provides a simple environment with
+ which you can fetch, build and install NetSurf and its dependencies.
+
+ The QUICK-START is the recommended way to build NetSurf.
+
+
+ Manual building
+=================
+
+ If you can't follow the quick start instructions, you will have to build
+ NetSurf manually. The instructions for doing this are given below.
+
+
+ Obtaining the build dependencies
+----------------------------------
+
+ Many of NetSurf's dependencies are packaged on various operating systems.
+ The remainder must be installed manually. Currently, some of the libraries
+ developed as part of the NetSurf project have not had official releases.
+ Hopefully they will soon be released with downloadable tarballs and packaged
+ in common distros. For now, you'll have to make do with Git checkouts.
+
+ Package installation
+ --------------------
+
+ Debian-like OS:
+
+ $ apt-get install libcurl3-dev libpng-dev
+
+ Recent OS versions might need libcurl4-dev instead of libcurl3-dev but
+ note that when it has not been built with OpenSSL, the SSL_CTX is not
+ available and results that certification details won't be presented in case
+ they are invalid. But as this is currently unimplemented in the Framebuffer
+ flavour of NetSurf, this won't make a difference at all.
+
+ Fedora:
+
+ $ yum install curl-devel libpng-devel lcms-devel
+
+ Other:
+
+ You'll need to install the development resources for libcurl3 and libpng.
+
+
+ Preparing your workspace
+--------------------------
+
+ NetSurf has a number of libraries which must be built in-order and
+ installed into your workspace. Each library depends on a core build
+ system which NetSurf projects use. This build system relies on the
+ presence of things like pkg-config to find libraries and also certain
+ environment variables in order to work correctly.
+
+ Assuming you are preparing a workspace in /home/netsurf/workspace then
+ the following steps will set you up:
+
+ Make the workspace directory and change to it
+ ---------------------------------------------
+
+ $ mkdir -p ${HOME}/netsurf/workspace
+ $ cd ${HOME}/netsurf/workspace
+
+ Make the temporary install space
+ --------------------------------
+
+ $ mkdir inst
+
+ Make an environment script
+ --------------------------
+ $ cat > env.sh <<'EOF'
+ export PKG_CONFIG_PATH=${HOME}/netsurf/workspace/inst/lib/pkgconfig::
+ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${HOME}/netsurf/workspace/inst/lib
+ export PREFIX=${HOME}/netsurf/workspace/inst
+ EOF
+
+ Change to workspace and source the environment
+ ----------------------------------------------
+
+ Whenever you wish to start development in a new shell, run the following:
+
+ $ cd ${HOME}/netsurf/workspace
+ $ source env.sh
+
+ From here on, any commands in this document assume you have sourced your
+ shell environment.
+
+
+ The NetSurf project's libraries
+---------------------------------
+
+ The NetSurf project has developed several libraries which are required by
+ the browser. These are:
+
+ BuildSystem -- Shared build system, needed to build the other libraries
+ LibParserUtils -- Parser building utility functions
+ LibWapcaplet -- String internment
+ Hubbub -- HTML5 compliant HTML parser
+ LibCSS -- CSS parser and selection engine
+ LibNSGIF -- GIF format image decoder
+ LibNSBMP -- BMP and ICO format image decoder
+ LibROSprite -- RISC OS Sprite format image decoder
+ LibNSFB -- Framebuffer abstraction
+
+ To fetch each of these libraries, run the appropriate commands from the
+ Docs/LIBRARIES file.
+
+ To build and install these libraries, simply enter each of their directories
+ and run:
+
+ $ make install
+
+ | Note: We advise enabling iconv() support in libparserutils, which vastly
+ | increases the number of supported character sets. To do this,
+ | create a file called Makefile.config.override in the libparserutils
+ | directory, containing the following line:
+ |
+ | CFLAGS += -DWITH_ICONV_FILTER
+ |
+ | For more information, consult the libparserutils README file.
+
+
+ Getting the NetSurf source
+----------------------------
+
+ From your workspace directory, run the following command to get the NetSurf
+ source:
+
+ $ git clone git://git.netsurf-browser.org/netsurf.git
+
+ And change to the 'netsurf' directory:
+
+ $ cd netsurf
+
+
Building and executing NetSurf
-================================
+--------------------------------
First of all, you should examine the contents of Makefile.defaults
and enable and disable relevant features as you see fit in a
@@ -203,79 +348,3 @@ Index: framebuffer/font_freetype.c
The documentation of libnsfb should be consulted for futher
information about supported frontends and their configuration.
-
- Obtaining NetSurf's build dependencies
-========================================
-
- Many of NetSurf's dependencies are packaged on various operating systems.
- The remainder must be installed manually. Currently, some of the libraries
- developed as part of the NetSurf project have not had official releases.
- Hopefully they will soon be released with downloadable tarballs and packaged
- in common distros. For now, you'll have to make do with Git checkouts.
-
- Package installation
-----------------------
-
- Debian-like OS:
-
- $ apt-get install libcurl3-dev libmng-dev
-
- Recent OS versions might need libcurl4-dev instead of libcurl3-dev but
- note that when it has not been built with OpenSSL, the SSL_CTX is not
- available and results that certification details won't be presented in case
- they are invalid. But as this is currently unimplemented in the Framebuffer
- flavour of NetSurf, this won't make a difference at all.
-
- Fedora:
-
- $ yum install curl-devel libmng-devel lcms-devel
-
- Other:
-
- You'll need to install the development resources for libcurl3 and libmng.
-
- Note that if you don't require MNG or JNG image support, NetSurf can be
- configured to use libpng instead of libmng. If you wish to do this, install
- the libpng development package instead.
-
- The NetSurf project's libraries
----------------------------------
-
- The NetSurf project has developed several libraries which are required by
- the browser. These are:
-
- LibParserUtils -- Parser building utility functions
- LibWapcaplet -- String internment
- Hubbub -- HTML5 compliant HTML parser
- LibCSS -- CSS parser and selection engine
- LibNSGIF -- GIF format image decoder
- LibNSBMP -- BMP and ICO format image decoder
- LibROSprite -- RISC OS Sprite format image decoder
- LibNSFB -- Framebuffer abstraction
-
- To fetch each of these libraries, run the appropriate commands from the
- Docs/LIBRARIES file.
-
- To build and install these libraries, simply enter each of their directories
- and run:
-
- $ sudo make install
-
- | Note: We advise enabling iconv() support in libparserutils, which vastly
- | increases the number of supported character sets. To do this,
- | create a file called Makefile.config.override in the libparserutils
- | directory, containing the following line:
- |
- | CFLAGS += -DWITH_ICONV_FILTER
- |
- | For more information, consult the libparserutils README file.
-
- General requirements
-----------------------
-
- Depending on the frontend selected the build may need specific
- libraries installed, e.g. the SDL port requires SDL1.2 or later
-
- Installing these libraries will often will pull in loads of things,
- like the PNG and JPEG libraries, colour management libraries, zlib,
- OpenSSL etc that NetSurf also depends on.
diff --git a/Docs/BUILDING-GTK b/Docs/BUILDING-GTK
index 16b15a4af..dab2bef07 100644
--- a/Docs/BUILDING-GTK
+++ b/Docs/BUILDING-GTK
@@ -1,51 +1,32 @@
--------------------------------------------------------------------------------
- Build Instructions for GTK NetSurf 8 April 2010
+ Build Instructions for GTK NetSurf 16 March 2014
--------------------------------------------------------------------------------
This document provides instructions for building the GTK version of NetSurf
and provides guidance on obtaining NetSurf's build dependencies.
GTK NetSurf has been tested on Debian, Ubuntu, Fedora 8, FreeBSD, NetBSD and
- Solaris 10.
+ Solaris 10. NetSurf requires at minimum GTK 2.12.
- Building and executing NetSurf
-================================
+ Quick Start
+=============
- First of all, you should examine the contents of Makefile.defaults
- and enable and disable relevant features as you see fit by creating
- a Makefile.config file. Some of these options can be automatically
- detected and used, and where this is the case they are set to such.
- Others cannot be automatically detected from the Makefile, so you
- will either need to install the dependencies, or set them to NO.
-
- You should then obtain NetSurf's dependencies, keeping in mind which options
- you have enabled in the configuration file. See the next section for
- specifics.
-
- Once done, to build GTK NetSurf on a UNIX-like platform, simply run:
+ See the QUICK-START document, which provides a simple environment with
+ which you can fetch, build and install NetSurf and its dependencies.
- $ make
+ The QUICK-START is the recommended way to build NetSurf.
- If that produces errors, you probably don't have some of NetSurf's
- build dependencies installed. See "Obtaining NetSurf's dependencies"
- below. Or turn off the complaining features in a Makefile.config
- file. You may need to "make clean" before attempting to build after
- installing the dependencies.
-
- Run NetSurf by executing the "test-nsgtk" shell script:
-
- $ ./test-nsgtk
- This script makes it easy to run the nsgtk binary from the build tree. It
- sets up some environment variables which enable NetSurf to find its
- resources.
+ Manual building
+=================
- If you are packaging NetSurf, see the PACKAGING-GTK document.
+ If you can't follow the quick start instructions, you will have to build
+ NetSurf manually. The instructions for doing this are given below.
- Obtaining NetSurf's build dependencies
-========================================
+ Obtaining the build dependencies
+----------------------------------
Many of NetSurf's dependencies are packaged on various operating systems.
The remainder must be installed manually. Currently, some of the libraries
@@ -53,21 +34,13 @@
Hopefully they will soon be released with downloadable tarballs and packaged
in common distros. For now, you'll have to make do with Git checkouts.
- Some of NetSurf's own libraries will be installed in /usr/local/ by default.
- Fedora, and perhaps some other distributions of Linux, do not ship a
- pkg-config that will search here, so you will either need to change where
- these libraries install, or do the following before building NetSurf itself;
-
- $ PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
- $ export PKG_CONFIG_PATH
-
Package installation
-----------------------
+ --------------------
Debian-like OS:
- $ apt-get install libgtk2.0-dev libcurl3-dev libmng-dev
- $ apt-get install librsvg2-dev liblcms1-dev libjpeg-dev
+ $ apt-get install libgtk2.0-dev libcurl3-dev libpng-dev
+ $ apt-get install librsvg2-dev libjpeg-dev
If you want to build with gtk 3 replace libgtk2.0-dev with libgtk-3-dev
@@ -84,17 +57,66 @@
Fedora:
- $ yum install curl-devel libmng-devel
- $ yum install librsvg2-devel lcms-devel expat-devel
+ $ yum install curl-devel libpng-devel
+ $ yum install librsvg2-devel expat-devel
Other:
You'll need to install the development resources for libglade2, libcurl3,
- libmng and librsvg.
+ libpng and librsvg.
+
+ Libharu
+ -------
+
+ NetSurf can use Haru PDF to enable PDF export. Haru PDF can be obtained
+ from http://libharu.org/. We require libharu 2.2 or later.
+
+ | Note: libharu cannot be auto-detected by the Makefile. If you wish to
+ | enable it, do so by creating a Makefile.config file.
+
+
+ Preparing your workspace
+--------------------------
+
+ NetSurf has a number of libraries which must be built in-order and
+ installed into your workspace. Each library depends on a core build
+ system which NetSurf projects use. This build system relies on the
+ presence of things like pkg-config to find libraries and also certain
+ environment variables in order to work correctly.
+
+ Assuming you are preparing a workspace in /home/netsurf/workspace then
+ the following steps will set you up:
+
+ Make the workspace directory and change to it
+ ---------------------------------------------
+
+ $ mkdir -p ${HOME}/netsurf/workspace
+ $ cd ${HOME}/netsurf/workspace
+
+ Make the temporary install space
+ --------------------------------
+
+ $ mkdir inst
+
+ Make an environment script
+ --------------------------
+ $ cat > env.sh <<'EOF'
+ export PKG_CONFIG_PATH=${HOME}/netsurf/workspace/inst/lib/pkgconfig::
+ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${HOME}/netsurf/workspace/inst/lib
+ export PREFIX=${HOME}/netsurf/workspace/inst
+ EOF
+
+ Change to workspace and source the environment
+ ----------------------------------------------
+
+ Whenever you wish to start development in a new shell, run the following:
+
+ $ cd ${HOME}/netsurf/workspace
+ $ source env.sh
+
+ From here on, any commands in this document assume you have sourced your
+ shell environment.
- Note that if you don't require MNG or JNG image support, NetSurf can be
- configured to use libpng instead of libmng. If you wish to do this, install
- the libpng development package instead.
The NetSurf project's libraries
---------------------------------
@@ -102,6 +124,7 @@
The NetSurf project has developed several libraries which are required by
the browser. These are:
+ BuildSystem -- Shared build system, needed to build the other libraries
LibParserUtils -- Parser building utility functions
LibWapcaplet -- String internment
Hubbub -- HTML5 compliant HTML parser
@@ -111,12 +134,12 @@
LibROSprite -- RISC OS Sprite format image decoder
To fetch each of these libraries, run the appropriate commands from the
- Docs/LIBRARIES file.
+ Docs/LIBRARIES file, from within your workspace directory.
To build and install these libraries, simply enter each of their directories
and run:
- $ sudo make install
+ $ make install
| Note: We advise enabling iconv() support in libparserutils, which vastly
| increases the number of supported character sets. To do this,
@@ -127,22 +150,56 @@
|
| For more information, consult the libparserutils README file.
- Libharu
----------
+ Now you should have all the NetSurf project libraries built and installed.
- NetSurf can use Haru PDF to enable PDF export. Haru PDF can be obtained
- from http://libharu.org/. We require libharu 2.2 or later.
- | Note: libharu cannot be auto-detected by the Makefile. If you wish to
- | enable it, do so by creating a Makefile.config file.
+ Getting the NetSurf source
+----------------------------
+
+ From your workspace directory, run the following command to get the NetSurf
+ source:
+
+ $ git clone git://git.netsurf-browser.org/netsurf.git
+
+ And change to the 'netsurf' directory:
+
+ $ cd netsurf
+
+ Building and executing NetSurf
+--------------------------------
+
+ First of all, you should examine the contents of Makefile.defaults
+ and enable and disable relevant features as you see fit by creating
+ a Makefile.config file. Some of these options can be automatically
+ detected and used, and where this is the case they are set to such.
+ Others cannot be automatically detected from the Makefile, so you
+ will either need to install the dependencies, or set them to NO.
+
+ You should then obtain NetSurf's dependencies, keeping in mind which options
+ you have enabled in the configuration file. See the next section for
+ specifics.
+
+ Once done, to build GTK NetSurf on a UNIX-like platform, simply run:
+
+ $ make
- General requirements
-----------------------
+ If that produces errors, you probably don't have some of NetSurf's
+ build dependencies installed. See "Obtaining NetSurf's dependencies"
+ below. Or turn off the complaining features in a Makefile.config
+ file. You may need to "make clean" before attempting to build after
+ installing the dependencies.
- NetSurf requires at minimum GTK 2.12. Earlier versions will not work. It also
- depends on Cairo for rendering, but you should have this already with
- versions of GTK 2.12 or later.
+ Run NetSurf by executing the "test-nsgtk" shell script:
+
+ $ ./test-nsgtk
+
+ This script makes it easy to run the nsgtk binary from the build tree. It
+ sets up some environment variables which enable NetSurf to find its
+ resources.
+
+
+ Note for packagers
+====================
+
+ If you are packaging NetSurf, see the PACKAGING-GTK document.
- This will pull in loads of things, like all the GTK dev libraries, the PNG
- and JPEG libraries, colour management libraries, zlib, OpenSSL etc that
- NetSurf also depends on.
diff --git a/Docs/BUILDING-Monkey b/Docs/BUILDING-Monkey
deleted file mode 100644
index 727124c34..000000000
--- a/Docs/BUILDING-Monkey
+++ /dev/null
@@ -1,104 +0,0 @@
---------------------------------------------------------------------------------
- Build Instructions for Monkey NetSurf 13 March 2011
---------------------------------------------------------------------------------
-
- This document provides instructions for building the Monkey
- automation version of NetSurf and provides guidance on obtaining
- NetSurf's build dependencies.
-
- Monkey NetSurf has been tested on Ubuntu 10.10/amd64.
-
-
- Building and executing NetSurf
- ==============================
-
- First of all, you should examine the contents of Makefile.defaults
- and enable and disable relevant features as you see fit by creating
- a Makefile.config file. Some of these options can be automatically
- detected and used, and where this is the case they are set to such.
- Others cannot be automatically detected from the Makefile, so you
- will either need to install the dependencies, or set them to NO.
-
- You should then obtain NetSurf's dependencies, keeping in mind which options
- you have enabled in the configuration file. See the next section for
- specifics.
-
- Once done, to build Monkey NetSurf on a UNIX-like platform, simply run:
-
- $ make TARGET=monkey
-
- If that produces errors, you probably don't have some of NetSurf's
- build dependencies installed. See "Obtaining NetSurf's dependencies"
- below. Or turn off the complaining features in a Makefile.config
- file. You may need to "make clean" before attempting to build after
- installing the dependencies.
-
- Run NetSurf by executing the "nsmonkey" command from within the build tree.
-
- $ ./nsmonkey
-
- If you are packaging NetSurf, do NOT package nsmonkey. It is a debug tool.
-
-
- Obtaining NetSurf's build dependencies
- ======================================
-
- Many of NetSurf's dependencies are packaged on various operating systems.
- The remainder must be installed manually. Currently, some of the libraries
- developed as part of the NetSurf project have not had official releases.
- Hopefully they will soon be released with downloadable tarballs and packaged
- in common distros. For now, you'll have to make do with Git checkouts.
-
- Some of NetSurf's own libraries will be installed in /usr/local/ by default.
- Fedora, and perhaps some other distributions of Linux, do not ship a
- pkg-config that will search here, so you will either need to change where
- these libraries install, or do the following before building NetSurf itself;
-
- $ PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
- $ export PKG_CONFIG_PATH
-
- Package installation
-----------------------
-
- Debian-like OS:
-
- $ apt-get install libcurl3-dev
-
- Recent OS versions might need libcurl4-dev instead of libcurl3-dev but
- note that when it has not been built with OpenSSL, the SSL_CTX is not
- available and results that certification details won't be presented in case
- they are invalid. But as this is currently unimplemented in the GTK
- flavour of NetSurf, this won't make a difference at all.
-
-
- The NetSurf project's libraries
- -------------------------------
-
- The NetSurf project has developed several libraries which are required by
- the browser. These are:
-
- LibParserUtils -- Parser building utility functions
- LibWapcaplet -- String internment
- Hubbub -- HTML5 compliant HTML parser
- LibCSS -- CSS parser and selection engine
- LibNSGIF -- GIF format image decoder
- LibNSBMP -- BMP and ICO format image decoder
- LibROSprite -- RISC OS Sprite format image decoder
-
- To fetch each of these libraries, run the appropriate commands from the
- Docs/LIBRARIES file.
-
- To build and install these libraries, simply enter each of their directories
- and run:
-
- $ sudo make install
-
- | Note: We advise enabling iconv() support in libparserutils, which vastly
- | increases the number of supported character sets. To do this,
- | create a file called Makefile.config.override in the libparserutils
- | directory, containing the following line:
- |
- | CFLAGS += -DWITH_ICONV_FILTER
- |
- | For more information, consult the libparserutils README file.
-
diff --git a/Docs/BUILDING-RISC_OS b/Docs/BUILDING-RISC_OS
deleted file mode 100644
index 7e61bd22f..000000000
--- a/Docs/BUILDING-RISC_OS
+++ /dev/null
@@ -1,121 +0,0 @@
---------------------------------------------------------------------------------
- Build Instructions for RISC OS NetSurf 16 July 2012
---------------------------------------------------------------------------------
-
- This document provides instructions for building the RISC OS NetSurf
- natively on a RISC OS computer and provides guidance on obtaining NetSurf's
- build dependencies.
-
- RISC OS NetSurf should work on RISC OS 4.02 and above.
-
- | Note: This guide assumes that you have the RISC OS SVN client installed,
- | and that you have used it to fetch the NetSurf source. It also
- | assumes that you have the following requirements installed:
- |
- | + OSLib 6.80 or later
- | + Perl 5.8.8 or later
- | + GCC 3.4.6 release 3 or later
- | + The latest NSTools
-
- If you want to cross-compile NetSurf for RISC OS, use the BUILDING-ROCross
- document.
-
-
- Building and executing NetSurf
-================================
-
- | Note: The version of make supplied with RISC OS GCC 3 is old and has a bug
- | that prevents NetSurf from building. Either ensure that NSTools is
- | seen before GCC, or replace the make inside "!GCC.bin" with the make
- | from "!NSTools.bin".
- | The minimum version of make that works is v3.81. You can check what
- | version you have by running, '*make --version'.
-
- | Note: The pre-built libraries currently supplied in NSTools are AOF format,
- | and will not work with GCC4, which requires them to be in ELF format.
- | If you want to build NetSurf with GCC4, you will need to build the
- | libraries yourself. See "Obtaining NetSurf's dependencies" below for
- | details.
-
- You can examine the contents of Makefile.defaults and enable and disable
- features as you see fit by creating a Makefile.config file. The default
- settings will work fine.
-
- You should then obtain NetSurf's dependencies, keeping in mind which options
- you have enabled in the configuration file. See the next section for
- specifics.
-
- Once done, to build RISC OS NetSurf on a RISC OS system, set the CSD to the
- directory containing the NetSurf sources, set the next slot to at least
- 6000K, and in a TaskWindow, simply run:
-
- *make
-
- If that produces errors, you probably don't have some of NetSurf's build
- dependencies installed, or your libraries may be out of date.
-
- See "Obtaining NetSurf's dependencies" below. Or turn off the complaining
- features in a Makefile.config file. You may need to "make clean" before
- attempting to build after installing the dependencies.
-
- Once NetSurf is compiled, the !RunImage is put into the !NetSurf
- application directory, so you can simply double click it as normal.
-
- To confirm that you're running your own development NetSurf build, view the
- Info window from the NetSurf iconbar menu. The Version string should read
-
- #.0 (Development)
-
- where # is the next major release version number.
-
-
- Obtaining NetSurf's build dependencies
-========================================
-
- NSTools contains all of the tools needed to build NetSurf, such as make,
- uname and ccres. It also contains pre-built libraries.
-
- Currently NSTools contains libraries which are in a format that are in a
- format which is compatible with RISC OS GCC3 but not RISC OS GCC4. Until
- NSTools is updated with GCC4 compatible libraries, it is recommended that
- you use GCC3 for native builds.
-
- The NSTools on the web site is not auto-built, so it may not always have
- the latest versions of the NetSurf project's own libraries. In this case
- you will need to build the libraries yourself and update your copy of
- NSTools.
-
- Fetching the sources
-----------------------
-
- Use SVN to obtain the latest versions of each of the libraries. To do this,
- set the CSD to a directory where you want to keep your copies of the library
- sources, and run the appropriate commands from the Docs/LIBRARIES file.
-
- The above will create a directory for each of the libraries containing their
- sources.
-
- | Note: We advise enabling iconv() support in libparserutils, which vastly
- | increases the number of supported character sets. To do this,
- | create a file called Makefile.config.override in the libparserutils
- | directory, containing the following line:
- |
- | CFLAGS += -DWITH_ICONV_FILTER
- |
- | For more information, consult the libparserutils README file.
-
- Updating NSTools' copies of the libraries
--------------------------------------------
-
- Set the CSD to the directory of the library you want to build, set your next
- slot to at least 6000K and in a TaskWindow, run
-
- *svn update
-
- This updates your local copy of the source to the latest version. To build
- and install the library into NSTools, run:
-
- *make install
-
- | Note: If you are using GCC3, you may get a warning from AR when you run
- | make. This can be ignored.
diff --git a/Docs/BUILDING-ROCross b/Docs/BUILDING-ROCross
index f82ff2ad7..e28847f8d 100644
--- a/Docs/BUILDING-ROCross
+++ b/Docs/BUILDING-ROCross
@@ -56,8 +56,6 @@
$ ../autobuilder/build libpng12-0
- $ ../autobuilder/build libmng1
-
$ ../autobuilder/build oslib
B. NetSurf libraries
diff --git a/Docs/Doxyfile b/Docs/Doxyfile
index 40102ea61..29bd573d1 100644
--- a/Docs/Doxyfile
+++ b/Docs/Doxyfile
@@ -703,7 +703,9 @@ INPUT_ENCODING = UTF-8
FILE_PATTERNS = *.c \
*.h \
*.y \
- *.l
+ *.l \
+ *.cpp \
+ *.m
# The RECURSIVE tag can be used to turn specify whether or not subdirectories
# should be searched for input files as well. Possible values are YES and NO.
@@ -717,12 +719,7 @@ RECURSIVE = NO
# Note that relative paths are relative to the directory from which doxygen is
# run.
-EXCLUDE = css/css_enum.c \
- css/css_enum.h \
- css/parser.c \
- css/parser.h \
- css/scanner.c \
- css/scanner.h
+EXCLUDE =
# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
# directories that are symbolic links (a Unix file system feature) are excluded
@@ -1788,7 +1785,7 @@ MSCFILE_DIRS =
# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
-DOT_GRAPH_MAX_NODES = 50
+DOT_GRAPH_MAX_NODES = 100
# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
# graphs generated by dot. A depth value of 3 means that only nodes reachable
diff --git a/Docs/QUICK-START b/Docs/QUICK-START
new file mode 100644
index 000000000..237027b71
--- /dev/null
+++ b/Docs/QUICK-START
@@ -0,0 +1,72 @@
+--------------------------------------------------------------------------------
+ Quick Build Steps for NetSurf 26 February 2014
+--------------------------------------------------------------------------------
+
+ This document provides steps for building NetSurf.
+
+
+ Grab a temporary env.sh
+--------------------------
+
+ $ wget http://git.netsurf-browser.org/netsurf.git/plain/Docs/env.sh
+ $ source env.sh
+
+
+ Install any packages you need
+-------------------------------
+
+ Installs all packages required to build NetSurf and the NetSurf project
+ libraries.
+
+ $ ns-package-install
+
+ If your package manager is not supported, you will have to install third
+ party packages manually.
+
+
+ Get the NetSurf project source code from Git
+----------------------------------------------
+
+ $ ns-clone
+
+
+ Build and install our project libraries
+-----------------------------------------
+
+ Updates NetSurf project library sources to latest, builds and installs them.
+
+ $ ns-pull-install
+
+
+ Switch to new NetSurf workspace
+---------------------------------
+
+ $ rm env.sh
+ $ cd ~/dev-netsurf/workspace
+ $ source env.sh
+
+
+ Build and run NetSurf
+-----------------------
+
+ $ cd netsurf
+
+ To build the native front end (the GTK front end on Linux, BSDs, etc) you
+ could do:
+
+ $ make
+ $ ./nsgtk
+
+ To build the framebuffer front end, you could do:
+
+ $ make TARGET=framebuffer
+ $ ./nsfb
+
+
+ Not working?
+==============
+
+ If the above steps are inapplicable, or don't work, you can build manually.
+ Follow the instructions in the BUILDING-* documents in the Docs/ directory
+ the NetSurf browser source tree.
+
diff --git a/Docs/env.sh b/Docs/env.sh
index db2729c0c..89f9add6a 100644
--- a/Docs/env.sh
+++ b/Docs/env.sh
@@ -22,13 +22,22 @@ if [ "x${TARGET_WORKSPACE}" = "x" ]; then
fi
if [ "x${USE_CPUS}" = "x" ]; then
- NCPUS=$(grep -c "^processor" /proc/cpuinfo 2>/dev/null)
+ NCPUS=$(getconf _NPROCESSORS_ONLN 2>/dev/null || getconf NPROCESSORS_ONLN 2>/dev/null)
NCPUS="${NCPUS:-1}"
NCPUS=$((NCPUS * 2))
USE_CPUS="-j${NCPUS}"
fi
+# The GTK version to build for (either 2 or 3 currently)
+if [ "x${NETSURF_GTK_MAJOR}" = "x" ]; then
+ NETSURF_GTK_MAJOR=3
+fi
+
+# The host system doing the building
+HOST_ABI=$(uname -s)
+
# setup environment
+echo "HOST_ABI=${HOST_ABI}"
echo "TARGET_ABI=${TARGET_ABI}"
echo "TARGET_WORKSPACE=${TARGET_WORKSPACE}"
echo "USE_CPUS=${USE_CPUS}"
@@ -37,27 +46,43 @@ export PREFIX=${TARGET_WORKSPACE}/inst-${TARGET_ABI}
export PKG_CONFIG_PATH=${PREFIX}/lib/pkgconfig:${PKG_CONFIG_PATH}::
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${PREFIX}/lib
export PATH=${PATH}:${PREFIX}/bin
+export NETSURF_GTK_MAJOR
+# NetSurf GIT repositories
NS_GIT="git://git.netsurf-browser.org"
+
# internal libraries all frontends require (order is important)
-NS_INTERNAL_LIBS="buildsystem libwapcaplet libparserutils libhubbub libdom libcss libnsgif libnsbmp libsvgtiny librosprite"
-# internal libraries only required by some frontends
-NS_FRONTEND_LIBS="libnsfb"
-# internal libraries required for the risc os target abi
-NS_RISCOS_LIBS="librufl libpencil"
-# tools required to build the browser
-NS_TOOLS="nsgenbind"
+NS_INTERNAL_LIBS="buildsystem libwapcaplet libparserutils libhubbub libdom libcss libnsgif libnsbmp"
+
# The browser itself
NS_BROWSER="netsurf"
-# deb packages
-NS_DEV_DEB="build-essential pkg-config git gperf"
-NS_TOOL_DEB="flex bison"
-NS_GTK_DEB="libgtk2.0-dev libcurl3-dev libmng-dev librsvg2-dev liblcms1-dev libjpeg-dev libmozjs-dev"
+# add target specific libraries
+if [ "x${TARGET_ABI}" = "xHaiku" ]; then
+ # tools required to build the browser
+ NS_TOOLS=""
+ NS_FRONTEND_LIBS=""
+elif [ "x${TARGET_ABI}" = "xriscos" ]; then
+ # tools required to build the browser
+ NS_TOOLS="nsgenbind"
+ # libraries required for the risc os target abi
+ NS_FRONTEND_LIBS="libsvgtiny librufl libpencil librosprite"
+else
+ # tools required to build the browser
+ NS_TOOLS="nsgenbind"
+ # internal libraries only required by some frontends
+ NS_FRONTEND_LIBS="libsvgtiny libnsfb"
+fi
+
+################ OS Package installation ################
-#add target specific libraries
-if [ "x${TARGET_ABI}" = "xriscos" ]; then
- NS_FRONTEND_LIBS="${NS_FRONTEND_LIBS} ${NS_RISCOS_LIBS}"
+# deb packages for dpkg based systems
+NS_DEV_DEB="build-essential pkg-config git gperf libcurl3-dev libpng-dev libjpeg-dev libmozjs185-dev"
+NS_TOOL_DEB="flex bison libhtml-parser-perl"
+if [ "x${NETSURF_GTK_MAJOR}" = "x3" ]; then
+ NS_GTK_DEB="libgtk-3-dev librsvg2-dev"
+else
+ NS_GTK_DEB="libgtk2.0-dev librsvg2-dev"
fi
# apt get commandline to install necessary dev packages
@@ -66,6 +91,63 @@ ns-apt-get-install()
sudo apt-get install $(echo ${NS_DEV_DEB} ${NS_TOOL_DEB} ${NS_GTK_DEB})
}
+# RPM packages for rpm based systems (tested on fedora 20)
+NS_DEV_RPM="git gcc pkgconfig libexpat-devel openssl-devel js-devel-1.8.5 libcurl-devel perl-Digest-MD5-File libjpeg-devel libpng-devel"
+NS_TOOL_RPM="flex bison"
+if [ "x${NETSURF_GTK_MAJOR}" = "x3" ]; then
+ NS_GTK_RPM="gtk3-devel librsvg2-devel"
+else
+ NS_GTK_RPM="gtk2-devel librsvg2-devel"
+fi
+
+# yum commandline to install necessary dev packages
+ns-yum-install()
+{
+ sudo yum -y install $(echo ${NS_DEV_RPM} ${NS_TOOL_RPM} ${NS_GTK_RPM})
+}
+
+# Haiku secondary arch suffix:
+# empty for primary (gcc2 on x86),
+# "_x86" for gcc4 secondary.
+HA=
+# Haiku packages
+NS_DEV_HPKG="curl${HA}_devel libpng${HA}_devel jpeg${HA}_devel openssl${HA}_devel libiconv${HA}_devel expat${HA}_devel pkgconfig${HA} gperf${HA}"
+
+# pkgman commandline to install necessary dev packages
+ns-pkgman-install()
+{
+ pkgman install $(echo ${NS_DEV_HPKG})
+}
+
+# generic for help text
+NS_DEV_GEN="git, gcc, pkgconfig, expat library, openssl library, spidermonkey-1.8.5 library, libcurl, perl, perl MD5 digest, libjpeg library, libpng library"
+NS_TOOL_GEN="flex tool, bison tool"
+if [ "x${NETSURF_GTK_MAJOR}" = "x3" ]; then
+ NS_GTK_GEN="gtk+ 3 toolkit library, librsvg2 library"
+else
+ NS_GTK_GEN="gtk+ 2 toolkit library, librsvg2 library"
+fi
+
+
+# Genertic OS package install
+# looks for package managers and tries to use them if present
+ns-package-install()
+{
+ if [ -x "/usr/bin/apt-get" ]; then
+ ns-apt-get-install
+ elif [ -x "/usr/bin/yum" ]; then
+ ns-yum-install
+ elif [ -x "/bin/pkgman" ]; then
+ ns-pkgman-install
+ else
+ echo "Unable to determine OS packaging system in use."
+ echo "Please ensure development packages are installed for:"
+ echo ${NS_DEV_GEN}"," ${NS_TOOL_GEN}"," ${NS_GTK_GEN}
+ fi
+}
+
+################ Development helpers ################
+
# git pull in all repos parameters are passed to git pull
ns-pull()
{
@@ -107,7 +189,7 @@ ns-make-libs()
done
}
-# issues a make command to all libraries
+# issues a make command for framebuffer libraries
ns-make-libnsfb()
{
echo " MAKE: make -C libnsfb $USE_CPUS $*"
diff --git a/Docs/source-object-backing-store b/Docs/source-object-backing-store
new file mode 100644
index 000000000..5d4d3049d
--- /dev/null
+++ b/Docs/source-object-backing-store
@@ -0,0 +1,204 @@
+Source Object (low level) cache backing store
+=============================================
+
+Introduction
+------------
+
+The source object cache provides a system to extend the life of source
+objects (html files, images etc.) after they are no longer immediately
+being used.
+
+Only fetch types where we have well defined rules on caching are
+considered, in practice this limits us to HTTP(S). The section in
+RFC2616 [1] on caching specifies these rules.
+
+To futher extend the objects lifetime they can be pushed into a
+backing store where the objects are available for reuse less quickly
+than from RAM but faster than retriving from the network again.
+
+The backing store implementation provides a key:value infrastructure
+with a simple store, retrive and invalidate interface.
+
+Generic filesystem backing store
+--------------------------------
+
+Although the backing store interface is fully pluggable a generic
+implementation based on storing objects on the filesystem in a
+heirachy of directories.
+
+The option to alter the backing store format exists and is controled
+by a version field. It is implementation defined what happens if a
+version mis-match occours.
+
+As the backing store only holds cache data one should not expect a
+great deal of effort to be expended converting formats (i.e. the cache
+may simply be discarded).
+
+Layout version 1.1
+------------------
+
+An object has an identifier value generated from the url (NetSurf
+backing stores uses the url as the unique key). The value used is
+obtained using nsurl_hash() which is currently a 32 bit FNV so is
+directly usable.
+
+This identifier is adequate to ensure the collision rate for the
+hashed url values (a collision for every 2^16 urls added) is
+sufficiently low the overhead of returning the wrong object (which
+backing stores are permitted to do) is not significat.
+
+An entry list is maintained which contains all the metadata about a
+given identifier. This list is limited in length to constrain the
+resources necessary to maintain it. It is made persistant to avoid the
+overhead of reconstructing it at initialisation and to keep the data
+used to improve the eviction decisions.
+
+Each object is stored and retrived directly into the filesystem using
+a filename generated from a RFC4648 base32 encoding of an address
+value. The objects address is derived from the identifier by cropping
+it to a shorter length.
+
+A mapping between the object address and its entry is maintained which
+uses storage directly proportional to the size of the address length.
+
+The cropping length is stored in the control file with the default
+values set at compile time. This allows existing backing stores to
+continue operating with existing data independantly of new default
+setting. This setting gives some ability to tune the default cache
+index size to values suitable for a specific host operating system.
+
+E.g. Linux based systems can easily cope with several megabytes of
+mmaped index but RISC OS might want to limit this to a few megabytes
+of heap at most.
+
+The files are stored on disc using their base32 address value.
+By creating a directory for each character of the encoded filename
+(except the last which is of course the leafname) we create a
+directory structure where no directory has more than 32 entries.
+
+E.g. A 19bit address of 0x1 would be base32 encoded into AAAB
+resulting in the data being stored in a file path of
+"/store/prefix/d/B/A/A/BAAAAA".
+
+An address of 0x00040001 encodes to BAAB and a file path of
+"/store/prefix/m/B/A/A/BAABAAA"
+
+Version 1.0
+-----------
+
+The version 1 layout was identical to the 1.1 except base64url
+encoding was used, this proved problematic as some systems filesystems
+were case insensitive so upper and lower case letetrs collided.
+
+There is no upgrade provision from the previous version simply delete
+the cache directory.
+
+Control files
+~~~~~~~~~~~~~
+
+control
++++++++
+A control file is used to hold a list of values describing how the
+other files in the backing store should be used.
+
+entries
++++++++
+
+this file contains a table of entries describing the files held on the
+filesystem.
+
+Each control file table entry is 28 bytes and consists of
+
+ - signed 64 bit value for last use time
+
+ - 32bit full url hash allowing for index reconstruction and
+ addiitonal collision detection. Also the possibility of increasing
+ the ADDRESS_LENGTH although this would require renaming all the
+ existing files in the cache and is not currently implemented.
+
+ - unsigned 32bit length for data
+
+ - unsigned 32bit length for metadata
+
+ - unsigned 16bit value for number of times used.
+
+ - unsigned 16bit value for flags
+
+ - unsigned 16bit value for data block index (unused)
+
+ - unsigned 16bit value for metatdata block index (unused)
+
+Address to entry index
+~~~~~~~~~~~~~~~~~~~~~~
+
+An entry index is held in RAM that allows looking up the address to
+map to an entry in the control file.
+
+The index is the only data structure whose size is directly depndant
+on the length of the hash specificaly:
+
+(2 ^ (ADDRESS_BITS - 3)) * ENTRY_BITS) in bytes
+
+where ADDRESS_BITS is how long the address is in bits and ENTRY_BITS
+is how many entries the control file (and hence the while
+cache) may hold.
+
+RISCOS values
++++++++++++++
+
+By limiting the ENTRY_BITS size to 14 (16,384 entries) the entries
+list is limited to 448kilobytes.
+
+The typical values for RISC OS would set ADDRESS_BITS to 18. This
+spreads the entries over 262144 hash values which uses 512 kilobytes
+for the index. Limiting the hash space like this reduces the
+efectiveness of the cache.
+
+A small ADDRESS_LENGTH causes a collision (two urls with the same
+address) to happen roughly for every 2 ^ (ADDRESS_BITS / 2) = 2 ^ 9 =
+512 objects stored. This roughly translates to a cache miss due to
+collision every ten pages navigated to.
+
+Larger systems
+++++++++++++++
+
+In general ENTRY_BITS set to 16 as this limits the store to 65536
+objects which given the average size of an object at 8 kilobytes
+yeilds half a gigabyte of disc used which is judged to be sufficient.
+
+For larger systems e.g. those using GTK frontend we would most likely
+select ADDRESS_BITS as 22 resulting in a collision every 2048 objects
+but the index using some 8 Megabytes
+
+Typical values
+--------------
+
+Example 1
+~~~~~~~~~
+
+For a store with 1034 objects genrated from a random navigation of
+pages linked from the about:welcome page.
+
+Metadata total size is 593608 bytes an average of 574 bytes. The
+majority of the storage is used to hold the urls and headers.
+
+Data total size is 9180475 bytes a mean of 8879 bytes 1648726 in the
+largest 10 entries which if excluded gives 7355 bytes average size
+
+Example 2
+~~~~~~~~~
+
+355 pages navigated in 80 minutes from about:welcome page and a
+handful of additional sites (google image search and reddit)
+
+2018 objects in cache at quit. 400 objects from news.bbc.co.uk alone
+
+Metadata total 987,439 bytes mean of 489 bytes
+
+data total 33,127,831 bytes mean of 16,416 bytes
+
+with one single 5,000,811 byte gif
+
+data totals without gif is 28,127,020 mean 13,945
+
+[1] http://tools.ietf.org/html/rfc2616#section-13 \ No newline at end of file
diff --git a/Makefile b/Makefile
index 32b1afd07..4fe22e2a3 100644
--- a/Makefile
+++ b/Makefile
@@ -70,6 +70,9 @@ else
ifeq ($(TARGET),)
TARGET := beos
endif
+ ifeq ($(TARGET),haiku)
+ TARGET := beos
+ endif
else
ifeq ($(HOST),AmigaOS)
HOST := amiga
@@ -131,14 +134,20 @@ ifneq ($(TARGET),riscos)
endif
endif
-Q=@
-VQ=@
PERL=perl
MKDIR=mkdir
TOUCH=touch
STRIP=strip
SPLIT_MESSAGES=$(PERL) utils/split-messages.pl
+# build verbosity
+ifeq ($(V),1)
+ Q:=
+else
+ Q=@
+endif
+VQ=@
+
# Override this only if the host compiler is called something different
HOST_CC := gcc
@@ -314,6 +323,8 @@ DEPROOT := $(OBJROOT)/deps
TOOLROOT := $(OBJROOT)/tools
+# A macro that conditionaly adds flags to the build when a feature is enabled.
+#
# 1: Feature name (ie, NETSURF_USE_BMP -> BMP)
# 2: Parameters to add to CFLAGS
# 3: Parameters to add to LDFLAGS
@@ -321,6 +332,7 @@ TOOLROOT := $(OBJROOT)/tools
define feature_enabled
ifeq ($$(NETSURF_USE_$(1)),YES)
CFLAGS += $(2)
+ CXXFLAGS += $(2)
LDFLAGS += $(3)
ifneq ($(MAKECMDGOALS),clean)
$$(info M.CONFIG: $(4) enabled (NETSURF_USE_$(1) := YES))
@@ -335,6 +347,35 @@ define feature_enabled
endif
endef
+# A macro that conditionaly adds flags to the build with a uniform display.
+#
+# 1: Feature name (ie, NETSURF_USE_BMP -> BMP)
+# 2: Human-readable name for the feature
+# 3: Parameters to add to CFLAGS when enabled
+# 4: Parameters to add to LDFLAGS when enabled
+# 5: Parameters to add to CFLAGS when disabled
+# 6: Parameters to add to LDFLAGS when disabled
+define feature_switch
+ ifeq ($$(NETSURF_USE_$(1)),YES)
+ CFLAGS += $(3)
+ CXXFLAGS += $(3)
+ LDFLAGS += $(4)
+ ifneq ($(MAKECMDGOALS),clean)
+ $$(info M.CONFIG: $(2) enabled (NETSURF_USE_$(1) := YES))
+ endif
+ else ifeq ($$(NETSURF_USE_$(1)),NO)
+ CFLAGS += $(5)
+ CXXFLAGS += $(5)
+ LDFLAGS += $(6)
+ ifneq ($(MAKECMDGOALS),clean)
+ $$(info M.CONFIG: $(2) disabled (NETSURF_USE_$(1) := NO))
+ endif
+ else
+ $$(info M.CONFIG: $(4) error (NETSURF_USE_$(1) := $$(NETSURF_USE_$(1))))
+ $$(error NETSURF_USE_$(1) must be YES or NO)
+ endif
+endef
+
# Extend flags with appropriate values from pkg-config for enabled features
#
# 1: pkg-config required modules for feature
@@ -348,6 +389,7 @@ define pkg_config_find_and_add
ifeq ($$(PKG_CONFIG_$(1)_EXISTS),yes)
CFLAGS += $$(shell $$(PKG_CONFIG) --cflags $(1))
+ CXXFLAGS += $$(shell $$(PKG_CONFIG) --cflags $(1))
LDFLAGS += $$(shell $$(PKG_CONFIG) --libs $(1))
ifneq ($(MAKECMDGOALS),clean)
$$(info PKG.CNFG: $(2) ($(1)) enabled)
@@ -375,6 +417,7 @@ define pkg_config_find_and_add_enabled
ifeq ($$(NETSURF_USE_$(1)),YES)
ifeq ($$(NETSURF_FEATURE_$(1)_AVAILABLE),yes)
CFLAGS += $$(shell $$(PKG_CONFIG) --cflags $(2)) $$(NETSURF_FEATURE_$(1)_CFLAGS)
+ CXXFLAGS += $$(shell $$(PKG_CONFIG) --cflags $(2)) $$(NETSURF_FEATURE_$(1)_CFLAGS)
LDFLAGS += $$(shell $$(PKG_CONFIG) --libs $(2)) $$(NETSURF_FEATURE_$(1)_LDFLAGS)
ifneq ($(MAKECMDGOALS),clean)
$$(info M.CONFIG: $(3) ($(2)) enabled (NETSURF_USE_$(1) := YES))
@@ -388,6 +431,7 @@ define pkg_config_find_and_add_enabled
else ifeq ($$(NETSURF_USE_$(1)),AUTO)
ifeq ($$(NETSURF_FEATURE_$(1)_AVAILABLE),yes)
CFLAGS += $$(shell $$(PKG_CONFIG) --cflags $(2)) $$(NETSURF_FEATURE_$(1)_CFLAGS)
+ CXXFLAGS += $$(shell $$(PKG_CONFIG) --cflags $(2)) $$(NETSURF_FEATURE_$(1)_CFLAGS)
LDFLAGS += $$(shell $$(PKG_CONFIG) --libs $(2)) $$(NETSURF_FEATURE_$(1)_LDFLAGS)
ifneq ($(MAKECMDGOALS),clean)
$$(info M.CONFIG: $(3) ($(2)) auto-enabled (NETSURF_USE_$(1) := AUTO))
@@ -415,39 +459,57 @@ endef
# General flag setup
# ----------------------------------------------------------------------------
-# Set up the WARNFLAGS here so that they can be overridden in the Makefile.config
-WARNFLAGS = -W -Wall -Wundef -Wpointer-arith \
- -Wcast-align -Wwrite-strings -Wstrict-prototypes \
- -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls \
- -Wnested-externs -Wuninitialized
+# Set up the warning flags here so that they can be overridden in the
+# Makefile.config
+COMMON_WARNFLAGS = -W -Wall -Wundef -Wpointer-arith -Wcast-align \
+ -Wwrite-strings -Wmissing-declarations -Wuninitialized
ifneq ($(CC_MAJOR),2)
- WARNFLAGS += -Wno-unused-parameter
+ COMMON_WARNFLAGS += -Wno-unused-parameter
endif
# deal with lots of unwanted warnings from javascript
ifeq ($(call cc_ver_ge,4,6),1)
- WARNFLAGS += -Wno-unused-but-set-variable
+ COMMON_WARNFLAGS += -Wno-unused-but-set-variable
+endif
+# deal with chaging warning flags on differing HOST systems
+ifeq ($(HOST),OpenBSD)
+ # OpenBSD headers are not compatible with redundant declaration warning
+ COMMON_WARNFLAGS += -Wno-redundant-decls
+else
+ COMMON_WARNFLAGS += -Wredundant-decls
endif
+# c++ default warning flags
+CXXWARNFLAGS :=
+
+# C default warning flags
+CWARNFLAGS := -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs
+
# Pull in the configuration
include Makefile.defaults
-$(eval $(call feature_enabled,JPEG,-DWITH_JPEG,-ljpeg,JPEG (libjpeg)))
-$(eval $(call feature_enabled,MNG,-DWITH_MNG,-lmng,JNG/MNG/PNG (libmng)))
+# Build flags for libjpeg as it has no pkgconfig file
+$(eval $(call feature_switch,JPEG,JPEG (libjpeg),-DWITH_JPEG,-ljpeg,-UWITH_JPEG,))
-$(eval $(call feature_enabled,HARU_PDF,-DWITH_PDF_EXPORT,-lhpdf -lpng,PDF export (haru)))
-$(eval $(call feature_enabled,LIBICONV_PLUG,-DLIBICONV_PLUG,,glibc internal iconv))
+# Build flags for haru
+$(eval $(call feature_switch,HARU_PDF,PDF export (haru),-DWITH_PDF_EXPORT,-lhpdf -lpng,-UWITH_PDF_EXPORT,))
+
+# Build flags for iconv
+$(eval $(call feature_switch,LIBICONV_PLUG,glibc internal iconv,-DLIBICONV_PLUG,,-ULIBICONV_PLUG,-liconv))
# common libraries without pkg-config support
LDFLAGS += -lz
# add top level and build directory to include search path
CFLAGS += -I. -I$(OBJROOT)
+CXXFLAGS += -I. -I$(OBJROOT)
# export the user agent format
CFLAGS += -DNETSURF_UA_FORMAT_STRING=\"$(NETSURF_UA_FORMAT_STRING)\"
+CXXFLAGS += -DNETSURF_UA_FORMAT_STRING=\"$(NETSURF_UA_FORMAT_STRING)\"
# set the default homepage to use
CFLAGS += -DNETSURF_HOMEPAGE=\"$(NETSURF_HOMEPAGE)\"
+CXXFLAGS += -DNETSURF_HOMEPAGE=\"$(NETSURF_HOMEPAGE)\"
# ----------------------------------------------------------------------------
# General make rules
@@ -556,7 +618,7 @@ ifeq ($(TARGET),beos)
$(Q)$(BEOS_SETVER) $(EXETARGET) \
-app $(VERSION_MAJ) $(VERSION_MIN) 0 d 0 \
-short "NetSurf $(VERSION_FULL)" \
- -long "NetSurf $(VERSION_FULL) © 2003 - 2013 The NetSurf Developers"
+ -long "NetSurf $(VERSION_FULL) © 2003 - 2014 The NetSurf Developers"
$(VQ)echo " MIMESET: $(EXETARGET)"
$(Q)$(BEOS_MIMESET) $(EXETARGET)
endif
@@ -610,26 +672,24 @@ clean-target:
$(call clean_install_messages, !NetSurf/Resources)
clean-testament:
- $(VQ)echo " CLEAN: utils/testament.h"
- $(Q)$(RM) utils/testament.h
+ $(VQ)echo " CLEAN: testament.h"
+ $(Q)$(RM) $(OBJROOT)/testament.h
clean-builddir:
$(VQ)echo " CLEAN: $(OBJROOT)"
$(Q)$(RM) -r $(OBJROOT)
CLEANS += clean-builddir
-all-program: $(EXETARGET) post-exe
- $(call split_install_messages, any, !NetSurf/Resources)
-.PHONY: testament
-testament utils/testament.h:
- $(Q)if test -d .svn; then \
- $(PERL) utils/svn-testament.pl $(CURDIR) utils/testament.h; \
- else \
- $(PERL) utils/git-testament.pl $(CURDIR) utils/testament.h; \
- fi
+.PHONY: all-program all-messages testament
-post-exe: $(POSTEXES)
+testament $(OBJROOT)/testament.h:
+ $(Q)$(PERL) utils/git-testament.pl $(CURDIR) $(OBJROOT)/testament.h
+
+all-messages:
+ $(call split_install_messages, any, !NetSurf/Resources)
+
+all-program: all-messages $(EXETARGET) $(POSTEXES)
.SUFFIXES:
@@ -668,7 +728,7 @@ $$(DEPROOT)/$(3) $$(OBJROOT)/$(2): $$(OBJROOT)/created
> $$(DEPROOT)/$(3)
$$(VQ)echo " COMPILE: $(1)"
$$(Q)$$(RM) $$(OBJROOT)/$(2)
- $$(Q)$$(CC) $$(CFLAGS) -o $$(OBJROOT)/$(2) -c $(1)
+ $$(Q)$$(CC) $$(CFLAGS) $$(COMMON_WARNFLAGS) $$(CWARNFLAGS) -o $$(OBJROOT)/$(2) -c $(1)
endef
else
@@ -677,7 +737,8 @@ $$(DEPROOT)/$(3) $$(OBJROOT)/$(2): $$(OBJROOT)/created
$$(VQ)echo " COMPILE: $(1)"
$$(Q)$$(RM) $$(DEPROOT)/$(3)
$$(Q)$$(RM) $$(OBJROOT)/$(2)
- $$(Q)$$(CC) $$(CFLAGS) -MMD -MT '$$(DEPROOT)/$(3) $$(OBJROOT)/$(2)' \
+ $$(Q)$$(CC) $$(CFLAGS) $$(COMMON_WARNFLAGS) $$(CWARNFLAGS) \
+ -MMD -MT '$$(DEPROOT)/$(3) $$(OBJROOT)/$(2)' \
-MF $$(DEPROOT)/$(3) -o $$(OBJROOT)/$(2) -c $(1)
endef
@@ -687,12 +748,12 @@ define compile_target_cpp
$$(DEPROOT)/$(3) $$(OBJROOT)/$(2): $$(OBJROOT)/created
$$(VQ)echo " DEP: $(1)"
$$(Q)$$(RM) $$(DEPROOT)/$(3)
- $$(Q)$$(CC) $$(CFLAGS) -MM \
+ $$(Q)$$(CC) $$(CFLAGS) $$(COMMON_WARNFLAGS) $$(CXXWARNFLAGS) -MM \
$(1) | sed 's,^.*:,$$(DEPROOT)/$(3) $$(OBJROOT)/$(2):,' \
> $$(DEPROOT)/$(3)
$$(VQ)echo " COMPILE: $(1)"
$$(Q)$$(RM) $$(OBJROOT)/$(2)
- $$(Q)$$(CXX) $$(CFLAGS) -o $$(OBJROOT)/$(2) -c $(1)
+ $$(Q)$$(CXX) $$(CXXFLAGS) $$(COMMON_WARNFLAGS) $$(CXXWARNFLAGS) -o $$(OBJROOT)/$(2) -c $(1)
endef
diff --git a/Makefile.config.example b/Makefile.config.example
index a142d4610..8737e5372 100644
--- a/Makefile.config.example
+++ b/Makefile.config.example
@@ -8,10 +8,9 @@
# To see the available config options, look at Makefile.defaults, but make any
# alterations in your Makefile.config
-
-### To enable/disable MNG support, uncomment the appropriate line below.
-# override NETSURF_USE_MNG := YES
-# override NETSURF_USE_MNG := NO
+### To enable/disable PNG support, uncomment the appropriate line below.
+# override NETSURF_USE_PNG := YES
+# override NETSURF_USE_PNG := NO
### To enable/disable SVGTiny support, uncomment the appropriate line below.
# override NETSURF_USE_NSSVG := YES
diff --git a/Makefile.defaults b/Makefile.defaults
index 515f4a042..45a3a2067 100644
--- a/Makefile.defaults
+++ b/Makefile.defaults
@@ -43,16 +43,10 @@ NETSURF_USE_GIF := YES
# Valid options: YES, NO (highly recommended)
NETSURF_USE_JPEG := YES
-# Enable NetSurf's use of libpng for displaying PNGs. If MNG and PNG
-# are both enabled then NetSurf will choose libpng for PNGs, leaving
-# MNGs and JNGs to libmng.
-# Valid options: YES, NO (at least one of PNG/MNG highly recommended)
+# Enable NetSurf's use of libpng for displaying PNGs.
+# Valid options: YES, NO (highly recommended)
NETSURF_USE_PNG := YES
-# Enable NetSurf's use of libmng for displaying MNGs, JNGs and PNGs
-# Valid options: YES, NO (at least one of PNG/MNG highly recommended)
-NETSURF_USE_MNG := YES
-
# Enable NetSurf's use of libwebp for displaying WebPs
# Valid options: YES, NO
NETSURF_USE_WEBP := NO
@@ -92,9 +86,17 @@ NETSURF_HOMEPAGE := "about:welcome"
# Valid options: YES, NO
NETSURF_USE_LIBICONV_PLUG := YES
+# Enable building the source object cache filesystem based backing store.
+# implementation.
+# Valid options: YES, NO
+NETSURF_FS_BACKING_STORE := NO
+
# Initial CFLAGS. Optimisation level etc. tend to be target specific.
CFLAGS :=
+# Initial CXXFLAGS. Optimisation level etc. tend to be target specific.
+CXXFLAGS :=
+
# Default installation/execution prefix
PREFIX ?= /usr/local
diff --git a/README b/README
index fa8ec6c80..f983b9e27 100644
--- a/README
+++ b/README
@@ -8,8 +8,7 @@
Building NetSurf
==================
- Read the appropriate BUILDING-* document in the Docs/ directory for
- instructions.
+ Read the QUICK-START document in the Docs/ directory for instructions.
Creating a new port
diff --git a/amiga/Makefile.defaults b/amiga/Makefile.defaults
index 5ff1b69c3..20022bb98 100644
--- a/amiga/Makefile.defaults
+++ b/amiga/Makefile.defaults
@@ -2,45 +2,40 @@
# Amiga-specific options
# ----------------------------------------------------------------------------
- # Force using glibc internal iconv implementation instead of external libiconv
- # Valid options: YES, NO
- NETSURF_USE_LIBICONV_PLUG := YES
-
- # Enable NetSurf's use of librosprite for displaying RISC OS Sprites
- # Valid options: YES, NO, AUTO
- NETSURF_USE_ROSPRITE := NO
-
- # Enable NetSurf's use of libmng for displaying MNGs, JNGs and PNGs
- # Valid options: YES, NO (at least one of PNG/MNG/DT highly recommended)
- NETSURF_USE_MNG := NO
-
- # Enable NetSurf's use of libwebp for displaying WebPs
- # Valid options: YES, NO
- NETSURF_USE_WEBP := NO
-
- # Enable NetSurf to display Amiga icons
- # Valid options: YES, NO (recommended)
- NETSURF_USE_AMIGA_ICON := YES
-
- # Enable NetSurf's use of DataTypes for unknown filetypes
- # Valid options: YES, NO
- NETSURF_USE_AMIGA_DATATYPES := YES
-
- # Enable NetSurf's use of libsvgtiny for displaying SVGs
- # Valid options: YES, NO
- NETSURF_USE_NSSVG := YES
-
- # Enable NetSurf's use of libcairo for some plotter functions
- # This will also link NetSurf with shared objects, and
- # requires AmigaOS 4.1 or higher to run the resulting executable
- # Valid options: YES, NO, AUTO
- NETSURF_USE_AMIGA_CAIRO := AUTO
-
- # Enable NetSurf's use of Spidermonkey 1.80+
- # Only here to stop the build complaining;
- # enable NETSURF_USE_MOZJS instead for JavaScript support
- # Valid options: NO
- NETSURF_USE_JS := NO
-
- # Optimisation levels
- CFLAGS += -O2 -gstabs
+# Force using glibc internal iconv implementation instead of external libiconv
+# Valid options: YES, NO
+NETSURF_USE_LIBICONV_PLUG := YES
+
+# Enable NetSurf's use of librosprite for displaying RISC OS Sprites
+# Valid options: YES, NO, AUTO
+NETSURF_USE_ROSPRITE := NO
+
+# Enable NetSurf's use of libwebp for displaying WebPs
+# Valid options: YES, NO
+NETSURF_USE_WEBP := NO
+
+# Enable NetSurf to display Amiga icons
+# Valid options: YES, NO (recommended)
+NETSURF_USE_AMIGA_ICON := YES
+
+# Enable NetSurf's use of DataTypes for unknown filetypes
+# Valid options: YES, NO
+NETSURF_USE_AMIGA_DATATYPES := YES
+
+# Enable NetSurf's use of libsvgtiny for displaying SVGs
+# Valid options: YES, NO
+NETSURF_USE_NSSVG := YES
+
+# Enable building the source object cache filesystem based backing store.
+# Valid options: YES, NO
+NETSURF_FS_BACKING_STORE := YES
+
+# Enable NetSurf's use of Spidermonkey 1.80+
+# Only here to stop the build complaining;
+# enable NETSURF_USE_MOZJS instead for JavaScript support
+# Valid options: NO
+NETSURF_USE_JS := NO
+
+# Optimisation levels
+CFLAGS += -O2 -gstabs
+
diff --git a/amiga/Makefile.target b/amiga/Makefile.target
index da9b252c9..ea765af36 100644
--- a/amiga/Makefile.target
+++ b/amiga/Makefile.target
@@ -2,7 +2,7 @@
# Amiga target setup
# ----------------------------------------------------------------------------
-CFLAGS += -std=c99 -Dnsamiga -DFETCHER_CURLL_SCHEDULED
+CFLAGS += -std=c99 -Dnsamiga
ifneq ($(SUBTARGET),os3)
CFLAGS += -U__STRICT_ANSI__ -D__USE_INLINE__ -D__USE_BASETYPE__
@@ -15,7 +15,6 @@ NETSURF_FEATURE_PNG_CFLAGS := -DWITH_PNG
NETSURF_FEATURE_WEBP_CFLAGS := -DWITH_WEBP
NETSURF_FEATURE_NSSVG_CFLAGS := -DWITH_NS_SVG
NETSURF_FEATURE_VIDEO_CFLAGS := -DWITH_VIDEO
-NETSURF_FEATURE_AMIGA_CAIRO_CFLAGS := -DNS_AMIGA_CAIRO
ifeq ($(HOST),amiga)
$(eval $(call feature_enabled,ROSPRITE,-DWITH_NSSPRITE,-lrosprite,Sprite (librosprite)))
@@ -23,30 +22,23 @@ ifeq ($(HOST),amiga)
$(eval $(call feature_enabled,GIF,-DWITH_GIF,-lnsgif,GIF (libnsgif)))
$(eval $(call feature_enabled,PNG,-DWITH_PNG,-lpng,PNG (libpng) ))
$(eval $(call feature_enabled,NSSVG,-DWITH_NS_SVG,-lsvgtiny,SVG (libsvgtiny)))
- $(eval $(call feature_enabled,MNG,,-llcms -ljpeg,PNG/JNG/MNG (libmng)))
$(eval $(call feature_enabled,WEBP,-DWITH_WEBP,-lwebp,WebP (libwebp)))
$(eval $(call feature_enabled,VIDEO,-DWITH_VIDEO -I /SDK/local/newlib/include/glib-2.0,-lgstreamer-0.10 -lglib-2.0 -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lintl -lffi,Video (libgstreamer)))
$(eval $(call feature_enabled,JS,-DXP_UNIX -DWITH_JS -DJS_VERSION=185,-lstdc++ -lmozjs185,JavaScript))
$(eval $(call feature_enabled,MOZJS,-DXP_AMIGA -DWITH_MOZJS -DJS_VERSION=170 -DJSVERSION_LATEST=170 -DJSOPTION_JIT=0 -DJSCLASS_GLOBAL_FLAGS=0,-ljs -lfdlibm,JavaScript))
- $(eval $(call feature_enabled,AMIGA_CAIRO,-DNS_AMIGA_CAIRO,,Cairo))
$(eval $(call feature_enabled,AMIGA_ICON,-DWITH_AMIGA_ICON,,Amiga icon))
$(eval $(call feature_enabled,AMIGA_DATATYPES,-DWITH_AMIGA_DATATYPES,,DataTypes))
CFLAGS += -I /SDK/local/common/include/libpng12
LDFLAGS += -lcurl -lrtmp -lpthread -ltre -lintl -lauto -lpbl
LDFLAGS += -lssl -lcrypto -ldom -lhubbub -lcss -lparserutils -lwapcaplet
-
- ifeq ($(NETSURF_USE_AMIGA_CAIRO),YES)
- CFLAGS += -I /SDK/local/common/include/cairo
- LDFLAGS += -use-dynld -ldl -lcairo -lpixman-1 -lfreetype -lfontconfig -lpng -lexpat
- endif
else
$(eval $(call pkg_config_find_and_add_enabled,ROSPRITE,librosprite,Sprite))
$(eval $(call pkg_config_find_and_add_enabled,BMP,libnsbmp,BMP))
$(eval $(call pkg_config_find_and_add_enabled,GIF,libnsgif,GIF))
$(eval $(call pkg_config_find_and_add_enabled,PNG,libpng,PNG))
$(eval $(call pkg_config_find_and_add_enabled,NSSVG,libsvgtiny,NSSVG))
- $(eval $(call pkg_config_find_and_add_enabled,AMIGA_CAIRO,cairo,Cairo))
+ $(eval $(call feature_enabled,MOZJS,-DXP_AMIGA -DWITH_MOZJS -DJS_VERSION=170 -DJSVERSION_LATEST=170 -DJSOPTION_JIT=0 -DJSCLASS_GLOBAL_FLAGS=0,-ljs,JavaScript))
$(eval $(call feature_enabled,AMIGA_ICON,-DWITH_AMIGA_ICON,,Amiga icon))
$(eval $(call feature_enabled,AMIGA_DATATYPES,-DWITH_AMIGA_DATATYPES,,DataTypes))
@@ -54,7 +46,7 @@ else
CFLAGS += $(shell $(PKG_CONFIG) --cflags libcurl openssl)
CFLAGS += $(shell $(PKG_CONFIG) --cflags tre libdom libcss)
- LDFLAGS += $(shell $(PKG_CONFIG) --libs libcurl openssl)
+ LDFLAGS += $(shell $(PKG_CONFIG) --static --libs libcurl openssl)
LDFLAGS += $(shell $(PKG_CONFIG) --libs tre libdom libcss)
LDFLAGS += -L$(GCCSDK_INSTALL_ENV)/lib
@@ -109,7 +101,7 @@ AMIGA_LIBRARIES := parserutils.library nsgif.library nsbmp.library iconv.library
AMIGA_LIBS := $(addprefix /Libs/,$(AMIGA_LIBRARIES))
AMIGA_SHARED_OBJS := libjpeg.so.12 libcurl.so.7 librtmp.so.0 libsvgtiny.so.0 \
libssl.so.1.0.0 libcrypto.so.1.0.0 libcss.so.0 libwapcaplet.so.0 libpng12.so \
- libdom.so.0 libhubbub.so.0 libtre.so.5 libintl.so
+ libdom.so.0 libhubbub.so.0 libtre.so.5 libintl.so libparserutils.so.0
AMIGA_SOBJS := $(addprefix /SObjs/,$(AMIGA_SHARED_OBJS))
AMIGA_DISTRIBUTION_FILES := amiga/dist/*
AMIGA_INSTALL_TARGET_DIR := NetSurf_Amiga
diff --git a/amiga/agclass/amigaguide_class.c b/amiga/agclass/amigaguide_class.c
index dfac7ad7a..9d69e96c2 100755..100644
--- a/amiga/agclass/amigaguide_class.c
+++ b/amiga/agclass/amigaguide_class.c
@@ -8,6 +8,8 @@
#include "amigaguide_class.h"
+
+
struct localObjectData
{
struct NewAmigaGuide nag;
@@ -15,7 +17,6 @@ struct localObjectData
AMIGAGUIDECONTEXT agHandle;
uint32 agContextID;
uint32 agSignal;
- BOOL agActive;
};
struct Library *AmigaGuideBase = NULL;
@@ -34,6 +35,7 @@ uint32 om_set(Class *, Object *, struct opSet *);
uint32 om_get(Class *, Object *, struct opGet *);
uint32 agm_open(Class *, Object *, Msg);
uint32 agm_close(Class *, Object *, Msg);
+uint32 agm_process(Class *, Object *, Msg);
/* *************************** class initialization and disposal ***************************** */
@@ -107,6 +109,9 @@ static uint32 dispatchAGClass(Class *cl, Object *o, Msg msg)
case AGM_CLOSE:
return agm_close(cl, o, msg);
+ case AGM_PROCESS:
+ return agm_process(cl, o, msg);
+
default:
return IIntuition->IDoSuperMethodA(cl, o, msg);
}
@@ -128,7 +133,6 @@ uint32 om_new(Class *cl, Object *o, struct opSet *msg)
if ( (lod = (struct localObjectData *)INST_DATA(cl, retVal)) )
{
// Initialize values.
- lod->agActive = FALSE;
lod->agHandle = NULL;
lod->agContextID = 0;
lod->nag.nag_Name = NULL;
@@ -169,10 +173,9 @@ uint32 om_dispose(Class *cl, Object *o, Msg msg)
uint32 om_set(Class *cl, Object *o, struct opSet *msg)
{
struct localObjectData *lod = (struct localObjectData *)INST_DATA(cl, o);
- struct TagItem *tags, *ti;
-
-
- tags = msg->ops_AttrList;
+ struct TagItem *ti = NULL, *tags = msg->ops_AttrList;
+ uint32 retVal = 0L;
+
while ((ti = IUtility->NextTagItem (&tags)))
{
@@ -180,31 +183,32 @@ uint32 om_set(Class *cl, Object *o, struct opSet *msg)
{
case AMIGAGUIDE_Name:
lod->nag.nag_Name = (STRPTR)ti->ti_Data;
- lod->agActive = FALSE; // Database name has changed, we must setup the help system again.
+ retVal++;
break;
case AMIGAGUIDE_Screen:
lod->nag.nag_Screen = (struct Screen *)ti->ti_Data;
- lod->agActive = FALSE; // Screen pointer has changed, we must setup the help system again.
+ retVal++;
break;
case AMIGAGUIDE_PubScreen:
lod->nag.nag_PubScreen = (STRPTR)ti->ti_Data;
- lod->agActive = FALSE; // Pubscreen name has changed, we must setup the help system again.
+ retVal++;
break;
case AMIGAGUIDE_BaseName:
lod->nag.nag_BaseName = (STRPTR)ti->ti_Data;
- lod->agActive = FALSE; // Application basename has changed, we must setup the help system again.
+ retVal++;
break;
case AMIGAGUIDE_ContextArray:
lod->nag.nag_Context = (STRPTR *)ti->ti_Data;
- lod->agActive = FALSE; // Context array has changed, we must setup the help system again.
+ retVal++;
break;
case AMIGAGUIDE_ContextID:
lod->agContextID = (uint32)ti->ti_Data;
+ retVal++;
break;
default:
@@ -212,38 +216,7 @@ uint32 om_set(Class *cl, Object *o, struct opSet *msg)
}
}
-
- // Setup the help system, if not ready yet or needs changing.
- if ( lod->agActive == FALSE )
- {
- // Shut down help system should it already be running.
- if ( lod->agHandle ) agm_close(cl, o, (Msg)msg);
-
- // (Re)establish the AmigaGuide context and open the database asynchronously.
- if ( (lod->agHandle = IAmigaGuide->OpenAmigaGuideAsync(&(lod->nag), NULL)) )
- {
- if ( (lod->agSignal = IAmigaGuide->AmigaGuideSignal(lod->agHandle)) )
- {
- // Wait until the help system is up and running.
- IExec->Wait(lod->agSignal);
- while ( !(lod->agActive) )
- {
- while ( (lod->agm = IAmigaGuide->GetAmigaGuideMsg(lod->agHandle)) )
- {
- // The AmigaGuide process started OK.
- if ( lod->agm->agm_Type == ActiveToolID ) lod->agActive = TRUE;
-
- // Opening the guide file failed for some reason, continue as usual.
- if ( lod->agm->agm_Type == ToolStatusID && lod->agm->agm_Pri_Ret ) lod->agActive = TRUE;
-
- IAmigaGuide->ReplyAmigaGuideMsg(lod->agm);
- }
- }
- }
- }
- }
-
- return (uint32)lod->agHandle;
+ return retVal;
}
@@ -261,32 +234,37 @@ uint32 om_get(Class *cl, Object *o, struct opGet *msg)
{
case AMIGAGUIDE_Name:
*(msg->opg_Storage) = (uint32)lod->nag.nag_Name;
- retVal = 1;
+ retVal = 1L;
break;
case AMIGAGUIDE_Screen:
*(msg->opg_Storage) = (uint32)lod->nag.nag_Screen;
- retVal = 1;
+ retVal = 1L;
break;
case AMIGAGUIDE_PubScreen:
*(msg->opg_Storage) = (uint32)lod->nag.nag_PubScreen;
- retVal = 1;
+ retVal = 1L;
break;
case AMIGAGUIDE_BaseName:
*(msg->opg_Storage) = (uint32)lod->nag.nag_BaseName;
- retVal = 1;
+ retVal = 1L;
break;
case AMIGAGUIDE_ContextArray:
*(msg->opg_Storage) = (uint32)lod->nag.nag_Context;
- retVal = 1;
+ retVal = 1L;
break;
case AMIGAGUIDE_ContextID:
*(msg->opg_Storage) = (uint32)lod->agContextID;
- retVal = 1;
+ retVal = 1L;
+ break;
+
+ case AMIGAGUIDE_Signal:
+ *(msg->opg_Storage) = (uint32)lod->agSignal;
+ retVal = 1L;
break;
default:
@@ -304,23 +282,47 @@ uint32 om_get(Class *cl, Object *o, struct opGet *msg)
uint32 agm_open(Class *cl, Object *o, Msg msg)
{
struct localObjectData *lod = (struct localObjectData *)INST_DATA(cl, o);
- uint32 retVal = 0;
+ BOOL agActive = FALSE;
+ uint32 retVal = 0L;
- if ( (lod->agHandle) && (lod->agActive) )
- {
- if ( lod->nag.nag_Context )
- {
- // A context node array is provided = open the current context node.
- IAmigaGuide->SetAmigaGuideContext(lod->agHandle, lod->agContextID, NULL);
- retVal = IAmigaGuide->SendAmigaGuideContext(lod->agHandle, NULL);
- }
- else
+ // Close a previous instance.
+ if ( lod->agHandle ) agm_close(cl, o, msg);
+
+ // (Re)establish the AmigaGuide context and open the database asynchronously.
+ if ( (lod->agHandle = IAmigaGuide->OpenAmigaGuideAsync(&(lod->nag), NULL)) )
{
- // No context array is provided = open the main node.
- retVal = IAmigaGuide->SendAmigaGuideCmd(lod->agHandle, "LINK MAIN", TAG_DONE);
+ if ( (lod->agSignal = IAmigaGuide->AmigaGuideSignal(lod->agHandle)) )
+ {
+ // Wait until the database is displayed and ready.
+ IExec->Wait(lod->agSignal);
+ while ( agActive == FALSE )
+ {
+ while ( (lod->agm = IAmigaGuide->GetAmigaGuideMsg(lod->agHandle)) )
+ {
+ // The AmigaGuide process started OK.
+ if ( lod->agm->agm_Type == ActiveToolID ) agActive = TRUE;
+
+ // Opening the guide file failed for some reason, continue as usual.
+ if ( lod->agm->agm_Type == ToolStatusID && lod->agm->agm_Pri_Ret ) agActive = TRUE;
+
+ IAmigaGuide->ReplyAmigaGuideMsg(lod->agm);
+ }
+ }
+ if ( lod->nag.nag_Context )
+ {
+ // A context node array is provided = open the current context node.
+ IAmigaGuide->SetAmigaGuideContext(lod->agHandle, lod->agContextID, NULL);
+ retVal = IAmigaGuide->SendAmigaGuideContext(lod->agHandle, NULL);
+ }
+ else
+ {
+ // No context array is provided = open the main node.
+ retVal = IAmigaGuide->SendAmigaGuideCmd(lod->agHandle, "LINK MAIN", TAG_DONE);
+ }
+ }
}
- }
+
return retVal;
}
@@ -332,15 +334,52 @@ uint32 agm_open(Class *cl, Object *o, Msg msg)
uint32 agm_close(Class *cl, Object *o, Msg msg)
{
struct localObjectData *lod = (struct localObjectData *)INST_DATA(cl, o);
+ uint32 retVal = 0L;
if ( lod->agHandle )
{
IAmigaGuide->CloseAmigaGuide(lod->agHandle);
lod->agHandle = NULL;
- lod->agActive = FALSE;
+ lod->agSignal = 0;
+ retVal = 1L;
}
- return (uint32)lod->agHandle;
+ return retVal;
+
+}
+
+
+
+
+
+
+uint32 agm_process(Class *cl, Object *o, Msg msg)
+{
+ struct localObjectData *lod = (struct localObjectData *)INST_DATA(cl, o);
+ uint32 retVal = 0L;
+
+
+ if (lod->agHandle)
+ {
+ while ( (lod->agm = IAmigaGuide->GetAmigaGuideMsg(lod->agHandle)) )
+ {
+ switch (lod->agm->agm_Type)
+ {
+ case ShutdownMsgID:
+ agm_close(cl, o, msg);
+ retVal = 1L;
+ break;
+
+ default:
+ //printf("%d\n", lod->agm->agm_Type);
+ break;
+ }
+ IAmigaGuide->ReplyAmigaGuideMsg(lod->agm);
+ }
+ }
+ return retVal;
+
}
+
diff --git a/amiga/agclass/amigaguide_class.h b/amiga/agclass/amigaguide_class.h
index f122f35f7..ee7e55e60 100755
--- a/amiga/agclass/amigaguide_class.h
+++ b/amiga/agclass/amigaguide_class.h
@@ -27,10 +27,13 @@
#define AMIGAGUIDE_BaseName (AMIGAGUIDE_Dummy + 4) // Basename of the application that opens the help file.
#define AMIGAGUIDE_ContextArray (AMIGAGUIDE_Dummy + 5) // Context node array (must be NULL-terminated).
#define AMIGAGUIDE_ContextID (AMIGAGUIDE_Dummy + 6) // Index value of the node to display.
+#define AMIGAGUIDE_Signal (AMIGAGUIDE_Dummy + 7) // Signal mask to wait on
// method definition
-#define AGM_OPEN WM_OPEN
-#define AGM_CLOSE WM_CLOSE
+#define AGM_Dummy AMIGAGUIDE_Dummy + 100
+#define AGM_OPEN AGM_Dummy + 1
+#define AGM_CLOSE AGM_Dummy + 2
+#define AGM_PROCESS AGM_Dummy + 3
// function prototypes
Class *initAGClass(void);
diff --git a/amiga/arexx.c b/amiga/arexx.c
index 472aea1ce..3bac0c249 100644
--- a/amiga/arexx.c
+++ b/amiga/arexx.c
@@ -196,12 +196,12 @@ int ami_find_tab_bw(struct gui_window_2 *gwin, struct browser_window *bw)
struct browser_window *ami_find_tab(int window, int tab)
{
- int windows = 0, tabs = 0;
struct nsObject *node, *nnode;
- struct gui_window_2 *gwin;
if(!IsMinListEmpty(window_list))
{
+ int windows = 0;
+
node = (struct nsObject *)GetHead((struct List *)window_list);
do
@@ -248,8 +248,7 @@ STATIC VOID rx_open(struct ARexxCmd *cmd, struct RexxMsg *rxm __attribute__((unu
browser_window_navigate(curbw,
url,
NULL,
- BROWSER_WINDOW_DOWNLOAD |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_DOWNLOAD,
NULL,
NULL,
NULL);
@@ -257,9 +256,8 @@ STATIC VOID rx_open(struct ARexxCmd *cmd, struct RexxMsg *rxm __attribute__((unu
}
else if(cmd->ac_ArgList[2])
{
- browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_TAB,
+ browser_window_create(BW_CREATE_HISTORY |
+ BW_CREATE_TAB,
url,
NULL,
bw,
@@ -267,8 +265,7 @@ STATIC VOID rx_open(struct ARexxCmd *cmd, struct RexxMsg *rxm __attribute__((unu
}
else if(cmd->ac_ArgList[1])
{
- browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -281,16 +278,14 @@ STATIC VOID rx_open(struct ARexxCmd *cmd, struct RexxMsg *rxm __attribute__((unu
browser_window_navigate(bw,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
}
else
{
- browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -510,8 +505,7 @@ STATIC VOID rx_home(struct ARexxCmd *cmd, struct RexxMsg *rxm __attribute__((unu
browser_window_navigate(bw,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -575,7 +569,6 @@ STATIC VOID rx_windows(struct ARexxCmd *cmd, struct RexxMsg *rxm __attribute__((
STATIC VOID rx_active(struct ARexxCmd *cmd, struct RexxMsg *rxm __attribute__((unused)))
{
- int windows = 0, tabs = 0;
int window = 0, tab = 0;
struct browser_window *bw = curbw;
struct nsObject *node, *nnode;
@@ -585,6 +578,8 @@ STATIC VOID rx_active(struct ARexxCmd *cmd, struct RexxMsg *rxm __attribute__((u
if(!IsMinListEmpty(window_list))
{
+ int windows = 0;
+
node = (struct nsObject *)GetHead((struct List *)window_list);
do
diff --git a/amiga/bitmap.c b/amiga/bitmap.c
index c07f45c67..271978b2e 100644
--- a/amiga/bitmap.c
+++ b/amiga/bitmap.c
@@ -152,7 +152,9 @@ bool bitmap_save(void *bitmap, const char *path, unsigned flags)
int err = 0;
Object *dto = NULL;
- if(!ami_download_check_overwrite(path, NULL, 0)) return false;
+ if ((flags & AMI_BITMAP_FORCE_OVERWRITE) == 0) {
+ if(!ami_download_check_overwrite(path, NULL, 0)) return false;
+ }
if(dto = ami_datatype_object_from_bitmap(bitmap))
{
@@ -453,7 +455,7 @@ static struct BitMap *ami_bitmap_get_truecolour(struct bitmap *bitmap,int width,
COMPTAG_DestHeight,height,
COMPTAG_OffsetX,0,
COMPTAG_OffsetY,0,
- COMPTAG_FriendBitMap,friendbm,
+ COMPTAG_FriendBitMap, scrn->RastPort.BitMap,
TAG_DONE);
#endif
}
diff --git a/amiga/bitmap.h b/amiga/bitmap.h
index 0435aec5b..6657d2f8a 100755
--- a/amiga/bitmap.h
+++ b/amiga/bitmap.h
@@ -26,6 +26,7 @@
#include <libraries/Picasso96.h>
#define AMI_BITMAP_FORMAT RGBFB_R8G8B8A8
+#define AMI_BITMAP_FORCE_OVERWRITE 0xFF
struct bitmap {
int width;
diff --git a/amiga/clipboard.c b/amiga/clipboard.c
index d37fb1aec..fa1d189d4 100644
--- a/amiga/clipboard.c
+++ b/amiga/clipboard.c
@@ -16,10 +16,21 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <proto/iffparse.h>
+#include <proto/intuition.h>
+#include <proto/exec.h>
+#include <proto/datatypes.h>
+#include <proto/diskfont.h>
+
+#include <diskfont/diskfonttag.h>
+#include <datatypes/textclass.h>
+#include <datatypes/pictureclass.h>
+
+#include "utils/nsoption.h"
+#include "utils/utf8.h"
#include "desktop/gui.h"
#include "desktop/plotters.h"
#include "desktop/textinput.h"
-#include "utils/nsoption.h"
#include "amiga/bitmap.h"
#include "amiga/clipboard.h"
@@ -31,18 +42,6 @@
#include "amiga/menu.h"
#include "amiga/utf8.h"
-#include "utils/utf8.h"
-
-#include <proto/iffparse.h>
-#include <proto/intuition.h>
-#include <proto/exec.h>
-#include <proto/datatypes.h>
-#include <proto/diskfont.h>
-
-#include <diskfont/diskfonttag.h>
-#include <datatypes/textclass.h>
-#include <datatypes/pictureclass.h>
-
#define ID_UTF8 MAKE_ID('U','T','F','8')
struct IFFHandle *iffh = NULL;
@@ -107,17 +106,6 @@ void gui_start_selection(struct gui_window *g)
OnMenu(g->shared->win, AMI_MENU_CUT);
}
-void gui_clear_selection(struct gui_window *g)
-{
- if(!g) return;
- if(!g->shared->win) return;
- if(nsoption_bool(kiosk_mode) == true) return;
-
- OffMenu(g->shared->win, AMI_MENU_CLEAR);
- OffMenu(g->shared->win, AMI_MENU_CUT);
- OffMenu(g->shared->win, AMI_MENU_COPY);
-}
-
char *ami_clipboard_cat_collection(struct CollectionItem *ci, LONG codeset, size_t *text_length)
{
struct CollectionItem *ci_new = NULL, *ci_next, *ci_curr = ci;
@@ -197,12 +185,10 @@ char *ami_clipboard_cat_collection(struct CollectionItem *ci, LONG codeset, size
void gui_get_clipboard(char **buffer, size_t *length)
{
- struct ContextNode *cn;
struct CollectionItem *ci = NULL;
struct StoredProperty *sp = NULL;
ULONG rlen=0,error;
struct CSet *cset;
- LONG codeset = 0;
if(OpenIFF(iffh,IFFF_READ)) return;
@@ -216,6 +202,7 @@ void gui_get_clipboard(char **buffer, size_t *length)
if(ci = FindCollection(iffh, ID_FTXT, ID_UTF8)) {
*buffer = ami_clipboard_cat_collection(ci, 106, length);
} else if(ci = FindCollection(iffh, ID_FTXT, ID_CHRS)) {
+ LONG codeset = 0;
if(sp = FindProp(iffh, ID_FTXT, ID_CSET)) {
cset = (struct CSet *)sp->sp_Data;
codeset = cset->CodeSet;
@@ -226,7 +213,7 @@ void gui_get_clipboard(char **buffer, size_t *length)
CloseIFF(iffh);
}
-void gui_set_clipboard(const char *buffer, size_t length,
+static void gui_set_clipboard(const char *buffer, size_t length,
nsclipboard_styles styles[], int n_styles)
{
char *text;
@@ -257,7 +244,7 @@ void gui_set_clipboard(const char *buffer, size_t length,
if(nsoption_bool(clipboard_write_utf8)) {
WriteChunkBytes(iffh, buffer, length);
} else {
- if(utf8_to_local_encoding(buffer, length, &text) == UTF8_CONVERT_OK) {
+ if(utf8_to_local_encoding(buffer, length, &text) == NSERROR_OK) {
char *p;
p = text;
@@ -387,3 +374,10 @@ bool ami_easy_clipboard_svg(struct hlcache_handle *c)
return true;
}
#endif
+
+static struct gui_clipboard_table clipboard_table = {
+ .get = gui_get_clipboard,
+ .set = gui_set_clipboard,
+};
+
+struct gui_clipboard_table *amiga_clipboard_table = &clipboard_table;
diff --git a/amiga/clipboard.h b/amiga/clipboard.h
index cf3f74087..db6fc35cc 100755
--- a/amiga/clipboard.h
+++ b/amiga/clipboard.h
@@ -25,6 +25,11 @@ struct hlcache_handle;
struct selection;
struct gui_window;
struct gui_window_2;
+struct gui_clipboard_table;
+
+extern struct gui_clipboard_table *amiga_clipboard_table;
+
+void gui_start_selection(struct gui_window *g);
void ami_clipboard_init(void);
void ami_clipboard_free(void);
diff --git a/amiga/context_menu.c b/amiga/context_menu.c
index 2ad2b89d9..b85824f2c 100644
--- a/amiga/context_menu.c
+++ b/amiga/context_menu.c
@@ -39,8 +39,8 @@
#include "amiga/theme.h"
#include "amiga/tree.h"
#include "amiga/utf8.h"
+#include "desktop/browser_history.h"
#include "desktop/browser_private.h"
-#include "desktop/local_history.h"
#include "desktop/hotlist.h"
#include "desktop/searchweb.h"
#include "desktop/textinput.h"
@@ -53,7 +53,7 @@
static uint32 ami_context_menu_hook(struct Hook *hook, Object *item, APTR reserved);
static uint32 ami_context_menu_hook_tree(struct Hook *hook, Object *item, APTR reserved);
-static bool ami_context_menu_history(const struct history *history, int x0, int y0,
+static bool ami_context_menu_history(const struct browser_window *bw, int x0, int y0,
int x1, int y1, const struct history_entry *entry, void *user_data);
static uint32 ami_popup_hook(struct Hook *hook,Object *item,APTR reserved);
@@ -269,7 +269,7 @@ void ami_context_menu_add_submenu(Object *ctxmenuobj, ULONG cmsub, void *userdat
PMIA_UserData, nsurl_access(hlcache_handle_get_url(userdata)),
PMIA_CommKey, "B",
TAG_DONE),
- TAG_DONE),
+ PMEND,
TAG_DONE),
~0);
break;
@@ -324,7 +324,7 @@ void ami_context_menu_add_submenu(Object *ctxmenuobj, ULONG cmsub, void *userdat
PMIA_UserData, userdata,
PMIA_Disabled, (content_get_type(userdata) != CONTENT_HTML),
TAG_DONE),
- TAG_DONE),
+ PMEND,
TAG_DONE),
~0);
break;
@@ -364,7 +364,7 @@ void ami_context_menu_add_submenu(Object *ctxmenuobj, ULONG cmsub, void *userdat
PMIA_UserData, userdata,
PMIA_Disabled, !browser_window_stop_available(userdata),
TAG_DONE),
- TAG_DONE),
+ PMEND,
TAG_DONE),
~0);
break;
@@ -410,7 +410,7 @@ void ami_context_menu_add_submenu(Object *ctxmenuobj, ULONG cmsub, void *userdat
PMIA_ID, CMID_SAVEURL,
PMIA_UserData, userdata,
TAG_DONE),
- TAG_DONE),
+ PMEND,
TAG_DONE),
~0);
break;
@@ -467,7 +467,7 @@ void ami_context_menu_add_submenu(Object *ctxmenuobj, ULONG cmsub, void *userdat
PMIA_UserData, userdata,
PMIA_Disabled, !ami_mime_content_to_cmd(userdata),
TAG_DONE),
- TAG_DONE),
+ PMEND,
TAG_DONE),
~0);
break;
@@ -598,8 +598,8 @@ void ami_context_menu_show(struct gui_window_2 *gwin,int x,int y)
ctxmenuhook.h_SubEntry = NULL;
ctxmenuhook.h_Data = gwin;
- ctxmenuobj = NewObject( POPUPMENU_GetClass(), NULL,
- PMA_MenuHandler, &ctxmenuhook,
+ ctxmenuobj = NewObject( POPUPMENU_GetClass(), NULL,
+ PMA_MenuHandler, &ctxmenuhook,
TAG_DONE);
if(gwin->bw && gwin->bw->history &&
@@ -607,7 +607,7 @@ void ami_context_menu_show(struct gui_window_2 *gwin,int x,int y)
gwin->win->MouseX, gwin->win->MouseY))
{
gwin->temp = 0;
- history_enumerate_back(gwin->bw->history, ami_context_menu_history, gwin);
+ browser_window_history_enumerate_back(gwin->bw, ami_context_menu_history, gwin);
IDoMethod(ctxmenuobj, PM_INSERT,
NewObject(POPUPMENU_GetItemClass(), NULL,
@@ -630,7 +630,7 @@ void ami_context_menu_show(struct gui_window_2 *gwin,int x,int y)
gwin->win->MouseX, gwin->win->MouseY))
{
gwin->temp = 0;
- history_enumerate_forward(gwin->bw->history, ami_context_menu_history, gwin);
+ browser_window_history_enumerate_forward(gwin->bw, ami_context_menu_history, gwin);
IDoMethod(ctxmenuobj, PM_INSERT,
NewObject(POPUPMENU_GetItemClass(), NULL,
@@ -707,7 +707,7 @@ void ami_context_menu_show(struct gui_window_2 *gwin,int x,int y)
static uint32 ami_context_menu_hook(struct Hook *hook,Object *item,APTR reserved)
{
- int32 itemid = 0;
+ int32 itemid = 0;
struct gui_window_2 *gwin = hook->h_Data;
APTR userdata = NULL;
struct browser_window *bw;
@@ -718,10 +718,9 @@ static uint32 ami_context_menu_hook(struct Hook *hook,Object *item,APTR reserved
nsurl *url;
nserror error;
- if(GetAttrs(item,PMIA_ID,&itemid,
- PMIA_UserData,&userdata,
- TAG_DONE))
- {
+ if(GetAttrs(item, PMIA_ID, &itemid,
+ PMIA_UserData, &userdata,
+ TAG_DONE)) {
switch(itemid)
{
case CMID_SELECTFILE:
@@ -742,17 +741,11 @@ static uint32 ami_context_menu_hook(struct Hook *hook,Object *item,APTR reserved
strlcpy(fname,filereq->fr_Drawer,1024);
AddPart(fname,filereq->fr_File,1024);
- if(utf8_from_local_encoding(fname,0,&utf8_fn) != UTF8_CONVERT_OK)
- {
- warn_user("NoMemory","");
- break;
- }
-
browser_window_drop_file_at_point(
file_input->bw,
file_input->x,
file_input->y,
- utf8_fn);
+ fname);
}
break;
@@ -786,8 +779,7 @@ static uint32 ami_context_menu_hook(struct Hook *hook,Object *item,APTR reserved
case CMID_URLOPENWIN:
error = nsurl_create(userdata, &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_CLONE | BW_CREATE_HISTORY,
url,
hlcache_handle_get_url(gwin->bw->current_content),
gwin->bw,
@@ -805,9 +797,7 @@ static uint32 ami_context_menu_hook(struct Hook *hook,Object *item,APTR reserved
case CMID_URLOPENTAB:
error = nsurl_create(userdata, &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_TAB,
+ error = browser_window_create(BW_CREATE_CLONE | BW_CREATE_HISTORY | BW_CREATE_TAB,
url,
hlcache_handle_get_url(gwin->bw->current_content),
gwin->bw,
@@ -830,8 +820,7 @@ static uint32 ami_context_menu_hook(struct Hook *hook,Object *item,APTR reserved
browser_window_navigate(gwin->bw,
url,
hlcache_handle_get_url(gwin->bw->current_content),
- BROWSER_WINDOW_DOWNLOAD |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_DOWNLOAD,
NULL,
NULL,
NULL);
@@ -845,8 +834,7 @@ static uint32 ami_context_menu_hook(struct Hook *hook,Object *item,APTR reserved
browser_window_navigate(gwin->bw,
hlcache_handle_get_url(userdata),
hlcache_handle_get_url(gwin->bw->current_content),
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -862,8 +850,7 @@ static uint32 ami_context_menu_hook(struct Hook *hook,Object *item,APTR reserved
browser_window_navigate(gwin->bw,
url,
hlcache_handle_get_url(gwin->bw->current_content),
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -923,7 +910,7 @@ static uint32 ami_context_menu_hook(struct Hook *hook,Object *item,APTR reserved
}
else
{
- history_go(gwin->bw, gwin->bw->history,
+ browser_window_history_go(gwin->bw,
(struct history_entry *)userdata, false);
}
break;
@@ -938,8 +925,7 @@ static uint32 ami_context_menu_hook(struct Hook *hook,Object *item,APTR reserved
browser_window_navigate(gwin->bw,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -996,27 +982,27 @@ static uint32 ami_context_menu_hook(struct Hook *hook,Object *item,APTR reserved
case CMID_SELSEARCH:
{
char *sel;
- char *urltxt;
- nsurl *url;
if(sel = browser_window_get_selection(gwin->bw))
{
- urltxt = search_web_from_term(sel);
-
- if (nsurl_create(urltxt, &url) != NSERROR_OK) {
- warn_user("NoMemory", 0);
- } else {
- browser_window_navigate(gwin->bw,
- url,
- NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
- NULL,
- NULL,
- NULL);
+ nserror ret;
+ nsurl *url;
+
+ ret = search_web_omni(sel, SEARCH_WEB_OMNI_SEARCHONLY, &url);
+ free(sel);
+ if (ret == NSERROR_OK) {
+ ret = browser_window_navigate(gwin->bw,
+ url,
+ NULL,
+ BW_NAVIGATE_HISTORY,
+ NULL,
+ NULL,
+ NULL);
nsurl_unref(url);
}
- free(sel);
+ if (ret != NSERROR_OK) {
+ warn_user(messages_get_errorcode(ret), 0);
+ }
}
}
break;
@@ -1262,8 +1248,9 @@ static uint32 ami_context_menu_hook_tree(struct Hook *hook, Object *item, APTR r
return itemid;
}
-static bool ami_context_menu_history(const struct history *history, int x0, int y0,
- int x1, int y1, const struct history_entry *entry, void *user_data)
+static bool ami_context_menu_history(const struct browser_window *bw,
+ int x0, int y0, int x1, int y1,
+ const struct history_entry *entry, void *user_data)
{
struct gui_window_2 *gwin = (struct gui_window_2 *)user_data;
@@ -1272,7 +1259,7 @@ static bool ami_context_menu_history(const struct history *history, int x0, int
IDoMethod(ctxmenuobj, PM_INSERT,
NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)history_entry_get_title(entry),
+ PMIA_Title, (ULONG)browser_window_history_entry_get_title(entry),
PMIA_ID, CMID_HISTORY,
PMIA_UserData, entry,
TAG_DONE),
@@ -1288,7 +1275,7 @@ static uint32 ami_popup_hook(struct Hook *hook,Object *item,APTR reserved)
if(GetAttr(PMIA_ID, item, &itemid))
{
- form_select_process_selection(gwin->shared->bw->current_content,gwin->shared->control,itemid);
+ form_select_process_selection(gwin->shared->control,itemid);
}
return itemid;
diff --git a/amiga/context_menu.h b/amiga/context_menu.h
index 60224f4e6..69ccdff68 100755
--- a/amiga/context_menu.h
+++ b/amiga/context_menu.h
@@ -27,4 +27,7 @@ void ami_context_menu_free(void);
BOOL ami_context_menu_mouse_trap(struct gui_window_2 *gwin, BOOL trap);
void ami_context_menu_show(struct gui_window_2 *gwin, int x, int y);
void ami_context_menu_show_tree(struct tree *tree, struct Window *win, int type);
+
+void gui_create_form_select_menu(struct browser_window *bw, struct form_control *control);
+
#endif
diff --git a/amiga/dist/Install b/amiga/dist/Install
index 61defec03..96026a0ee 100755
--- a/amiga/dist/Install
+++ b/amiga/dist/Install
@@ -43,223 +43,6 @@
)
)
-(procedure p_failedsobjs
- (if #failedsobjs
- (message "The following shared objects failed to copy. These will be updated on next reboot.\n\n" #failedsobjs)
- )
-)
-
-(procedure p_schedulesobj #sobj
- (transcript "Scheduling update of " #sobj " for next reboot")
-
- (set #failedsobjs (cat #failedsobjs "\n" #sobj))
-
- (makedir "SObjs:so-installer")
-
- (copyfiles
- (source (tackon "SObjs" #sobj))
- (dest "SObjs:so-installer")
- )
-
- (startup "Shared object installer"
- (prompt "Adding commands to user-startup to schedule copy of " #sobj " on next reboot")
- (help @startup-help)
- (command "if EXISTS SObjs:so-installer\n")
- (command " copy SObjs:so-installer SObjs: CLONE FORCE QUIET\n")
- (command " delete SObjs:so-installer ALL FORCE QUIET\n")
- (command "endif\n")
- )
-)
-
-(procedure p_comparesobj2 #sobj1_full #sobj2_full
- (set #same 0)
-
- (set #sobj-version (getversion (#sobj1_full)))
- (if (= #sobj-version 0)
- (
- (if (exists (#sobj2_full))
- (
- (set #file-newer (earlier (#sobj2_full) (#sobj1_full)))
- (set #old-size (getsize (#sobj2_full)))
- (set #new-size (getsize (#sobj1_full)))
-
- (if (AND (= #old-size #new-size) (= #file-newer 0)) (set #same 1))
- )
- )
- )
- ; else if version info is available
- (
- (set #sobj-oldversion (getversion (#sobj2_full)))
-
- (if (<= #sobj-version #sobj-oldversion) (set #same 1))
- )
- )
-)
-
-(procedure p_comparesobj #sobj
- (set #sobj1 (tackon "SObjs/" #sobj))
- (set #sobj2 (tackon "SObjs:" #sobj))
-
- (p_comparesobj2 #sobj1 #sobj2)
-)
-
-(procedure p_linksobj #sobj #sobj_link
- (set #sobj2 (tackon "SObjs:" #sobj_link))
-
- (p_comparesobj2 (tackon "SObjs/" #sobj) #sobj2)
-
- (if (= #same 0) ;if #sobj is newer than that pointed to by #sobj_link
- (
- (if (exists (#sobj2))
- (transcript "Deleting " #sobj2)
- (delete #sobj2 (optional "force")) ;prevent dodgy recursive links
- )
- (set #linkcmd (cat "makelink " #sobj2 " SObjs:" #sobj " soft"))
- (transcript "Running " #linkcmd)
- (run #linkcmd)
- )
- )
-)
-
-(procedure p_copysobj #sobj
- (set #sobj-version (getversion (tackon "SObjs/" #sobj)))
-
- (if (= #sobj-version 0)
- (
- (transcript "Date compare " #sobj)
-
- (if (exists (tackon "SObjs:" #sobj))
- (
- (set #file-newer (earlier (tackon "SObjs:" #sobj) (tackon "SObjs/" #sobj)))
-
- (if (= #file-newer 0)
- (
- (set #newer-text "has an older datestamp")
- )
- ;else
- (
- (set #newer-text "has a newer datestamp")
- )
- )
-
- (set #old-size (getsize (tackon "SObjs:" #sobj)))
- (set #new-size (getsize (tackon "SObjs/" #sobj)))
-
- (if (AND (= #old-size #new-size) (= #file-newer 0))
- (
- (set #copy 0)
- )
- ;else
- (
- (if (OR (= @user-level 2) (AND (= @user-level 1) (<> #file-newer 0)))
-; Expert users are always prompted
-; Average users are prompted if the file trying to be copied is newer
-; Novice users are never prompted
-; This is roughly equivalent to (copylib (confirm))
-; No prompting occurs if the destination does not exist (silent copy)
-; or the files are the same size and the one being copied isn't newer (don't copy)
- (
- (set #copy
- (askbool
- (prompt "Copying " #sobj "...\n\n"
- "Version to install: " #new-size " bytes\n"
- "Version currently installed: " #old-size " bytes\n\n"
- "The file to copy " #newer-text)
- (help @askbool-help)
- (default #file-newer)
- (choices "Proceed with copy" "Skip this part")
- )
- )
- )
- ;else
- (
- (set #copy #file-newer)
- )
- )
- )
- )
- )
- ; else if dest file does not exist
- (
- (set #copy 1)
- )
- )
-
- (if (<> #copy 0)
- (
- (if (<> #AutoInstall 1)
- (
- (copyfiles
- (prompt "Copying " #sobj "...")
- (help @copyfiles-help)
- (source (tackon "SObjs/" #sobj))
- (dest "SObjs:")
- (optional "nofail" "force")
- )
- )
- ;else
- (
- (run "CopyStore SObjs/" #sobj " SObjs:")
- )
- )
-
- (p_comparesobj #sobj)
- (if (= #same 0)
- (
- (p_schedulesobj #sobj)
- )
- )
- )
- )
- )
- ; else if version info is available
- (
- (if (<> #AutoInstall 1)
- (
- (copylib
- (prompt "Copying " #sobj "...")
- (help @copylib-help)
- (source (tackon "SObjs/" #sobj))
- (dest "SObjs:")
- (optional "nofail" "force")
- (confirm "expert")
- )
- )
- ;else
- (
- (run "CopyStore SObjs/" #sobj " SObjs:")
- )
- )
-
- (p_comparesobj #sobj)
- (if (= #same 0)
- (
- (p_schedulesobj #sobj)
- )
- )
- )
- )
-)
-
-(procedure p_copylib #lib
- (if (<> #AutoInstall 1)
- (
- (copylib
- (prompt "Copying " #lib "...")
- (help @copylib-help)
- (source (tackon "Libs/" #lib))
- (dest "Libs:")
- (optional "nofail" "force")
- (confirm "expert")
- )
- )
- ;else
- (
- (run "CopyStore Libs/" #lib " Libs:")
- )
- )
-)
-
(procedure p_chk_launch-handler #protocol
(run "C:Search >T:NS_Install.tmp " (tackon "ENVARC:launch-handler/URL" #protocol) " NetSurf" (safe))
(set #has_entry (getsize "T:NS_Install.tmp"))
@@ -274,6 +57,9 @@
(if (<> #AutoInstall 1) (welcome))
+; (hopefully temporary) workaround for a bug in Installer:
+(if (= @language "dutch") (set @askdir-help ""))
+
(complete 0)
(set @default-dest (getenv "AppPaths/NetSurf"))
@@ -309,72 +95,9 @@
(set #icon-exists (exists (tackon @default-dest "NetSurf.info")))
(set osver (getversion))
(set osver (/ osver 65536))
-(set #versions-available 0)
-
-(set #static-filename "NetSurf")
-(set #cairo-filename "NetSurf")
-
-(if (exists "NetSurf")
- (
- (if (exists "SObjs")
- (
- (if (>= osver 53)
- (
- (set #cairo-name "Shared objects/part-Cairo")
- (set #versions-available (+ #versions-available 1))
- (set #cairo-version 1)
- )
- ;else
- (
- (set #cairo-version 0)
- (set #cairo-name "")
- )
- )
- )
- ;else
- (
- ; assume static if sobjs is not present
- (set #static-name "Static/graphics.library")
- (set #versions-available (+ #versions-available 1))
- (set #cairo-version 0)
- (set #static-filename "NetSurf")
- )
- )
- )
- ; else
- (
- (set #cairo-version 0)
- (set #cairo-name "")
- )
-)
-
-(transcript "Versions avaiable for install: " #versions-available " " #static-name " " #cairo-name)
-
-(if (= #versions-available 0)
- (
- (abort "Did not find any compatible versions of NetSurf to install!\n\n"
- "NetSurf requires AmigaOS 4.1 or higher.")
- )
-)
(complete 10)
-(if (AND (> @user-level 0) (> #versions-available 1))
- (
- (set #cairo-version
- (askchoice
- (prompt "Which version of NetSurf would you like to install?")
- (help "The Cairo version has anti-aliasing of graphical elements.\n\n"
- @askchoice-help)
- (choices #static-name #cairo-name)
- (default #cairo-version)
- )
- )
- )
-)
-
-(complete 15)
-
(set #user (getenv "user"))
(if (= #user "") (set #user "Default"))
@@ -415,7 +138,7 @@
)
)
-(complete 18)
+(complete 15)
(if (>= osver 53)
(
@@ -436,7 +159,7 @@
)
)
-(complete 19)
+(complete 20)
(set #runfixfonts
(askbool
@@ -449,9 +172,7 @@
)
)
-(complete 20)
-
-(set #netsurf-name (select #cairo-version #static-filename #cairo-filename))
+(complete 25)
(working "Installing NetSurf")
@@ -460,7 +181,7 @@
(copyfiles
(prompt "Copying NetSurf...")
(help @copyfiles-help)
- (source #netsurf-name)
+ (source "NetSurf")
(dest @default-dest)
(newname "NetSurf")
(optional "askuser" "force" "oknodelete")
@@ -473,7 +194,7 @@
)
)
-(complete 30)
+(complete 40)
(if #searchengines-exist
(rename (tackon @default-dest "Resources/SearchEngines") (tackon @default-dest "Resources/SearchEngines.backup"))
@@ -483,6 +204,8 @@
(run "c:filenote Rexx/ViewSource.nsrx \"View source\"")
(run "c:filenote Rexx/GetVideo.nsrx \"Get video\"")
+(complete 50)
+
(copyfiles
(prompt "Copying files")
(source "")
@@ -494,6 +217,8 @@
; (all)
)
+(complete 65)
+
(copyfiles
(prompt "Copying additional documentation")
(source "")
@@ -504,34 +229,7 @@
(optional "nofail")
)
-(set #complete 40)
-(working "Copying Libraries")
-
-(if (exists "Libs")
- (
- (foreach "Libs" "#?"
- (complete #complete)
- (p_copylib @each-name)
- (set #complete (+ #complete 2))
- )
- )
-)
-
-(set #complete 60)
-
-(if (= #cairo-version 1)
- (
- (working "Copying Shared Objects")
-
- (foreach "SObjs" "#?"
- (complete #complete)
- (p_copysobj @each-name)
- (set #complete (+ #complete 1))
- )
- )
-)
-
-(complete 90)
+(complete 70)
(if #themeshort
(
@@ -578,7 +276,7 @@
)
)
-(complete 95)
+(complete 75)
(if (= (exists "ENVARC:Sys/def_css.info") 0)
(copyfiles
@@ -591,7 +289,7 @@
)
)
-(complete 96)
+(complete 80)
(working "Setting MIME types")
(p_setmimetype "css" "text/css")
@@ -611,7 +309,7 @@
(p_setmimetype "zip" "application/x-zip")
(p_setmimetype "js" "application/javascript")
-(complete 97)
+(complete 85)
(if (>= osver 53)
(if (= (exists "Rexx:NetSurf") 0)
@@ -659,7 +357,7 @@
)
)
-(complete 98)
+(complete 90)
(if (= #addlaunchhandler 1)
(
@@ -691,7 +389,7 @@
)
)
-(complete 99)
+(complete 95)
(working "Running FixFonts")
@@ -708,7 +406,6 @@
(exit (quiet))
)
(
- (p_failedsobjs)
(exit)
)
)
diff --git a/amiga/dist/NetSurf.guide b/amiga/dist/NetSurf.guide
index 25310bdc1..2ea772e35 100755
--- a/amiga/dist/NetSurf.guide
+++ b/amiga/dist/NetSurf.guide
@@ -6,9 +6,6 @@
@{b}NetSurf@{ub} Amiga-specific documentation
http://www.netsurf-browser.org
-@{" Change Log " link ChangeLog/Main}
-@{" Licence " link COPYING/Main}
-
@{" GUI " link GUI}
@{" Preferences GUI " link Prefs}
@@ -121,7 +118,6 @@ There are a couple of Amiga-specific options which can only be changed directly
@{b}kiosk_mode@{ub} No gadgets
@{b}printer_unit@{ub} Specifies which printer.device unit to print to
@{b}drag_save_icons@{ub} Enables displaying Workbench-style transparent icons under the pointer when performing drag saves (ctrl-drag of objects available if NetSurf is running on the Workbench screen) and text selection drags. If set to 0 the pointer style will change instead. OS 4.0 users may want to set this to 0 as icons will appear opaque and obscure the drop position.
-@{b}cairo_renderer@{ub} Set rendering engine. -1 = palette-mapped (set automatically when required), 0 = graphics.library (default), 1 = Cairo/graphics.library mixed, 2 = Full Cairo.
@{b}monitor_aspect_x@{ub}/@{b}monitor_aspect_y@{ub} Correct aspect ratio for displays (default of 0 means "assume square pixels").
@{b}screen_compositing@{ub} Use compositing on NetSurf's own screen. 0=disable, 1=enable, 2=default (NB: This is indirectly modified by changing the "simple refresh" option in the GUI)
@{b}resize_with_contents@{ub} Set to 1 to respect GUI prefs' "resize with contents" option. Default is to use old-style "resize on release"
@@ -183,6 +179,7 @@ Commands are:
@{b}OPEN URL/A,NEW=NEWWINDOW/S,NEWTAB/S,SAVEAS/K,W=WINDOW/K/N,T=TAB/K/N@{ub}
Opens URL in current window or a new window/tab if NEWWINDOW/NEWTAB is specified. Saves the location without displaying if SAVEAS and a filename is specified (SAVEAS available in 2.6325)
+Note that if the URL is non-ASCII it is expected to be encoded in UTF-8 (file: references should always be in local charset due to filesystem limitations). Usually this is not relevant, as all normalised URLs will be in their ASCII form.
@{b}SAVE FILENAME/A,W=WINDOW/K/N,T=TAB/K/N@{ub} (2.6027)
Saves current page source to FILENAME
@@ -255,6 +252,10 @@ Under OS4.1 Update 1, launch-handler is used in preference to OpenURL. The
Installer script can add the relevant configuration to launch URLs in NetSurf.
Please ensure your email application is configured in URL Prefs for mailto:
links clicked within NetSurf.
+
+Note that a helper script is installed in S:ARexx which can be used instead of
+the main executable, to stop the NetSurf executable from being loaded again if
+it is already running.
@endnode
@node hotlist "Hotlist menu"
@@ -367,8 +368,6 @@ There are a number of options which can be changed that will affect the speed of
@{b}Cache native versions@{ub} to @{b}Scaled@{ub} (or preferably @{b}All@{ub}, but this will use more graphics mem, and scaling images is a bigger performance hit)
Deselect @{b}Higher quality scaling@{ub}, this will be very slow if not done in hardware.@{lindent}
-@{lindent 2}* In @{"Options" link Options}, set cairo_renderer:1@{lindent}
-
@{lindent 2}* In @{"Options" link Options}, increase redraw_tile_size_x/y (increasing this value uses more graphics mem)@{lindent}
@{lindent 2}* In @{"Options" link Options}, set font_antialiasing:0@{lindent}
diff --git a/amiga/dist/netsurf.readme b/amiga/dist/netsurf.readme
index bd37b2e62..24d8df534 100755
--- a/amiga/dist/netsurf.readme
+++ b/amiga/dist/netsurf.readme
@@ -2,23 +2,21 @@ Short: Fast CSS capable web browser
Uploader: chris@unsatisfactorysoftware.co.uk (Chris Young)
Author: NetSurf contributors (OS4 port by Chris Young)
Type: comm/www
-Version: 3.1 development
+Version: 3.3
Architecture: ppc-amigaos >= 4.0.0
-This is a test build of NetSurf 3.1 for AmigaOS 4.
-It is beta software, which means it is unstable and missing
-features - use at your own risk!
-
-This is provided for testing purposes only. For the latest
-stable version, visit http://www.netsurf-browser.org
+This is NetSurf 3.3 for AmigaOS 4.
+For the latest version, visit http://www.netsurf-browser.org
Please report bugs to chris@unsatisfactorysoftware.co.uk,
on the Amigans.net forums or on the NetSurf mailing list.
-See http://www.netsurf-browser.org for more information about NetSurf.
+See http://www.netsurf-browser.org for more information about
+NetSurf.
This software is licensed under the GPL, and the sources are
available from http://www.netsurf-browser.org. A copy can
also be obtained directly from the maintainer of this port,
chris@unsatisfactorysoftware.co.uk, in the event that the
website is unavailable.
+
diff --git a/amiga/download.c b/amiga/download.c
index 52baedb24..7c0054f03 100644
--- a/amiga/download.c
+++ b/amiga/download.c
@@ -72,7 +72,7 @@ struct gui_download_window {
struct dlnode *dln;
struct browser_window *bw;
struct download_context *ctx;
- char *url;
+ const char *url;
char fname[1024];
int result;
};
@@ -85,13 +85,13 @@ enum {
int downloads_in_progress = 0;
-struct gui_download_window *gui_download_window_create(download_context *ctx,
+static struct gui_download_window *gui_download_window_create(download_context *ctx,
struct gui_window *gui)
{
- const char *url = download_context_get_url(ctx);
- const char *mime_type = download_context_get_mime_type(ctx);
+ const char *url = nsurl_access(download_context_get_url(ctx));
unsigned long total_size = download_context_get_total_length(ctx);
struct gui_download_window *dw;
+ char *dl_filename = ami_utf8_easy(download_context_get_filename(ctx));
APTR va[3];
dw = AllocVecTags(sizeof(struct gui_download_window), AVT_ClearWithValue, 0, TAG_DONE);
@@ -107,9 +107,9 @@ struct gui_download_window *gui_download_window_create(download_context *ctx,
if(AslRequestTags(savereq,
ASLFR_Window, gui->shared->win,
ASLFR_SleepWindow, TRUE,
- ASLFR_TitleText,messages_get("NetSurf"),
- ASLFR_Screen,scrn,
- ASLFR_InitialFile, download_context_get_filename(ctx),
+ ASLFR_TitleText, messages_get("NetSurf"),
+ ASLFR_Screen, scrn,
+ ASLFR_InitialFile, dl_filename,
TAG_DONE))
{
strlcpy(dw->fname, savereq->fr_Drawer, 1024);
@@ -127,10 +127,11 @@ struct gui_download_window *gui_download_window_create(download_context *ctx,
}
}
+ if(dl_filename) ami_utf8_free(dl_filename);
dw->size = total_size;
dw->downloaded = 0;
if(gui) dw->bw = gui->shared->bw;
- dw->url = (char *)strdup((char *)url);
+ dw->url = url;
va[0] = (APTR)dw->downloaded;
va[1] = (APTR)dw->size;
@@ -191,7 +192,7 @@ struct gui_download_window *gui_download_window_create(download_context *ctx,
return dw;
}
-nserror gui_download_window_data(struct gui_download_window *dw,
+static nserror gui_download_window_data(struct gui_download_window *dw,
const char *data, unsigned int size)
{
APTR va[3];
@@ -225,29 +226,15 @@ nserror gui_download_window_data(struct gui_download_window *dw,
return NSERROR_OK;
}
-void gui_download_window_error(struct gui_download_window *dw,
- const char *error_msg)
-{
- warn_user("Unwritten","");
- dw->result = AMINS_DLOAD_ERROR;
- gui_download_window_done(dw);
-}
-
-void ami_download_window_abort(struct gui_download_window *dw)
-{
- download_context_abort(dw->ctx);
- dw->result = AMINS_DLOAD_ABORT;
- gui_download_window_done(dw);
-}
-
-void gui_download_window_done(struct gui_download_window *dw)
+static void gui_download_window_done(struct gui_download_window *dw)
{
struct dlnode *dln,*dln2 = NULL;
- struct browser_window *bw = dw->bw;
+ struct browser_window *bw;
bool queuedl = false;
STRPTR sendcmd = NULL;
if(!dw) return;
+ bw = dw->bw;
if((nsoption_bool(download_notify)) && (dw->result == AMINS_DLOAD_OK))
{
@@ -273,7 +260,6 @@ void gui_download_window_done(struct gui_download_window *dw)
FClose(dw->fh);
SetComment(dw->fname, dw->url);
- if(dw->url) free(dw->url);
downloads_in_progress--;
@@ -287,14 +273,29 @@ void gui_download_window_done(struct gui_download_window *dw)
browser_window_navigate(bw,
url,
NULL,
- BROWSER_WINDOW_DOWNLOAD |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_DOWNLOAD,
NULL,
NULL,
NULL);
nsurl_unref(url);
}
}
+ ami_try_quit(); /* In case the only window open was this download */
+}
+
+static void gui_download_window_error(struct gui_download_window *dw,
+ const char *error_msg)
+{
+ warn_user("Unwritten","");
+ dw->result = AMINS_DLOAD_ERROR;
+ gui_download_window_done(dw);
+}
+
+void ami_download_window_abort(struct gui_download_window *dw)
+{
+ download_context_abort(dw->ctx);
+ dw->result = AMINS_DLOAD_ABORT;
+ gui_download_window_done(dw);
}
BOOL ami_download_window_event(struct gui_download_window *dw)
@@ -344,7 +345,6 @@ void ami_free_download_list(struct List *dllist)
void
gui_window_save_link(struct gui_window *g, const char *url, const char *title)
{
- BPTR fh = 0;
char fname[1024];
STRPTR openurlstring,linkname;
struct DiskObject *dobj = NULL;
@@ -366,6 +366,8 @@ gui_window_save_link(struct gui_window *g, const char *url, const char *title)
if(ami_download_check_overwrite(fname, g->shared->win, 0))
{
+ BPTR fh;
+
if(fh = FOpen(fname,MODE_NEWFILE,0))
{
/* TODO: Should be URLOpen on OS4.1 */
@@ -398,8 +400,6 @@ BOOL ami_download_check_overwrite(const char *file, struct Window *win, ULONG si
/* Return TRUE if file can be (over-)written */
int32 res = 0;
BPTR lock = 0;
- BPTR fh = 0;
- int64 oldsize = 0;
char *overwritetext;
if(nsoption_bool(ask_overwrite) == false) return TRUE;
@@ -409,6 +409,9 @@ BOOL ami_download_check_overwrite(const char *file, struct Window *win, ULONG si
if(lock)
{
if(size) {
+ BPTR fh;
+ int64 oldsize = 0;
+
if(fh = OpenFromLock(lock)) {
oldsize = GetFileSize(fh);
Close(fh);
@@ -430,3 +433,12 @@ BOOL ami_download_check_overwrite(const char *file, struct Window *win, ULONG si
if(res == 1) return TRUE;
else return FALSE;
}
+
+static struct gui_download_table download_table = {
+ .create = gui_download_window_create,
+ .data = gui_download_window_data,
+ .error = gui_download_window_error,
+ .done = gui_download_window_done,
+};
+
+struct gui_download_table *amiga_download_table = &download_table;
diff --git a/amiga/download.h b/amiga/download.h
index ed09a8057..95d71ecfe 100755
--- a/amiga/download.h
+++ b/amiga/download.h
@@ -23,6 +23,8 @@
#include "amiga/gui.h"
+extern struct gui_download_table *amiga_download_table;
+
struct download_context;
struct gui_download_window;
@@ -36,4 +38,7 @@ void ami_download_window_abort(struct gui_download_window *dw);
BOOL ami_download_window_event(struct gui_download_window *dw);
void ami_free_download_list(struct List *dllist);
BOOL ami_download_check_overwrite(const char *file, struct Window *win, ULONG size);
+
+void gui_window_save_link(struct gui_window *g, const char *url, const char *title);
+
#endif
diff --git a/amiga/drag.c b/amiga/drag.c
index 1123ba265..c7c5f4b77 100644
--- a/amiga/drag.c
+++ b/amiga/drag.c
@@ -50,11 +50,13 @@ ULONG drag_icon_width;
ULONG drag_icon_height;
BOOL drag_in_progress = FALSE;
-void gui_drag_save_object(gui_save_type type, hlcache_handle *c,
- struct gui_window *g)
+void gui_drag_save_object(struct gui_window *g, hlcache_handle *c,
+ gui_save_type type)
{
const char *filetype = NULL;
+ /* Check we are running on Workbench */
+ if(nsoption_charp(pubscreen_name) == NULL) return;
if(strcmp(nsoption_charp(pubscreen_name), "Workbench")) return;
switch(type)
@@ -98,9 +100,8 @@ void gui_drag_save_selection(struct gui_window *g, const char *selection)
void ami_drag_save(struct Window *win)
{
- ULONG which = WBO_NONE,type;
- char path[1025],dpath[1025];
- const char *source_data;
+ ULONG which = WBO_NONE, type;
+ char path[1025], dpath[1025];
ULONG source_size;
ami_drag_icon_close(NULL);
@@ -195,10 +196,8 @@ void ami_drag_save(struct Window *win)
void ami_drag_icon_show(struct Window *win, const char *type)
{
struct DiskObject *dobj = NULL;
- ULONG *icondata1;
ULONG width, height;
- long format = 0;
- int err = 0;
+ int err;
int deftype = WBPROJECT;
drag_in_progress = TRUE;
diff --git a/amiga/drag.h b/amiga/drag.h
index 218aa67f8..cfe9719ce 100644
--- a/amiga/drag.h
+++ b/amiga/drag.h
@@ -26,6 +26,9 @@ int drag_save;
void *drag_save_data;
struct gui_window *drag_save_gui;
+void gui_drag_save_selection(struct gui_window *g, const char *selection);
+void gui_drag_save_object(struct gui_window *g, hlcache_handle *c, gui_save_type type);
+
void ami_drag_save(struct Window *win);
void ami_drag_icon_show(struct Window *win, const char *type);
void ami_drag_icon_close(struct Window *win);
diff --git a/amiga/dt_anim.c b/amiga/dt_anim.c
index c84470052..4722d2dd2 100644
--- a/amiga/dt_anim.c
+++ b/amiga/dt_anim.c
@@ -92,7 +92,6 @@ static const content_handler amiga_dt_anim_content_handler = {
nserror amiga_dt_anim_init(void)
{
- char dt_mime[50];
struct DataType *dt, *prevdt = NULL;
lwc_string *type;
lwc_error lerror;
@@ -161,14 +160,11 @@ bool amiga_dt_anim_convert(struct content *c)
amiga_dt_anim_content *plugin = (amiga_dt_anim_content *) c;
union content_msg_data msg_data;
int width, height;
- char title[100];
const uint8 *data;
UBYTE *bm_buffer;
ULONG size;
- Object *dto;
struct BitMapHeader *bmh;
unsigned int bm_flags = BITMAP_NEW | BITMAP_OPAQUE;
- int bm_format = PBPAFMT_RGBA;
struct adtFrame adt_frame;
APTR clut;
@@ -341,20 +337,20 @@ APTR ami_colormap_to_clut(struct ColorMap *cmap)
{
int i;
UBYTE *clut = AllocVecTags(256 * 4, AVT_ClearWithValue, 0, TAG_DONE); /* NB: Was not MEMF_PRIVATE */
- ULONG colour[3 * 256];
+ ULONG colr[256 * 4];
if(!clut) return NULL;
/* Get the palette from the ColorMap */
- GetRGB32(cmap, 0, 256, (ULONG *)&colour);
+ GetRGB32(cmap, 0, 256, (ULONG *)&colr);
/* convert it to a table of ARGB values */
for(i = 0; i < 1024; i += 4)
{
clut[i] = (0xff << 24) |
- ((colour[i] & 0xff000000) >> 8) |
- ((colour[i + 1] & 0xff000000) >> 16) |
- ((colour[i + 2] & 0xff000000) >> 24);
+ ((colr[i] & 0xff000000) >> 8) |
+ ((colr[i + 1] & 0xff000000) >> 16) |
+ ((colr[i + 2] & 0xff000000) >> 24);
}
return clut;
diff --git a/amiga/dt_picture.c b/amiga/dt_picture.c
index 211d2215a..779e1bcf8 100644
--- a/amiga/dt_picture.c
+++ b/amiga/dt_picture.c
@@ -62,7 +62,6 @@ struct amiga_dt_picture_content {
nserror amiga_dt_picture_init(void)
{
- char dt_mime[50];
struct DataType *dt, *prevdt = NULL;
lwc_string *type;
lwc_error lerror;
@@ -175,7 +174,6 @@ static struct bitmap *amiga_dt_picture_cache_convert(struct content *c)
UBYTE *bm_buffer;
Object *dto;
struct bitmap *bitmap;
- unsigned int bm_flags = BITMAP_NEW;
#ifdef __amigaos4__
int bm_format = PBPAFMT_RGBA;
#else
@@ -185,7 +183,7 @@ static struct bitmap *amiga_dt_picture_cache_convert(struct content *c)
if(dto = amiga_dt_picture_newdtobject(adt))
{
- bitmap = bitmap_create(c->width, c->height, bm_flags);
+ bitmap = bitmap_create(c->width, c->height, BITMAP_NEW);
if (!bitmap) {
msg_data.error = messages_get("NoMemory");
content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
@@ -214,14 +212,10 @@ bool amiga_dt_picture_convert(struct content *c)
{
LOG(("amiga_dt_picture_convert"));
- union content_msg_data msg_data;
int width, height;
char *title;
- UBYTE *bm_buffer;
Object *dto;
struct BitMapHeader *bmh;
- unsigned int bm_flags = BITMAP_NEW;
- int bm_format = PBPAFMT_RGBA;
char *filetype;
if(dto = amiga_dt_picture_newdtobject((struct amiga_dt_picture_content *)c))
diff --git a/amiga/dt_sound.c b/amiga/dt_sound.c
index 3f8216914..a1daf03f5 100644
--- a/amiga/dt_sound.c
+++ b/amiga/dt_sound.c
@@ -77,7 +77,6 @@ void amiga_dt_sound_play(Object *dto)
nserror amiga_dt_sound_init(void)
{
- char dt_mime[50];
struct DataType *dt, *prevdt = NULL;
lwc_string *type;
lwc_error lerror;
@@ -146,12 +145,9 @@ bool amiga_dt_sound_convert(struct content *c)
LOG(("amiga_dt_sound_convert"));
amiga_dt_sound_content *plugin = (amiga_dt_sound_content *) c;
- union content_msg_data msg_data;
int width = 50, height = 50;
- char title[100];
const uint8 *data;
ULONG size;
- Object *dto;
data = (uint8 *)content__get_source_data(c, &size);
diff --git a/amiga/file.c b/amiga/file.c
index 937fb9052..b73dd1676 100644
--- a/amiga/file.c
+++ b/amiga/file.c
@@ -22,6 +22,7 @@
#include "amiga/filetype.h"
#include "amiga/icon.h"
#include "amiga/iff_dr2d.h"
+#include "amiga/misc.h"
#include "amiga/save_pdf.h"
#include "amiga/theme.h"
@@ -30,12 +31,12 @@
#include "desktop/browser_private.h"
#include "utils/nsoption.h"
+#include "utils/file.h"
#include "desktop/save_complete.h"
#include "desktop/save_pdf/pdf_plotters.h"
#include "desktop/save_text.h"
#include "utils/messages.h"
-#include "utils/url.h"
#include <proto/asl.h>
#include <proto/dos.h>
@@ -48,8 +49,6 @@ static struct Hook aslhookfunc;
static const ULONG ami_file_asl_mime_hook(struct Hook *mh,
struct FileRequester *fr, struct AnchorPathOld *ap)
{
- BPTR file = 0;
- char buffer[10];
char fname[1024];
BOOL ret = FALSE;
char *mt = NULL;
@@ -62,7 +61,7 @@ static const ULONG ami_file_asl_mime_hook(struct Hook *mh,
strcpy(fname,fr->fr_Drawer);
AddPart(fname,ap->ap_Info.fib_FileName,1024);
- mt = fetch_mimetype(fname);
+ mt = strdup(fetch_filetype(fname));
lerror = lwc_intern_string(mt, strlen(mt), &lwc_mt);
if (lerror != lwc_error_ok)
return FALSE;
@@ -78,7 +77,7 @@ static const ULONG ami_file_asl_mime_hook(struct Hook *mh,
void ami_file_open(struct gui_window_2 *gwin)
{
- char *temp, *temp2;
+ char *temp;
nsurl *url;
if(AslRequestTags(filereq,
@@ -95,23 +94,20 @@ void ami_file_open(struct gui_window_2 *gwin)
{
strlcpy(temp, filereq->fr_Drawer, 1024);
AddPart(temp, filereq->fr_File, 1024);
- temp2 = path_to_url(temp);
- if (nsurl_create(temp2, &url) != NSERROR_OK) {
+ if (netsurf_path_to_nsurl(temp, &url) != NSERROR_OK) {
warn_user("NoMemory", 0);
} else {
browser_window_navigate(gwin->bw,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
nsurl_unref(url);
}
- free(temp2);
FreeVec(temp);
}
}
@@ -151,23 +147,19 @@ void ami_file_save(int type, char *fname, struct Window *win,
struct hlcache_handle *object, struct hlcache_handle *favicon,
struct browser_window *bw)
{
- BPTR lock = 0;
+ BPTR lock, fh;
const char *source_data;
ULONG source_size;
struct bitmap *bm;
- BPTR fh=0;
ami_update_pointer(win, GUI_POINTER_WAIT);
- if(ami_download_check_overwrite(fname, win, 0))
- {
- switch(type)
- {
+ if(ami_download_check_overwrite(fname, win, 0)) {
+ switch(type) {
case AMINS_SAVE_SOURCE:
- if((source_data = content_get_source_data(object, &source_size)))
- {
- if(fh = FOpen(fname, MODE_NEWFILE,0))
- {
+ if((source_data = content_get_source_data(object, &source_size))) {
+ BPTR fh;
+ if(fh = FOpen(fname, MODE_NEWFILE,0)) {
FWrite(fh, source_data, 1, source_size);
FClose(fh);
}
@@ -179,8 +171,7 @@ void ami_file_save(int type, char *fname, struct Window *win,
break;
case AMINS_SAVE_COMPLETE:
- if(lock = CreateDir(fname))
- {
+ if(lock = CreateDir(fname)) {
UnLock(lock);
save_complete(object, fname, ami_file_set_type);
amiga_icon_superimpose_favicon(fname, favicon, NULL);
@@ -195,15 +186,13 @@ void ami_file_save(int type, char *fname, struct Window *win,
break;
case AMINS_SAVE_IFF:
- if((bm = content_get_bitmap(object)))
- {
+ if((bm = content_get_bitmap(object))) {
bm->url = (char *)nsurl_access(hlcache_handle_get_url(object));
bm->title = (char *)content_get_title(object);
bitmap_save(bm, fname, 0);
}
#ifdef WITH_NS_SVG
- else if(ami_mime_compare(object, "svg") == true)
- {
+ else if(ami_mime_compare(object, "svg") == true) {
ami_save_svg(object, fname);
}
#endif
diff --git a/amiga/filetype.c b/amiga/filetype.c
index 39e874ab0..2d55e1f8e 100644
--- a/amiga/filetype.c
+++ b/amiga/filetype.c
@@ -55,9 +55,7 @@ enum
const char *fetch_filetype(const char *unix_path)
{
static char mimetype[50];
- STRPTR ttype = NULL;
struct DiskObject *dobj = NULL;
- BPTR lock = 0;
struct DataType *dtn;
BOOL found = FALSE;
lwc_string *lwc_mimetype;
@@ -66,8 +64,7 @@ const char *fetch_filetype(const char *unix_path)
We'll just do a filename check here for quickness, although the
first word ought to be checked against WB_DISKMAGIC really. */
- if(strncmp(unix_path + strlen(unix_path) - 5, ".info", 5) == 0)
- {
+ if(strncmp(unix_path + strlen(unix_path) - 5, ".info", 5) == 0) {
strcpy(mimetype,"image/x-amiga-icon");
found = TRUE;
}
@@ -76,32 +73,26 @@ const char *fetch_filetype(const char *unix_path)
/* Secondly try getting a tooltype "MIMETYPE" and use that as the MIME type.
Will fail over to default icons if the file doesn't have a real icon. */
- if(!found)
- {
+ if(!found) {
if(dobj = GetIconTags(unix_path,ICONGETA_FailIfUnavailable,FALSE,
- TAG_DONE))
- {
+ TAG_DONE)) {
+ STRPTR ttype = NULL;
ttype = FindToolType(dobj->do_ToolTypes, "MIMETYPE");
- if(ttype)
- {
+ if(ttype) {
strcpy(mimetype,ttype);
found = TRUE;
}
-
FreeDiskObject(dobj);
}
}
/* If that didn't work, use the MIME file and DataTypes */
- if(!found)
- {
- if (lock = Lock (unix_path, ACCESS_READ))
- {
- if (dtn = ObtainDataTypeA (DTST_FILE, (APTR)lock, NULL))
- {
- if(ami_mime_from_datatype(dtn, &lwc_mimetype, NULL))
- {
+ if(!found) {
+ BPTR lock;
+ if (lock = Lock (unix_path, ACCESS_READ)) {
+ if (dtn = ObtainDataTypeA (DTST_FILE, (APTR)lock, NULL)) {
+ if(ami_mime_from_datatype(dtn, &lwc_mimetype, NULL)) {
strcpy(mimetype, lwc_string_data(lwc_mimetype));
found = TRUE;
ReleaseDataType(dtn);
@@ -144,12 +135,6 @@ const char *fetch_filetype(const char *unix_path)
return mimetype;
}
-
-char *fetch_mimetype(const char *ro_path)
-{
- return strdup(fetch_filetype(ro_path));
-}
-
const char *ami_content_type_to_file_type(content_type type)
{
switch(type)
@@ -179,9 +164,7 @@ const char *ami_content_type_to_file_type(content_type type)
nserror ami_mime_init(const char *mimefile)
{
- lwc_string *type;
lwc_error lerror;
- nserror error;
char buffer[256];
BPTR fh = 0;
struct RDArgs *rargs = NULL;
diff --git a/amiga/filetype.h b/amiga/filetype.h
index 851dddf36..e99f5950c 100644
--- a/amiga/filetype.h
+++ b/amiga/filetype.h
@@ -27,6 +27,8 @@
struct hlcache_handle;
struct ami_mime_entry;
+const char *fetch_filetype(const char *unix_path);
+
nserror ami_mime_init(const char *mimefile);
void ami_mime_free(void);
void ami_mime_entry_free(struct ami_mime_entry *mimeentry);
@@ -46,4 +48,5 @@ bool ami_mime_compare(struct hlcache_handle *c, const char *type);
/* deprecated */
const char *ami_content_type_to_file_type(content_type type);
+
#endif
diff --git a/amiga/font.c b/amiga/font.c
index 36c810428..de84a0420 100755
--- a/amiga/font.c
+++ b/amiga/font.c
@@ -23,12 +23,12 @@
#include "amiga/gui.h"
#include "amiga/utf8.h"
#include "amiga/object.h"
+#include "amiga/schedule.h"
#include "utils/nsoption.h"
#include "css/css.h"
#include "css/utils.h"
#include "render/font.h"
#include "utils/log.h"
-#include "utils/schedule.h"
#include "utils/utf8.h"
#include "utils/utils.h"
@@ -149,9 +149,9 @@ ULONG ami_xdpi;
int32 ami_font_plot_glyph(struct OutlineFont *ofont, struct RastPort *rp,
uint16 *char1, uint16 *char2, uint32 x, uint32 y, uint32 emwidth, bool aa);
int32 ami_font_width_glyph(struct OutlineFont *ofont,
- uint16 *char1, uint16 *char2, uint32 emwidth);
+ const uint16 *char1, const uint16 *char2, uint32 emwidth);
struct OutlineFont *ami_open_outline_font(const plot_font_style_t *fstyle,
- uint16 *codepoint);
+ const uint16 *codepoint);
static void ami_font_cleanup(struct MinList *ami_font_list);
static bool nsfont_width(const plot_font_style_t *fstyle,
@@ -204,15 +204,13 @@ bool nsfont_position_in_string(const plot_font_style_t *fstyle,
FIXED kern = 0;
struct OutlineFont *ofont, *ufont = NULL;
uint32 tx=0,i=0;
- size_t len, utf8len = 0;
- uint8 *utf8;
int utf8_pos = 0;
uint32 co = 0;
int utf16charlen;
ULONG emwidth = (ULONG)NSA_FONT_EMWIDTH(fstyle->size);
int32 tempx;
- if(utf8_to_enc(string,"UTF-16",length,(char **)&utf16) != UTF8_CONVERT_OK) return false;
+ if(utf8_to_enc(string,"UTF-16",length,(char **)&utf16) != NSERROR_OK) return false;
outf16 = utf16;
if(!(ofont = ami_open_outline_font(fstyle, 0))) return false;
@@ -291,30 +289,35 @@ bool nsfont_split(const plot_font_style_t *fstyle,
int x, size_t *char_offset, int *actual_x)
{
ULONG co;
- uint16 *utf16 = NULL,*outf16 = NULL;
- uint16 *utf16next = NULL;
+ uint16 *utf16_str = NULL;
+ const uint16 *utf16 = NULL;
+ const uint16 *utf16next = NULL;
FIXED kern = 0;
- int utf16charlen = 0;
struct OutlineFont *ofont, *ufont = NULL;
uint32 tx=0;
int utf8_pos = 0;
int32 tempx = 0;
ULONG emwidth = (ULONG)NSA_FONT_EMWIDTH(fstyle->size);
- if(utf8_to_enc((char *)string,"UTF-16",length,(char **)&utf16) != UTF8_CONVERT_OK) return false;
- outf16 = utf16;
- if(!(ofont = ami_open_outline_font(fstyle, 0))) return false;
+ /* Get utf16 conversion of string for glyph measuring routines */
+ if (utf8_to_enc(string, "UTF-16", length, (char **)&utf16_str) !=
+ NSERROR_OK)
+ return false;
+
+ utf16 = utf16_str;
+ if (!(ofont = ami_open_outline_font(fstyle, 0)))
+ return false;
*char_offset = 0;
*actual_x = 0;
+ if (*utf16 == 0xFEFF) utf16++;
+
while (utf8_pos < length) {
if ((*utf16 < 0xD800) || (0xDBFF < *utf16))
- utf16charlen = 1;
+ utf16next = utf16 + 1;
else
- utf16charlen = 2;
-
- utf16next = &utf16[utf16charlen];
+ utf16next = utf16 + 2;
tempx = ami_font_width_glyph(ofont, utf16, utf16next, emwidth);
@@ -332,21 +335,13 @@ bool nsfont_split(const plot_font_style_t *fstyle,
/* Got a space */
*actual_x = tx;
*char_offset = utf8_pos;
-
- if (x < tx) {
- /* Beyond available width,
- * so don't look further */
- free(outf16);
- return true;
- }
}
tx += tempx;
-
if ((x < tx) && (*char_offset != 0)) {
/* Reached available width, and a space was found;
* split there. */
- free(outf16);
+ free(utf16_str);
return true;
}
@@ -354,14 +349,13 @@ bool nsfont_split(const plot_font_style_t *fstyle,
utf8_pos = utf8_next(string, length, utf8_pos);
}
- free(outf16);
+ free(utf16_str);
/* No spaces to split at, or everything fits */
assert(*char_offset == 0 || x >= tx);
*char_offset = length;
*actual_x = tx;
-
return true;
}
@@ -432,7 +426,7 @@ struct ami_font_node *ami_font_open(const char *font)
* \return outline font or NULL on error
*/
struct OutlineFont *ami_open_outline_font(const plot_font_style_t *fstyle,
- uint16 *codepoint)
+ const uint16 *codepoint)
{
struct ami_font_node *node;
struct OutlineFont *ofont;
@@ -642,13 +636,14 @@ int32 ami_font_plot_glyph(struct OutlineFont *ofont, struct RastPort *rp,
}
int32 ami_font_width_glyph(struct OutlineFont *ofont,
- uint16 *char1, uint16 *char2, uint32 emwidth)
+ const uint16 *char1, const uint16 *char2, uint32 emwidth)
{
int32 char_advance = 0;
FIXED kern = 0;
- struct MinList *gwlist;
- FIXED char1w;
+ struct MinList *gwlist = NULL;
+ FIXED char1w = 0;
struct GlyphWidthEntry *gwnode;
+ bool skip_c2 = false;
if ((*char1 >= 0xD800) && (*char1 <= 0xDBFF)) {
/* We don't support UTF-16 surrogates yet, so just return. */
@@ -657,9 +652,11 @@ int32 ami_font_width_glyph(struct OutlineFont *ofont,
if ((*char2 >= 0xD800) && (*char2 <= 0xDBFF)) {
/* Don't attempt to kern a UTF-16 surrogate */
- *char2 = 0;
+ skip_c2 = true;
}
-
+
+ if (*char2 < 0x0020) skip_c2 = true;
+
if(ESetInfo(&ofont->olf_EEngine,
OT_GlyphCode, *char1,
OT_GlyphCode2, *char1,
@@ -674,7 +671,7 @@ int32 ami_font_width_glyph(struct OutlineFont *ofont,
kern = 0;
- if(*char2) {
+ if(!skip_c2) {
if(ESetInfo(&ofont->olf_EEngine,
OT_GlyphCode, *char1,
OT_GlyphCode2, *char2,
@@ -687,7 +684,7 @@ int32 ami_font_width_glyph(struct OutlineFont *ofont,
}
char_advance = (ULONG)(((char1w - kern) * emwidth) / 65536);
- if(*char2) EReleaseInfo(&ofont->olf_EEngine,
+ if(!skip_c2) EReleaseInfo(&ofont->olf_EEngine,
OT_TextKernPair, kern,
TAG_END);
@@ -732,7 +729,7 @@ ULONG ami_unicode_text(struct RastPort *rp, const char *string, ULONG length,
if(!string || string[0]=='\0') return 0;
if(!length) return 0;
- if(utf8_to_enc(string,"UTF-16",length,(char **)&utf16) != UTF8_CONVERT_OK) return 0;
+ if(utf8_to_enc(string,"UTF-16",length,(char **)&utf16) != NSERROR_OK) return 0;
outf16 = utf16;
if(!(ofont = ami_open_outline_font(fstyle, 0))) return 0;
@@ -831,7 +828,7 @@ void ami_init_fonts(void)
NewList(&ami_diskfontlib_list);
/* run first cleanup in ten minutes */
- schedule(60000, (schedule_callback_fn)ami_font_cleanup, ami_font_list);
+ ami_schedule(600000, ami_font_cleanup, ami_font_list);
}
void ami_close_fonts(void)
@@ -875,7 +872,7 @@ static void ami_font_cleanup(struct MinList *ami_font_list)
}while(node=nnode);
/* reschedule to run in five minutes */
- schedule(30000, (schedule_callback_fn)ami_font_cleanup, ami_font_list);
+ ami_schedule(300000, ami_font_cleanup, ami_font_list);
}
void ami_font_setdevicedpi(int id)
diff --git a/amiga/font_scan.c b/amiga/font_scan.c
index f3ad36e6f..6a595b456 100644
--- a/amiga/font_scan.c
+++ b/amiga/font_scan.c
@@ -71,7 +71,7 @@ struct ami_font_scan_window {
* \param glypharray an array of 0xffff lwc_string pointers
* \return font name or NULL
*/
-const char *ami_font_scan_lookup(uint16 *code, lwc_string **glypharray)
+const char *ami_font_scan_lookup(const uint16 *code, lwc_string **glypharray)
{
if(*code >= 0xd800 && *code <= 0xdbff) {
/* This is a multi-byte character, we don't support falback for these yet. */
@@ -294,7 +294,7 @@ ULONG ami_font_scan_fonts(struct MinList *list,
*/
ULONG ami_font_scan_list(struct MinList *list)
{
- int afShortage, afSize = 100, i;
+ int afShortage, afSize = 100;
struct AvailFontsHeader *afh;
struct AvailFonts *af;
ULONG found = 0;
@@ -315,7 +315,7 @@ ULONG ami_font_scan_list(struct MinList *list)
if(afh) {
af = (struct AvailFonts *)&(afh[1]);
- for(i = 0; i < afh->afh_NumEntries; i++) {
+ for(int i = 0; i < afh->afh_NumEntries; i++) {
if(af[i].af_Attr.ta_Style == FS_NORMAL) {
if(af[i].af_Attr.ta_Name != NULL) {
node = (struct nsObject *)FindIName((struct List *)list,
diff --git a/amiga/font_scan.h b/amiga/font_scan.h
index 840f200e1..d29469742 100755
--- a/amiga/font_scan.h
+++ b/amiga/font_scan.h
@@ -25,6 +25,6 @@ void ami_font_scan_init(const char *filename, bool force_scan, bool save,
lwc_string **glypharray);
void ami_font_scan_fini(lwc_string **glypharray);
void ami_font_scan_save(const char *filename, lwc_string **glypharray);
-const char *ami_font_scan_lookup(uint16 *code, lwc_string **glypharray);
+const char *ami_font_scan_lookup(const uint16 *code, lwc_string **glypharray);
#endif
diff --git a/amiga/gui.c b/amiga/gui.c
index c28ea583f..7ababdf74 100644
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2008-2013 Chris Young <chris@unsatisfactorysoftware.co.uk>
+ * Copyright 2008-2014 Chris Young <chris@unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -17,14 +17,16 @@
*/
/* NetSurf core includes */
+#include "content/backing_store.h"
+#include "content/fetchers.h"
+#include "content/fetchers/resource.h"
#include "content/urldb.h"
#include "css/utils.h"
+#include "desktop/browser_history.h"
#include "desktop/browser_private.h"
#include "desktop/hotlist.h"
-#include "desktop/local_history.h"
#include "desktop/mouse.h"
#include "desktop/netsurf.h"
-#include "utils/nsoption.h"
#include "desktop/save_complete.h"
#include "desktop/scrollbar.h"
#include "desktop/searchweb.h"
@@ -33,10 +35,11 @@
#include "image/ico.h"
#include "utils/log.h"
#include "utils/messages.h"
+#include "utils/nsoption.h"
#include "utils/utf8.h"
#include "utils/utils.h"
-#include "utils/url.h"
-#include "content/fetchers/resource.h"
+#include "utils/nsurl.h"
+#include "utils/file.h"
/* NetSurf Amiga platform includes */
#include "amiga/arexx.h"
@@ -69,6 +72,7 @@
#include "amiga/theme.h"
#include "amiga/tree.h"
#include "amiga/utf8.h"
+#include "amiga/sslcert.h"
/* Custom StringView class */
#include "amiga/stringview/stringview.h"
@@ -87,6 +91,7 @@
#include <proto/keymap.h>
#include <proto/locale.h>
#include <proto/Picasso96API.h>
+#include <proto/popupmenu.h>
#include <proto/utility.h>
#include <proto/wb.h>
@@ -109,6 +114,7 @@
#include <proto/bevel.h>
#include <proto/bitmap.h>
#include <proto/button.h>
+#include <proto/chooser.h>
#include <proto/clicktab.h>
#include <proto/layout.h>
#include <proto/space.h>
@@ -118,6 +124,7 @@
#include <classes/window.h>
#include <gadgets/button.h>
+#include <gadgets/chooser.h>
#include <gadgets/clicktab.h>
#include <gadgets/layout.h>
#include <gadgets/scroller.h>
@@ -143,6 +150,8 @@
#define EXTRADOWN (IECODE_5TH_BUTTON)
#define EXTRAUP (IECODE_5TH_BUTTON | IECODE_UP_PREFIX)
+extern struct gui_utf8_table *amiga_utf8_table;
+
struct ami_gui_tb_userdata {
struct List *sblist;
struct gui_window_2 *gw;
@@ -159,17 +168,20 @@ Class *urlStringClass;
BOOL locked_screen = FALSE;
BOOL screen_closed = FALSE;
+ULONG screen_signal = -1;
+
struct MsgPort *applibport = NULL;
ULONG applibsig = 0;
-BOOL refresh_search_ico = FALSE;
-BOOL refresh_favicon = FALSE;
-BOOL refresh_throbber = FALSE;
struct Hook newprefs_hook;
+STRPTR temp_homepage_url = NULL;
+bool cli_force = false;
+
static char *current_user;
static char *current_user_dir;
+static char *current_user_faviconcache;
-static const __attribute__((used)) char *stack_cookie = "\0$STACK:131072\0";
+static const __attribute__((used)) char *stack_cookie = "\0$STACK:98304\0";
const char * const versvn;
const char * const verdate;
@@ -186,8 +198,6 @@ void ami_try_quit(void);
void ami_quit_netsurf_delayed(void);
Object *ami_gui_splash_open(void);
void ami_gui_splash_close(Object *win_obj);
-static uint32 ami_set_search_ico_render_hook(struct Hook *hook, APTR space,
- struct gpRender *msg);
static uint32 ami_set_favicon_render_hook(struct Hook *hook, APTR space,
struct gpRender *msg);
static uint32 ami_set_throbber_render_hook(struct Hook *hook, APTR space,
@@ -198,22 +208,30 @@ static void ami_gui_window_update_box_deferred(struct gui_window *g, bool draw);
static void ami_do_redraw(struct gui_window_2 *g);
static void ami_schedule_redraw_remove(struct gui_window_2 *gwin);
+static bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy);
+static void gui_window_set_scroll(struct gui_window *g, int sx, int sy);
+static void gui_window_remove_caret(struct gui_window *g);
+static void gui_window_place_caret(struct gui_window *g, int x, int y, int height, const struct rect *clip);
+
+
+
/* accessors for default options - user option is updated if it is set as per default */
#define nsoption_default_set_int(OPTION, VALUE) \
if (nsoptions_default[NSOPTION_##OPTION].value.i == nsoptions[NSOPTION_##OPTION].value.i) \
nsoptions[NSOPTION_##OPTION].value.i = VALUE; \
nsoptions_default[NSOPTION_##OPTION].value.i = VALUE
+
+
STRPTR ami_locale_langs(void)
{
struct Locale *locale;
- STRPTR acceptlangs = NULL, acceptlangs2 = NULL;
- int i;
+ STRPTR acceptlangs = NULL;
char *remapped;
if(locale = OpenLocale(NULL))
{
- for(i=0;i<10;i++)
+ for(int i = 0; i < 10; i++)
{
if(locale->loc_PrefLanguages[i])
{
@@ -222,7 +240,7 @@ STRPTR ami_locale_langs(void)
{
if(acceptlangs)
{
- acceptlangs2 = acceptlangs;
+ STRPTR acceptlangs2 = acceptlangs;
acceptlangs = ASPrintf("%s, %s",acceptlangs2, remapped);
FreeVec(acceptlangs2);
acceptlangs2 = NULL;
@@ -246,13 +264,15 @@ STRPTR ami_locale_langs(void)
bool ami_gui_map_filename(char **remapped, const char *path, const char *file, const char *map)
{
BPTR fh = 0;
- char mapfile[1024];
+ char *mapfile = NULL;
+ size_t mapfile_size = 0;
char buffer[1024];
char *realfname;
bool found = false;
- strcpy(mapfile, path);
- path_add_part(mapfile, 1024, map);
+ netsurf_mkpath(&mapfile, &mapfile_size, 2, path, map);
+
+ if(mapfile == NULL) return false;
if(fh = FOpen(mapfile, MODE_OLDFILE, 0))
{
@@ -280,18 +300,20 @@ bool ami_gui_map_filename(char **remapped, const char *path, const char *file, c
if(found == false) *remapped = strdup(file);
else LOG(("Remapped %s to %s in path %s using %s", file, *remapped, path, map));
+ free(mapfile);
+
return found;
}
bool ami_gui_check_resource(char *fullpath, const char *file)
{
- bool free_rmap = false;
bool found = false;
char *remapped;
BPTR lock = 0;
+ size_t fullpath_len = 1024;
ami_gui_map_filename(&remapped, fullpath, file, "Resource.map");
- path_add_part(fullpath, 1024, remapped);
+ netsurf_mkpath(&fullpath, &fullpath_len, 2, fullpath, remapped);
LOG(("Checking for %s", fullpath));
@@ -314,6 +336,7 @@ bool ami_locate_resource(char *fullpath, const char *file)
BPTR lock = 0;
bool found = false;
char *remapped;
+ size_t fullpath_len = 1024;
/* Check NetSurf user data area first */
@@ -341,7 +364,7 @@ bool ami_locate_resource(char *fullpath, const char *file)
{
ami_gui_map_filename(&remapped, "PROGDIR:Resources",
locale->loc_PrefLanguages[i], "LangNames");
- path_add_part(fullpath, 1024, remapped);
+ netsurf_mkpath(&fullpath, &fullpath_len, 2, fullpath, remapped);
found = ami_gui_check_resource(fullpath, file);
}
@@ -399,7 +422,6 @@ void ami_open_resources(void)
TAG_DONE))) die(messages_get("NoMemory"));
ami_file_req_init();
- //ami_help_init(NULL);
}
static UWORD ami_system_colour_scrollbar_fgpen(struct DrawInfo *drinfo)
@@ -421,7 +443,7 @@ colour_option_from_pen(UWORD pen,
struct Screen *screen,
colour def_colour)
{
- ULONG colour[3];
+ ULONG colr[3];
struct DrawInfo *drinfo;
if((option < NSOPTION_SYS_COLOUR_START) ||
@@ -437,12 +459,12 @@ colour_option_from_pen(UWORD pen,
if(pen == AMINS_SCROLLERPEN) pen = ami_system_colour_scrollbar_fgpen(drinfo);
/* Get the colour of the pen being used for "pen" */
- GetRGB32(screen->ViewPort.ColorMap, drinfo->dri_Pens[pen], 1, (ULONG *)&colour);
+ GetRGB32(screen->ViewPort.ColorMap, drinfo->dri_Pens[pen], 1, (ULONG *)&colr);
/* convert it to a color */
- def_colour = ((colour[0] & 0xff000000) >> 24) |
- ((colour[1] & 0xff000000) >> 16) |
- ((colour[2] & 0xff000000) >> 8);
+ def_colour = ((colr[0] & 0xff000000) >> 24) |
+ ((colr[1] & 0xff000000) >> 16) |
+ ((colr[2] & 0xff000000) >> 8);
FreeScreenDrawInfo(screen, drinfo);
}
@@ -506,7 +528,6 @@ static void ami_set_screen_defaults(struct Screen *screen)
static nserror ami_set_options(struct nsoption_s *defaults)
{
STRPTR tempacceptlangs;
- BPTR lock = 0;
char temp[1024];
/* The following line disables the popupmenu.class select menu
@@ -516,11 +537,6 @@ static nserror ami_set_options(struct nsoption_s *defaults)
nsoption_set_bool(core_select_menu, true);
- #ifndef NS_AMIGA_CAIRO
- /* Ensure we get some output when Cairo not available */
- nsoption_set_int(cairo_renderer, 0);
- #endif
-
if((!nsoption_charp(accept_language)) ||
(nsoption_charp(accept_language)[0] == '\0') ||
(nsoption_bool(accept_lang_locale) == true))
@@ -548,9 +564,6 @@ static nserror ami_set_options(struct nsoption_s *defaults)
nsoption_setnull_charp(ca_bundle,
(char *)strdup("PROGDIR:Resources/ca-bundle"));
-
- search_engines_file_location = nsoption_charp(search_engines_file);
-
sprintf(temp, "%s/FontGlyphCache", current_user_dir);
nsoption_setnull_charp(font_unicode_file,
(char *)strdup(temp));
@@ -564,15 +577,16 @@ static nserror ami_set_options(struct nsoption_s *defaults)
if (nsoption_charp(font_unicode) == NULL)
{
+ BPTR lock = 0;
/* Search for some likely candidates */
- if(lock=Lock("FONTS:Code2000.font",ACCESS_READ))
+ if(lock = Lock("FONTS:Code2000.font", ACCESS_READ))
{
UnLock(lock);
nsoption_set_charp(font_unicode,
(char *)strdup("Code2000"));
}
- else if(lock=Lock("FONTS:Bitstream Cyberbit.font",ACCESS_READ))
+ else if(lock = Lock("FONTS:Bitstream Cyberbit.font", ACCESS_READ))
{
UnLock(lock);
nsoption_set_charp(font_unicode,
@@ -580,9 +594,11 @@ static nserror ami_set_options(struct nsoption_s *defaults)
}
}
+ if(popupmenu_lib_ok == FALSE)
+ nsoption_set_bool(context_menu, false);
+
#ifndef __amigaos4__
nsoption_set_bool(download_notify, false);
- nsoption_set_bool(context_menu, false);
nsoption_set_bool(font_antialiasing, false);
nsoption_set_bool(truecolour_mouse_pointers, false);
#endif
@@ -594,7 +610,7 @@ void ami_amiupdate(void)
{
/* Create AppPath location for AmiUpdate use */
- BPTR lock = 0, amiupdatefh = 0;
+ BPTR lock = 0;
if(((lock = Lock("ENVARC:AppPaths",SHARED_LOCK)) == 0))
{
@@ -606,6 +622,7 @@ void ami_amiupdate(void)
if(lock = Lock("PROGDIR:", ACCESS_READ))
{
char filename[1024];
+ BPTR amiupdatefh;
DevNameFromLock(lock,(STRPTR)&filename,1024L,DN_FULLPATH);
@@ -616,11 +633,10 @@ void ami_amiupdate(void)
}
}
-nsurl *gui_get_resource_url(const char *path)
+static nsurl *gui_get_resource_url(const char *path)
{
char buf[1024];
char path2[1024];
- char *raw;
nsurl *url = NULL;
if(ami_locate_resource(buf, path) == false)
@@ -640,11 +656,7 @@ nsurl *gui_get_resource_url(const char *path)
else return NULL;
}
- raw = path_to_url(buf);
- if (raw != NULL) {
- nsurl_create(raw, &url);
- free(raw);
- }
+ netsurf_path_to_nsurl(buf, &url);
return url;
}
@@ -654,7 +666,6 @@ void gui_init(int argc, char** argv)
BPTR lock = 0;
ami_open_resources(); /* alloc ports/asl reqs, open libraries/devices */
- ami_print_init();
ami_clipboard_init();
ami_openurl_open();
@@ -720,11 +731,15 @@ void ami_openscreen(void)
}
}
+ if(screen_signal == -1) screen_signal = AllocSignal(-1);
+ LOG(("Screen signal %d", screen_signal));
scrn = OpenScreenTags(NULL,
SA_DisplayID, id,
SA_Title, nsscreentitle,
SA_Type, PUBLICSCREEN,
SA_PubName, "NetSurf",
+ SA_PubSig, screen_signal,
+ SA_PubTask, FindTask(0),
SA_LikeWorkbench, TRUE,
SA_Compositing, compositing,
TAG_DONE);
@@ -735,6 +750,9 @@ void ami_openscreen(void)
}
else
{
+ FreeSignal(screen_signal);
+ screen_signal = -1;
+
if(scrn = LockPubScreen("NetSurf"))
{
locked_screen = TRUE;
@@ -760,7 +778,7 @@ void ami_openscreen(void)
ami_font_setdevicedpi(id);
ami_set_screen_defaults(scrn);
- //ami_help_new_screen(scrn);
+ ami_help_new_screen(scrn);
}
void ami_openscreenfirst(void)
@@ -770,15 +788,10 @@ void ami_openscreenfirst(void)
ami_theme_throbber_setup();
}
-static void gui_init2(int argc, char** argv)
+static void ami_gui_commandline(int *argc, char **argv)
{
- struct Screen *screen;
- nsurl *url;
- nserror error;
- struct browser_window *bw = NULL;
+ int new_argc = 0;
struct RDArgs *args;
- STRPTR temp_homepage_url = NULL;
- BOOL notalreadyrunning;
STRPTR template = "NSOPTS/M,URL/K,FORCE/S";
long rarray[] = {0,0,0};
enum
@@ -788,6 +801,55 @@ static void gui_init2(int argc, char** argv)
A_FORCE
};
+ if(*argc == 0) return; // argc==0 is started from wb
+
+ if(args = ReadArgs(template, rarray, NULL)) {
+ if(rarray[A_URL]) {
+ LOG(("URL %s specified on command line", rarray[A_URL]));
+ temp_homepage_url = ami_to_utf8_easy((char *)rarray[A_URL]);
+ }
+
+ if(rarray[A_FORCE]) {
+ LOG(("FORCE specified on command line"));
+ cli_force = true;
+ }
+
+ if(rarray[A_NSOPTS]) {
+ /* The NSOPTS/M parameter specified in the ReadArgs template is
+ * special. The /M means it collects all arguments that can't
+ * be assigned to any other parameter, and stores them in an
+ * array. We collect these and pass them as a fake argc/argv
+ * to nsoption_commandline().
+ * This trickery is necessary because if ReadArgs() is called
+ * first, nsoption_commandline() can no longer parse (fetch?)
+ * the arguments. If nsoption_commandline() is called first,
+ * then ReadArgs cannot fetch the arguments.
+ */
+ char **p = (char **)rarray[A_NSOPTS];
+ do {
+ LOG(("Arg [%d] assigned to NSOPTS/M by ReadArgs: %s", new_argc, *p));
+ new_argc++;
+ p++;
+ } while(*p != NULL);
+
+ nsoption_commandline(&new_argc, (char **)rarray[A_NSOPTS], NULL);
+ }
+
+ FreeArgs(args);
+ } else {
+ LOG(("ReadArgs failed to parse command line"));
+ }
+}
+
+
+static void gui_init2(int argc, char** argv)
+{
+ struct Screen *screen;
+ BOOL notalreadyrunning;
+ nsurl *url;
+ nserror error;
+ struct browser_window *bw = NULL;
+
notalreadyrunning = ami_arexx_init();
/* Treeview init code ends up calling a font function which needs this */
@@ -808,59 +870,38 @@ static void gui_init2(int argc, char** argv)
ami_cookies_initialise();
ami_global_history_initialise();
- search_web_provider_details(nsoption_int(search_provider));
-
- if(argc) // argc==0 is started from wb
- {
- if(args = ReadArgs(template,rarray,NULL))
- {
- if (notalreadyrunning &&
- (nsoption_bool(startup_no_window) == false))
- ami_openscreenfirst();
-
- if(rarray[A_URL])
- {
- temp_homepage_url = (char *)strdup((char *)rarray[A_URL]);
-
- if(notalreadyrunning)
- {
- error = nsurl_create(temp_homepage_url, &url);
- if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
- url,
- NULL,
- NULL,
- &bw);
- nsurl_unref(url);
- }
- if (error != NSERROR_OK) {
- warn_user(messages_get_errorcode(error), 0);
- }
-
- free(temp_homepage_url);
- }
- }
+ search_web_select_provider(nsoption_int(search_provider));
- if(rarray[A_FORCE])
- {
- notalreadyrunning = TRUE;
- }
+ if (notalreadyrunning &&
+ (nsoption_bool(startup_no_window) == false))
+ ami_openscreenfirst();
- FreeArgs(args);
+ if(temp_homepage_url && notalreadyrunning) {
+ error = nsurl_create(temp_homepage_url, &url);
+ if (error == NSERROR_OK) {
+ error = browser_window_create(BW_CREATE_HISTORY,
+ url,
+ NULL,
+ NULL,
+ &bw);
+ nsurl_unref(url);
}
+ if (error != NSERROR_OK) {
+ warn_user(messages_get_errorcode(error), 0);
+ }
+ free(temp_homepage_url);
}
- else
- {
+
+ if(cli_force == true) {
+ notalreadyrunning = TRUE;
+ }
+
+ if(argc == 0) { // WB
struct WBStartup *WBenchMsg = (struct WBStartup *)argv;
struct WBArg *wbarg;
int first=0,i=0;
char fullpath[1024];
- if (notalreadyrunning &&
- (nsoption_bool(startup_no_window) == false))
- ami_openscreenfirst();
-
for(i=0,wbarg=WBenchMsg->sm_ArgList;i<WBenchMsg->sm_NumArgs;i++,wbarg++)
{
if(i==0) continue;
@@ -869,18 +910,22 @@ static void gui_init2(int argc, char** argv)
DevNameFromLock(wbarg->wa_Lock,fullpath,1024,DN_FULLPATH);
AddPart(fullpath,wbarg->wa_Name,1024);
- if(!temp_homepage_url) temp_homepage_url = path_to_url(fullpath);
+ if(!temp_homepage_url) {
+ nsurl *temp_url;
+ if (netsurf_path_to_nsurl(fullpath, &temp_url) == NSERROR_OK) {
+ temp_homepage_url = strdup(nsurl_access(temp_url));
+ nsurl_unref(temp_url);
+ }
+ }
if(notalreadyrunning)
{
error = nsurl_create(temp_homepage_url, &url);
-
if (error == NSERROR_OK) {
if(!first)
{
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -890,8 +935,7 @@ static void gui_init2(int argc, char** argv)
}
else
{
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_CLONE | BW_CREATE_HISTORY,
url,
NULL,
bw,
@@ -973,8 +1017,7 @@ static void gui_init2(int argc, char** argv)
if(!bw && (nsoption_bool(startup_no_window) == false)) {
error = nsurl_create(nsoption_charp(homepage_url), &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -987,92 +1030,18 @@ static void gui_init2(int argc, char** argv)
}
}
-/** Normal entry point from OS */
-int main(int argc, char** argv)
-{
- setbuf(stderr, NULL);
- char messages[100];
- char script[1024];
- char temp[1024];
- BPTR lock = 0;
- int32 user = 0;
- nserror ret;
- Object *splash_window = ami_gui_splash_open();
-
- user = GetVar("user", temp, 1024, GVF_GLOBAL_ONLY);
- current_user = ASPrintf("%s", (user == -1) ? "Default" : temp);
- current_user_dir = ASPrintf("PROGDIR:Users/%s", current_user);
-
- if(lock = CreateDirTree(current_user_dir))
- UnLock(lock);
-
- current_user_options = ASPrintf("%s/Choices", current_user_dir);
-
- ami_mime_init("PROGDIR:Resources/mimetypes");
- sprintf(temp, "%s/mimetypes.user", current_user_dir);
- ami_mime_init(temp);
- ami_schedule_open_timer();
- ami_schedule_create();
-
- amiga_plugin_hack_init();
- amiga_datatypes_init();
-
- /* initialise logging. Not fatal if it fails but not much we
- * can do about it either.
- */
- nslog_init(NULL, &argc, argv);
-
- /* user options setup */
- ret = nsoption_init(ami_set_options, &nsoptions, &nsoptions_default);
- if (ret != NSERROR_OK) {
- die("Options failed to initialise");
- }
- nsoption_read(current_user_options, NULL);
- nsoption_commandline(&argc, argv, NULL);
-
- if(ami_locate_resource(messages, "Messages") == false)
- die("Cannot open Messages file");
-
- ret = netsurf_init(messages);
- if (ret != NSERROR_OK) {
- die("NetSurf failed to initialise");
- }
-
- amiga_icon_init();
-
- gui_init(argc, argv);
- gui_init2(argc, argv);
-
- ami_gui_splash_close(splash_window);
-
- strlcpy(script, nsoption_charp(arexx_dir), 1024);
- AddPart(script, nsoption_charp(arexx_startup), 1024);
- ami_arexx_execute(script);
-
- netsurf_main_loop();
-
- strlcpy(script, nsoption_charp(arexx_dir), 1024);
- AddPart(script, nsoption_charp(arexx_shutdown), 1024);
- ami_arexx_execute(script);
-
- netsurf_exit();
-
- ami_mime_free();
-
- return 0;
-}
void ami_gui_history(struct gui_window_2 *gwin, bool back)
{
if(back == true)
{
if(browser_window_back_available(gwin->bw))
- history_back(gwin->bw, gwin->bw->history);
+ browser_window_history_back(gwin->bw, false);
}
else
{
if(browser_window_forward_available(gwin->bw))
- history_forward(gwin->bw, gwin->bw->history);
+ browser_window_history_forward(gwin->bw, false);
}
ami_update_buttons(gwin);
@@ -1229,7 +1198,6 @@ bool ami_spacebox_to_ns_coords(struct gui_window_2 *gwin, int *x, int *y,
bool ami_mouse_to_ns_coords(struct gui_window_2 *gwin, int *x, int *y,
int mouse_x, int mouse_y)
{
- int xs, ys;
int ns_x, ns_y;
struct IBox *bbox;
@@ -1386,22 +1354,90 @@ void ami_gui_menu_update_all(void)
} while(node = nnode);
}
+/**
+ * function to add retrieved favicon to gui
+ */
+static void gui_window_set_icon(struct gui_window *g, hlcache_handle *icon)
+{
+ struct BitMap *bm = NULL;
+ struct IBox *bbox;
+ ULONG cur_tab = 0;
+ struct bitmap *icon_bitmap;
+
+ if(nsoption_bool(kiosk_mode) == true) return;
+ if(!g) return;
+
+ if(g->tab_node && (g->shared->tabs > 1)) GetAttr(CLICKTAB_Current,
+ g->shared->objects[GID_TABS],
+ (ULONG *)&cur_tab);
+
+ if ((icon != NULL) && ((icon_bitmap = content_get_bitmap(icon)) != NULL))
+ {
+ bm = ami_bitmap_get_native(icon_bitmap, 16, 16,
+ g->shared->win->RPort->BitMap);
+ }
+
+ if((cur_tab == g->tab) || (g->shared->tabs <= 1))
+ {
+ GetAttr(SPACE_AreaBox, g->shared->objects[GID_ICON], (ULONG *)&bbox);
+
+ RefreshGList((struct Gadget *)g->shared->objects[GID_ICON],
+ g->shared->win, NULL, 1);
+
+ if(bm)
+ {
+ ULONG tag, tag_data, minterm;
+
+ if(ami_plot_screen_is_palettemapped() == false) {
+ tag = BLITA_UseSrcAlpha;
+ tag_data = !icon_bitmap->opaque;
+ minterm = 0xc0;
+ } else {
+ tag = BLITA_MaskPlane;
+ tag_data = (ULONG)ami_bitmap_get_mask(icon_bitmap, 16, 16, bm);
+ minterm = (ABC|ABNC|ANBC);
+ }
+
+ BltBitMapTags(BLITA_SrcX, 0,
+ BLITA_SrcY, 0,
+ BLITA_DestX, bbox->Left,
+ BLITA_DestY, bbox->Top,
+ BLITA_Width, 16,
+ BLITA_Height, 16,
+ BLITA_Source, bm,
+ BLITA_Dest, g->shared->win->RPort,
+ BLITA_SrcType, BLITT_BITMAP,
+ BLITA_DestType, BLITT_RASTPORT,
+ BLITA_Minterm, minterm,
+ tag, tag_data,
+ TAG_DONE);
+ }
+ }
+
+ g->favicon = icon;
+}
+
+static void ami_gui_refresh_favicon(void *p)
+{
+ struct gui_window_2 *gwin = (struct gui_window_2 *)p;
+ gui_window_set_icon(gwin->bw->window, gwin->bw->window->favicon);
+}
+
void ami_handle_msg(void)
{
- struct IntuiMessage *message = NULL;
ULONG class,result,storage = 0,x,y,xs,ys,width=800,height=600;
uint16 code,quals;
struct IBox *bbox;
struct nsObject *node;
struct nsObject *nnode;
struct gui_window_2 *gwin = NULL;
- struct MenuItem *item;
struct InputEvent *ie;
struct Node *tabnode;
- int i, nskey;
+ int nskey;
struct browser_window *closedbw;
struct timeval curtime;
static int drag_x_move = 0, drag_y_move = 0;
+ char *utf8 = NULL;
nsurl *url;
if(IsMinListEmpty(window_list))
@@ -1419,121 +1455,60 @@ void ami_handle_msg(void)
gwin = node->objstruct;
- if(node->Type == AMINS_TVWINDOW)
- {
- if(ami_tree_event((struct treeview_window *)gwin))
- {
- if(IsMinListEmpty(window_list))
- {
- /* last window closed, so exit */
- ami_try_quit();
- }
+ if(node->Type == AMINS_TVWINDOW) {
+ if(ami_tree_event((struct treeview_window *)gwin)) {
+ ami_try_quit();
break;
- }
- else
- {
+ } else {
node = nnode;
continue;
}
- }
- else if(node->Type == AMINS_FINDWINDOW)
- {
- if(ami_search_event())
- {
- if(IsMinListEmpty(window_list))
- {
- /* last window closed, so exit */
- ami_try_quit();
- }
+ } else if(node->Type == AMINS_FINDWINDOW) {
+ if(ami_search_event()) {
+ ami_try_quit();
break;
- }
- else
- {
+ } else {
node = nnode;
continue;
}
- }
- else if(node->Type == AMINS_HISTORYWINDOW)
- {
- if(ami_history_event((struct history_window *)gwin))
- {
- if(IsMinListEmpty(window_list))
- {
- /* last window closed, so exit */
- ami_try_quit();
- }
+ } else if(node->Type == AMINS_HISTORYWINDOW) {
+ if(ami_history_event((struct history_window *)gwin)) {
+ ami_try_quit();
break;
- }
- else
- {
+ } else {
node = nnode;
continue;
}
- }
- else if(node->Type == AMINS_PRINTWINDOW)
- {
- if(ami_print_event((struct ami_print_window *)gwin))
- {
- if(IsMinListEmpty(window_list))
- {
- /* last window closed, so exit */
- ami_try_quit();
- }
+ } else if(node->Type == AMINS_PRINTWINDOW) {
+ if(ami_print_event((struct ami_print_window *)gwin)) {
+ ami_try_quit();
break;
- }
- else
- {
+ } else {
node = nnode;
continue;
}
- }
- else if(node->Type == AMINS_GUIOPTSWINDOW)
- {
- if(ami_gui_opts_event())
- {
- if(IsMinListEmpty(window_list))
- {
- /* last window closed, so exit with conditions ;) */
- if(scrn) ami_try_quit();
- }
+ } else if(node->Type == AMINS_GUIOPTSWINDOW) {
+ if(ami_gui_opts_event()) {
+ /* last window possibly closed, so exit with conditions ;) */
+ if(scrn) ami_try_quit();
break;
- }
- else
- {
+ } else {
node = nnode;
continue;
}
- }
- else if(node->Type == AMINS_DLWINDOW)
- {
- if(ami_download_window_event((struct gui_download_window *)gwin))
- {
- if(IsMinListEmpty(window_list))
- {
- /* last window closed, so exit */
- ami_try_quit();
- }
+ } else if(node->Type == AMINS_DLWINDOW) {
+ if(ami_download_window_event((struct gui_download_window *)gwin)) {
+ ami_try_quit();
break;
- }
- else
- {
+ } else {
node = nnode;
continue;
}
- }
- else if(node->Type == AMINS_LOGINWINDOW)
- {
- if(ami_401login_event((struct gui_login_window *)gwin))
- {
- if(IsMinListEmpty(window_list))
- {
- /* last window closed, so exit */
- ami_try_quit();
- }
+ } else if(node->Type == AMINS_LOGINWINDOW) {
+ if(ami_401login_event((struct gui_login_window *)gwin)) {
+ ami_try_quit();
break;
- }
- else
- {
+ } else {
node = nnode;
continue;
}
@@ -1759,6 +1734,7 @@ void ami_handle_msg(void)
switch(result & WMHI_GADGETMASK)
{
case GID_TABS:
+ if(gwin->objects[GID_TABS] == NULL) break;
GetAttrs(gwin->objects[GID_TABS],
CLICKTAB_NodeClosed, &tabnode, TAG_DONE);
if(tabnode)
@@ -1780,76 +1756,74 @@ void ami_handle_msg(void)
break;
case GID_ADDTAB:
- {
- nserror error;
-
- error = nsurl_create(nsoption_charp(homepage_url), &url);
- if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_TAB,
- url,
- NULL,
- gwin->bw,
- NULL);
- nsurl_unref(url);
- }
- if (error != NSERROR_OK) {
- warn_user(messages_get_errorcode(error), 0);
- }
- }
+ ami_gui_new_blank_tab(gwin);
break;
case GID_URL:
+ {
+ nserror ret;
+ nsurl *url;
GetAttr(STRINGA_TextVal,
(Object *)gwin->objects[GID_URL],
(ULONG *)&storage);
- if(search_is_url((char *)storage) == false)
- {
- storage = (ULONG)search_web_from_term((char *)storage);
- }
- {
- if (nsurl_create((char *)storage, &url) != NSERROR_OK) {
- warn_user("NoMemory", 0);
- } else {
+ utf8 = ami_to_utf8_easy((const char *)storage);
+
+ ret = search_web_omni(utf8, SEARCH_WEB_OMNI_NONE, &url);
+ ami_utf8_free(utf8);
+ if (ret == NSERROR_OK) {
browser_window_navigate(gwin->bw,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
nsurl_unref(url);
- }
}
+ if (ret != NSERROR_OK) {
+ warn_user(messages_get_errorcode(ret), 0);
+ }
+ }
break;
case GID_TOOLBARLAYOUT:
/* Need fixing: never gets here */
- search_web_retrieve_ico(false);
+ search_web_select_provider(-1);
+ break;
+
+ case GID_SEARCH_ICON:
+ GetAttr(CHOOSER_Selected, gwin->objects[GID_SEARCH_ICON], (ULONG *)&storage);
+ search_web_select_provider(storage);
break;
case GID_SEARCHSTRING:
+ {
+ nserror ret;
+ nsurl *url;
+
GetAttr(STRINGA_TextVal,
(Object *)gwin->objects[GID_SEARCHSTRING],
(ULONG *)&storage);
- storage = (ULONG)search_web_from_term((char *)storage);
- {
- if (nsurl_create((char *)storage, &url) != NSERROR_OK) {
- warn_user("NoMemory", 0);
- } else {
+
+ utf8 = ami_to_utf8_easy((const char *)storage);
+
+ ret = search_web_omni(utf8, SEARCH_WEB_OMNI_SEARCHONLY, &url);
+ ami_utf8_free(utf8);
+ if (ret == NSERROR_OK) {
browser_window_navigate(gwin->bw,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
- nsurl_unref(url);
- }
+ nsurl_unref(url);
}
+ if (ret != NSERROR_OK) {
+ warn_user(messages_get_errorcode(ret), 0);
+ }
+
+ }
break;
case GID_HOME:
@@ -1860,8 +1834,7 @@ void ami_handle_msg(void)
browser_window_navigate(gwin->bw,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -1903,7 +1876,6 @@ void ami_handle_msg(void)
GetAttr(STRINGA_TextVal,
(Object *)gwin->objects[GID_URL],
(ULONG *)&storage);
-
if(nsurl_create((const char *)storage, &url) == NSERROR_OK) {
if(hotlist_has_url(url)) {
hotlist_remove_url(url);
@@ -1912,7 +1884,6 @@ void ami_handle_msg(void)
}
nsurl_unref(url);
}
-
ami_gui_update_hotlist_button(gwin);
break;
@@ -1948,8 +1919,7 @@ void ami_handle_msg(void)
error = nsurl_create(nsoption_charp(homepage_url), &urlns);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_CLONE | BW_CREATE_HISTORY,
urlns,
NULL,
gwin->bw,
@@ -1970,9 +1940,8 @@ void ami_handle_msg(void)
error = nsurl_create(nsoption_charp(homepage_url), &urlns);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_TAB,
+ error = browser_window_create(BW_CREATE_CLONE | BW_CREATE_HISTORY |
+ BW_CREATE_TAB,
urlns,
NULL,
gwin->bw,
@@ -2064,13 +2033,12 @@ void ami_handle_msg(void)
if(browser_window_reload_available(gwin->bw))
browser_window_reload(gwin->bw,false);
break;
-/*
+
case 'u': // open url
if((nsoption_bool(kiosk_mode) == false))
ActivateLayoutGadget((struct Gadget *)gwin->objects[GID_MAIN],
gwin->win, NULL, (uint32)gwin->objects[GID_URL]);
break;
-*/
}
}
else
@@ -2137,7 +2105,7 @@ void ami_handle_msg(void)
break;
case RAWKEY_HELP: // help
- //ami_help_open(AMI_HELP_GUI);
+ ami_help_open(AMI_HELP_GUI, scrn);
break;
}
}
@@ -2152,7 +2120,7 @@ void ami_handle_msg(void)
case AMINS_WINDOW:
ami_set_border_gadget_balance(gwin);
- ami_update_throbber(gwin,true);
+ ami_throbber_redraw_schedule(0, gwin->bw->window);
if(gwin->tabs)
{
@@ -2164,11 +2132,11 @@ void ami_handle_msg(void)
GetClickTabNodeAttrs(tab,
TNA_UserData, &bw,
TAG_DONE);
- bw->reformat_pending = true;
} while(tab=ntab);
}
- gwin->bw->reformat_pending = true;
+ ami_schedule(0, ami_gui_refresh_favicon, gwin);
+ browser_window_schedule_reformat(gwin->bw);
ami_schedule_redraw(gwin, true);
break;
}
@@ -2180,7 +2148,6 @@ void ami_handle_msg(void)
case WMHI_ICONIFY:
{
- struct DiskObject *dobj;
struct bitmap *bm;
bm = urldb_get_thumbnail(hlcache_handle_get_url(gwin->bw->current_content));
@@ -2238,36 +2205,8 @@ void ami_handle_msg(void)
// ReplyMsg((struct Message *)message);
}
- if(node->Type == AMINS_WINDOW)
- {
- /* Catch any reformats tagged by the core - only used by scale? */
- if(gwin->bw->reformat_pending) {
- ami_schedule_redraw(gwin, true);
- }
-
- if(gwin->bw->window->throbbing)
- ami_update_throbber(gwin,false);
- }
} while(node = nnode);
- if(refresh_search_ico)
- {
- gui_window_set_search_ico(NULL);
- refresh_search_ico = FALSE;
- }
-
- if(refresh_favicon)
- {
- gui_window_set_icon(gwin->bw->window, gwin->bw->window->favicon);
- refresh_favicon = FALSE;
- }
-
- if(refresh_throbber)
- {
- ami_update_throbber(gwin, true);
- refresh_throbber = FALSE;
- }
-
if(ami_menu_window_close)
{
if(ami_menu_window_close == (void *)AMI_MENU_WINDOW_CLOSE_ALL)
@@ -2301,7 +2240,6 @@ void ami_handle_appmsg(void)
int x, y;
struct WBArg *appwinargs;
STRPTR filename;
- char *urlfilename;
int i = 0;
while(appmsg=(struct AppMessage *)GetMsg(appport))
@@ -2333,9 +2271,8 @@ void ami_handle_appmsg(void)
appmsg->am_MouseX, appmsg->am_MouseY) == false)
{
nsurl *url;
- urlfilename = path_to_url(filename);
- if (nsurl_create(urlfilename, &url) != NSERROR_OK) {
+ if (netsurf_path_to_nsurl(filename, &url) != NSERROR_OK) {
warn_user("NoMemory", 0);
}
else
@@ -2345,8 +2282,7 @@ void ami_handle_appmsg(void)
browser_window_navigate(gwin->bw,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -2355,9 +2291,8 @@ void ami_handle_appmsg(void)
}
else
{
- browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_TAB,
+ browser_window_create(BW_CREATE_CLONE | BW_CREATE_HISTORY |
+ BW_CREATE_TAB,
url,
NULL,
gwin->bw,
@@ -2365,17 +2300,14 @@ void ami_handle_appmsg(void)
}
nsurl_unref(url);
}
-
- free(urlfilename);
}
else
{
if(browser_window_drop_file_at_point(gwin->bw, x, y, filename) == false)
{
nsurl *url;
- urlfilename = path_to_url(filename);
- if (nsurl_create(urlfilename, &url) != NSERROR_OK) {
+ if (netsurf_path_to_nsurl(filename, &url) != NSERROR_OK) {
warn_user("NoMemory", 0);
}
else
@@ -2386,8 +2318,7 @@ void ami_handle_appmsg(void)
browser_window_navigate(gwin->bw,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -2396,9 +2327,8 @@ void ami_handle_appmsg(void)
}
else
{
- browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_TAB,
+ browser_window_create(BW_CREATE_CLONE | BW_CREATE_HISTORY |
+ BW_CREATE_TAB,
url,
NULL,
gwin->bw,
@@ -2407,7 +2337,6 @@ void ami_handle_appmsg(void)
}
nsurl_unref(url);
}
- free(urlfilename);
}
}
FreeVec(filename);
@@ -2437,8 +2366,7 @@ void ami_handle_applib(void)
error = nsurl_create(nsoption_charp(homepage_url), &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -2455,14 +2383,10 @@ void ami_handle_applib(void)
{
struct ApplicationOpenPrintDocMsg *applibopdmsg =
(struct ApplicationOpenPrintDocMsg *)applibmsg;
- char *tempurl;
-
- tempurl = path_to_url(applibopdmsg->fileName);
- error = nsurl_create(tempurl, &url);
+ error = netsurf_path_to_nsurl(applibopdmsg->fileName, &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -2472,7 +2396,6 @@ void ami_handle_applib(void)
if (error != NSERROR_OK) {
warn_user(messages_get_errorcode(error), 0);
}
- free(tempurl);
}
break;
@@ -2514,16 +2437,40 @@ void ami_get_msg(void)
ULONG appsig = 1L << appport->mp_SigBit;
ULONG schedulesig = 1L << msgport->mp_SigBit;
ULONG ctrlcsig = SIGBREAKF_CTRL_C;
- ULONG signal;
+ uint32 signal = 0;
+ fd_set read_fd_set, write_fd_set, except_fd_set;
+ int max_fd = -1;
struct TimerRequest *timermsg = NULL;
struct MsgPort *printmsgport = ami_print_get_msgport();
- ULONG printsig = 1L << printmsgport->mp_SigBit;
- ULONG signalmask = winsignal | appsig | schedulesig | rxsig | printsig | applibsig | ctrlcsig;
+ ULONG printsig = 0;
+ ULONG helpsignal = ami_help_signal();
+ if(printmsgport) printsig = 1L << printmsgport->mp_SigBit;
+ uint32 signalmask = winsignal | appsig | schedulesig | rxsig |
+ printsig | applibsig | helpsignal;
+
+ if ((fetcher_fdset(&read_fd_set, &write_fd_set, &except_fd_set, &max_fd) == NSERROR_OK) &&
+ (max_fd != -1)) {
+ /* max_fd is the highest fd in use, but waitselect() needs to know how many
+ * are in use, so we add 1. */
+ if (waitselect(max_fd + 1, &read_fd_set, &write_fd_set, &except_fd_set,
+ NULL, (unsigned int *)&signalmask) != -1) {
+ signal = signalmask;
+ } else {
+ LOG(("waitselect() returned error"));
+ /* \todo Fix Ctrl-C handling.
+ * WaitSelect() from bsdsocket.library returns -1 if the task was
+ * signalled with a Ctrl-C. waitselect() from newlib.library does not.
+ * Adding the Ctrl-C signal to our user signal mask causes a Ctrl-C to
+ * occur sporadically. Otherwise we never get a -1 except on error.
+ * NetSurf still terminates at the Wait() when network activity is over.
+ */
+ }
+ } else {
+ /* If fetcher_fdset fails or no network activity, do it the old fashioned way. */
+ signalmask |= ctrlcsig;
+ signal = Wait(signalmask);
+ }
- signal = Wait(signalmask);
-/*
-printf("sig recvd %ld (%ld %ld %ld %ld %ld %ld)\n", signal, winsignal , appsig , schedulesig , rxsig , printsig , applibsig);
-*/
if(signal & winsignal)
ami_handle_msg();
@@ -2536,39 +2483,28 @@ printf("sig recvd %ld (%ld %ld %ld %ld %ld %ld)\n", signal, winsignal , appsig ,
if(signal & applibsig)
ami_handle_applib();
- if(signal & printsig)
- {
+ if(signal & printsig) {
while(GetMsg(printmsgport)); //ReplyMsg
ami_print_cont();
}
- if(signal & schedulesig)
- {
- if(timermsg = (struct TimerRequest *)GetMsg(msgport))
- {
+ if(signal & schedulesig) {
+ if(timermsg = (struct TimerRequest *)GetMsg(msgport)) {
ReplyMsg((struct Message *)timermsg);
schedule_run(FALSE);
}
}
+ if(signal & helpsignal)
+ ami_help_process();
+
if(signal & ctrlcsig)
- {
ami_quit_netsurf_delayed();
- }
}
-static void ami_gui_fetch_callback(void *p)
-{
- /* This doesn't need to do anything - the scheduled event will
- * send a message to trigger Wait() to return, thereby causing
- * the event function to return, and NetSurf to call
- * hlcache_poll() as part of the usual fetch/event loop.
- */
-}
-void gui_poll(bool active)
+static void gui_poll(bool active)
{
- if(active) schedule(0, ami_gui_fetch_callback, NULL);
ami_get_msg();
}
@@ -2616,8 +2552,8 @@ void ami_switch_tab(struct gui_window_2 *gwin,bool redraw)
GetAttr(CLICKTAB_CurrentNode, (Object *)gwin->objects[GID_TABS],
(ULONG *)&tabnode);
GetClickTabNodeAttrs(tabnode,
- TNA_UserData, &gwin->bw,
- TAG_DONE);
+ TNA_UserData, &gwin->bw,
+ TAG_DONE);
curbw = gwin->bw;
GetAttr(SPACE_AreaBox, (Object *)gwin->objects[GID_BROWSER], (ULONG *)&bbox);
@@ -2641,31 +2577,15 @@ void ami_switch_tab(struct gui_window_2 *gwin,bool redraw)
p96RectFill(gwin->win->RPort, bbox->Left, bbox->Top,
bbox->Width+bbox->Left, bbox->Height+bbox->Top, 0xffffffff);
-
browser_window_update(gwin->bw, false);
gui_window_set_scroll(gwin->bw->window,
gwin->bw->window->scrollx, gwin->bw->window->scrolly);
gwin->redraw_scroll = false;
- browser_window_refresh_url_bar(gwin->bw,
- hlcache_handle_get_url(gwin->bw->current_content), gwin->bw->frag_id);
-
+ browser_window_refresh_url_bar(gwin->bw);
ami_gui_update_hotlist_button(gwin);
- }
-}
-
-void ami_try_quit(void)
-{
- if(nsoption_bool(close_no_quit) == false)
- {
- netsurf_quit = true;
- return;
- }
- else
- {
- if(locked_screen == FALSE)
- if(CloseScreen(scrn)) scrn = NULL;
+ ami_throbber_redraw_schedule(0, gwin->bw->window);
}
}
@@ -2675,34 +2595,39 @@ void ami_quit_netsurf(void)
struct nsObject *nnode;
struct gui_window_2 *gwin;
- if(!IsMinListEmpty(window_list))
- {
+ if(!IsMinListEmpty(window_list)) {
node = (struct nsObject *)GetHead((struct List *)window_list);
- do
- {
+ do {
nnode=(struct nsObject *)GetSucc((struct Node *)node);
gwin = node->objstruct;
- switch(node->Type)
- {
+ switch(node->Type) {
case AMINS_TVWINDOW:
ami_tree_close((struct treeview_window *)gwin);
break;
case AMINS_WINDOW:
+ /* This also closes windows that are attached to the
+ * gui_window, such as local history and find. */
ShowWindow(gwin->win, WINDOW_BACKMOST);
ami_close_all_tabs(gwin);
break;
- }
+ case AMINS_GUIOPTSWINDOW:
+ ami_gui_opts_close();
+ break;
+
+ case AMINS_DLWINDOW:
+ ami_download_window_abort((struct gui_download_window *)gwin);
+ break;
+ }
} while(node = nnode);
win_destroyed = true;
}
- if(IsMinListEmpty(window_list))
- {
+ if(IsMinListEmpty(window_list)) {
/* last window closed, so exit */
netsurf_quit = true;
}
@@ -2734,23 +2659,54 @@ void ami_quit_netsurf_delayed(void)
}
}
-void ami_gui_close_screen(struct Screen *scrn, BOOL locked_screen)
+void ami_gui_close_screen(struct Screen *scrn, BOOL locked_screen, BOOL donotwait)
{
if(scrn == NULL) return;
- if(CloseScreen(scrn)) return;
+ if(CloseScreen(scrn) == TRUE) {
+ if(locked_screen == FALSE) {
+ FreeSignal(screen_signal);
+ screen_signal = -1;
+ scrn = NULL;
+ }
+ return;
+ }
if(locked_screen == TRUE) return;
+ if(donotwait == TRUE) return;
/* If this is our own screen, wait for visitor windows to close */
- LOG(("Waiting for visitor windows to close..."));
- do {
+ if(screen_signal != -1) {
+ ULONG scrnsig = 1 << screen_signal;
+ LOG(("Waiting for visitor windows to close... (signal)"));
+ Wait(scrnsig);
+ }
+
+ while (CloseScreen(scrn) == FALSE) {
+ LOG(("Waiting for visitor windows to close... (polling)"));
Delay(50);
- } while (CloseScreen(scrn) == FALSE);
+ }
+
+ FreeSignal(screen_signal);
+ screen_signal = -1;
+ scrn = NULL;
}
-void gui_quit(void)
+void ami_try_quit(void)
{
- int i;
+ if(!IsMinListEmpty(window_list)) return;
+ if(nsoption_bool(close_no_quit) == false)
+ {
+ netsurf_quit = true;
+ return;
+ }
+ else
+ {
+ ami_gui_close_screen(scrn, locked_screen, TRUE);
+ }
+}
+
+static void gui_quit(void)
+{
ami_theme_throbber_free();
urldb_save(nsoption_charp(url_file));
@@ -2767,9 +2723,10 @@ void gui_quit(void)
ami_free_layers(&browserglob);
ami_close_fonts();
+ ami_help_free();
LOG(("Closing screen"));
- ami_gui_close_screen(scrn, locked_screen);
+ ami_gui_close_screen(scrn, locked_screen, FALSE);
FreeVec(nsscreentitle);
LOG(("Freeing menu items"));
@@ -2781,16 +2738,12 @@ void gui_quit(void)
LOG(("Freeing clipboard"));
ami_clipboard_free();
- ami_print_free();
-
FreeSysObject(ASOT_PORT,appport);
FreeSysObject(ASOT_PORT,sport);
- //ami_help_free();
ami_file_req_free();
-
ami_openurl_close();
- FreeStringClass(urlStringClass);
+ FreeStringClass(urlStringClass);
if(IApplication) DropInterface((struct Interface *)IApplication);
if(ApplicationBase) CloseLibrary(ApplicationBase);
@@ -2806,9 +2759,40 @@ void gui_quit(void)
FreeVec(current_user_options);
FreeVec(current_user_dir);
+ FreeVec(current_user_faviconcache);
FreeVec(current_user);
}
+char *ami_gui_get_cache_favicon_name(nsurl *url, bool only_if_avail)
+{
+ STRPTR filename = NULL;
+ BPTR lock = 0;
+
+ if (filename = ASPrintf("%s/%x", current_user_faviconcache, nsurl_hash(url))) {
+ LOG(("favicon cache location: %s", filename));
+
+ if (only_if_avail == true) {
+ if(lock = Lock(filename, ACCESS_READ)) {
+ UnLock(lock);
+ return filename;
+ }
+ } else {
+ return filename;
+ }
+ }
+ return NULL;
+}
+
+static void ami_gui_cache_favicon(nsurl *url, struct bitmap *favicon)
+{
+ STRPTR filename = NULL;
+
+ if (filename = ami_gui_get_cache_favicon_name(url, false)) {
+ if(favicon) bitmap_save(favicon, filename, AMI_BITMAP_FORCE_OVERWRITE);
+ FreeVec(filename);
+ }
+}
+
void ami_gui_update_hotlist_button(struct gui_window_2 *gwin)
{
char *url;
@@ -2822,6 +2806,9 @@ void ami_gui_update_hotlist_button(struct gui_window_2 *gwin)
if(hotlist_has_url(nsurl)) {
RefreshSetGadgetAttrs((struct Gadget *)gwin->objects[GID_FAVE], gwin->win, NULL,
BUTTON_RenderImage, gwin->objects[GID_FAVE_RMV], TAG_DONE);
+
+ if (gwin->bw->window->favicon)
+ ami_gui_cache_favicon(nsurl, content_get_bitmap(gwin->bw->window->favicon));
} else {
RefreshSetGadgetAttrs((struct Gadget *)gwin->objects[GID_FAVE], gwin->win, NULL,
BUTTON_RenderImage, gwin->objects[GID_FAVE_ADD], TAG_DONE);
@@ -2961,7 +2948,6 @@ void ami_gui_hotlist_toolbar_add(struct gui_window_2 *gwin)
gwin->win, NULL, TRUE);
if(gwin->bw) {
- gwin->bw->reformat_pending = true;
ami_schedule_redraw(gwin, true);
}
}
@@ -3003,7 +2989,6 @@ void ami_gui_hotlist_toolbar_remove(struct gui_window_2 *gwin)
RethinkLayout((struct Gadget *)gwin->objects[GID_MAIN],
gwin->win, NULL, TRUE);
- gwin->bw->reformat_pending = true;
ami_schedule_redraw(gwin, true);
}
@@ -3032,7 +3017,10 @@ void ami_gui_hotlist_toolbar_update(struct gui_window_2 *gwin)
}
}
-void ami_gui_hotlist_toolbar_update_all(void)
+/**
+ * Update hotlist toolbar and recreate the menu for all windows
+ */
+void ami_gui_hotlist_update_all(void)
{
struct nsObject *node;
struct nsObject *nnode;
@@ -3049,6 +3037,7 @@ void ami_gui_hotlist_toolbar_update_all(void)
if(node->Type == AMINS_WINDOW)
{
ami_gui_hotlist_toolbar_update(gwin);
+ ami_menu_refresh(gwin);
}
} while(node = nnode);
}
@@ -3099,6 +3088,11 @@ void ami_toggletabbar(struct gui_window_2 *gwin, bool show)
IDoMethod(gwin->objects[GID_TABLAYOUT], LM_REMOVECHILD,
gwin->win, gwin->objects[GID_ADDTAB]);
+
+ /* NB: We are NULLing these, but not disposing them as
+ * that causes an Intuition deadlock (TODO) */
+ gwin->objects[GID_TABS] = NULL;
+ gwin->objects[GID_ADDTAB] = NULL;
}
FlushLayoutDomainCache((struct Gadget *)gwin->objects[GID_MAIN]);
@@ -3106,10 +3100,7 @@ void ami_toggletabbar(struct gui_window_2 *gwin, bool show)
RethinkLayout((struct Gadget *)gwin->objects[GID_MAIN],
gwin->win, NULL, TRUE);
- if(gwin->bw) {
- gwin->bw->reformat_pending = true;
- ami_schedule_redraw(gwin, true);
- }
+ if(gwin->bw) browser_window_update(gwin->bw, false);
}
void ami_gui_tabs_toggle_all(void)
@@ -3139,12 +3130,41 @@ void ami_gui_tabs_toggle_all(void)
} while(node = nnode);
}
-struct gui_window *gui_create_browser_window(struct browser_window *bw,
- struct browser_window *clone, bool new_tab)
+void ami_gui_search_ico_refresh(void *p)
+{
+ search_web_select_provider(-1);
+}
+
+nserror ami_gui_new_blank_tab(struct gui_window_2 *gwin)
+{
+ nsurl *url;
+ nserror error;
+ struct browser_window *bw = NULL;
+
+ error = nsurl_create(nsoption_charp(homepage_url), &url);
+ if (error == NSERROR_OK) {
+ error = browser_window_create(BW_CREATE_HISTORY |
+ BW_CREATE_TAB,
+ url,
+ NULL,
+ gwin->bw,
+ &bw);
+ nsurl_unref(url);
+ }
+ if (error != NSERROR_OK) {
+ warn_user(messages_get_errorcode(error), 0);
+ return error;
+ }
+
+ return NSERROR_OK;
+}
+
+static struct gui_window *
+gui_window_create(struct browser_window *bw,
+ struct gui_window *existing,
+ gui_window_create_flags flags)
{
struct gui_window *g = NULL;
- bool closegadg=TRUE;
- struct Node *node;
ULONG curx=nsoption_int(window_x),cury=nsoption_int(window_y),curw=nsoption_int(window_width),curh=nsoption_int(window_height);
char nav_west[100],nav_west_s[100],nav_west_g[100];
char nav_east[100],nav_east_s[100],nav_east_g[100];
@@ -3160,19 +3180,16 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
if (!scrn) ami_openscreenfirst();
- if (nsoption_bool(kiosk_mode)) new_tab = false;
+ if (nsoption_bool(kiosk_mode)) flags &= ~GW_CREATE_TAB;
if (nsoption_bool(resize_with_contents)) idcmp_sizeverify = 0;
bw->scale = 1.0;
- if(clone)
+ if(existing)
{
- if(clone->window)
- {
- curx=clone->window->shared->win->LeftEdge;
- cury=clone->window->shared->win->TopEdge;
- curw=clone->window->shared->win->Width;
- curh=clone->window->shared->win->Height;
- }
+ curx=existing->shared->win->LeftEdge;
+ cury=existing->shared->win->TopEdge;
+ curw=existing->shared->win->Width;
+ curh=existing->shared->win->Height;
}
g = AllocVecTags(sizeof(struct gui_window), AVT_ClearWithValue, 0, TAG_DONE);
@@ -3186,13 +3203,15 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
NewList(&g->dllist);
g->deferred_rects = NewObjList();
- if(new_tab && clone)
+ if((flags & GW_CREATE_TAB) && existing)
{
- g->shared = clone->window->shared;
+ g->shared = existing->shared;
g->tab = g->shared->next_tab;
+ g->shared->tabs++; /* do this early so functions know to update the tabs */
- if((g->shared->tabs == 1) && (nsoption_bool(tab_always_show) == false))
+ if((g->shared->tabs == 2) && (nsoption_bool(tab_always_show) == false)) {
ami_toggletabbar(g->shared, true);
+ }
SetGadgetAttrs((struct Gadget *)g->shared->objects[GID_TABS],
g->shared->win, NULL,
@@ -3211,12 +3230,12 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
}
else
{
- struct Node *insert_after = clone->window->tab_node;
+ struct Node *insert_after = existing->tab_node;
- if(clone->window->last_new_tab)
- insert_after = clone->window->last_new_tab;
+ if(existing->last_new_tab)
+ insert_after = existing->last_new_tab;
Insert(&g->shared->tab_list, g->tab_node, insert_after);
- clone->window->last_new_tab = g->tab_node;
+ existing->last_new_tab = g->tab_node;
}
RefreshSetGadgetAttrs((struct Gadget *)g->shared->objects[GID_TABS],
@@ -3234,12 +3253,12 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
if(ClickTabBase->lib_Version < 53)
RethinkLayout((struct Gadget *)g->shared->objects[GID_TABLAYOUT],g->shared->win,NULL,TRUE);
- g->shared->tabs++;
g->shared->next_tab++;
if(nsoption_bool(new_tab_is_active)) ami_switch_tab(g->shared,false);
ami_update_buttons(g->shared);
+ ami_schedule(0, ami_gui_refresh_favicon, g->shared);
return g;
}
@@ -3257,9 +3276,6 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
g->shared->scrollerhook.h_Entry = (void *)ami_scroller_hook;
g->shared->scrollerhook.h_Data = g->shared;
- g->shared->search_ico_hook.h_Entry = (void *)ami_set_search_ico_render_hook;
- g->shared->search_ico_hook.h_Data = g->shared;
-
g->shared->favicon_hook.h_Entry = (void *)ami_set_favicon_render_hook;
g->shared->favicon_hook.h_Data = g->shared;
@@ -3294,6 +3310,9 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
TAG_DONE);
AddTail(&g->shared->tab_list,g->tab_node);
+ g->shared->web_search_list = ami_gui_opts_websearch();
+ g->shared->search_bm = NULL;
+
g->shared->tabs=1;
g->shared->next_tab=1;
@@ -3403,12 +3422,12 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
}
g->shared->objects[OID_MAIN] = WindowObject,
- WA_ScreenTitle,nsscreentitle,
- WA_Activate, TRUE,
- WA_DepthGadget, TRUE,
- WA_DragBar, TRUE,
- WA_CloseGadget, TRUE,
- WA_SizeGadget, TRUE,
+ WA_ScreenTitle,nsscreentitle,
+ WA_Activate, TRUE,
+ WA_DepthGadget, TRUE,
+ WA_DragBar, TRUE,
+ WA_CloseGadget, TRUE,
+ WA_SizeGadget, TRUE,
WA_Top,cury,
WA_Left,curx,
WA_Width,curw,
@@ -3417,12 +3436,12 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
WA_ReportMouse,TRUE,
refresh_mode, TRUE,
WA_SizeBBottom, TRUE,
- WA_IDCMP, IDCMP_MENUPICK | IDCMP_MOUSEMOVE |
- IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE |
- IDCMP_RAWKEY | idcmp_sizeverify |
- IDCMP_GADGETUP | IDCMP_IDCMPUPDATE |
- IDCMP_REFRESHWINDOW |
- IDCMP_ACTIVEWINDOW | IDCMP_EXTENDEDMOUSE,
+ WA_IDCMP, IDCMP_MENUPICK | IDCMP_MOUSEMOVE |
+ IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE |
+ IDCMP_RAWKEY | idcmp_sizeverify |
+ IDCMP_GADGETUP | IDCMP_IDCMPUPDATE |
+ IDCMP_REFRESHWINDOW |
+ IDCMP_ACTIVEWINDOW | IDCMP_EXTENDEDMOUSE,
WINDOW_IconifyGadget, iconifygadget,
WINDOW_NewMenu, g->shared->menu,
WINDOW_MenuUserData, WGUD_HOOK,
@@ -3435,8 +3454,8 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
WINDOW_BuiltInScroll, TRUE,
WINDOW_GadgetHelp, TRUE,
WINDOW_UserData, g->shared,
- WINDOW_ParentGroup, g->shared->objects[GID_MAIN] = VGroupObject,
- LAYOUT_SpaceOuter, TRUE,
+ WINDOW_ParentGroup, g->shared->objects[GID_MAIN] = VGroupObject,
+ LAYOUT_SpaceOuter, TRUE,
LAYOUT_AddChild, g->shared->objects[GID_TOOLBARLAYOUT] = HGroupObject,
LAYOUT_VertAlignment, LALIGN_CENTER,
LAYOUT_AddChild, g->shared->objects[GID_BACK] = ButtonObject,
@@ -3531,7 +3550,7 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
GA_TabCycle, TRUE,
STRINGA_Buffer, g->shared->svbuffer,
STRINGVIEW_Header, URLHistory_GetList(),
- StringEnd,
+ TAG_DONE),
LAYOUT_AddChild, g->shared->objects[GID_FAVE] = ButtonObject,
GA_ID, GID_FAVE,
@@ -3548,13 +3567,13 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
LAYOUT_WeightBar, TRUE,
LAYOUT_AddChild, HGroupObject,
LAYOUT_VertAlignment, LALIGN_CENTER,
- LAYOUT_AddChild, g->shared->objects[GID_SEARCH_ICON] = SpaceObject,
+ LAYOUT_AddChild, g->shared->objects[GID_SEARCH_ICON] = ChooserObject,
GA_ID, GID_SEARCH_ICON,
- SPACE_MinWidth, 16,
- SPACE_MinHeight, 16,
- SPACE_Transparent, FALSE,
- SPACE_RenderHook, &g->shared->search_ico_hook,
- SpaceEnd,
+ GA_RelVerify, TRUE,
+ CHOOSER_DropDown, TRUE,
+ CHOOSER_Labels, g->shared->web_search_list,
+ CHOOSER_MaxLabels, 40, /* Same as options GUI */
+ ChooserEnd,
CHILD_WeightedWidth,0,
CHILD_WeightedHeight,0,
LAYOUT_AddChild, g->shared->objects[GID_SEARCHSTRING] =StringObject,
@@ -3761,7 +3780,8 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
glob = &browserglob;
if(locked_screen) UnlockPubScreen(NULL,scrn);
- search_web_retrieve_ico(false);
+
+ ami_schedule(0, ami_gui_search_ico_refresh, NULL);
ScreenToFront(scrn);
@@ -3844,7 +3864,7 @@ void ami_close_all_tabs(struct gui_window_2 *gwin)
}
}
-void gui_window_destroy(struct gui_window *g)
+static void gui_window_destroy(struct gui_window *g)
{
struct Node *ptab;
ULONG ptabnum = 0;
@@ -3898,6 +3918,7 @@ void gui_window_destroy(struct gui_window *g)
g->shared->tabs--;
ami_switch_tab(g->shared,true);
+ ami_schedule(0, ami_gui_refresh_favicon, g->shared);
if((g->shared->tabs == 1) && (nsoption_bool(tab_always_show) == false))
ami_toggletabbar(g->shared, false);
@@ -3925,6 +3946,9 @@ void gui_window_destroy(struct gui_window *g)
DisposeObject(g->shared->objects[GID_FAVE_ADD]);
DisposeObject(g->shared->objects[GID_FAVE_RMV]);
+ ami_gui_opts_websearch_free(g->shared->web_search_list);
+ if(g->shared->search_bm) DisposeObject(g->shared->search_bm);
+
ami_free_menulabs(g->shared);
free(g->shared->wintitle);
ami_utf8_free(g->shared->status);
@@ -3950,7 +3974,7 @@ void gui_window_destroy(struct gui_window *g)
win_destroyed = true;
}
-void gui_window_set_title(struct gui_window *g, const char *title)
+static void gui_window_set_title(struct gui_window *g, const char *title)
{
struct Node *node;
ULONG cur_tab = 0;
@@ -3961,7 +3985,7 @@ void gui_window_set_title(struct gui_window *g, const char *title)
utf8title = ami_utf8_easy((char *)title);
- if(g->tab_node && (g->shared->tabs > 1))
+ if(g->tab_node) // && (g->shared->tabs > 1))
{
node = g->tab_node;
@@ -3973,8 +3997,8 @@ void gui_window_set_title(struct gui_window *g, const char *title)
TAG_DONE);
SetClickTabNodeAttrs(node, TNA_Text, utf8title,
- TNA_HintInfo, utf8title,
- TAG_DONE);
+ TNA_HintInfo, utf8title,
+ TAG_DONE);
RefreshSetGadgetAttrs((struct Gadget *)g->shared->objects[GID_TABS],
g->shared->win, NULL,
@@ -4008,7 +4032,7 @@ static void ami_redraw_callback(void *p)
{
struct gui_window_2 *gwin = (struct gui_window_2 *)p;
- if(gwin->redraw_required || gwin->bw->reformat_pending) {
+ if(gwin->redraw_required) {
ami_do_redraw(gwin);
}
@@ -4032,19 +4056,18 @@ static void ami_redraw_callback(void *p)
*/
void ami_schedule_redraw(struct gui_window_2 *gwin, bool full_redraw)
{
- int cs = 0;
+ int ms = 0;
if(full_redraw) gwin->redraw_required = true;
if(gwin->redraw_scheduled == true) return;
- if(gwin->bw->reformat_pending) cs = nsoption_int(reformat_delay);
- schedule(cs, ami_redraw_callback, gwin);
+ ami_schedule(ms, ami_redraw_callback, gwin);
gwin->redraw_scheduled = true;
}
static void ami_schedule_redraw_remove(struct gui_window_2 *gwin)
{
- schedule_remove(ami_redraw_callback, gwin);
+ ami_schedule(-1, ami_redraw_callback, gwin);
}
static void ami_do_redraw_tiled(struct gui_window_2 *gwin, bool busy,
@@ -4147,9 +4170,7 @@ static void ami_do_redraw_limits(struct gui_window *g, struct browser_window *bw
struct IBox *bbox;
ULONG cur_tab = 0;
ULONG sx, sy;
- struct rect clip;
- struct RastPort *temprp;
- int posx, posy;
+
struct redraw_context ctx = {
.interactive = true,
.background_images = true,
@@ -4175,7 +4196,7 @@ static void ami_do_redraw_limits(struct gui_window *g, struct browser_window *bw
return;
}
-void gui_window_redraw_window(struct gui_window *g)
+static void gui_window_redraw_window(struct gui_window *g)
{
ULONG cur_tab = 0;
@@ -4221,8 +4242,8 @@ static void ami_gui_window_update_box_deferred(struct gui_window *g, bool draw)
static bool ami_gui_window_update_box_deferred_check(struct MinList *deferred_rects,
const struct rect *new_rect)
{
- struct nsObject *node;
- struct nsObject *nnode;
+struct nsObject *node;
+struct nsObject *nnode;
struct rect *rect;
if(IsMinListEmpty(deferred_rects)) return true;
@@ -4253,7 +4274,7 @@ static bool ami_gui_window_update_box_deferred_check(struct MinList *deferred_re
return true;
}
-void gui_window_update_box(struct gui_window *g, const struct rect *rect)
+static void gui_window_update_box(struct gui_window *g, const struct rect *rect)
{
struct nsObject *nsobj;
struct rect *deferred_rect;
@@ -4270,15 +4291,27 @@ void gui_window_update_box(struct gui_window *g, const struct rect *rect)
ami_schedule_redraw(g->shared, false);
}
+/**
+ * callback from core to reformat a window.
+ */
+static void amiga_window_reformat(struct gui_window *gw)
+{
+ struct IBox *bbox;
+
+ if (gw != NULL) {
+ GetAttr(SPACE_AreaBox, (Object *)gw->shared->objects[GID_BROWSER], (ULONG *)&bbox);
+ browser_window_reformat(gw->shared->bw, false, bbox->Width, bbox->Height);
+
+ gw->shared->redraw_scroll = false;
+ }
+}
+
static void ami_do_redraw(struct gui_window_2 *gwin)
{
- struct Region *reg = NULL;
struct Rectangle rect;
- hlcache_handle *c;
ULONG hcurrent,vcurrent,xoffset,yoffset,width=800,height=600,x0=0,y0=0;
struct IBox *bbox;
ULONG oldh = gwin->oldh, oldv=gwin->oldv;
- bool morescroll = false;
struct RastPort *temprp;
if(browser_window_redraw_ready(gwin->bw) == false) return;
@@ -4290,20 +4323,11 @@ static void ami_do_redraw(struct gui_window_2 *gwin)
gwin->bw->window->scrollx = hcurrent;
gwin->bw->window->scrolly = vcurrent;
- c = gwin->bw->current_content;
-
width=bbox->Width;
height=bbox->Height;
xoffset=bbox->Left;
yoffset=bbox->Top;
- if(gwin->bw->reformat_pending)
- {
- browser_window_reformat(gwin->bw, false, width, height);
- gwin->bw->reformat_pending = false;
- gwin->redraw_scroll = false;
- }
-
if(gwin->redraw_scroll)
{
if((abs(vcurrent-oldv) > height) || (abs(hcurrent-oldh) > width))
@@ -4316,7 +4340,6 @@ static void ami_do_redraw(struct gui_window_2 *gwin)
if(gwin->redraw_scroll)
{
struct rect rect;
- int x0, y0, x1, y1;
gwin->bw->window->c_h_temp = gwin->bw->window->c_h;
gui_window_remove_caret(gwin->bw->window);
@@ -4407,7 +4430,7 @@ void ami_refresh_window(struct gui_window_2 *gwin)
struct IBox *bbox;
int x0, x1, y0, y1, sx, sy;
- struct RegionRectangle *regrect, *nregrect;
+ struct RegionRectangle *regrect;
sx = gwin->bw->window->scrollx;
sy = gwin->bw->window->scrolly;
@@ -4471,13 +4494,13 @@ void ami_get_vscroll_pos(struct gui_window_2 *gwin, ULONG *ys)
*ys /= gwin->bw->scale;
}
-bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
+static bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
{
ami_get_hscroll_pos(g->shared, (ULONG *)sx);
ami_get_vscroll_pos(g->shared, (ULONG *)sy);
}
-void gui_window_set_scroll(struct gui_window *g, int sx, int sy)
+static void gui_window_set_scroll(struct gui_window *g, int sx, int sy)
{
struct IBox *bbox;
ULONG cur_tab = 0;
@@ -4536,13 +4559,7 @@ void gui_window_set_scroll(struct gui_window *g, int sx, int sy)
// g->shared->new_content = false;
}
-void gui_window_scroll_visible(struct gui_window *g, int x0, int y0,
- int x1, int y1)
-{
- gui_window_set_scroll(g, x0, y0);
-}
-
-void gui_window_get_dimensions(struct gui_window *g, int *width, int *height,
+static void gui_window_get_dimensions(struct gui_window *g, int *width, int *height,
bool scaled)
{
struct IBox *bbox;
@@ -4560,7 +4577,7 @@ void gui_window_get_dimensions(struct gui_window *g, int *width, int *height,
}
}
-void gui_window_update_extent(struct gui_window *g)
+static void gui_window_update_extent(struct gui_window *g)
{
struct IBox *bbox, zbox;
ULONG cur_tab = 0;
@@ -4607,7 +4624,7 @@ void gui_window_update_extent(struct gui_window *g)
g->shared->new_content = true;
}
-void gui_window_set_status(struct gui_window *g, const char *text)
+static void gui_window_set_status(struct gui_window *g, const char *text)
{
ULONG cur_tab = 0;
char *utf8text;
@@ -4646,7 +4663,7 @@ void gui_window_set_status(struct gui_window *g, const char *text)
}
}
-void gui_window_set_url(struct gui_window *g, const char *url)
+static void gui_window_set_url(struct gui_window *g, const char *url)
{
ULONG cur_tab = 0;
@@ -4665,83 +4682,23 @@ void gui_window_set_url(struct gui_window *g, const char *url)
ami_update_buttons(g->shared);
}
-/**
- * function to add retrieved favicon to gui
- */
-void gui_window_set_icon(struct gui_window *g, hlcache_handle *icon)
-{
- struct BitMap *bm = NULL;
- struct IBox *bbox;
- ULONG cur_tab = 0;
- struct bitmap *icon_bitmap;
-
- if(nsoption_bool(kiosk_mode) == true) return;
- if(!g) return;
-
- if(g->tab_node && (g->shared->tabs > 1)) GetAttr(CLICKTAB_Current,
- g->shared->objects[GID_TABS],
- (ULONG *)&cur_tab);
-
- if ((icon != NULL) && ((icon_bitmap = content_get_bitmap(icon)) != NULL))
- {
- bm = ami_bitmap_get_native(icon_bitmap, 16, 16,
- g->shared->win->RPort->BitMap);
- }
-
- if((cur_tab == g->tab) || (g->shared->tabs <= 1))
- {
- GetAttr(SPACE_AreaBox, g->shared->objects[GID_ICON], (ULONG *)&bbox);
-
- RefreshGList((struct Gadget *)g->shared->objects[GID_ICON],
- g->shared->win, NULL, 1);
-
- if(bm)
- {
- ULONG tag, tag_data, minterm;
-
- if(ami_plot_screen_is_palettemapped() == false) {
- tag = BLITA_UseSrcAlpha;
- tag_data = !icon_bitmap->opaque;
- minterm = 0xc0;
- } else {
- tag = BLITA_MaskPlane;
- tag_data = (ULONG)ami_bitmap_get_mask(icon_bitmap, 16, 16, bm);
- minterm = (ABC|ABNC|ANBC);
- }
-
- BltBitMapTags(BLITA_SrcX, 0,
- BLITA_SrcY, 0,
- BLITA_DestX, bbox->Left,
- BLITA_DestY, bbox->Top,
- BLITA_Width, 16,
- BLITA_Height, 16,
- BLITA_Source, bm,
- BLITA_Dest, g->shared->win->RPort,
- BLITA_SrcType, BLITT_BITMAP,
- BLITA_DestType, BLITT_RASTPORT,
- BLITA_Minterm, minterm,
- tag, tag_data,
- TAG_DONE);
- }
- }
-
- g->favicon = icon;
-}
static uint32 ami_set_favicon_render_hook(struct Hook *hook, APTR space,
struct gpRender *msg)
{
- refresh_favicon = TRUE;
+ ami_schedule(0, ami_gui_refresh_favicon, hook->h_Data);
return 0;
}
/**
- * set gui display of a retrieved favicon representing the search
- * provider
- * \param ico may be NULL for local calls; then access current cache from
- * search_web_ico()
+ * Gui callback when search provider details are updated.
+ *
+ * \param provider_name The providers name.
+ * \param ico_bitmap The icon bitmap representing the provider.
+ * \return NSERROR_OK on success else error code.
*/
-void gui_window_set_search_ico(hlcache_handle *ico)
+static nserror gui_search_web_provider_update(const char *provider_name,
+ struct bitmap *ico_bitmap)
{
struct BitMap *bm = NULL;
struct IBox *bbox;
@@ -4749,16 +4706,13 @@ void gui_window_set_search_ico(hlcache_handle *ico)
struct nsObject *node;
struct nsObject *nnode;
struct gui_window_2 *gwin;
- char fname[100];
- struct bitmap *ico_bitmap;
- if(IsMinListEmpty(window_list)) return;
- if(nsoption_bool(kiosk_mode) == true) return;
+ if(IsMinListEmpty(window_list)) return NSERROR_BAD_PARAMETER;
+ if(nsoption_bool(kiosk_mode) == true) return NSERROR_BAD_PARAMETER;
- if (ico == NULL) ico = search_web_ico();
- ico_bitmap = content_get_bitmap(ico);
- if ((ico != NULL) && (ico_bitmap != NULL))
+ if (ico_bitmap != NULL) {
bm = ami_bitmap_get_native(ico_bitmap, 16, 16, NULL);
+ }
node = (struct nsObject *)GetHead((struct List *)window_list);
@@ -4768,63 +4722,36 @@ void gui_window_set_search_ico(hlcache_handle *ico)
if(node->Type == AMINS_WINDOW)
{
- GetAttr(SPACE_AreaBox, gwin->objects[GID_SEARCH_ICON], (ULONG *)&bbox);
+ if(gwin->search_bm != NULL)
+ DisposeObject(gwin->search_bm);
+
+ gwin->search_bm = BitMapObject,
+ BITMAP_Screen, scrn,
+ BITMAP_Width, 16,
+ BITMAP_Height, 16,
+ BITMAP_BitMap, bm,
+ BitMapEnd;
RefreshSetGadgetAttrs((struct Gadget *)gwin->objects[GID_SEARCH_ICON],
gwin->win, NULL,
- GA_HintInfo, search_web_provider_name(),
+ GA_HintInfo, provider_name,
+ GA_Image, gwin->search_bm,
TAG_DONE);
-
- EraseRect(gwin->win->RPort, bbox->Left, bbox->Top,
- bbox->Left+16, bbox->Top+16);
-
- if(bm)
- {
- ULONG tag, tag_data, minterm;
-
- if(ami_plot_screen_is_palettemapped() == false) {
- tag = BLITA_UseSrcAlpha;
- tag_data = !ico_bitmap->opaque;
- minterm = 0xc0;
- } else {
- tag = BLITA_MaskPlane;
- tag_data = (ULONG)ami_bitmap_get_mask(ico_bitmap, 16, 16, bm);
- minterm = (ABC|ABNC|ANBC);
- }
-
- BltBitMapTags(BLITA_SrcX, 0,
- BLITA_SrcY, 0,
- BLITA_DestX, bbox->Left,
- BLITA_DestY, bbox->Top,
- BLITA_Width, 16,
- BLITA_Height, 16,
- BLITA_Source, bm,
- BLITA_Dest, gwin->win->RPort,
- BLITA_SrcType, BLITT_BITMAP,
- BLITA_DestType, BLITT_RASTPORT,
- BLITA_Minterm, minterm,
- tag, tag_data,
- TAG_DONE);
- }
}
} while(node = nnode);
-}
-static uint32 ami_set_search_ico_render_hook(struct Hook *hook, APTR space,
- struct gpRender *msg)
-{
- refresh_search_ico = TRUE;
- return 0;
+ return NSERROR_OK;
}
static uint32 ami_set_throbber_render_hook(struct Hook *hook, APTR space,
struct gpRender *msg)
{
- refresh_throbber = TRUE;
+ struct gui_window_2 *gwin = hook->h_Data;
+ ami_throbber_redraw_schedule(0, gwin->bw->window);
return 0;
}
-void gui_window_place_caret(struct gui_window *g, int x, int y, int height,
+static void gui_window_place_caret(struct gui_window *g, int x, int y, int height,
const struct rect *clip)
{
struct IBox *bbox;
@@ -4861,11 +4788,8 @@ void gui_window_place_caret(struct gui_window *g, int x, int y, int height,
OnMenu(g->shared->win, AMI_MENU_PASTE);
}
-void gui_window_remove_caret(struct gui_window *g)
+static void gui_window_remove_caret(struct gui_window *g)
{
- struct IBox *bbox;
- int xs,ys;
-
if(!g) return;
if(g->c_h == 0) return;
@@ -4878,7 +4802,7 @@ void gui_window_remove_caret(struct gui_window *g)
g->c_h = 0;
}
-void gui_window_new_content(struct gui_window *g)
+static void gui_window_new_content(struct gui_window *g)
{
hlcache_handle *c;
@@ -4898,12 +4822,7 @@ void gui_window_new_content(struct gui_window *g)
ami_gui_update_hotlist_button(g->shared);
}
-bool gui_window_scroll_start(struct gui_window *g)
-{
- return true;
-}
-
-bool gui_window_drag_start(struct gui_window *g, gui_drag_type type,
+static bool gui_window_drag_start(struct gui_window *g, gui_drag_type type,
const struct rect *rect)
{
g->shared->drag_op = type;
@@ -4929,9 +4848,7 @@ void ami_scroller_hook(struct Hook *hook,Object *object,struct IntuiMessage *msg
ULONG gid;
struct gui_window_2 *gwin = hook->h_Data;
struct IntuiWheelData *wheel;
- Object *reqrefresh = NULL;
struct Node *node = NULL;
- char *urltxt;
nsurl *url;
switch(msg->Class)
@@ -4955,8 +4872,7 @@ void ami_scroller_hook(struct Hook *hook,Object *object,struct IntuiMessage *msg
GetSpeedButtonNodeAttrs(node, SBNA_UserData, (ULONG *)&url, TAG_DONE);
if(gwin->key_state & BROWSER_MOUSE_MOD_2) {
- browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_TAB,
+ browser_window_create(BW_CREATE_TAB,
url,
NULL,
gwin->bw,
@@ -4965,8 +4881,7 @@ void ami_scroller_hook(struct Hook *hook,Object *object,struct IntuiMessage *msg
browser_window_navigate(gwin->bw,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -5006,8 +4921,7 @@ void ami_scroller_hook(struct Hook *hook,Object *object,struct IntuiMessage *msg
bool ami_text_box_at_point(struct gui_window_2 *gwin, ULONG *x, ULONG *y)
{
struct IBox *bbox;
- ULONG xs,ys,width,height;
- int box_x=0,box_y=0;
+ ULONG xs, ys, width, height;
struct contextual_content data;
GetAttr(SPACE_AreaBox, (Object *)gwin->objects[GID_BROWSER],
@@ -5126,3 +5040,192 @@ void ami_gui_splash_close(Object *win_obj)
{
if(win_obj) DisposeObject(win_obj);
}
+
+static void gui_file_gadget_open(struct gui_window *g, hlcache_handle *hl,
+ struct form_control *gadget)
+{
+ LOG(("File open dialog rquest for %p/%p", g, gadget));
+
+ if(AslRequestTags(filereq,
+ ASLFR_Window, g->shared->win,
+ ASLFR_SleepWindow, TRUE,
+ ASLFR_TitleText, messages_get("NetSurf"),
+ ASLFR_Screen, scrn,
+ ASLFR_DoSaveMode, FALSE,
+ TAG_DONE)) {
+ char fname[1024];
+ strlcpy(fname, filereq->fr_Drawer, 1024);
+ AddPart(fname, filereq->fr_File, 1024);
+ browser_window_set_gadget_filename(g->shared->bw, gadget, fname);
+ }
+}
+
+static struct gui_window_table amiga_window_table = {
+ .create = gui_window_create,
+ .destroy = gui_window_destroy,
+ .redraw = gui_window_redraw_window,
+ .update = gui_window_update_box,
+ .get_scroll = gui_window_get_scroll,
+ .set_scroll = gui_window_set_scroll,
+ .get_dimensions = gui_window_get_dimensions,
+ .update_extent = gui_window_update_extent,
+ .reformat = amiga_window_reformat,
+
+ .set_icon = gui_window_set_icon,
+ .set_title = gui_window_set_title,
+ .set_url = gui_window_set_url,
+ .set_status = gui_window_set_status,
+ .place_caret = gui_window_place_caret,
+ .remove_caret = gui_window_remove_caret,
+ .drag_start = gui_window_drag_start,
+ .new_content = gui_window_new_content,
+ .file_gadget_open = gui_file_gadget_open,
+ .drag_save_object = gui_drag_save_object,
+ .drag_save_selection =gui_drag_save_selection,
+ .start_selection = gui_start_selection,
+
+ /* from theme */
+ .set_pointer = gui_window_set_pointer,
+ .start_throbber = gui_window_start_throbber,
+ .stop_throbber = gui_window_stop_throbber,
+
+ /* from download */
+ .save_link = gui_window_save_link,
+};
+
+
+static struct gui_fetch_table amiga_fetch_table = {
+ .filetype = fetch_filetype,
+
+ .get_resource_url = gui_get_resource_url,
+};
+
+static struct gui_search_web_table amiga_search_web_table = {
+ .provider_update = gui_search_web_provider_update,
+};
+
+static struct gui_browser_table amiga_browser_table = {
+ .poll = gui_poll,
+ .schedule = ami_schedule,
+
+ .quit = gui_quit,
+ .launch_url = gui_launch_url,
+ .create_form_select_menu = gui_create_form_select_menu,
+ .cert_verify = gui_cert_verify,
+ .login = gui_401login_open,
+};
+
+/** Normal entry point from OS */
+int main(int argc, char** argv)
+{
+ setbuf(stderr, NULL);
+ char messages[100];
+ char script[1024];
+ char temp[1024];
+ STRPTR current_user_cache = NULL;
+ BPTR lock = 0;
+ int32 user = 0;
+ nserror ret;
+ Object *splash_window = ami_gui_splash_open();
+ struct netsurf_table amiga_table = {
+ .browser = &amiga_browser_table,
+ .window = &amiga_window_table,
+ .clipboard = amiga_clipboard_table,
+ .download = amiga_download_table,
+ .fetch = &amiga_fetch_table,
+ .file = amiga_file_table,
+ .utf8 = amiga_utf8_table,
+ .search = amiga_search_table,
+ .search_web = &amiga_search_web_table,
+ .llcache = filesystem_llcache_table,
+ };
+
+ signal(SIGINT, SIG_IGN);
+
+ ret = netsurf_register(&amiga_table);
+ if (ret != NSERROR_OK) {
+ die("NetSurf operation table failed registration");
+ }
+
+ /* Open popupmenu.library just to check the version.
+ * Versions older than 53.11 are dangerous, so we
+ * forcibly disable context menus if these are in use.
+ */
+ popupmenu_lib_ok = FALSE;
+ if(PopupMenuBase = OpenLibrary("popupmenu.library", 53)) {
+ LOG(("popupmenu.library v%d.%d",
+ PopupMenuBase->lib_Version, PopupMenuBase->lib_Revision));
+ if(LIB_IS_AT_LEAST((struct Library *)PopupMenuBase, 53, 11))
+ popupmenu_lib_ok = TRUE;
+ CloseLibrary(PopupMenuBase);
+ }
+
+ user = GetVar("user", temp, 1024, GVF_GLOBAL_ONLY);
+ current_user = ASPrintf("%s", (user == -1) ? "Default" : temp);
+ current_user_dir = ASPrintf("PROGDIR:Users/%s", current_user);
+
+ if(lock = CreateDirTree(current_user_dir))
+ UnLock(lock);
+
+ current_user_options = ASPrintf("%s/Choices", current_user_dir);
+ current_user_cache = ASPrintf("%s/Cache", current_user_dir);
+ current_user_faviconcache = ASPrintf("%s/IconCache", current_user_dir);
+
+ if(lock = CreateDirTree(current_user_cache)) UnLock(lock);
+ if(lock = CreateDirTree(current_user_faviconcache)) UnLock(lock);
+
+ ami_mime_init("PROGDIR:Resources/mimetypes");
+ sprintf(temp, "%s/mimetypes.user", current_user_dir);
+ ami_mime_init(temp);
+ ami_schedule_open_timer();
+ ami_schedule_create();
+
+ amiga_plugin_hack_init();
+ ret = amiga_datatypes_init();
+
+ /* initialise logging. Not fatal if it fails but not much we
+ * can do about it either.
+ */
+ nslog_init(NULL, &argc, argv);
+
+ /* user options setup */
+ ret = nsoption_init(ami_set_options, &nsoptions, &nsoptions_default);
+ if (ret != NSERROR_OK) {
+ die("Options failed to initialise");
+ }
+ nsoption_read(current_user_options, NULL);
+ ami_gui_commandline(&argc, argv); /* calls nsoption_commandline */
+
+ if (ami_locate_resource(messages, "Messages") == false)
+ die("Cannot open Messages file");
+ ret = netsurf_init(messages, current_user_cache);
+ if (ret != NSERROR_OK) {
+ die("NetSurf failed to initialise");
+ }
+
+ if(current_user_cache != NULL) FreeVec(current_user_cache);
+ ret = amiga_icon_init();
+
+ search_web_init(nsoption_charp(search_engines_file));
+
+ gui_init(argc, argv);
+ gui_init2(argc, argv);
+
+ ami_gui_splash_close(splash_window);
+
+ strlcpy(script, nsoption_charp(arexx_dir), 1024);
+ AddPart(script, nsoption_charp(arexx_startup), 1024);
+ ami_arexx_execute(script);
+
+ netsurf_main_loop();
+
+ strlcpy(script, nsoption_charp(arexx_dir), 1024);
+ AddPart(script, nsoption_charp(arexx_shutdown), 1024);
+ ami_arexx_execute(script);
+
+ netsurf_exit();
+
+ ami_mime_free();
+
+ return 0;
+}
diff --git a/amiga/gui.h b/amiga/gui.h
index 85e5854ea..c106455d1 100755
--- a/amiga/gui.h
+++ b/amiga/gui.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2008-2012 Chris Young <chris@unsatisfactorysoftware.co.uk>
+ * Copyright 2008-2014 Chris Young <chris@unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -111,6 +111,8 @@ struct gui_window_2 {
ULONG hotlist_items;
char *hotlist_toolbar_lab[AMI_GUI_TOOLBAR_MAX];
struct List hotlist_toolbar_list;
+ struct List *web_search_list;
+ Object *search_bm;
char *svbuffer;
char *status;
char *wintitle;
@@ -120,7 +122,6 @@ struct gui_window_2 {
BOOL rmbtrapped;
struct AppIcon *appicon; /* iconify appicon */
struct DiskObject *dobj; /* iconify appicon */
- struct Hook search_ico_hook;
struct Hook favicon_hook;
struct Hook throbber_hook;
gui_drag_type drag_op;
@@ -153,6 +154,7 @@ struct gui_window
void ami_get_msg(void);
void ami_close_all_tabs(struct gui_window_2 *gwin);
+void ami_try_quit(void);
void ami_quit_netsurf(void);
void ami_schedule_redraw(struct gui_window_2 *gwin, bool full_redraw);
STRPTR ami_locale_langs(void);
@@ -160,10 +162,12 @@ int ami_key_to_nskey(ULONG keycode, struct InputEvent *ie);
bool ami_text_box_at_point(struct gui_window_2 *gwin, ULONG *x, ULONG *y);
BOOL ami_gadget_hit(Object *obj, int x, int y);
void ami_gui_history(struct gui_window_2 *gwin, bool back);
-void ami_gui_hotlist_toolbar_update_all(void);
+void ami_gui_hotlist_update_all(void);
void ami_gui_tabs_toggle_all(void);
bool ami_locate_resource(char *fullpath, const char *file);
void ami_gui_update_hotlist_button(struct gui_window_2 *gwin);
+nserror ami_gui_new_blank_tab(struct gui_window_2 *gwin);
+char *ami_gui_get_cache_favicon_name(nsurl *url, bool only_if_avail);
struct TextFont *origrpfont;
struct MinList *window_list;
@@ -175,4 +179,6 @@ struct browser_window *curbw;
struct gui_globals browserglob;
uint32 ami_appid;
BOOL ami_autoscroll;
+BOOL popupmenu_lib_ok;
#endif
+
diff --git a/amiga/gui_options.c b/amiga/gui_options.c
index 1bf20ad47..50f7b7cfd 100755
--- a/amiga/gui_options.c
+++ b/amiga/gui_options.c
@@ -198,7 +198,7 @@ enum
#define OPTS_MAX_TABS 10
#define OPTS_MAX_SCREEN 4
#define OPTS_MAX_PROXY 5
-#define OPTS_MAX_NATIVEBM 3
+#define OPTS_MAX_NATIVEBM 4
#define OPTS_MAX_DITHER 4
struct ami_gui_opts_window {
@@ -216,10 +216,7 @@ CONST_STRPTR nativebmopts[OPTS_MAX_NATIVEBM];
CONST_STRPTR ditheropts[OPTS_MAX_DITHER];
CONST_STRPTR fontopts[6];
CONST_STRPTR gadlab[OPTS_LAST];
-STRPTR *websearch_list;
-
-STRPTR *ami_gui_opts_websearch(void);
-void ami_gui_opts_websearch_free(STRPTR *websearchlist);
+struct List *websearch_list;
void ami_gui_opts_setup(void)
{
@@ -299,7 +296,7 @@ void ami_gui_opts_setup(void)
gadlab[GID_OPTS_FONT_MINSIZE] = (char *)ami_utf8_easy((char *)messages_get("Minimum"));
gadlab[GID_OPTS_FONT_ANTIALIASING] = (char *)ami_utf8_easy((char *)messages_get("FontAntialiasing"));
gadlab[GID_OPTS_CACHE_MEM] = (char *)ami_utf8_easy((char *)messages_get("Size"));
- gadlab[GID_OPTS_CACHE_DISC] = (char *)ami_utf8_easy((char *)messages_get("Duration"));
+ gadlab[GID_OPTS_CACHE_DISC] = (char *)ami_utf8_easy((char *)messages_get("Size"));
gadlab[GID_OPTS_OVERWRITE] = (char *)ami_utf8_easy((char *)messages_get("ConfirmOverwrite"));
gadlab[GID_OPTS_NOTIFY] = (char *)ami_utf8_easy((char *)messages_get("DownloadNotify"));
gadlab[GID_OPTS_DLDIR] = (char *)ami_utf8_easy((char *)messages_get("DownloadDir"));
@@ -406,9 +403,12 @@ void ami_gui_opts_open(void)
BOOL proxyhostdisabled = TRUE, proxyauthdisabled = TRUE, proxybypassdisabled = FALSE;
BOOL disableanims, animspeeddisabled = FALSE, acceptlangdisabled = FALSE;
BOOL scaleselected = nsoption_bool(scale_quality), scaledisabled = FALSE;
+ BOOL ditherdisable = TRUE;
BOOL download_notify_disabled = FALSE;
BOOL ptr_disable = FALSE;
char animspeed[10];
+ char *homepage_url_lc = ami_utf8_easy(nsoption_charp(homepage_url));
+
struct TextAttr fontsans, fontserif, fontmono, fontcursive, fontfantasy;
if(gow && gow->win)
@@ -446,6 +446,9 @@ void ami_gui_opts_open(void)
screenmodeid = strtoul(nsoption_charp(screen_modeid),NULL,0);
}
+ if(ami_plot_screen_is_palettemapped() == true)
+ ditherdisable = FALSE;
+
if(nsoption_bool(http_proxy) == true)
{
proxytype = nsoption_int(http_proxy_auth) + 1;
@@ -553,7 +556,7 @@ void ami_gui_opts_open(void)
LAYOUT_AddChild, gow->objects[GID_OPTS_HOMEPAGE] = StringObject,
GA_ID, GID_OPTS_HOMEPAGE,
GA_RelVerify, TRUE,
- STRINGA_TextVal, nsoption_charp(homepage_url),
+ STRINGA_TextVal, homepage_url_lc,
STRINGA_BufferPos,0,
StringEnd,
CHILD_Label, LabelObject,
@@ -907,6 +910,7 @@ void ami_gui_opts_open(void)
LAYOUT_AddChild, gow->objects[GID_OPTS_DITHERQ] = ChooserObject,
GA_ID, GID_OPTS_DITHERQ,
GA_RelVerify, TRUE,
+ GA_Disabled, ditherdisable,
CHOOSER_PopUp, TRUE,
CHOOSER_LabelArray, ditheropts,
CHOOSER_Selected, nsoption_int(dither_quality),
@@ -1150,15 +1154,14 @@ void ami_gui_opts_open(void)
LAYOUT_AddChild, gow->objects[GID_OPTS_CACHE_DISC] = IntegerObject,
GA_ID, GID_OPTS_CACHE_DISC,
GA_RelVerify, TRUE,
- GA_Disabled, TRUE,
- INTEGER_Number, nsoption_int(disc_cache_age),
+ INTEGER_Number, nsoption_uint(disc_cache_size) / 1048576,
INTEGER_Minimum, 0,
- INTEGER_Maximum, 366,
+ INTEGER_Maximum, 4096,
INTEGER_Arrows, TRUE,
IntegerEnd,
CHILD_WeightedWidth, 0,
CHILD_Label, LabelObject,
- LABEL_Text, gadlab[LAB_OPTS_DAYS],
+ LABEL_Text, gadlab[LAB_OPTS_MB],
LabelEnd,
LayoutEnd,
CHILD_Label, LabelObject,
@@ -1306,7 +1309,7 @@ void ami_gui_opts_open(void)
GA_ID, GID_OPTS_SEARCH_PROV,
GA_RelVerify, TRUE,
CHOOSER_PopUp, TRUE,
- CHOOSER_LabelArray, websearch_list,
+ CHOOSER_Labels, websearch_list,
CHOOSER_Selected, nsoption_int(search_provider),
CHOOSER_MaxLabels, 40,
ChooserEnd,
@@ -1328,6 +1331,7 @@ void ami_gui_opts_open(void)
GA_RelVerify, TRUE,
GA_Text, gadlab[GID_OPTS_CONTEXTMENU],
GA_Selected, nsoption_bool(context_menu),
+ GA_Disabled, !popupmenu_lib_ok,
CheckBoxEnd,
#endif
LAYOUT_AddChild, gow->objects[GID_OPTS_FASTSCROLL] = CheckBoxObject,
@@ -1523,6 +1527,7 @@ void ami_gui_opts_open(void)
gow->node = AddObject(window_list,AMINS_GUIOPTSWINDOW);
gow->node->objstruct = gow;
}
+ ami_utf8_free(homepage_url_lc);
}
void ami_gui_opts_use(bool save)
@@ -1537,7 +1542,7 @@ void ami_gui_opts_use(bool save)
ami_update_pointer(gow->win, GUI_POINTER_WAIT);
GetAttr(STRINGA_TextVal,gow->objects[GID_OPTS_HOMEPAGE],(ULONG *)&data);
- nsoption_set_charp(homepage_url, (char *)strdup((char *)data));
+ nsoption_set_charp(homepage_url, (char *)ami_to_utf8_easy((char *)data));
GetAttr(STRINGA_TextVal,gow->objects[GID_OPTS_CONTENTLANG],(ULONG *)&data);
nsoption_set_charp(accept_language, (char *)strdup((char *)data));
@@ -1742,7 +1747,8 @@ void ami_gui_opts_use(bool save)
GetAttr(INTEGER_Number,gow->objects[GID_OPTS_CACHE_MEM],(ULONG *)&nsoption_int(memory_cache_size));
nsoption_set_int(memory_cache_size, nsoption_int(memory_cache_size) * 1048576);
- GetAttr(INTEGER_Number,gow->objects[GID_OPTS_CACHE_DISC],(ULONG *)&nsoption_int(disc_cache_age));
+ GetAttr(INTEGER_Number,gow->objects[GID_OPTS_CACHE_DISC],(ULONG *)&nsoption_uint(disc_cache_size));
+ nsoption_set_uint(disc_cache_size, nsoption_uint(disc_cache_size) * 1048576);
GetAttr(GA_Selected,gow->objects[GID_OPTS_OVERWRITE],(ULONG *)&data);
if (data) {
@@ -1802,8 +1808,7 @@ void ami_gui_opts_use(bool save)
ami_gui_tabs_toggle_all();
GetAttr(CHOOSER_Selected,gow->objects[GID_OPTS_SEARCH_PROV],(ULONG *)&nsoption_int(search_provider));
- search_web_provider_details(nsoption_int(search_provider));
- search_web_retrieve_ico(false);
+ search_web_select_provider(nsoption_int(search_provider));
GetAttr(GA_Selected,gow->objects[GID_OPTS_CLIPBOARD],(ULONG *)&data);
if (data) {
@@ -1929,10 +1934,10 @@ BOOL ami_gui_opts_event(void)
case WMHI_GADGETHELP:
if((result & WMHI_GADGETMASK) == 0) {
/* Pointer not over our window */
- ami_help_open(AMI_HELP_MAIN);
+ ami_help_open(AMI_HELP_MAIN, scrn);
} else {
/* TODO: Make this sensitive to the tab the user is currently on */
- ami_help_open(AMI_HELP_PREFS);
+ ami_help_open(AMI_HELP_PREFS, scrn);
}
break;
@@ -2110,39 +2115,41 @@ BOOL ami_gui_opts_event(void)
return FALSE;
}
-STRPTR *ami_gui_opts_websearch(void)
+struct List *ami_gui_opts_websearch(void)
{
- char buf[300];
- ULONG ref = 0;
- STRPTR *websearchlist;
+ struct List *list;
+ struct Node *node;
+ const char *name;
+ int iter;
- websearchlist = AllocVecTagList(200, NULL); /* NB: Was not MEMF_PRIVATE */
+ list = AllocVecTagList(sizeof(struct List), NULL);
+ NewList(list);
- if (nsoption_charp(search_engines_file) == NULL) return websearchlist;
+ if (nsoption_charp(search_engines_file) == NULL) return list;
- FILE *f = fopen(nsoption_charp(search_engines_file), "r");
- if (f == NULL) return websearchlist;
-
- while (fgets(buf, sizeof(buf), f) != NULL) {
- if (buf[0] == '\0') continue;
- buf[strlen(buf)-1] = '\0';
- websearchlist[ref] = strdup(strtok(buf, "|"));
- ref++;
+ for (iter = search_web_iterate_providers(0, &name);
+ iter != -1;
+ iter = search_web_iterate_providers(iter, &name)) {
+ node = AllocChooserNode(CNA_Text, name, TAG_DONE);
+ AddTail(list, node);
}
- fclose(f);
- websearchlist[ref] = NULL;
- return websearchlist;
+ return list;
}
-void ami_gui_opts_websearch_free(STRPTR *websearchlist)
+void ami_gui_opts_websearch_free(struct List *websearchlist)
{
- ULONG ref = 0;
+ struct Node *node;
+ struct Node *nnode;
- while (websearchlist[ref] != NULL) {
- free(websearchlist[ref]);
- ref++;
- }
+ if(IsListEmpty(websearchlist)) return;
+ node = GetHead(websearchlist);
+
+ do {
+ nnode = GetSucc(node);
+ Remove(node);
+ } while(node = nnode);
FreeVec(websearchlist);
}
+
diff --git a/amiga/gui_options.h b/amiga/gui_options.h
index 0fd0715a3..04c1be51e 100755
--- a/amiga/gui_options.h
+++ b/amiga/gui_options.h
@@ -18,8 +18,15 @@
#ifndef AMIGA_GUI_OPTIONS_H
#define AMIGA_GUI_OPTIONS_H
+/* Prefs GUI control */
void ami_gui_opts_open(void);
BOOL ami_gui_opts_event(void);
+void ami_gui_opts_close(void);
+
+/* Web search list */
+struct List *ami_gui_opts_websearch(void);
+void ami_gui_opts_websearch_free(struct List *websearchlist);
char *current_user_options;
#endif
+
diff --git a/amiga/help.c b/amiga/help.c
index 214e59d96..8914440be 100755
--- a/amiga/help.c
+++ b/amiga/help.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2013 Chris Young <chris@unsatisfactorysoftware.co.uk>
+ * Copyright 2013-4 Chris Young <chris@unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -45,8 +45,9 @@ void ami_help_init(struct Screen *screen)
TAG_DONE);
}
-void ami_help_open(ULONG node)
+void ami_help_open(ULONG node, struct Screen *screen)
{
+ if(AmigaGuideObject == NULL) ami_help_init(screen);
SetAttrs(AmigaGuideObject, AMIGAGUIDE_ContextID, node, TAG_DONE);
IDoMethod(AmigaGuideObject, AGM_OPEN, NULL);
}
@@ -62,5 +63,21 @@ void ami_help_free(void)
void ami_help_new_screen(struct Screen *screen)
{
+ if(AmigaGuideObject == NULL) return;
SetAttrs(AmigaGuideObject, AMIGAGUIDE_Screen, screen, TAG_DONE);
}
+
+ULONG ami_help_signal(void)
+{
+ ULONG ag_sig = 0;
+ if(AmigaGuideObject)
+ GetAttr(AMIGAGUIDE_Signal, AmigaGuideObject, &ag_sig);
+ return ag_sig;
+}
+
+void ami_help_process(void)
+{
+ ULONG ret = IDoMethod(AmigaGuideObject, AGM_PROCESS, NULL);
+ if(ret) ami_help_free();
+}
+
diff --git a/amiga/help.h b/amiga/help.h
index 4baa2a0e2..e405edd0c 100755
--- a/amiga/help.h
+++ b/amiga/help.h
@@ -29,8 +29,10 @@ enum {
struct Screen;
-void ami_help_init(struct Screen *screen);
-void ami_help_open(ULONG node);
+void ami_help_open(ULONG node, struct Screen *screen);
void ami_help_free(void);
void ami_help_new_screen(struct Screen *screen);
+ULONG ami_help_signal(void);
+void ami_help_process(void);
#endif
+
diff --git a/amiga/history_local.c b/amiga/history_local.c
index b5aba3825..9884ea3ec 100755
--- a/amiga/history_local.c
+++ b/amiga/history_local.c
@@ -25,14 +25,13 @@
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
+#include "desktop/browser_history.h"
#include "desktop/browser_private.h"
-#include "desktop/local_history.h"
#include "desktop/plotters.h"
#include "amiga/os3support.h"
#include "amiga/object.h"
#include "amiga/gui.h"
#include "utils/log.h"
-#include "utils/url.h"
#include "utils/utils.h"
#include <proto/intuition.h>
#include "amiga/history_local.h"
@@ -52,7 +51,7 @@
#include <reaction/reaction.h>
#include <reaction/reaction_macros.h>
-static struct history *history_current = 0;
+static struct browser_window *history_bw;
/* Last position of mouse in window. */
static int mouse_x = 0;
/* Last position of mouse in window. */
@@ -74,11 +73,10 @@ static void ami_history_scroller_hook(struct Hook *hook,Object *object,struct In
void ami_history_open(struct browser_window *bw, struct history *history)
{
int width, height;
- struct IBox *bbox;
assert(history);
- history_current = history;
+ history_bw = bw;
if(!hwindow)
{
@@ -87,7 +85,7 @@ void ami_history_open(struct browser_window *bw, struct history *history)
ami_init_layers(&hwindow->gg, scrn->Width, scrn->Height);
hwindow->bw = bw;
- history_size(history, &width, &height);
+ browser_window_history_size(bw, &width, &height);
hwindow->scrollerhook.h_Entry = (void *)ami_history_scroller_hook;
hwindow->scrollerhook.h_Data = hwindow;
@@ -173,7 +171,7 @@ void ami_history_redraw(struct history_window *hw)
SetRPAttrs(glob->rp, RPTAG_APenColor, 0xffffffff, TAG_DONE);
RectFill(glob->rp, 0, 0, bbox->Width - 1, bbox->Height - 1);
- history_redraw_rectangle(history_current, xs, ys,
+ browser_window_history_redraw_rectangle(history_bw, xs, ys,
bbox->Width + xs, bbox->Height + ys, 0, 0, &ctx);
glob = &browserglob;
@@ -210,13 +208,13 @@ bool ami_history_click(struct history_window *hw,uint16 code)
switch(code)
{
case SELECTUP:
- history_click(hw->bw,history_current,x,y,false);
+ browser_window_history_click(history_bw,x,y,false);
ami_history_redraw(hw);
ami_schedule_redraw(hw->bw->window->shared, true);
break;
case MIDDLEUP:
- history_click(hw->bw,history_current,x,y,true);
+ browser_window_history_click(history_bw,x,y,true);
ami_history_redraw(hw);
break;
@@ -239,7 +237,6 @@ BOOL ami_history_event(struct history_window *hw)
/* return TRUE if window destroyed */
ULONG class,result,relevent = 0;
uint16 code;
- struct MenuItem *item;
const char *url;
struct IBox *bbox;
ULONG xs, ys;
@@ -265,7 +262,7 @@ BOOL ami_history_event(struct history_window *hw)
GetAttr(SCROLLER_Top, hw->objects[OID_HSCROLL], (ULONG *)&xs);
GetAttr(SCROLLER_Top, hw->objects[OID_VSCROLL], (ULONG *)&ys);
- url = history_position_url(history_current,
+ url = browser_window_history_position_url(history_bw,
hw->win->MouseX - bbox->Left + xs,
hw->win->MouseY - bbox->Top + ys);
@@ -297,7 +294,7 @@ void ami_history_update_extent(struct history_window *hw)
struct IBox *bbox;
int width, height;
- history_size(hw->bw->history, &width, &height);
+ browser_window_history_size(hw->bw, &width, &height);
GetAttr(SPACE_AreaBox,hw->objects[GID_BROWSER],(ULONG *)&bbox);
RefreshSetGadgetAttrs((APTR)hw->objects[OID_VSCROLL],hw->win,NULL,
diff --git a/amiga/icon.c b/amiga/icon.c
index c5bc6ae1f..01802d308 100644
--- a/amiga/icon.c
+++ b/amiga/icon.c
@@ -39,6 +39,7 @@
#include "amiga/os3support.h"
#include "amiga/bitmap.h"
#include "amiga/icon.h"
+#include "amiga/misc.h"
#include "desktop/plotters.h"
#include "image/bitmap.h"
#include "content/content_protected.h"
@@ -46,6 +47,7 @@
#include "utils/messages.h"
#include "utils/utils.h"
#include "utils/url.h"
+#include "utils/file.h"
#define THUMBNAIL_WIDTH 100 /* Icon sizes for thumbnails, usually the same as */
#define THUMBNAIL_HEIGHT 86 /* WIDTH/HEIGHT in desktop/thumbnail.c */
@@ -139,18 +141,15 @@ bool amiga_icon_convert(struct content *c)
ULONG size;
int width = 0, height = 0;
long format = 0;
- int err = 0;
+ int err;
uint8 r, g, b, a;
ULONG offset;
- const char *url;
- char *filename;
+ char *filename = NULL;
char *p;
ULONG trans, pals1;
struct ColorRegister *pal1;
- url = nsurl_access(content_get_url(c));
- filename = url_to_path(url);
-
+ netsurf_nsurl_to_path(content_get_url(c), &filename);
/* This loader will only work on local files, so fail if not a local path */
if(filename == NULL)
{
@@ -365,7 +364,7 @@ void amiga_icon_superimpose_favicon_internal(struct hlcache_handle *icon, struct
ULONG *icondata1, *icondata2;
ULONG width, height;
long format = 0;
- int err = 0;
+ int err;
if(dobj == NULL) return;
@@ -420,11 +419,10 @@ void amiga_icon_superimpose_favicon_internal(struct hlcache_handle *icon, struct
void amiga_icon_superimpose_favicon(char *path, struct hlcache_handle *icon, char *type)
{
struct DiskObject *dobj = NULL;
- struct BitMap *bm = NULL;
ULONG *icondata1, *icondata2;
ULONG width, height;
long format = 0;
- int err = 0;
+ int err;
ULONG trans1, pals1;
ULONG trans2, pals2;
struct ColorRegister *pal1;
diff --git a/amiga/iff_dr2d.c b/amiga/iff_dr2d.c
index 0638b94a6..5709d418b 100644
--- a/amiga/iff_dr2d.c
+++ b/amiga/iff_dr2d.c
@@ -31,7 +31,7 @@ ULONG numcols;
ULONG findcolour(ULONG newcol)
{
ULONG i;
- ULONG colour = 0xFFFFFFFF;
+ ULONG colr = 0xFFFFFFFF;
UBYTE red,grn,blu;
red = svgtiny_RED(newcol);
@@ -41,21 +41,20 @@ ULONG findcolour(ULONG newcol)
for(i=0;i<numcols;i++)
{
if((cm[i].red == red) && (cm[i].green == grn) && (cm[i].blue == blu))
- colour = i;
+ colr = i;
}
- return colour;
+ return colr;
}
void addcolour(ULONG newcol)
{
- int i;
- ULONG colour;
+ ULONG colr;
UBYTE red,grn,blu;
- colour = findcolour(newcol);
+ colr = findcolour(newcol);
- if(colour == 0xFFFFFFFF)
+ if(colr == 0xFFFFFFFF)
{
cm[numcols].red = svgtiny_RED(newcol);
cm[numcols].green = svgtiny_GREEN(newcol);
@@ -342,7 +341,6 @@ int main(int argc, char **argv)
{
BPTR fh = 0;
char *buffer;
- size_t n;
struct IFFHandle *iffh = NULL;
int64 size;
LONG rarray[] = {0,0};
diff --git a/amiga/launch.c b/amiga/launch.c
index ebd82294a..d3c9ff11e 100755
--- a/amiga/launch.c
+++ b/amiga/launch.c
@@ -31,6 +31,7 @@
#include <proto/openurl.h>
#include "utils/nsoption.h"
+#include "utils/nsurl.h"
#include "utils/url.h"
struct Library *OpenURLBase = NULL;
@@ -49,7 +50,7 @@ struct ami_protocol *ami_openurl_add_protocol(const char *url)
struct ami_protocol *ami_p =
(struct ami_protocol *)AllocVecTagList(sizeof(struct ami_protocol), NULL);
- if(url_scheme(url, &ami_p->protocol) != URL_FUNC_OK)
+ if(url_scheme(url, &ami_p->protocol) != NSERROR_OK)
{
FreeVec(ami_p);
return NULL;
@@ -105,8 +106,6 @@ BOOL ami_openurl_check_list(struct MinList *list, const char *url)
void ami_openurl_open(void)
{
- struct ami_protocol *ami_p;
-
if(nsoption_bool(use_openurl_lib)) {
if(OpenURLBase = OpenLibrary("openurl.library",0))
IOpenURL = (struct OpenURLIFace *)GetInterface(OpenURLBase,"main",1,NULL);
@@ -124,26 +123,31 @@ void ami_openurl_close(const char *scheme)
ami_openurl_free_list(&ami_unsupportedprotocols);
}
-void gui_launch_url(const char *url)
+nserror gui_launch_url(struct nsurl *url)
{
APTR procwin = SetProcWindow((APTR)-1L);
char *launchurl = NULL;
- BPTR fptr = 0;
- if(ami_openurl_check_list(&ami_unsupportedprotocols, url) == FALSE)
+ if(ami_openurl_check_list(&ami_unsupportedprotocols, nsurl_access(url)) == FALSE)
{
if(IOpenURL)
{
URL_OpenA((STRPTR)url,NULL);
} else {
- if(launchurl = ASPrintf("URL:%s",url)) {
- fptr = Open(launchurl,MODE_OLDFILE);
- if(fptr) Close(fptr);
- else ami_openurl_add_protocol(url);
+ if(launchurl = ASPrintf("URL:%s", nsurl_access(url))) {
+ BPTR fptr = Open(launchurl,MODE_OLDFILE);
+ if(fptr)
+ {
+ Close(fptr);
+ } else {
+ ami_openurl_add_protocol(nsurl_access(url));
+ }
FreeVec(launchurl);
}
}
}
- SetProcWindow(procwin);
+ SetProcWindow(procwin);
+
+ return NSERROR_OK;
}
diff --git a/amiga/launch.h b/amiga/launch.h
index 40f7dae30..cab638b1d 100755
--- a/amiga/launch.h
+++ b/amiga/launch.h
@@ -25,4 +25,7 @@
void ami_openurl_open(void);
void ami_openurl_close(void);
+
+nserror gui_launch_url(struct nsurl *url);
+
#endif
diff --git a/amiga/login.c b/amiga/login.c
index 816ece675..c4bf5d92a 100755
--- a/amiga/login.c
+++ b/amiga/login.c
@@ -16,7 +16,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "desktop/401login.h"
#include "amiga/os3support.h"
#include "amiga/gui.h"
#include "amiga/object.h"
@@ -24,7 +23,6 @@
#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/utility.h>
-#include "utils/url.h"
#include "content/urldb.h"
#include "utils/messages.h"
#include "utils/errors.h"
@@ -93,7 +91,7 @@ void gui_401login_open(nsurl *url, const char *realm,
lw->objects[OID_MAIN] = WindowObject,
WA_ScreenTitle,nsscreentitle,
- WA_Title,lw->url,
+ WA_Title, nsurl_access(lw->url),
WA_Activate, TRUE,
WA_DepthGadget, TRUE,
WA_DragBar, TRUE,
diff --git a/amiga/login.h b/amiga/login.h
index 2ad5d8bdc..e3f77901f 100755
--- a/amiga/login.h
+++ b/amiga/login.h
@@ -24,4 +24,8 @@
struct gui_login_window;
BOOL ami_401login_event(struct gui_login_window *lw);
+
+void gui_401login_open(nsurl *url, const char *realm,
+ nserror (*cb)(bool proceed, void *pw), void *cbpw);
+
#endif
diff --git a/amiga/menu.c b/amiga/menu.c
index a9185e823..19888f75b 100644
--- a/amiga/menu.c
+++ b/amiga/menu.c
@@ -35,8 +35,6 @@
#include <images/label.h>
#include <proto/bitmap.h>
#include <images/bitmap.h>
-#include <proto/glyph.h>
-#include <images/glyph.h>
#include <reaction/reaction_macros.h>
@@ -58,12 +56,19 @@
#include "amiga/theme.h"
#include "amiga/tree.h"
#include "amiga/utf8.h"
+#include "amiga/schedule.h"
#include "desktop/hotlist.h"
#include "desktop/browser_private.h"
#include "desktop/gui.h"
#include "desktop/textinput.h"
#include "utils/messages.h"
-#include "utils/schedule.h"
+
+/* This is here temporarily until we get a new SDK */
+#define LABEL_MenuMode (LABEL_Dummy+12)
+ /* (BOOL) Use highlighting that fits in better visually in a
+ menu. Defaults to FALSE. */
+/**/
+
enum {
NSA_GLYPH_SUBMENU,
@@ -357,13 +362,34 @@ void ami_menu_free_glyphs(void)
menu_glyphs_loaded = false;
}
+static int ami_menu_calc_item_width(struct gui_window_2 *gwin, int j, struct RastPort *rp)
+{
+ int space_width = TextLength(rp, " ", 1);
+ int item_size;
+
+ item_size = TextLength(rp, gwin->menulab[j], strlen(gwin->menulab[j]));
+ item_size += space_width;
+
+ if(gwin->menukey[j]) {
+ item_size += TextLength(rp, &gwin->menukey[j], 1);
+ item_size += menu_glyph_width[NSA_GLYPH_AMIGAKEY];
+ /**TODO: take account of the size of other imagery too
+ */
+ }
+
+ return item_size;
+}
+
+
static struct gui_window_2 *ami_menu_layout(struct gui_window_2 *gwin)
{
int i, j;
- int txtlen = 0;
+ int txtlen = 0, subtxtlen = 0;
+ int left_posn;
struct RastPort *rp = &scrn->RastPort;
struct DrawInfo *dri = GetScreenDrawInfo(scrn);
-
+ int space_width = TextLength(rp, " ", 1);
+
if(menu_glyphs_loaded == false)
ami_menu_load_glyphs(dri);
@@ -372,18 +398,10 @@ static struct gui_window_2 *ami_menu_layout(struct gui_window_2 *gwin)
if(gwin->menutype[i] == NM_TITLE) {
j = i + 1;
txtlen = 0;
- int item_size = 0;
do {
if(gwin->menulab[j] != NM_BARLABEL) {
if(gwin->menutype[j] == NM_ITEM) {
- item_size = TextLength(rp, gwin->menulab[j], strlen(gwin->menulab[j]));
- if(gwin->menukey[j]) {
- item_size += TextLength(rp, &gwin->menukey[j], 1);
- item_size += menu_glyph_width[NSA_GLYPH_AMIGAKEY];
- /**TODO: take account of the size of other imagery too
- */
- }
-
+ int item_size = ami_menu_calc_item_width(gwin, j, rp);
if(item_size > txtlen) {
txtlen = item_size;
}
@@ -398,32 +416,76 @@ static struct gui_window_2 *ami_menu_layout(struct gui_window_2 *gwin)
using label.image if there's a bitmap associated with the item. */
if((gwin->menuicon[i] != NULL) && (gwin->menulab[i] != NM_BARLABEL)) {
int icon_width = 0;
+ Object *blank_space = NULL;
Object *submenuarrow = NULL;
Object *icon = BitMapObject,
BITMAP_Screen, scrn,
BITMAP_SourceFile, gwin->menuicon[i],
BITMAP_Masking, TRUE,
BitMapEnd;
+
+ /* \todo make this scale the bitmap to these dimensions */
+ SetAttrs(icon,
+ BITMAP_Width, 16,
+ BITMAP_Height, 16,
+ TAG_DONE);
+
GetAttr(IA_Width, icon, (ULONG *)&icon_width);
-
+
+ if(gwin->menutype[i] == NM_SUB) {
+ left_posn = subtxtlen;
+ } else {
+ left_posn = txtlen;
+ }
+
+ left_posn = left_posn -
+ TextLength(rp, gwin->menulab[i], strlen(gwin->menulab[i])) -
+ icon_width - space_width;
+
if((gwin->menutype[i] == NM_ITEM) && (gwin->menutype[i+1] == NM_SUB)) {
+ left_posn -= menu_glyph_width[NSA_GLYPH_SUBMENU];
+
submenuarrow = NewObject(NULL, "sysiclass",
- SYSIA_Which, MENUSUB,
- SYSIA_DrawInfo, dri,
- IA_Left, txtlen - TextLength(rp, gwin->menulab[i], strlen(gwin->menulab[i])) -
- menu_glyph_width[NSA_GLYPH_SUBMENU] - icon_width,
+ SYSIA_Which, MENUSUB,
+ SYSIA_DrawInfo, dri,
+ IA_Left, left_posn,
TAG_DONE);
+
+ j = i + 1;
+ subtxtlen = 0;
+ do {
+ if(gwin->menulab[j] != NM_BARLABEL) {
+ if(gwin->menutype[j] == NM_SUB) {
+ int item_size = ami_menu_calc_item_width(gwin, j, rp);
+ if(item_size > subtxtlen) {
+ subtxtlen = item_size;
+ }
+ }
+ }
+ j++;
+ } while((gwin->menutype[j] == NM_SUB));
}
/**TODO: Checkmark/MX images and keyboard shortcuts
*/
+
+ if(gwin->menutype[i] == NM_SUB) {
+ blank_space = NewObject(NULL, "fillrectclass",
+ IA_Height, 0,
+ IA_Width, left_posn + icon_width,
+ TAG_DONE);
+ }
gwin->menuobj[i] = LabelObject,
+ LABEL_MenuMode, TRUE,
LABEL_DrawInfo, dri,
LABEL_DisposeImage, TRUE,
LABEL_Image, icon,
+ LABEL_Text, " ",
LABEL_Text, gwin->menulab[i],
LABEL_DisposeImage, TRUE,
+ LABEL_Image, blank_space,
+ LABEL_DisposeImage, TRUE,
LABEL_Image, submenuarrow,
LabelEnd;
@@ -455,8 +517,6 @@ static struct gui_window_2 *ami_menu_layout(struct gui_window_2 *gwin)
struct NewMenu *ami_create_menu(struct gui_window_2 *gwin)
{
- int i;
-
gwin->menu = AllocVecTags(sizeof(struct NewMenu) * (AMI_MENU_AREXX_MAX + 1),
AVT_ClearWithValue, 0, TAG_DONE);
ami_init_menulabs(gwin);
@@ -479,10 +539,6 @@ struct NewMenu *ami_create_menu(struct gui_window_2 *gwin)
if(nsoption_bool(background_images) == true)
gwin->menu[M_IMGBACK].nm_Flags |= CHECKED;
- /* Set up scheduler to refresh the hotlist menu */
- if(nsoption_int(menu_refresh) > 0)
- schedule(nsoption_int(menu_refresh), (void *)ami_menu_refresh, gwin);
-
return(gwin->menu);
}
@@ -548,7 +604,7 @@ void ami_menu_arexx_scan(struct gui_window_2 *gwin)
static bool ami_menu_hotlist_add(void *userdata, int level, int item, const char *title, nsurl *url, bool is_folder)
{
UBYTE type;
- char *icon;
+ STRPTR icon;
struct gui_window_2 *gw = (struct gui_window_2 *)userdata;
if(item >= AMI_MENU_HOTLIST_MAX) return false;
@@ -567,9 +623,10 @@ static bool ami_menu_hotlist_add(void *userdata, int level, int item, const char
}
if(is_folder == true) {
- icon = "icons/directory.png";
+ icon = ASPrintf("icons/directory.png");
} else {
- icon = "icons/content.png";
+ icon = ami_gui_get_cache_favicon_name(url, true);
+ if (icon == NULL) icon = ASPrintf("icons/content.png");
}
ami_menu_alloc_item(gw, item, type, title,
@@ -577,6 +634,8 @@ static bool ami_menu_hotlist_add(void *userdata, int level, int item, const char
if((is_folder == true) && (type == NM_SUB))
gw->menu[item].nm_Flags = NM_ITEMDISABLED;
+ if(icon) FreeVec(icon);
+
return true;
}
@@ -697,8 +756,7 @@ static void ami_menu_item_project_newwin(struct Hook *hook, APTR window, struct
error = nsurl_create(nsoption_charp(homepage_url), &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -713,25 +771,10 @@ static void ami_menu_item_project_newwin(struct Hook *hook, APTR window, struct
static void ami_menu_item_project_newtab(struct Hook *hook, APTR window, struct IntuiMessage *msg)
{
struct gui_window_2 *gwin;
- nsurl *url;
nserror error;
- GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&gwin);
-
- error = nsurl_create(nsoption_charp(homepage_url), &url);
- if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_TAB,
- url,
- NULL,
- gwin->bw,
- NULL);
- nsurl_unref(url);
- }
- if (error != NSERROR_OK) {
- warn_user(messages_get_errorcode(error), 0);
- }
+ GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&gwin);
+ error = ami_gui_new_blank_tab(gwin);
}
static void ami_menu_item_project_open(struct Hook *hook, APTR window, struct IntuiMessage *msg)
@@ -801,18 +844,9 @@ static void ami_menu_item_project_about(struct Hook *hook, APTR window, struct I
TDR_TitleString, messages_get("NetSurf"),
TDR_Window, gwin->win,
TDR_GadgetString, temp2,
-#ifndef NDEBUG
- TDR_FormatString,"NetSurf %s\n%s\nBuild date %s\n\nhttp://www.netsurf-browser.org",
-#else
- TDR_FormatString,"NetSurf %s\n%s\n\nhttp://www.netsurf-browser.org",
-#endif
+ TDR_FormatString,"NetSurf %s\nBuild date %s\n\nhttp://www.netsurf-browser.org",
TDR_Arg1,netsurf_version,
-#ifdef NS_AMIGA_CAIRO
- TDR_Arg2,"Cairo (OS4.1+) SObjs build",
-#else
- TDR_Arg2,"graphics.library static build",
-#endif
- TDR_Arg3,verdate,
+ TDR_Arg2,verdate,
TAG_DONE);
free(temp2);
@@ -825,8 +859,7 @@ static void ami_menu_item_project_about(struct Hook *hook, APTR window, struct I
if(url) {
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -867,8 +900,12 @@ static void ami_menu_item_edit_copy(struct Hook *hook, APTR window, struct Intui
}
else if(bm = content_get_bitmap(gwin->bw->current_content))
{
- bm->url = (char *)nsurl_access(hlcache_handle_get_url(gwin->bw->current_content));
- bm->title = (char *)content_get_title(gwin->bw->current_content);
+ /** @todo It should be checked that the lifetime of
+ * the objects containing the values returned (and the
+ * constness cast away) is safe.
+ */
+ bm->url = (char *)nsurl_access(browser_window_get_url(gwin->bw));
+ bm->title = (char *)browser_window_get_title(gwin->bw);
ami_easy_clipboard_bitmap(bm);
}
#ifdef WITH_NS_SVG
@@ -1041,7 +1078,6 @@ static void ami_menu_item_hotlist_show(struct Hook *hook, APTR window, struct In
static void ami_menu_item_hotlist_entries(struct Hook *hook, APTR window, struct IntuiMessage *msg)
{
nsurl *url = hook->h_Data;
- nserror error;
struct gui_window_2 *gwin;
GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&gwin);
@@ -1050,8 +1086,7 @@ static void ami_menu_item_hotlist_entries(struct Hook *hook, APTR window, struct
browser_window_navigate(gwin->bw,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -1109,13 +1144,13 @@ static void ami_menu_item_arexx_entries(struct Hook *hook, APTR window, struct I
char *script = hook->h_Data;
char *temp;
struct gui_window_2 *gwin;
- BPTR lock = 0;
GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&gwin);
if(script)
{
if(temp = AllocVecTagList(1024, NULL))
{
+ BPTR lock;
if(lock = Lock(nsoption_charp(arexx_dir), SHARED_LOCK)) {
DevNameFromLock(lock, temp, 1024, DN_FULLPATH);
AddPart(temp, script, 1024);
@@ -1126,3 +1161,4 @@ static void ami_menu_item_arexx_entries(struct Hook *hook, APTR window, struct I
}
}
}
+
diff --git a/amiga/misc.c b/amiga/misc.c
index 003a5fb6e..7d126c906 100755
--- a/amiga/misc.c
+++ b/amiga/misc.c
@@ -19,8 +19,10 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
#include <sys/types.h>
+#include <sys/stat.h>
#include <proto/dos.h>
#include <proto/exec.h>
@@ -34,8 +36,10 @@
#include "amiga/utf8.h"
#include "desktop/cookie_manager.h"
#include "utils/log.h"
+#include "utils/corestrings.h"
#include "utils/messages.h"
#include "utils/url.h"
+#include "utils/file.h"
#include "utils/utils.h"
void warn_user(const char *warning, const char *detail)
@@ -43,7 +47,6 @@ void warn_user(const char *warning, const char *detail)
Object *req = NULL;
char *utf8warning = ami_utf8_easy(messages_get(warning));
STRPTR bodytext = NULL;
- LONG result = 0;
LOG(("%s %s", warning, detail));
@@ -63,7 +66,7 @@ void warn_user(const char *warning, const char *detail)
TAG_DONE);
if (req) {
- result = IDoMethod(req, RM_OPENREQ, NULL, NULL, scrn);
+ LONG result = IDoMethod(req, RM_OPENREQ, NULL, NULL, scrn);
DisposeObject(req);
}
@@ -106,54 +109,91 @@ void die(const char *error)
exit(1);
}
-char *url_to_path(const char *url)
+/**
+ * Create a path from a nsurl using amiga file handling.
+ *
+ * @param[in] url The url to encode.
+ * @param[out] path_out A string containing the result path which should
+ * be freed by the caller.
+ * @return NSERROR_OK and the path is written to \a path or error code
+ * on faliure.
+ */
+static nserror amiga_nsurl_to_path(struct nsurl *url, char **path_out)
{
- char *tmps, *unesc, *slash, *colon, *url2;
-
- if (strncmp(url, "file://", SLEN("file://")) != 0)
- return NULL;
-
- url += SLEN("file://");
+ lwc_string *urlpath;
+ char *path;
+ bool match;
+ lwc_string *scheme;
+ nserror res;
+ char *colon;
+ char *slash;
+
+ if ((url == NULL) || (path_out == NULL)) {
+ return NSERROR_BAD_PARAMETER;
+ }
- if (strncmp(url, "localhost", SLEN("localhost")) == 0)
- url += SLEN("localhost");
+ scheme = nsurl_get_component(url, NSURL_SCHEME);
- if (strncmp(url, "/", SLEN("/")) == 0)
- url += SLEN("/");
+ if (lwc_string_caseless_isequal(scheme, corestring_lwc_file,
+ &match) != lwc_error_ok)
+ {
+ return NSERROR_BAD_PARAMETER;
+ }
+ lwc_string_unref(scheme);
+ if (match == false) {
+ return NSERROR_BAD_PARAMETER;
+ }
- if(*url == '\0')
- return NULL; /* file:/// is not a valid path */
+ urlpath = nsurl_get_component(url, NSURL_PATH);
+ if (urlpath == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
- url2 = malloc(strlen(url) + 2);
- strcpy(url2, url);
+ res = url_unescape(lwc_string_data(urlpath) + 1, &path);
+ lwc_string_unref(urlpath);
+ if (res != NSERROR_OK) {
+ return res;
+ }
- colon = strchr(url2, ':');
+ colon = strchr(path, ':');
if(colon == NULL)
{
- if(slash = strchr(url2, '/'))
+ slash = strchr(path, '/');
+ if(slash)
{
*slash = ':';
}
else
{
- int len = strlen(url2);
- url2[len] = ':';
- url2[len + 1] = '\0';
+ int len = strlen(path);
+ path[len] = ':';
+ path[len + 1] = '\0';
}
}
- if(url_unescape(url2,&unesc) == URL_FUNC_OK)
- return unesc;
+ *path_out = path;
- return (char *)url2;
+ return NSERROR_OK;
}
-char *path_to_url(const char *path)
+/**
+ * Create a nsurl from a path using amiga file handling.
+ *
+ * Perform the necessary operations on a path to generate a nsurl.
+ *
+ * @param[in] path The path to convert.
+ * @param[out] url_out pointer to recive the nsurl, The returned url
+ * must be unreferenced by the caller.
+ * @return NSERROR_OK and the url is placed in \a url or error code on
+ * faliure.
+ */
+static nserror amiga_path_to_nsurl(const char *path, struct nsurl **url_out)
{
char *colon = NULL;
char *r = NULL;
char newpath[1024 + strlen(path)];
BPTR lock = 0;
+ nserror ret;
if(lock = Lock(path, MODE_OLDFILE))
{
@@ -163,40 +203,19 @@ char *path_to_url(const char *path)
else strlcpy(newpath, path, sizeof newpath);
r = malloc(strlen(newpath) + SLEN("file:///") + 1);
+ if (r == NULL) {
+ return NSERROR_NOMEM;
+ }
if(colon = strchr(newpath, ':')) *colon = '/';
strcpy(r, "file:///");
strcat(r, newpath);
- return r;
-}
+ ret = nsurl_create(r, url_out);
+ free(r);
-/**
- * Return the filename part of a full path
- *
- * \param path full path and filename
- * \return filename (will be freed with free())
- */
-
-char *filename_from_path(char *path)
-{
- return strdup(FilePart(path));
-}
-
-/**
- * Add a path component/filename to an existing path
- *
- * \param path buffer containing path + free space
- * \param length length of buffer "path"
- * \param newpart string containing path component to add to path
- * \return true on success
- */
-
-bool path_add_part(char *path, int length, const char *newpart)
-{
- if(AddPart(path, newpart, length)) return true;
- else return false;
+ return ret;
}
/**
@@ -224,3 +243,197 @@ char *translate_escape_chars(const char *s)
ret[ii] = '\0';
return ret;
}
+
+/**
+ * Generate a posix path from one or more component elemnts.
+ *
+ * If a string is allocated it must be freed by the caller.
+ *
+ * @param[in,out] str pointer to string pointer if this is NULL enough
+ * storage will be allocated for the complete path.
+ * @param[in,out] size The size of the space available if \a str not
+ * NULL on input and if not NULL set to the total
+ * output length on output.
+ * @param[in] nelm The number of elements.
+ * @param[in] ap The elements of the path as string pointers.
+ * @return NSERROR_OK and the complete path is written to str
+ * or error code on faliure.
+ */
+static nserror amiga_vmkpath(char **str, size_t *size, size_t nelm, va_list ap)
+{
+ const char *elm[16];
+ size_t elm_len[16];
+ size_t elm_idx;
+ char *fname;
+ size_t fname_len = 0;
+
+ /* check the parameters are all sensible */
+ if ((nelm == 0) || (nelm > 16)) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if ((*str != NULL) && (size == NULL)) {
+ /* if the caller is providing the buffer they must say
+ * how much space is available.
+ */
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ /* calculate how much storage we need for the complete path
+ * with all the elements.
+ */
+ for (elm_idx = 0; elm_idx < nelm; elm_idx++) {
+ elm[elm_idx] = va_arg(ap, const char *);
+ /* check the argument is not NULL */
+ if (elm[elm_idx] == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ elm_len[elm_idx] = strlen(elm[elm_idx]);
+ fname_len += elm_len[elm_idx];
+ }
+ fname_len += nelm; /* allow for separators and terminator */
+
+ /* ensure there is enough space */
+ fname = *str;
+ if (fname != NULL) {
+ if (fname_len > *size) {
+ return NSERROR_NOSPACE;
+ }
+ } else {
+ fname = malloc(fname_len);
+ if (fname == NULL) {
+ return NSERROR_NOMEM;
+ }
+ }
+
+ /* copy the first element complete */
+ memmove(fname, elm[0], elm_len[0]);
+ fname[elm_len[0]] = 0;
+
+ /* add the remaining elements */
+ for (elm_idx = 1; elm_idx < nelm; elm_idx++) {
+ if (!AddPart(fname, elm[elm_idx], fname_len)) {
+ break;
+ }
+ }
+
+ *str = fname;
+ if (size != NULL) {
+ *size = fname_len;
+ }
+
+ return NSERROR_OK;
+}
+
+/**
+ * Get the basename of a file using posix path handling.
+ *
+ * This gets the last element of a path and returns it.
+ *
+ * @param[in] path The path to extract the name from.
+ * @param[in,out] str Pointer to string pointer if this is NULL enough
+ * storage will be allocated for the path element.
+ * @param[in,out] size The size of the space available if \a
+ * str not NULL on input and set to the total
+ * output length on output.
+ * @return NSERROR_OK and the complete path is written to str
+ * or error code on faliure.
+ */
+static nserror amiga_basename(const char *path, char **str, size_t *size)
+{
+ const char *leafname;
+ char *fname;
+
+ if (path == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ leafname = FilePart(path);
+ if (leafname == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ fname = strdup(leafname);
+ if (fname == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ *str = fname;
+ if (size != NULL) {
+ *size = strlen(fname);
+ }
+ return NSERROR_OK;
+}
+
+/**
+ * Ensure that all directory elements needed to store a filename exist.
+ *
+ * @param fname The filename to ensure the path to exists.
+ * @return NSERROR_OK on success or error code on failure.
+ */
+static nserror amiga_mkdir_all(const char *fname)
+{
+ char *dname;
+ char *sep;
+ struct stat sb;
+
+ dname = strdup(fname);
+
+ sep = strrchr(dname, '/');
+ if (sep == NULL) {
+ /* no directory separator path is just filename so its ok */
+ free(dname);
+ return NSERROR_OK;
+ }
+
+ *sep = 0; /* null terminate directory path */
+
+ if (stat(dname, &sb) == 0) {
+ free(dname);
+ if (S_ISDIR(sb.st_mode)) {
+ /* path to file exists and is a directory */
+ return NSERROR_OK;
+ }
+ return NSERROR_NOT_DIRECTORY;
+ }
+ *sep = '/'; /* restore separator */
+
+ sep = dname;
+ while (*sep == '/') {
+ sep++;
+ }
+ while ((sep = strchr(sep, '/')) != NULL) {
+ *sep = 0;
+ if (stat(dname, &sb) != 0) {
+ if (nsmkdir(dname, S_IRWXU) != 0) {
+ /* could not create path element */
+ free(dname);
+ return NSERROR_NOT_FOUND;
+ }
+ } else {
+ if (! S_ISDIR(sb.st_mode)) {
+ /* path element not a directory */
+ free(dname);
+ return NSERROR_NOT_DIRECTORY;
+ }
+ }
+ *sep = '/'; /* restore separator */
+ /* skip directory separators */
+ while (*sep == '/') {
+ sep++;
+ }
+ }
+
+ free(dname);
+ return NSERROR_OK;
+}
+
+/* amiga file handling operations */
+static struct gui_file_table file_table = {
+ .mkpath = amiga_vmkpath,
+ .basename = amiga_basename,
+ .nsurl_to_path = amiga_nsurl_to_path,
+ .path_to_nsurl = amiga_path_to_nsurl,
+ .mkdir_all = amiga_mkdir_all,
+};
+
+struct gui_file_table *amiga_file_table = &file_table;
diff --git a/amiga/misc.h b/amiga/misc.h
index 34a85fa90..db559f78a 100644
--- a/amiga/misc.h
+++ b/amiga/misc.h
@@ -18,6 +18,11 @@
#ifndef AMIGA_MISC_H
#define AMIGA_MISC_H
+
+extern struct gui_file_table *amiga_file_table;
+
char *translate_escape_chars(const char *s);
int32 ami_warn_user_multi(const char *body, const char *opt1, const char *opt2, struct Window *win);
+
+
#endif
diff --git a/amiga/options.h b/amiga/options.h
index f595cd240..868e28fdb 100644
--- a/amiga/options.h
+++ b/amiga/options.h
@@ -77,7 +77,6 @@ NSOPTION_INTEGER(cookies_window_ypos, 0)
NSOPTION_INTEGER(cookies_window_xsize, 0)
NSOPTION_INTEGER(cookies_window_ysize, 0)
NSOPTION_INTEGER(web_search_width, 0)
-NSOPTION_INTEGER(cairo_renderer, 0)
NSOPTION_BOOL(direct_render, false)
NSOPTION_BOOL(window_simple_refresh, false)
NSOPTION_BOOL(resize_with_contents, false)
@@ -87,6 +86,4 @@ NSOPTION_INTEGER(redraw_tile_size_y, 0)
NSOPTION_INTEGER(monitor_aspect_x, 0)
NSOPTION_INTEGER(monitor_aspect_y, 0)
NSOPTION_BOOL(accept_lang_locale, true)
-NSOPTION_INTEGER(menu_refresh, 0)
-
diff --git a/amiga/plotters.c b/amiga/plotters.c
index 6683fc58b..cb7ccac78 100755
--- a/amiga/plotters.c
+++ b/amiga/plotters.c
@@ -71,11 +71,6 @@ bool palette_mapped = false;
#define M_PI 3.14159265358979323846
#endif
-#ifdef NS_AMIGA_CAIRO
-#include <cairo/cairo.h>
-#include <cairo/cairo-amigaos.h>
-#endif
-
#define PATT_DOT 0xAAAA
#define PATT_DASH 0xCCCC
#define PATT_LINE 0xFFFF
@@ -102,42 +97,6 @@ const struct plotter_table amiplot = {
.option_knockout = true,
};
-
-#ifdef NS_AMIGA_CAIRO
-void ami_cairo_set_colour(cairo_t *cr,colour c)
-{
- int r, g, b;
-
- r = c & 0xff;
- g = (c & 0xff00) >> 8;
- b = (c & 0xff0000) >> 16;
-
- cairo_set_source_rgba(glob->cr, r / 255.0,
- g / 255.0, b / 255.0, 1.0);
-}
-
-void ami_cairo_set_solid(cairo_t *cr)
-{
- double dashes = 0;
-
- cairo_set_dash(glob->cr, &dashes, 0, 0);
-}
-
-void ami_cairo_set_dotted(cairo_t *cr)
-{
- double cdashes = 1;
-
- cairo_set_dash(glob->cr, &cdashes, 1, 0);
-}
-
-void ami_cairo_set_dashed(cairo_t *cr)
-{
- double cdashes = 3;
-
- cairo_set_dash(glob->cr, &cdashes, 1, 0);
-}
-#endif
-
void ami_init_layers(struct gui_globals *gg, ULONG width, ULONG height)
{
/* init shared bitmaps *
@@ -148,7 +107,7 @@ void ami_init_layers(struct gui_globals *gg, ULONG width, ULONG height)
struct BitMap *friend = NULL;
depth = GetBitMapAttr(scrn->RastPort.BitMap, BMA_DEPTH);
- if((depth < 16) || (nsoption_int(cairo_renderer) == -1)) {
+ if(depth < 16) {
palette_mapped = true;
} else {
palette_mapped = false;
@@ -195,19 +154,10 @@ void ami_init_layers(struct gui_globals *gg, ULONG width, ULONG height)
if((!gg->tmprasbuf) || (!gg->rp->TmpRas)) warn_user("NoMemory","");
InitTmpRas(gg->rp->TmpRas, gg->tmprasbuf, width*height);
-
-#ifdef NS_AMIGA_CAIRO
- gg->surface = cairo_amigaos_surface_create(gg->rp->BitMap);
- gg->cr = cairo_create(gg->surface);
-#endif
}
void ami_free_layers(struct gui_globals *gg)
{
-#ifdef NS_AMIGA_CAIRO
- cairo_destroy(gg->cr);
- cairo_surface_destroy(gg->surface);
-#endif
if(gg->rp)
{
DeleteLayer(0,gg->rp->Layer);
@@ -239,16 +189,16 @@ void ami_clearclipreg(struct gui_globals *gg)
gg->rect.MaxY = scrn->Height-1;
}
-static ULONG ami_plot_obtain_pen(struct MinList *shared_pens, ULONG colour)
+static ULONG ami_plot_obtain_pen(struct MinList *shared_pens, ULONG colr)
{
struct ami_plot_pen *node;
ULONG pen = ObtainBestPenA(scrn->ViewPort.ColorMap,
- (colour & 0x000000ff) << 24,
- (colour & 0x0000ff00) << 16,
- (colour & 0x00ff0000) << 8,
+ (colr & 0x000000ff) << 24,
+ (colr & 0x0000ff00) << 16,
+ (colr & 0x00ff0000) << 8,
NULL);
- if(pen == -1) LOG(("WARNING: Cannot allocate pen for ABGR:%lx", colour));
+ if(pen == -1) LOG(("WARNING: Cannot allocate pen for ABGR:%lx", colr));
if(shared_pens != NULL) {
if(node = (struct ami_plot_pen *)AllocVecTagList(sizeof(struct ami_plot_pen), NULL)) {
@@ -278,26 +228,26 @@ void ami_plot_release_pens(struct MinList *shared_pens)
}while(node = nnode);
}
-static void ami_plot_setapen(ULONG colour)
+static void ami_plot_setapen(ULONG colr)
{
if(palette_mapped == false) {
SetRPAttrs(glob->rp, RPTAG_APenColor,
- ns_color_to_nscss(colour),
+ ns_color_to_nscss(colr),
TAG_DONE);
} else {
- ULONG pen = ami_plot_obtain_pen(glob->shared_pens, colour);
+ ULONG pen = ami_plot_obtain_pen(glob->shared_pens, colr);
if(pen != -1) SetAPen(glob->rp, pen);
}
}
-static void ami_plot_setopen(ULONG colour)
+static void ami_plot_setopen(ULONG colr)
{
if(palette_mapped == false) {
SetRPAttrs(glob->rp, RPTAG_OPenColor,
- ns_color_to_nscss(colour),
+ ns_color_to_nscss(colr),
TAG_DONE);
} else {
- ULONG pen = ami_plot_obtain_pen(glob->shared_pens, colour);
+ ULONG pen = ami_plot_obtain_pen(glob->shared_pens, colr);
if(pen != -1) SetOPen(glob->rp, pen);
}
}
@@ -309,90 +259,41 @@ bool ami_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *style)
#endif
if (style->fill_type != PLOT_OP_TYPE_NONE) {
-
- if((nsoption_int(cairo_renderer) < 2) ||
- (palette_mapped == true))
- {
- ami_plot_setapen(style->fill_colour);
- RectFill(glob->rp, x0, y0, x1-1, y1-1);
- }
- else
- {
-#ifdef NS_AMIGA_CAIRO
- ami_cairo_set_colour(glob->cr, style->fill_colour);
- ami_cairo_set_solid(glob->cr);
-
- cairo_set_line_width(glob->cr, 0);
- cairo_rectangle(glob->cr, x0, y0, x1 - x0, y1 - y0);
- cairo_fill(glob->cr);
- cairo_stroke(glob->cr);
-#endif
- }
+ ami_plot_setapen(style->fill_colour);
+ RectFill(glob->rp, x0, y0, x1-1, y1-1);
}
if (style->stroke_type != PLOT_OP_TYPE_NONE) {
- if((nsoption_int(cairo_renderer) < 2) ||
- (palette_mapped == true))
- {
- glob->rp->PenWidth = style->stroke_width;
- glob->rp->PenHeight = style->stroke_width;
-
- switch (style->stroke_type) {
- case PLOT_OP_TYPE_SOLID: /**< Solid colour */
- default:
- glob->rp->LinePtrn = PATT_LINE;
- break;
-
- case PLOT_OP_TYPE_DOT: /**< Dotted plot */
- glob->rp->LinePtrn = PATT_DOT;
- break;
-
- case PLOT_OP_TYPE_DASH: /**< dashed plot */
- glob->rp->LinePtrn = PATT_DASH;
- break;
- }
-
- ami_plot_setapen(style->stroke_colour);
- Move(glob->rp, x0,y0);
- Draw(glob->rp, x1, y0);
- Draw(glob->rp, x1, y1);
- Draw(glob->rp, x0, y1);
- Draw(glob->rp, x0, y0);
-
- glob->rp->PenWidth = 1;
- glob->rp->PenHeight = 1;
- glob->rp->LinePtrn = PATT_LINE;
- }
- else
- {
-#ifdef NS_AMIGA_CAIRO
- ami_cairo_set_colour(glob->cr, style->stroke_colour);
-
- switch (style->stroke_type) {
- case PLOT_OP_TYPE_SOLID: /**< Solid colour */
- default:
- ami_cairo_set_solid(glob->cr);
- break;
-
- case PLOT_OP_TYPE_DOT: /**< Doted plot */
- ami_cairo_set_dotted(glob->cr);
- break;
-
- case PLOT_OP_TYPE_DASH: /**< dashed plot */
- ami_cairo_set_dashed(glob->cr);
- break;
- }
+ glob->rp->PenWidth = style->stroke_width;
+ glob->rp->PenHeight = style->stroke_width;
- if (style->stroke_width == 0)
- cairo_set_line_width(glob->cr, 1);
- else
- cairo_set_line_width(glob->cr, style->stroke_width);
+ switch (style->stroke_type) {
+ case PLOT_OP_TYPE_SOLID: /**< Solid colour */
+ default:
+ glob->rp->LinePtrn = PATT_LINE;
+ break;
- cairo_rectangle(glob->cr, x0, y0, x1 - x0, y1 - y0);
- cairo_stroke(glob->cr);
-#endif
- }
+ case PLOT_OP_TYPE_DOT: /**< Dotted plot */
+ glob->rp->LinePtrn = PATT_DOT;
+ break;
+
+ case PLOT_OP_TYPE_DASH: /**< dashed plot */
+ glob->rp->LinePtrn = PATT_DASH;
+ break;
+ }
+
+ ami_plot_setapen(style->stroke_colour);
+ Move(glob->rp, x0,y0);
+ Draw(glob->rp, x1, y0);
+ Draw(glob->rp, x1, y1);
+ Draw(glob->rp, x0, y1);
+ Draw(glob->rp, x0, y0);
+
+ glob->rp->PenWidth = 1;
+ glob->rp->PenHeight = 1;
+ glob->rp->LinePtrn = PATT_LINE;
}
+
return true;
}
@@ -402,12 +303,10 @@ bool ami_line(int x0, int y0, int x1, int y1, const plot_style_t *style)
LOG(("[ami_plotter] Entered ami_line()"));
#endif
- if((nsoption_int(cairo_renderer) < 2) || (palette_mapped == true))
- {
- glob->rp->PenWidth = style->stroke_width;
- glob->rp->PenHeight = style->stroke_width;
+ glob->rp->PenWidth = style->stroke_width;
+ glob->rp->PenHeight = style->stroke_width;
- switch (style->stroke_type) {
+ switch (style->stroke_type) {
case PLOT_OP_TYPE_SOLID: /**< Solid colour */
default:
glob->rp->LinePtrn = PATT_LINE;
@@ -420,50 +319,16 @@ bool ami_line(int x0, int y0, int x1, int y1, const plot_style_t *style)
case PLOT_OP_TYPE_DASH: /**< dashed plot */
glob->rp->LinePtrn = PATT_DASH;
break;
- }
-
- ami_plot_setapen(style->stroke_colour);
- Move(glob->rp,x0,y0);
- Draw(glob->rp,x1,y1);
-
- glob->rp->PenWidth = 1;
- glob->rp->PenHeight = 1;
- glob->rp->LinePtrn = PATT_LINE;
}
- else
- {
-#ifdef NS_AMIGA_CAIRO
- ami_cairo_set_colour(glob->cr, style->stroke_colour);
-
- switch (style->stroke_type) {
- case PLOT_OP_TYPE_SOLID: /**< Solid colour */
- default:
- ami_cairo_set_solid(glob->cr);
- break;
- case PLOT_OP_TYPE_DOT: /**< Doted plot */
- ami_cairo_set_dotted(glob->cr);
- break;
+ ami_plot_setapen(style->stroke_colour);
+ Move(glob->rp,x0,y0);
+ Draw(glob->rp,x1,y1);
- case PLOT_OP_TYPE_DASH: /**< dashed plot */
- ami_cairo_set_dashed(glob->cr);
- break;
- }
+ glob->rp->PenWidth = 1;
+ glob->rp->PenHeight = 1;
+ glob->rp->LinePtrn = PATT_LINE;
- if (style->stroke_width == 0)
- cairo_set_line_width(glob->cr, 1);
- else
- cairo_set_line_width(glob->cr, style->stroke_width);
-
- /* core expects horizontal and vertical lines to be on pixels, not
- * between pixels */
- cairo_move_to(glob->cr, (x0 == x1) ? x0 + 0.5 : x0,
- (y0 == y1) ? y0 + 0.5 : y0);
- cairo_line_to(glob->cr, (x0 == x1) ? x1 + 0.5 : x1,
- (y0 == y1) ? y1 + 0.5 : y1);
- cairo_stroke(glob->cr);
-#endif
- }
return true;
}
@@ -473,41 +338,21 @@ bool ami_polygon(const int *p, unsigned int n, const plot_style_t *style)
LOG(("[ami_plotter] Entered ami_polygon()"));
#endif
- int k;
+ ULONG cx,cy;
- if((nsoption_int(cairo_renderer) < 1) || (palette_mapped == true))
- {
- ULONG cx,cy;
+ ami_plot_setapen(style->fill_colour);
- ami_plot_setapen(style->fill_colour);
-
- if(AreaMove(glob->rp,p[0],p[1]) == -1)
- LOG(("AreaMove: vector list full"));
+ if(AreaMove(glob->rp,p[0],p[1]) == -1)
+ LOG(("AreaMove: vector list full"));
- for(k=1;k<n;k++)
- {
- if(AreaDraw(glob->rp,p[k*2],p[(k*2)+1]) == -1)
- LOG(("AreaDraw: vector list full"));
- }
-
- if(AreaEnd(glob->rp) == -1)
- LOG(("AreaEnd: error"));
- }
- else
- {
-#ifdef NS_AMIGA_CAIRO
- ami_cairo_set_colour(glob->cr, style->fill_colour);
- ami_cairo_set_solid(glob->cr);
-
- cairo_set_line_width(glob->cr, 0);
- cairo_move_to(glob->cr, p[0], p[1]);
- for (k = 1; k != n; k++) {
- cairo_line_to(glob->cr, p[k * 2], p[k * 2 + 1]);
- }
- cairo_fill(glob->cr);
- cairo_stroke(glob->cr);
-#endif
+ for(int k = 1; k < n; k++) {
+ if(AreaDraw(glob->rp,p[k*2],p[(k*2)+1]) == -1)
+ LOG(("AreaDraw: vector list full"));
}
+
+ if(AreaEnd(glob->rp) == -1)
+ LOG(("AreaEnd: error"));
+
return true;
}
@@ -536,16 +381,6 @@ bool ami_clip(const struct rect *clip)
if(reg) DisposeRegion(reg);
}
-#ifdef NS_AMIGA_CAIRO
- if((nsoption_int(cairo_renderer) == 2) && (palette_mapped == false))
- {
- cairo_reset_clip(glob->cr);
- cairo_rectangle(glob->cr, clip->x0, clip->y0,
- clip->x1 - clip->x0, clip->y1 - clip->y0);
- cairo_clip(glob->cr);
- }
-#endif
-
return true;
}
@@ -573,43 +408,17 @@ bool ami_disc(int x, int y, int radius, const plot_style_t *style)
LOG(("[ami_plotter] Entered ami_disc()"));
#endif
- if((nsoption_int(cairo_renderer) < 2) || (palette_mapped == true))
- {
- if (style->fill_type != PLOT_OP_TYPE_NONE) {
- ami_plot_setapen(style->fill_colour);
- AreaCircle(glob->rp,x,y,radius);
- AreaEnd(glob->rp);
- }
-
- if (style->stroke_type != PLOT_OP_TYPE_NONE) {
- ami_plot_setapen(style->stroke_colour);
- DrawEllipse(glob->rp,x,y,radius,radius);
- }
+ if (style->fill_type != PLOT_OP_TYPE_NONE) {
+ ami_plot_setapen(style->fill_colour);
+ AreaCircle(glob->rp,x,y,radius);
+ AreaEnd(glob->rp);
}
- else
- {
-#ifdef NS_AMIGA_CAIRO
- if (style->fill_type != PLOT_OP_TYPE_NONE) {
- ami_cairo_set_colour(glob->cr, style->fill_colour);
- ami_cairo_set_solid(glob->cr);
- cairo_set_line_width(glob->cr, 0);
-
- cairo_arc(glob->cr, x, y, radius, 0, M_PI * 2);
- cairo_fill(glob->cr);
- cairo_stroke(glob->cr);
- }
-
- if (style->stroke_type != PLOT_OP_TYPE_NONE) {
- ami_cairo_set_colour(glob->cr, style->stroke_colour);
- ami_cairo_set_solid(glob->cr);
-
- cairo_set_line_width(glob->cr, 1);
- cairo_arc(glob->cr, x, y, radius, 0, M_PI * 2);
- cairo_stroke(glob->cr);
- }
-#endif
+ if (style->stroke_type != PLOT_OP_TYPE_NONE) {
+ ami_plot_setapen(style->stroke_colour);
+ DrawEllipse(glob->rp,x,y,radius,radius);
}
+
return true;
}
@@ -644,25 +453,10 @@ bool ami_arc(int x, int y, int radius, int angle1, int angle2, const plot_style_
LOG(("[ami_plotter] Entered ami_arc()"));
#endif
- if((nsoption_int(cairo_renderer) <= 0) || (palette_mapped == true)) {
-
- if (angle2 < angle1) angle2 += 360;
-
- ami_plot_setapen(style->fill_colour);
+ if (angle2 < angle1) angle2 += 360;
- ami_arc_gfxlib(x, y, radius, angle1, angle2);
- } else {
-#ifdef NS_AMIGA_CAIRO
- ami_cairo_set_colour(glob->cr, style->fill_colour);
- ami_cairo_set_solid(glob->cr);
-
- cairo_set_line_width(glob->cr, 1);
- cairo_arc(glob->cr, x, y, radius,
- (angle1 + 90) * (M_PI / 180),
- (angle2 + 90) * (M_PI / 180));
- cairo_stroke(glob->cr);
-#endif
- }
+ ami_plot_setapen(style->fill_colour);
+ ami_arc_gfxlib(x, y, radius, angle1, angle2);
return true;
}
@@ -711,6 +505,7 @@ static bool ami_bitmap(int x, int y, int width, int height, struct bitmap *bitma
COMPTAG_SrcHeight,height,
COMPTAG_OffsetX,x,
COMPTAG_OffsetY,y,
+ COMPTAG_FriendBitMap, scrn->RastPort.BitMap,
TAG_DONE);
#endif
}
@@ -873,6 +668,7 @@ static void ami_bitmap_tile_hook(struct Hook *hook,struct RastPort *rp,struct Ba
COMPTAG_SrcHeight,bfbm->height,
COMPTAG_OffsetX,xf,
COMPTAG_OffsetY,yf,
+ COMPTAG_FriendBitMap, scrn->RastPort.BitMap,
TAG_DONE);
#endif
}
@@ -943,7 +739,6 @@ bool ami_path(const float *p, unsigned int n, colour fill, float width,
colour c, const float transform[6])
{
unsigned int i;
- struct bez_point *old_p;
struct bez_point start_p, cur_p, p_a, p_b, p_c, p_r;
#ifdef AMI_PLOTTER_DEBUG
@@ -958,153 +753,83 @@ bool ami_path(const float *p, unsigned int n, colour fill, float width,
return false;
}
- if((nsoption_int(cairo_renderer) >= 1) && (palette_mapped == false))
- {
-#ifdef NS_AMIGA_CAIRO
- cairo_matrix_t old_ctm, n_ctm;
-
- /* Save CTM */
- cairo_get_matrix(glob->cr, &old_ctm);
-
- /* Set up line style and width */
- cairo_set_line_width(glob->cr, 1);
- ami_cairo_set_solid(glob->cr);
-
- /* Load new CTM */
- n_ctm.xx = transform[0];
- n_ctm.yx = transform[1];
- n_ctm.xy = transform[2];
- n_ctm.yy = transform[3];
- n_ctm.x0 = transform[4];
- n_ctm.y0 = transform[5];
-
- cairo_set_matrix(glob->cr, &n_ctm);
-
- /* Construct path */
- for (i = 0; i < n; ) {
- if (p[i] == PLOTTER_PATH_MOVE) {
- cairo_move_to(glob->cr, p[i+1], p[i+2]);
- i += 3;
- } else if (p[i] == PLOTTER_PATH_CLOSE) {
- cairo_close_path(glob->cr);
- i++;
- } else if (p[i] == PLOTTER_PATH_LINE) {
- cairo_line_to(glob->cr, p[i+1], p[i+2]);
- i += 3;
- } else if (p[i] == PLOTTER_PATH_BEZIER) {
- cairo_curve_to(glob->cr, p[i+1], p[i+2],
- p[i+3], p[i+4],
- p[i+5], p[i+6]);
- i += 7;
- } else {
- LOG(("bad path command %f", p[i]));
- /* Reset matrix for safety */
- cairo_set_matrix(glob->cr, &old_ctm);
- return false;
- }
+ if (fill != NS_TRANSPARENT) {
+ ami_plot_setapen(fill);
+ if (c != NS_TRANSPARENT)
+ ami_plot_setopen(c);
+ } else {
+ if (c != NS_TRANSPARENT) {
+ ami_plot_setapen(c);
+ } else {
+ return true; /* wholly transparent */
}
+ }
- /* Restore original CTM */
- cairo_set_matrix(glob->cr, &old_ctm);
-
- /* Now draw path */
- if (fill != NS_TRANSPARENT) {
- ami_cairo_set_colour(glob->cr,fill);
-
- if (c != NS_TRANSPARENT) {
- /* Fill & Stroke */
- cairo_fill_preserve(glob->cr);
- ami_cairo_set_colour(glob->cr,c);
- cairo_stroke(glob->cr);
+ /* Construct path */
+ for (i = 0; i < n; ) {
+ if (p[i] == PLOTTER_PATH_MOVE) {
+ if (fill != NS_TRANSPARENT) {
+ if(AreaMove(glob->rp, p[i+1], p[i+2]) == -1)
+ LOG(("AreaMove: vector list full"));
} else {
- /* Fill only */
- cairo_fill(glob->cr);
+ Move(glob->rp, p[i+1], p[i+2]);
}
- } else if (c != NS_TRANSPARENT) {
- /* Stroke only */
- ami_cairo_set_colour(glob->cr,c);
- cairo_stroke(glob->cr);
- }
-#endif
- } else {
- if (fill != NS_TRANSPARENT) {
- ami_plot_setapen(fill);
- if (c != NS_TRANSPARENT)
- ami_plot_setopen(c);
- } else {
- if (c != NS_TRANSPARENT) {
- ami_plot_setapen(c);
+ /* Keep track for future Bezier curves/closes etc */
+ start_p.x = p[i+1];
+ start_p.y = p[i+2];
+ cur_p.x = start_p.x;
+ cur_p.y = start_p.y;
+ i += 3;
+ } else if (p[i] == PLOTTER_PATH_CLOSE) {
+ if (fill != NS_TRANSPARENT) {
+ if(AreaEnd(glob->rp) == -1)
+ LOG(("AreaEnd: error"));
} else {
- return true; /* wholly transparent */
+ Draw(glob->rp, start_p.x, start_p.y);
}
- }
-
- /* Construct path */
- for (i = 0; i < n; ) {
- if (p[i] == PLOTTER_PATH_MOVE) {
- if (fill != NS_TRANSPARENT) {
- if(AreaMove(glob->rp, p[i+1], p[i+2]) == -1)
- LOG(("AreaMove: vector list full"));
- } else {
- Move(glob->rp, p[i+1], p[i+2]);
- }
- /* Keep track for future Bezier curves/closes etc */
- start_p.x = p[i+1];
- start_p.y = p[i+2];
- cur_p.x = start_p.x;
- cur_p.y = start_p.y;
- i += 3;
- } else if (p[i] == PLOTTER_PATH_CLOSE) {
- if (fill != NS_TRANSPARENT) {
- if(AreaEnd(glob->rp) == -1)
- LOG(("AreaEnd: error"));
- } else {
- Draw(glob->rp, start_p.x, start_p.y);
- }
- i++;
- } else if (p[i] == PLOTTER_PATH_LINE) {
+ i++;
+ } else if (p[i] == PLOTTER_PATH_LINE) {
+ if (fill != NS_TRANSPARENT) {
+ if(AreaDraw(glob->rp, p[i+1], p[i+2]) == -1)
+ LOG(("AreaDraw: vector list full"));
+ } else {
+ Draw(glob->rp, p[i+1], p[i+2]);
+ }
+ cur_p.x = p[i+1];
+ cur_p.y = p[i+2];
+ i += 3;
+ } else if (p[i] == PLOTTER_PATH_BEZIER) {
+ p_a.x = p[i+1];
+ p_a.y = p[i+2];
+ p_b.x = p[i+3];
+ p_b.y = p[i+4];
+ p_c.x = p[i+5];
+ p_c.y = p[i+6];
+
+ for(double t = 0.0; t <= 1.0; t += 0.1) {
+ ami_bezier(&cur_p, &p_a, &p_b, &p_c, t, &p_r);
if (fill != NS_TRANSPARENT) {
- if(AreaDraw(glob->rp, p[i+1], p[i+2]) == -1)
+ if(AreaDraw(glob->rp, p_r.x, p_r.y) == -1)
LOG(("AreaDraw: vector list full"));
} else {
- Draw(glob->rp, p[i+1], p[i+2]);
- }
- cur_p.x = p[i+1];
- cur_p.y = p[i+2];
- i += 3;
- } else if (p[i] == PLOTTER_PATH_BEZIER) {
- p_a.x = p[i+1];
- p_a.y = p[i+2];
- p_b.x = p[i+3];
- p_b.y = p[i+4];
- p_c.x = p[i+5];
- p_c.y = p[i+6];
-
- for(double t = 0.0; t <= 1.0; t += 0.1) {
- ami_bezier(&cur_p, &p_a, &p_b, &p_c, t, &p_r);
- if (fill != NS_TRANSPARENT) {
- if(AreaDraw(glob->rp, p_r.x, p_r.y) == -1)
- LOG(("AreaDraw: vector list full"));
- } else {
- Draw(glob->rp, p_r.x, p_r.y);
- }
- }
- cur_p.x = p_c.x;
- cur_p.y = p_c.y;
- i += 7;
- } else {
- LOG(("bad path command %f", p[i]));
- /* End path for safety if using Area commands */
- if (fill != NS_TRANSPARENT) {
- AreaEnd(glob->rp);
- BNDRYOFF(glob->rp);
+ Draw(glob->rp, p_r.x, p_r.y);
}
- return false;
}
+ cur_p.x = p_c.x;
+ cur_p.y = p_c.y;
+ i += 7;
+ } else {
+ LOG(("bad path command %f", p[i]));
+ /* End path for safety if using Area commands */
+ if (fill != NS_TRANSPARENT) {
+ AreaEnd(glob->rp);
+ BNDRYOFF(glob->rp);
+ }
+ return false;
}
- if (fill != NS_TRANSPARENT)
- BNDRYOFF(glob->rp);
}
+ if (fill != NS_TRANSPARENT)
+ BNDRYOFF(glob->rp);
return true;
}
@@ -1113,3 +838,4 @@ bool ami_plot_screen_is_palettemapped(void)
{
return palette_mapped;
}
+
diff --git a/amiga/plotters.h b/amiga/plotters.h
index db767b60a..501698a41 100755
--- a/amiga/plotters.h
+++ b/amiga/plotters.h
@@ -21,9 +21,6 @@
#include "desktop/plotters.h"
#include <proto/layers.h>
#include <proto/graphics.h>
-#ifdef NS_AMIGA_CAIRO
-#include <cairo/cairo.h>
-#endif
struct gui_globals
{
@@ -34,10 +31,6 @@ struct gui_globals
APTR tmprasbuf;
struct Rectangle rect;
struct MinList *shared_pens;
-#ifdef NS_AMIGA_CAIRO
- cairo_surface_t *surface;
- cairo_t *cr;
-#endif
};
extern const struct plotter_table amiplot;
diff --git a/amiga/plugin_hack.c b/amiga/plugin_hack.c
index f78a67e2d..9bfd7a3d3 100644
--- a/amiga/plugin_hack.c
+++ b/amiga/plugin_hack.c
@@ -132,7 +132,7 @@ void amiga_plugin_hack_destroy(struct content *c)
{
amiga_plugin_hack_content *plugin = (amiga_plugin_hack_content *) c;
- LOG(("amiga_plugin_hack_destroy"));
+ LOG(("amiga_plugin_hack_destroy %p", plugin));
return;
}
diff --git a/amiga/plugin_hack.h b/amiga/plugin_hack.h
index ae79a1f91..3d644ae8b 100644
--- a/amiga/plugin_hack.h
+++ b/amiga/plugin_hack.h
@@ -22,8 +22,6 @@
#include "utils/config.h"
#include "utils/errors.h"
-struct hlcache_handle;
-
nserror amiga_plugin_hack_init(void);
void amiga_plugin_hack_execute(struct hlcache_handle *c);
diff --git a/amiga/print.c b/amiga/print.c
index 4bfce139b..66e5a558c 100644
--- a/amiga/print.c
+++ b/amiga/print.c
@@ -375,10 +375,11 @@ BOOL ami_print_event(struct ami_print_window *pw)
void ami_print(struct hlcache_handle *c, int copies)
{
- double height, print_height;
+ double height;
float scale = nsoption_int(print_scale) / 100.0;
- if(!ami_print_info.msgport) return;
+ if(ami_print_info.msgport == NULL)
+ ami_print_init();
if(!(ami_print_info.PReq =
(struct IODRPTagsReq *)AllocSysObjectTags(ASOT_IOREQUEST,
@@ -450,7 +451,8 @@ struct MsgPort *ami_print_init(void)
void ami_print_free(void)
{
- FreeSysObject(ASOT_PORT,ami_print_info.msgport);
+ FreeSysObject(ASOT_PORT, ami_print_info.msgport);
+ ami_print_info.msgport = NULL;
}
struct MsgPort *ami_print_get_msgport(void)
@@ -491,6 +493,7 @@ void ami_print_end(void)
glob = &browserglob;
ami_print_close_device();
+ ami_print_free();
}
void ami_print_close_device(void)
diff --git a/amiga/resources/Resource.map b/amiga/resources/Resource.map
index 745df4622..dbe02a4bc 100644
--- a/amiga/resources/Resource.map
+++ b/amiga/resources/Resource.map
@@ -1,2 +1,4 @@
# Resource.map
favicon.ico:favicon.png
+default.ico:icons/search.png
+
diff --git a/amiga/resources/Themes/AISS/Resource.map b/amiga/resources/Themes/AISS/Resource.map
index 64ff81699..4fe374aa2 100644
--- a/amiga/resources/Themes/AISS/Resource.map
+++ b/amiga/resources/Themes/AISS/Resource.map
@@ -1,5 +1,6 @@
# Resource.map
favicon.ico:TBimages:list_file
+default.ico:TBimages:list_search
icons/arrow-l.png:TBimages:list_mailreplied
icons/search.png:TBimages:list_search
icons/directory.png:TBimages:list_drawer
diff --git a/amiga/schedule.c b/amiga/schedule.c
index d4b35a509..6222917cf 100755
--- a/amiga/schedule.c
+++ b/amiga/schedule.c
@@ -16,9 +16,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "utils/schedule.h"
#include "amiga/os3support.h"
-#include "amiga/schedule.h"
#include <proto/exec.h>
#include <proto/timer.h>
@@ -27,6 +25,10 @@
#include <stdbool.h>
#include <pbl.h>
+#include "utils/errors.h"
+
+#include "amiga/schedule.h"
+
struct nscallback
{
struct TimeVal tv;
@@ -37,31 +39,41 @@ struct nscallback
PblHeap *schedule_list;
-void ami_remove_timer_event(struct nscallback *nscb);
-
/**
- * Schedule a callback.
+ * Remove timer event
*
- * \param t interval before the callback should be made / cs
- * \param callback callback function
- * \param p user parameter, passed to callback function
+ * \param nscb callback
*
- * The callback function will be called as soon as possible after t cs have
- * passed.
+ * The timer event for the callback is aborted
*/
-void schedule(int t, void (*callback)(void *p), void *p)
+static void ami_schedule_remove_timer_event(struct nscallback *nscb)
{
- struct nscallback *nscb;
- struct TimeVal tv;
- ULONG time_us = 0;
+ if(!nscb) return;
- if(schedule_list == NULL) return;
+ if(nscb->treq)
+ {
+ if(CheckIO((struct IORequest *)nscb->treq)==NULL)
+ AbortIO((struct IORequest *)nscb->treq);
- nscb = AllocVecTagList(sizeof(struct nscallback), NULL);
- if(!nscb) return;
+ WaitIO((struct IORequest *)nscb->treq);
+ FreeVec(nscb->treq);
+ }
+}
+
+/**
+ * Add timer event
+ *
+ * \param nscb callback
+ * \param t time in ms
+ *
+ * NetSurf will be signalled in t ms for this event.
+ */
- time_us = t*10000; /* t converted to µs */
+static nserror ami_schedule_add_timer_event(struct nscallback *nscb, int t)
+{
+ struct TimeVal tv;
+ ULONG time_us = t * 1000; /* t converted to µs */
nscb->tv.Seconds = time_us / 1000000;
nscb->tv.Microseconds = time_us % 1000000;
@@ -69,58 +81,100 @@ void schedule(int t, void (*callback)(void *p), void *p)
GetSysTime(&tv);
AddTime(&nscb->tv,&tv); // now contains time when event occurs
- if(nscb->treq = AllocVecTagList(sizeof(struct TimeRequest), NULL))
- {
+ if(nscb->treq = AllocVecTagList(sizeof(struct TimeRequest), NULL)) {
*nscb->treq = *tioreq;
- nscb->treq->Request.io_Command=TR_ADDREQUEST;
- nscb->treq->Time.Seconds=nscb->tv.Seconds; // secs
- nscb->treq->Time.Microseconds=nscb->tv.Microseconds; // micro
- SendIO((struct IORequest *)nscb->treq);
+ nscb->treq->Request.io_Command=TR_ADDREQUEST;
+ nscb->treq->Time.Seconds=nscb->tv.Seconds; // secs
+ nscb->treq->Time.Microseconds=nscb->tv.Microseconds; // micro
+ SendIO((struct IORequest *)nscb->treq);
+ } else {
+ return NSERROR_NOMEM;
}
- nscb->callback = callback;
- nscb->p = p;
-
- pblHeapInsert(schedule_list, nscb);
+ return NSERROR_OK;
}
/**
- * Unschedule a callback.
+ * Locate a scheduled callback
*
* \param callback callback function
* \param p user parameter, passed to callback function
+ * \param remove remove callback from the heap
*
- * All scheduled callbacks matching both callback and p are removed.
+ * A scheduled callback matching both callback and p is returned, or NULL if none present.
*/
-void schedule_remove(void (*callback)(void *p), void *p)
+static struct nscallback *ami_schedule_locate(void (*callback)(void *p), void *p, bool remove)
{
PblIterator *iterator;
struct nscallback *nscb;
- bool restoreheap = false;
+ bool found_cb = false;
- if(schedule_list == NULL) return;
- if(pblHeapIsEmpty(schedule_list)) return;
+ /* check there is something on the list */
+ if (schedule_list == NULL) return NULL;
+ if(pblHeapIsEmpty(schedule_list)) return NULL;
iterator = pblHeapIterator(schedule_list);
- while ((nscb = pblIteratorNext(iterator)) != -1)
- {
- if((nscb->callback == callback) && (nscb->p == p))
- {
- ami_remove_timer_event(nscb);
- pblIteratorRemove(iterator);
- FreeVec(nscb);
- restoreheap = true;
+ while ((nscb = pblIteratorNext(iterator)) != -1) {
+ if ((nscb->callback == callback) && (nscb->p == p)) {
+ if (remove == true) pblIteratorRemove(iterator);
+ found_cb = true;
+ break;
}
};
pblIteratorFree(iterator);
- if(restoreheap) pblHeapConstruct(schedule_list);
+ if (found_cb == true) return nscb;
+ else return NULL;
+}
+
+/**
+ * Reschedule a callback.
+ *
+ * \param nscb callback
+ * \param t time in ms
+ *
+ * The nscallback will be rescheduled for t ms.
+ */
+
+static nserror ami_schedule_reschedule(struct nscallback *nscb, int t)
+{
+ ami_schedule_remove_timer_event(nscb);
+ if (ami_schedule_add_timer_event(nscb, t) != NSERROR_OK)
+ return NSERROR_NOMEM;
+
+ pblHeapConstruct(schedule_list);
+ return NSERROR_OK;
}
-void schedule_remove_all(void)
+/**
+ * Unschedule a callback.
+ *
+ * \param callback callback function
+ * \param p user parameter, passed to callback function
+ *
+ * All scheduled callbacks matching both callback and p are removed.
+ */
+
+static nserror schedule_remove(void (*callback)(void *p), void *p)
+{
+ PblIterator *iterator;
+ struct nscallback *nscb;
+
+ nscb = ami_schedule_locate(callback, p, true);
+
+ if(nscb != NULL) {
+ ami_schedule_remove_timer_event(nscb);
+ FreeVec(nscb);
+ pblHeapConstruct(schedule_list);
+ }
+
+ return NSERROR_OK;
+}
+
+static void schedule_remove_all(void)
{
PblIterator *iterator;
struct nscallback *nscb;
@@ -131,7 +185,7 @@ void schedule_remove_all(void)
while ((nscb = pblIteratorNext(iterator)) != -1)
{
- ami_remove_timer_event(nscb);
+ ami_schedule_remove_timer_event(nscb);
pblIteratorRemove(iterator);
FreeVec(nscb);
};
@@ -139,13 +193,16 @@ void schedule_remove_all(void)
pblIteratorFree(iterator);
}
-/**
- * Process events up to current time.
- * This implementation only takes the top entry off the heap, it does not
- * venture to later scheduled events until the next time it is called -
- * immediately afterwards, if we're in a timer signalled loop.
- */
+static int ami_schedule_compare(const void *prev, const void *next)
+{
+ struct nscallback *nscb1 = *(struct nscallback **)prev;
+ struct nscallback *nscb2 = *(struct nscallback **)next;
+
+ return CmpTime(&nscb1->tv, &nscb2->tv);
+}
+
+/* exported function documented in amiga/schedule.h */
void schedule_run(BOOL poll)
{
struct nscallback *nscb;
@@ -170,34 +227,13 @@ void schedule_run(BOOL poll)
callback = nscb->callback;
p = nscb->p;
- ami_remove_timer_event(nscb);
+ ami_schedule_remove_timer_event(nscb);
pblHeapRemoveFirst(schedule_list);
FreeVec(nscb);
callback(p);
}
-void ami_remove_timer_event(struct nscallback *nscb)
-{
- if(!nscb) return;
-
- if(nscb->treq)
- {
- if(CheckIO((struct IORequest *)nscb->treq)==NULL)
- AbortIO((struct IORequest *)nscb->treq);
-
- WaitIO((struct IORequest *)nscb->treq);
- FreeVec(nscb->treq);
- }
-}
-
-int ami_schedule_compare(const void *prev, const void *next)
-{
- struct nscallback *nscb1 = *(struct nscallback **)prev;
- struct nscallback *nscb2 = *(struct nscallback **)next;
-
- return CmpTime(&nscb1->tv, &nscb2->tv);
-}
-
+/* exported function documented in amiga/schedule.h */
BOOL ami_schedule_create(void)
{
schedule_list = pblHeapNew();
@@ -206,6 +242,7 @@ BOOL ami_schedule_create(void)
pblHeapSetCompareFunction(schedule_list, ami_schedule_compare);
}
+/* exported function documented in amiga/schedule.h */
void ami_schedule_free(void)
{
schedule_remove_all();
@@ -213,6 +250,7 @@ void ami_schedule_free(void)
schedule_list = NULL;
}
+/* exported function documented in amiga/schedule.h */
void ami_schedule_open_timer(void)
{
msgport = AllocSysObjectTags(ASOT_PORT,
@@ -231,14 +269,38 @@ void ami_schedule_open_timer(void)
ITimer = (struct TimerIFace *)GetInterface((struct Library *)TimerBase,"main",1,NULL);
}
+/* exported function documented in amiga/schedule.h */
void ami_schedule_close_timer(void)
{
- if(ITimer)
- {
- DropInterface((struct Interface *)ITimer);
- }
-
+ if(ITimer) DropInterface((struct Interface *)ITimer);
CloseDevice((struct IORequest *) tioreq);
FreeSysObject(ASOT_IOREQUEST,tioreq);
FreeSysObject(ASOT_PORT,msgport);
}
+
+/* exported function documented in amiga/schedule.h */
+nserror ami_schedule(int t, void (*callback)(void *p), void *p)
+{
+ struct nscallback *nscb;
+
+ if(schedule_list == NULL) return NSERROR_INIT_FAILED;
+ if (t < 0) return schedule_remove(callback, p);
+
+ if (nscb = ami_schedule_locate(callback, p, false)) {
+ return ami_schedule_reschedule(nscb, t);
+ }
+
+ nscb = AllocVecTagList(sizeof(struct nscallback), NULL);
+ if(!nscb) return NSERROR_NOMEM;
+
+ if (ami_schedule_add_timer_event(nscb, t) != NSERROR_OK)
+ return NSERROR_NOMEM;
+
+ nscb->callback = callback;
+ nscb->p = p;
+
+ pblHeapInsert(schedule_list, nscb);
+
+ return NSERROR_OK;
+}
+
diff --git a/amiga/schedule.h b/amiga/schedule.h
index 3eddc8913..659230627 100755
--- a/amiga/schedule.h
+++ b/amiga/schedule.h
@@ -19,7 +19,6 @@
#ifndef AMIGA_SCHEDULE_H
#define AMIGA_SCHEDULE_H
#include <proto/timer.h>
-#include "utils/schedule.h"
#include "amiga/os3support.h"
struct Device *TimerBase;
@@ -28,9 +27,42 @@ struct TimerIFace *ITimer;
struct TimeRequest *tioreq;
struct MsgPort *msgport;
-void ami_schedule_open_timer(void);
-void ami_schedule_close_timer(void);
+/**
+ * Schedule a callback.
+ *
+ * \param t interval before the callback should be made / ms
+ * \param callback callback function
+ * \param p user parameter, passed to callback function
+ * \return NSERROR_OK on sucess or appropriate error on faliure
+ *
+ * The callback function will be called as soon as possible after t ms have
+ * passed.
+ */
+nserror ami_schedule(int t, void (*callback)(void *p), void *p);
+
+/**
+ * Initialise amiga scheduler
+ *
+ * /return true if initialised ok or false on error.
+ */
BOOL ami_schedule_create(void);
+
+/**
+ * Finalise amiga scheduler
+ *
+ */
void ami_schedule_free(void);
+
+/**
+ * Process events up to current time.
+ *
+ * This implementation only takes the top entry off the heap, it does not
+ * venture to later scheduled events until the next time it is called -
+ * immediately afterwards, if we're in a timer signalled loop.
+ */
void schedule_run(BOOL poll);
+
+void ami_schedule_open_timer(void);
+void ami_schedule_close_timer(void);
+
#endif
diff --git a/amiga/search.c b/amiga/search.c
index 17a2d453c..53754145a 100755
--- a/amiga/search.c
+++ b/amiga/search.c
@@ -69,14 +69,15 @@ static void ami_search_add_recent(const char *string, void *p);
static void ami_search_set_forward_state(bool active, void *p);
static void ami_search_set_back_state(bool active, void *p);
-static struct gui_search_callbacks ami_search_callbacks = {
- ami_search_set_forward_state,
- ami_search_set_back_state,
+static struct gui_search_table search_table = {
ami_search_set_status,
ami_search_set_hourglass,
- ami_search_add_recent
+ ami_search_add_recent,
+ ami_search_set_forward_state,
+ ami_search_set_back_state,
};
+struct gui_search_table *amiga_search_table = &search_table;
/**
* Change the displayed search status.
@@ -90,8 +91,6 @@ void ami_search_open(struct gui_window *gwin)
if(fwin)
{
browser_window_search_clear(fwin->gwin->shared->bw);
- ami_search_set_forward_state(true, NULL);
- ami_search_set_back_state(true, NULL);
fwin->gwin->shared->searchwin = NULL;
fwin->gwin = gwin;
gwin->shared->searchwin = fwin;
@@ -177,8 +176,6 @@ void ami_search_open(struct gui_window *gwin)
void ami_search_close(void)
{
browser_window_search_clear(fwin->gwin->shared->bw);
- ami_search_set_forward_state(true, NULL);
- ami_search_set_back_state(true, NULL);
fwin->gwin->shared->searchwin = NULL;
DisposeObject(fwin->objects[OID_MAIN]);
DelObject(fwin->node);
@@ -201,12 +198,7 @@ BOOL ami_search_event(void)
switch(result & WMHI_GADGETMASK)
{
case GID_SEARCHSTRING:
- browser_window_search_clear(
- fwin->gwin->shared->bw);
- ami_search_set_forward_state(
- true, NULL);
- ami_search_set_back_state(
- true, NULL);
+ browser_window_search_clear(fwin->gwin->shared->bw);
RefreshSetGadgetAttrs((struct Gadget *)fwin->objects[GID_PREV],
fwin->win, NULL,
@@ -226,7 +218,7 @@ BOOL ami_search_event(void)
ami_search_flags();
browser_window_search(
fwin->gwin->shared->bw,
- &ami_search_callbacks, NULL,
+ NULL,
flags, ami_search_string());
ActivateWindow(fwin->gwin->shared->win);
break;
@@ -237,7 +229,7 @@ BOOL ami_search_event(void)
ami_search_flags();
browser_window_search(
fwin->gwin->shared->bw,
- &ami_search_callbacks, NULL,
+ NULL,
flags, ami_search_string());
ActivateWindow(fwin->gwin->shared->win);
break;
diff --git a/amiga/search.h b/amiga/search.h
index fde730280..c4f30eb01 100755
--- a/amiga/search.h
+++ b/amiga/search.h
@@ -28,10 +28,10 @@ struct find_window {
struct gui_window *gwin;
};
+struct gui_search_table *amiga_search_table;
+
void ami_search_open(struct gui_window *gwin);
BOOL ami_search_event(void);
void ami_search_close(void);
-char *search_engines_file_location;
-char *search_default_ico_location;
#endif
diff --git a/amiga/sslcert.h b/amiga/sslcert.h
index e308f6231..953142e98 100644
--- a/amiga/sslcert.h
+++ b/amiga/sslcert.h
@@ -19,5 +19,10 @@
#ifndef AMIGA_SSLCERT_H
#define AMIGA_SSLCERT_H
+void gui_cert_verify(nsurl *url,
+ const struct ssl_cert_info *certs, unsigned long num,
+ nserror (*cb)(bool proceed, void *pw), void *cbpw);
+
void ami_ssl_free(struct treeview_window *twin);
+
#endif
diff --git a/amiga/stringview/stringview.c b/amiga/stringview/stringview.c
index 5aea939d5..9aa110a55 100755
--- a/amiga/stringview/stringview.c
+++ b/amiga/stringview/stringview.c
@@ -859,7 +859,6 @@ Class *MakeStringClass( void )
void FreeStringClass(Class *cl)
{
- struct Library *libbase;
URLHistory_Free();
FreeClass(cl);
}
diff --git a/amiga/theme.c b/amiga/theme.c
index 03ce01aeb..cc8b55d7f 100644
--- a/amiga/theme.c
+++ b/amiga/theme.c
@@ -36,11 +36,12 @@
#include "amiga/bitmap.h"
#include "amiga/drag.h"
-#include "desktop/browser_private.h"
-#include "utils/nsoption.h"
+#include "amiga/schedule.h"
#include "amiga/theme.h"
+#include "desktop/browser_private.h"
#include "desktop/searchweb.h"
#include "utils/messages.h"
+#include "utils/nsoption.h"
#include "utils/utils.h"
struct BitMap *throbber = NULL;
@@ -123,7 +124,6 @@ int osmouseptr[AMI_LASTPOINTER+1] = {
void ami_theme_init(void)
{
char themefile[1024];
- char searchico[1024];
BPTR lock = 0;
strcpy(themefile,nsoption_charp(theme));
@@ -148,21 +148,17 @@ void ami_theme_init(void)
UnLock(lock);
messages_load(themefile);
}
-
- ami_get_theme_filename(searchico, "theme_search", false);
- search_default_ico_location = (char *)strdup(searchico);
}
void ami_theme_throbber_setup(void)
{
char throbberfile[1024];
- Object *dto;
struct bitmap *bm;
ami_get_theme_filename(throbberfile,"theme_throbber",false);
throbber_frames=atoi(messages_get("theme_throbber_frames"));
throbber_update_interval = atoi(messages_get("theme_throbber_delay"));
- if(throbber_update_interval == 0) throbber_update_interval = 100;
+ if(throbber_update_interval == 0) throbber_update_interval = 250;
bm = ami_bitmap_from_datatype(throbberfile);
throbber = ami_bitmap_get_native(bm, bm->width, bm->height, NULL);
@@ -275,11 +271,6 @@ void ami_update_pointer(struct Window *win, gui_pointer_shape shape)
}
}
-void gui_window_hide_pointer(struct gui_window *g)
-{
- ami_set_pointer(g->shared, AMI_GUI_POINTER_BLANK, true);
-}
-
void ami_init_mouse_pointers(void)
{
if(LIB_IS_AT_LEAST((struct Library *)IntuitionBase, 53, 42)) return;
@@ -294,7 +285,7 @@ void ami_init_mouse_pointers(void)
for(i=0;i<=AMI_LASTPOINTER;i++)
{
- BPTR ptrfile = 0;
+ BPTR ptrfile;
mouseptrbm[i] = NULL;
mouseptrobj[i] = NULL;
char ptrfname[1024];
@@ -433,16 +424,8 @@ void gui_window_start_throbber(struct gui_window *g)
}
g->throbbing = true;
-
- if((cur_tab == g->tab) || (g->shared->tabs <= 1))
- {
- GetAttr(SPACE_AreaBox, g->shared->objects[GID_THROBBER],
- (ULONG *)&bbox);
-
- if(g->shared->throbber_frame == 0) g->shared->throbber_frame=1;
-
- BltBitMapRastPort(throbber,throbber_width,0,g->shared->win->RPort,bbox->Left,bbox->Top,throbber_width,throbber_height,0x0C0);
- }
+ if(g->shared->throbber_frame == 0) g->shared->throbber_frame = 1;
+ ami_throbber_redraw_schedule(throbber_update_interval, g);
}
void gui_window_stop_throbber(struct gui_window *g)
@@ -462,8 +445,6 @@ void gui_window_stop_throbber(struct gui_window *g)
g->shared->win, NULL);
}
- g->throbbing = false;
-
if((cur_tab == g->tab) || (g->shared->tabs <= 1))
{
GetAttr(SPACE_AreaBox, g->shared->objects[GID_THROBBER],
@@ -472,58 +453,58 @@ void gui_window_stop_throbber(struct gui_window *g)
BltBitMapRastPort(throbber, 0, 0, g->shared->win->RPort, bbox->Left,
bbox->Top, throbber_width, throbber_height, 0x0C0);
}
-// g->shared->throbber_frame = 0;
+
+ g->throbbing = false;
+ ami_throbber_redraw_schedule(-1, g);
}
-void ami_update_throbber(struct gui_window_2 *g,bool redraw)
+static void ami_throbber_update(void *p)
{
+ struct gui_window *g = (struct gui_window *)p;
struct IBox *bbox;
- int frame = g->throbber_frame;
+ int frame = 0;
+ ULONG cur_tab = 0;
if(!g) return;
- if(!g->objects[GID_THROBBER]) return;
+ if(!g->shared->objects[GID_THROBBER]) return;
- if(g->bw->window->throbbing == false)
- {
- frame = 0;
- g->throbber_frame=1;
+ if(g->throbbing == true) {
+ frame = g->shared->throbber_frame;
+ g->shared->throbber_frame++;
+ if(g->shared->throbber_frame > (throbber_frames-1))
+ g->shared->throbber_frame=1;
}
- else
- {
- if(!redraw)
- {
- if(g->throbber_update_count < throbber_update_interval)
- {
- g->throbber_update_count++;
- return;
- }
- g->throbber_update_count = 0;
+ if(g->tab_node && (g->shared->tabs > 1))
+ {
+ GetAttr(CLICKTAB_Current, g->shared->objects[GID_TABS],
+ (ULONG *)&cur_tab);
+ }
- g->throbber_frame++;
- if(g->throbber_frame > (throbber_frames-1))
- g->throbber_frame=1;
+ if((cur_tab == g->tab) || (g->shared->tabs <= 1))
+ {
+ GetAttr(SPACE_AreaBox, g->shared->objects[GID_THROBBER],
+ (ULONG *)&bbox);
- }
+ BltBitMapTags(BLITA_SrcX, throbber_width * frame,
+ BLITA_SrcY, 0,
+ BLITA_DestX, bbox->Left,
+ BLITA_DestY, bbox->Top,
+ BLITA_Width, throbber_width,
+ BLITA_Height, throbber_height,
+ BLITA_Source, throbber,
+ BLITA_Dest, g->shared->win->RPort,
+ BLITA_SrcType, BLITT_BITMAP,
+ BLITA_DestType, BLITT_RASTPORT,
+ // BLITA_UseSrcAlpha, TRUE,
+ TAG_DONE);
}
- GetAttr(SPACE_AreaBox,(Object *)g->objects[GID_THROBBER],(ULONG *)&bbox);
+ if(frame > 0) ami_throbber_redraw_schedule(throbber_update_interval, g);
+}
-/*
- EraseRect(g->win->RPort,bbox->Left,bbox->Top,
- bbox->Left+throbber_width,bbox->Top+throbber_height);
-*/
-
- BltBitMapTags(BLITA_SrcX, throbber_width * frame,
- BLITA_SrcY,0,
- BLITA_DestX,bbox->Left,
- BLITA_DestY,bbox->Top,
- BLITA_Width,throbber_width,
- BLITA_Height,throbber_height,
- BLITA_Source,throbber,
- BLITA_Dest,g->win->RPort,
- BLITA_SrcType,BLITT_BITMAP,
- BLITA_DestType,BLITT_RASTPORT,
-// BLITA_UseSrcAlpha,TRUE,
- TAG_DONE);
+void ami_throbber_redraw_schedule(int t, struct gui_window *g)
+{
+ ami_schedule(t, ami_throbber_update, g);
}
+
diff --git a/amiga/theme.h b/amiga/theme.h
index 3c3931c12..c1aca15d7 100644
--- a/amiga/theme.h
+++ b/amiga/theme.h
@@ -41,4 +41,11 @@ void ami_reset_pointer(struct gui_window_2 *gwin);
* and ALWAYS in preference to SetWindowPointer(), as it features more pointers and uses
* the correct ones specified in user preferences. */
void ami_update_pointer(struct Window *win, gui_pointer_shape shape);
+
+void gui_window_start_throbber(struct gui_window *g);
+void gui_window_stop_throbber(struct gui_window *g);
+void ami_throbber_redraw_schedule(int t, struct gui_window *g);
+
+void gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape);
#endif
+
diff --git a/amiga/thumbnail.c b/amiga/thumbnail.c
index 61102feff..9c149129d 100755
--- a/amiga/thumbnail.c
+++ b/amiga/thumbnail.c
@@ -69,7 +69,7 @@ bool thumbnail_create(hlcache_handle *content, struct bitmap *bitmap,
if(GfxBase->LibNode.lib_Version >= 53) // AutoDoc says v52, but this function isn't in OS4.0, so checking for v53 (OS4.1)
{
float resample_scale = bitmap->width / (float)plot_width;
- uint32 flags = COMPFLAG_IgnoreDestAlpha | COMPFLAG_SrcAlphaOverride;
+ uint32 flags = COMPFLAG_IgnoreDestAlpha;
if(nsoption_bool(scale_quality)) flags |= COMPFLAG_SrcFilter;
CompositeTags(COMPOSITE_Src,browserglob.bm,bitmap->nativebm,
@@ -84,6 +84,7 @@ bool thumbnail_create(hlcache_handle *content, struct bitmap *bitmap,
COMPTAG_DestHeight,bitmap->height,
COMPTAG_OffsetX,0,
COMPTAG_OffsetY,0,
+ COMPTAG_FriendBitMap, scrn->RastPort.BitMap,
TAG_DONE);
}
else
diff --git a/amiga/tree.c b/amiga/tree.c
index 42eae4fa6..18b071de3 100644
--- a/amiga/tree.c
+++ b/amiga/tree.c
@@ -304,26 +304,26 @@ void ami_tree_drag_end(struct treeview_window *twin, int x, int y)
BOOL drag;
nsurl *url = NULL;
const char *title = NULL;
+ bool ok = false;
if(drag = ami_drag_in_progress()) ami_drag_icon_close(twin->win);
if(drag && (twin != ami_window_at_pointer(AMINS_TVWINDOW)))
{
if((twin->type == AMI_TREE_HOTLIST) && (hotlist_has_selection())) {
- hotlist_get_selection(&url, &title);
+ ok = hotlist_get_selection(&url, &title);
} else if((twin->type == AMI_TREE_HISTORY) && (global_history_has_selection())) {
- global_history_get_selection(&url, &title);
+ ok = global_history_get_selection(&url, &title);
}
- if((title == NULL) || (title && (url == NULL))) {
+ if((ok == false) || (url == NULL)) {
DisplayBeep(scrn);
} else if(url) {
if(gwin = ami_window_at_pointer(AMINS_WINDOW)) {
browser_window_navigate(gwin->bw,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -332,9 +332,11 @@ void ami_tree_drag_end(struct treeview_window *twin, int x, int y)
hotlist_add_entry(url, title, true, y);
}
}
+ tree_mouse_action(twin->tree, twin->mouse_state | twin->key_state,
+ twin->drag_x, twin->drag_y); /* Keep the tree happy */
tree_drag_end(twin->tree, twin->mouse_state,
twin->drag_x, twin->drag_y,
- twin->drag_x, twin->drag_y); /* Keep the tree happy */
+ twin->drag_x, twin->drag_y); /* Keep the tree happier */
} else {
if(tree_drag_status(twin->tree) == TREE_UNKNOWN_DRAG)
DisplayBeep(scrn);
@@ -709,7 +711,7 @@ void ami_tree_close(struct treeview_window *twin)
ami_ssl_free(twin);
}
- ami_gui_hotlist_toolbar_update_all();
+ ami_gui_hotlist_update_all();
}
void ami_tree_update_quals(struct treeview_window *twin)
@@ -1391,11 +1393,11 @@ void ami_tree_redraw_request(int x, int y, int width, int height, void *data)
atrr_data->height = height;
atrr_data->twin = (struct treeview_window *)data;
- /**TODO: Queue these requests properly like the main browser code does
+ /** /todo Queue these requests properly like the main browser code does
**/
if(nsoption_bool(direct_render) == false)
- schedule(0, ami_tree_redraw_req, atrr_data);
+ ami_schedule(0, ami_tree_redraw_req, atrr_data);
else
- schedule(0, ami_tree_redraw_req_dr, atrr_data);
+ ami_schedule(0, ami_tree_redraw_req_dr, atrr_data);
}
diff --git a/amiga/utf8.c b/amiga/utf8.c
index a620ac181..a8e415d45 100755
--- a/amiga/utf8.c
+++ b/amiga/utf8.c
@@ -18,13 +18,44 @@
#include <stdlib.h>
#include <string.h>
-
#include <sys/types.h>
+
#include "utils/utf8.h"
+#include "desktop/gui.h"
#include <proto/exec.h>
#include <proto/diskfont.h>
#include <diskfont/diskfonttag.h>
+#include "amiga/utf8.h"
+
+nserror utf8_from_local_encoding(const char *string, size_t len, char **result)
+{
+ const char *encname = "ISO-8859-1";
+
+#ifdef __amigaos4__
+ LONG charset;
+
+ charset = GetDiskFontCtrl(DFCTRL_CHARSET);
+ encname = (const char *) ObtainCharsetInfo(DFCS_NUMBER, charset, DFCS_MIMENAME);
+#endif
+
+ return utf8_from_enc(string,encname,len,result,NULL);
+}
+
+nserror utf8_to_local_encoding(const char *string, size_t len, char **result)
+{
+ const char *encname = "ISO-8859-1";
+
+#ifdef __amigaos4__
+ LONG charset;
+
+ charset = GetDiskFontCtrl(DFCTRL_CHARSET);
+ encname = (const char *) ObtainCharsetInfo(DFCS_NUMBER, charset, DFCS_MIMENAME);
+#endif
+
+ return utf8_to_enc(string,encname,len,result);
+}
+
void ami_utf8_free(char *ptr)
{
if(ptr) free(ptr);
@@ -34,7 +65,7 @@ char *ami_utf8_easy(const char *string)
{
char *localtext;
- if(utf8_to_local_encoding(string,strlen(string),&localtext) == UTF8_CONVERT_OK)
+ if(utf8_to_local_encoding(string,strlen(string),&localtext) == NSERROR_OK)
{
return localtext;
}
@@ -48,7 +79,7 @@ char *ami_to_utf8_easy(const char *string)
{
char *localtext;
- if(utf8_from_local_encoding(string,strlen(string),&localtext) == UTF8_CONVERT_OK)
+ if(utf8_from_local_encoding(string,strlen(string),&localtext) == NSERROR_OK)
{
return localtext;
}
@@ -58,34 +89,10 @@ char *ami_to_utf8_easy(const char *string)
}
}
-utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len,
- char **result)
-{
- const char *encname = "ISO-8859-1";
-
-#ifdef __amigaos4__
- LONG charset;
-
- charset = GetDiskFontCtrl(DFCTRL_CHARSET);
- encname = (const char *) ObtainCharsetInfo(DFCS_NUMBER, charset, DFCS_MIMENAME);
-#endif
-
- return utf8_from_enc(string,encname,len,result,NULL);
-}
-
-utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len,
- char **result)
-{
- const char *encname = "ISO-8859-1";
-
-#ifdef __amigaos4__
- LONG charset;
-
- charset = GetDiskFontCtrl(DFCTRL_CHARSET);
- encname = (const char *) ObtainCharsetInfo(DFCS_NUMBER, charset, DFCS_MIMENAME);
-#endif
-
- return utf8_to_enc(string,encname,len,result);
-}
+static struct gui_utf8_table utf8_table = {
+ .utf8_to_local = utf8_to_local_encoding,
+ .local_to_utf8 = utf8_from_local_encoding,
+};
+struct gui_utf8_table *amiga_utf8_table = &utf8_table;
diff --git a/amiga/utf8.h b/amiga/utf8.h
index 7956523ee..065a149f2 100755
--- a/amiga/utf8.h
+++ b/amiga/utf8.h
@@ -18,7 +18,14 @@
#ifndef AMIGA_UTF8_H
#define AMIGA_UTF8_H
+
+extern struct gui_utf8_table *ami_utf8_table;
+
char *ami_utf8_easy(const char *string);
void ami_utf8_free(char *ptr);
char *ami_to_utf8_easy(const char *string);
+
+nserror utf8_from_local_encoding(const char *string, size_t len, char **result);
+nserror utf8_to_local_encoding(const char *string, size_t len, char **result);
+
#endif
diff --git a/amiga/version.c b/amiga/version.c
index 8bc1fbc81..aa5aa5d6f 100644
--- a/amiga/version.c
+++ b/amiga/version.c
@@ -16,22 +16,23 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "utils/testament.h"
+#include "testament.h"
/* NB: AmigaOS revision numbers start at 1 (not 0) and are monotonically
* incremental (v1.20 is higher than v1.3 and not the same as v1.2).
* Consequently, this version pair may not match the user-facing one in
- * desktop/version.c.
+ * desktop/version.c. Release revisions are prepended with 6000 to ensure
+ * they are higher than CI builds, and make this less confusing.
*/
#define NETSURF_VERSION_MAJOR "3"
#if defined(CI_BUILD)
#define NETSURF_VERSION_MINOR CI_BUILD
#else
-#define NETSURF_VERSION_MINOR "2"
+#define NETSURF_VERSION_MINOR "6000" "3"
#endif
-
static const __attribute__((used)) char *verstag = "\0$VER: NetSurf " NETSURF_VERSION_MAJOR "." NETSURF_VERSION_MINOR " (" WT_COMPILEDATE ")\0";
const char * const verdate = WT_COMPILEDATE;
const char * const verarexx = NETSURF_VERSION_MAJOR "." NETSURF_VERSION_MINOR;
const char * const wt_revid = WT_REVID;
+
diff --git a/atari/Makefile.defaults b/atari/Makefile.defaults
index ccc9b49ce..dcdc1d661 100644
--- a/atari/Makefile.defaults
+++ b/atari/Makefile.defaults
@@ -2,59 +2,56 @@
# Atari-specific options
# ----------------------------------------------------------------------------
- # Force using glibc internal iconv implementation instead of external libiconv
- # Valid options: YES, NO
- NETSURF_USE_LIBICONV_PLUG := NO
+# Force using glibc internal iconv implementation instead of external libiconv
+# Valid options: YES, NO
+NETSURF_USE_LIBICONV_PLUG := NO
- # Enable NetSurf's use of librosprite for displaying RISC OS Sprites
- # Valid options: YES, NO, AUTO
- NETSURF_USE_ROSPRITE := NO
+# Enable NetSurf's use of librosprite for displaying RISC OS Sprites
+# Valid options: YES, NO, AUTO
+NETSURF_USE_ROSPRITE := NO
- # Enable NetSurf's use of libwebp for displaying WebPs
- # Valid options: YES, NO
- NETSURF_USE_WEBP := NO
+# Enable NetSurf's use of libwebp for displaying WebPs
+# Valid options: YES, NO
+NETSURF_USE_WEBP := NO
- # Enable NetSurf's use of librsvg in conjunction with Cairo to display SVGs
- # Valid options: YES, NO, AUTO
- NETSURF_USE_RSVG := AUTO
+# Enable NetSurf's use of librsvg in conjunction with Cairo to display SVGs
+# Valid options: YES, NO, AUTO
+NETSURF_USE_RSVG := AUTO
- # Enable NetSurf's use of libsvgtiny for displaying SVGs
- # Valid options: YES, NO, AUTO
- NETSURF_USE_NSSVG := AUTO
+# Enable NetSurf's use of libsvgtiny for displaying SVGs
+# Valid options: YES, NO, AUTO
+NETSURF_USE_NSSVG := AUTO
- NETSURF_USE_MNG := NO
+# Enable Spidermonkey JavaScript engine
+# Valid options: YES, NO
+NETSURF_USE_MOZJS := NO
- # Enable Spidermonkey JavaScript engine
- # Valid options: YES, NO
- NETSURF_USE_MOZJS := NO
+# enable true type fonts via freetype2
+# Valid options: YES, NO
+NETSURF_USE_ATARI_FREETYPE_FONT := YES
- # enable true type fonts via freetype2
- # Valid options: YES, NO
- NETSURF_USE_ATARI_FREETYPE_FONT := YES
+# Enable use of netsurf embedded font
+# Valid options: YES, NO
+NETSURF_USE_ATARI_NETSURF_FONT := YES
- # Enable use of netsurf embedded font
- # Valid options: YES, NO
- NETSURF_USE_ATARI_NETSURF_FONT := YES
+# Enable VDI Font rendering
+# Valid options: YES, NO
+NETSURF_USE_ATARI_VDI_FONT := NO
- # Enable VDI Font rendering
- # Valid options: YES, NO
- NETSURF_USE_ATARI_VDI_FONT := NO
+# Configure support for screen drivers with no true colour mode
+# Valid options: YES, NO
+NETSURF_USE_ATARI_8BPP_SUPPORT := NO
- # Configure support for screen drivers with no true colour mode
- # Valid options: YES, NO
- NETSURF_USE_ATARI_8BPP_SUPPORT := NO
+# Configure the CPU target
+# Valid options: 68000, 68020-60, 5475 (coldfire)
+ATARIARCH = 68020-60
- # Configure the CPU target
- # Valid options: 68000, 68020-60, 5475 (coldfire)
- ATARIARCH = 68020-60
+# enable optimizations
+# -O2 is currently broken with m68000 / m68020-60 builds
+CFLAGS += -O3
- # enable optimizations
- # -O2 is currently broken with m68000 / m68020-60 builds
- CFLAGS += -O3
-
- # override warning flags removing -Wall
- WARNFLAGS = -W -Wundef -Wpointer-arith \
+# override warning flags removing -Wall
+WARNFLAGS = -W -Wundef -Wpointer-arith \
-Wcast-align -Wwrite-strings -Wstrict-prototypes \
-Wmissing-prototypes -Wmissing-declarations -Wredundant-decls \
-Wnested-externs -Wuninitialized -Wl,-t
-
diff --git a/atari/Makefile.target b/atari/Makefile.target
index 283361355..c9b2046f2 100644
--- a/atari/Makefile.target
+++ b/atari/Makefile.target
@@ -10,6 +10,7 @@
# the netsurf environment!
STRIP := $(wildcard $(GCCSDK_INSTALL_CROSSBIN)/*strip)
STACK := $(wildcard $(GCCSDK_INSTALL_CROSSBIN)/*stack)
+FT2CF := $(GCCSDK_INSTALL_ENV)/bin/freetype-config
ifeq ($(ATARIARCH),68000)
PRGSUFFIX := 000.app
@@ -32,10 +33,9 @@ endif
# non-pkgconfig components
-FREETYPE_FONT_CFLAGS := $(shell freetype-config --cflags) -DWITH_FREETYPE_FONT_DRIVER
+FREETYPE_FONT_CFLAGS := $(shell $(FT2CF) --cflags) -DWITH_FREETYPE_FONT_DRIVER
SPIDERMONKEY_CFLAGS := -DWITH_MOZJS -DXP_UNIX -DJS_HAS_FILE_OBJECT=0 -DJSOPTION_JIT=0 -DPOSIX_SOURCE -D_BSD_SOURCE
-$(eval $(call feature_enabled,MNG,-DWITH_MNG,-lmng,PNG/MNG/JNG (libmng)))
$(eval $(call feature_enabled,PNG,-DWITH_PNG,-lpng,PNG (libpng)))
$(eval $(call feature_enabled,MOZJS,$(SPIDERMONKEY_CFLAGS),-ljs,JavaScript (Spidermonkey)))
$(eval $(call feature_enabled,ATARI_FREETYPE_FONT,$(FREETYPE_FONT_CFLAGS),-lfreetype,(Freetype)))
@@ -59,7 +59,7 @@ endif
$(eval $(call pkg_config_find_and_add_enabled,BMP,libnsbmp,BMP))
$(eval $(call pkg_config_find_and_add_enabled,GIF,libnsgif,GIF))
-CFLAGS += -U__STRICT_ANSI__ -std=c99 -Dsmall $(WARNFLAGS) -Dnsatari \
+CFLAGS += -U__STRICT_ANSI__ -std=c99 -Dsmall -Dnsatari \
-D_BSD_SOURCE \
-D_XOPEN_SOURCE=600 \
-D_POSIX_C_SOURCE=200112L \
@@ -69,7 +69,7 @@ CFLAGS += -U__STRICT_ANSI__ -std=c99 -Dsmall $(WARNFLAGS) -Dnsatari \
LDFLAGS += -lcflib -lcurl
LDFLAGS += -lcss -lparserutils -ldom -lwapcaplet -lhubbub
LDFLAGS += -lssl -lcrypto
-LDFLAGS += -lz -liconv -lcares -lHermes -lgem -lm
+LDFLAGS += -lz -lcares -lHermes -lgem -lm
LDFLAGS += -L$(GCCSDK_INSTALL_ENV)/lib
diff --git a/atari/about.c b/atari/about.c
index f09dfb358..174e27b20 100644
--- a/atari/about.c
+++ b/atari/about.c
@@ -16,9 +16,9 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <limits.h>
-#include <unistd.h>
-#include <string.h>
+#include <limits.h>
+#include <unistd.h>
+#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>
@@ -28,16 +28,16 @@
#include "atari/plot/plot.h"
#include "atari/gemtk/gemtk.h"
#include "atari/res/netsurf.rsh"
-#include "atari/about.h"
+#include "atari/about.h"
-#include "utils/testament.h"
+#include "testament.h"
#include "utils/useragent.h"
#include "desktop/netsurf.h"
#include "utils/nsurl.h"
#include "utils/messages.h"
-#include "curl/curlver.h"
+#include "curl/curlver.h"
static OBJECT * about_form = NULL;
@@ -50,9 +50,6 @@ static short __CDECL about_userdraw(PARMBLK *parmblock)
{
short pxy[8];
short dummy;
- int content_len;
- char *content;
- short cur_x, cur_y;
short cheight = 8, cwidth = gl_wchar;
char c[2] = {0,0};
@@ -73,6 +70,9 @@ static short __CDECL about_userdraw(PARMBLK *parmblock)
};
if(parmblock->pb_currstate == parmblock->pb_prevstate){
+ short cur_x, cur_y;
+ char *content;
+ int content_len;
content = (char*)parmblock->pb_parm;
content_len = strlen(content);
@@ -170,8 +170,7 @@ void atari_about_show(void)
if (goto_url != NULL) {
nserr = nsurl_create(goto_url, &url);
if (nserr == NSERROR_OK) {
- nserr = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ nserr = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
diff --git a/atari/certview.c b/atari/certview.c
index 6877529d8..b6b752224 100644
--- a/atari/certview.c
+++ b/atari/certview.c
@@ -14,293 +14,287 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <ctype.h>
-#include <string.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-
-#include "desktop/browser.h"
-#include "content/urldb.h"
-#include "desktop/sslcert_viewer.h"
-#include "desktop/gui.h"
-#include "desktop/core_window.h"
-#include "utils/nsoption.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/utils.h"
-
-#include "atari/gui.h"
-#include "atari/misc.h"
-#include "atari/treeview.h"
-#include "atari/certview.h"
-#include "atari/findfile.h"
-#include "atari/gemtk/gemtk.h"
-#include "atari/res/netsurf.rsh"
-
-extern GRECT desk_area;
-
-
-/* Setup Atari Treeview Callbacks: */
-static nserror atari_sslcert_viewer_init_phase2(struct core_window *cw,
- struct core_window_callback_table * default_callbacks);
-static void atari_sslcert_viewer_finish(struct core_window *cw);
-static void atari_sslcert_viewer_keypress(struct core_window *cw,
- uint32_t ucs4);
-static void atari_sslcert_viewer_mouse_action(struct core_window *cw,
- browser_mouse_state mouse,
- int x, int y);
-static void atari_sslcert_viewer_draw(struct core_window *cw, int x,
- int y, struct rect *clip,
- const struct redraw_context *ctx);
-static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8]);
-
-static struct atari_treeview_callbacks atari_sslcert_viewer_treeview_callbacks = {
- .init_phase2 = atari_sslcert_viewer_init_phase2,
- .finish = atari_sslcert_viewer_finish,
- .draw = atari_sslcert_viewer_draw,
- .keypress = atari_sslcert_viewer_keypress,
- .mouse_action = atari_sslcert_viewer_mouse_action,
- .gemtk_user_func = handle_event
-};
-
-/* static functions */
-static void atari_sslcert_viewer_destroy(struct atari_sslcert_viewer_s * cvwin);
-
-
-static nserror atari_sslcert_viewer_init_phase2(struct core_window *cw,
- struct core_window_callback_table *cb_t)
-{
- struct atari_sslcert_viewer_s *cvwin;
- struct sslcert_session_data *ssl_d;
-
- cvwin = (struct atari_sslcert_viewer_s *)atari_treeview_get_user_data(cw);
-
- assert(cvwin);
-
- ssl_d = cvwin->ssl_session_data;
-
- assert(ssl_d);
-
- LOG((""));
-
- return(sslcert_viewer_init(cb_t, cw, ssl_d));
-}
-
-static void atari_sslcert_viewer_finish(struct core_window *cw)
-{
- struct atari_sslcert_viewer_s *cvwin;
-
- assert(cw);
-
- cvwin = (struct atari_sslcert_viewer_s *)atari_treeview_get_user_data(cw);
-
- /* This will also free the session data: */
- sslcert_viewer_fini(cvwin->ssl_session_data);
-
- LOG((""));
-}
-
-static void atari_sslcert_viewer_draw(struct core_window *cw, int x,
- int y, struct rect *clip,
- const struct redraw_context *ctx)
-{
- struct atari_sslcert_viewer_s *cvwin;
-
- assert(cw);
-
- cvwin = (struct atari_sslcert_viewer_s *)atari_treeview_get_user_data(cw);
-
- assert(cvwin);
-
- sslcert_viewer_redraw(cvwin->ssl_session_data, x, y, clip, ctx);
-}
-
-static void atari_sslcert_viewer_keypress(struct core_window *cw, uint32_t ucs4)
-{
- struct atari_sslcert_viewer_s *cvwin;
-
- assert(cw);
-
- cvwin = (struct atari_sslcert_viewer_s *)atari_treeview_get_user_data(cw);
-
- LOG(("ucs4: %lu\n", ucs4));
- sslcert_viewer_keypress(cvwin->ssl_session_data, ucs4);
-}
-
-static void atari_sslcert_viewer_mouse_action(struct core_window *cw,
- browser_mouse_state mouse,
- int x, int y)
-{
- struct atari_sslcert_viewer_s *cvwin;
-
- assert(cw);
-
- cvwin = (struct atari_sslcert_viewer_s *)atari_treeview_get_user_data(cw);
-
- if ((mouse & BROWSER_MOUSE_HOVER)) {
- sslcert_viewer_mouse_action(cvwin->ssl_session_data, mouse, x, y);
- } else {
- sslcert_viewer_mouse_action(cvwin->ssl_session_data, mouse, x, y);
- }
-}
-
-
-static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
-{
- struct core_window *tv=NULL;
- GRECT tb_area;
- GUIWIN * gemtk_win;
- struct gui_window * gw;
- struct atari_sslcert_viewer_s *cvwin = NULL;
- char *cur_url = NULL;
- char *cur_title = NULL;
- short retval = 0;
- OBJECT *toolbar;
-
- LOG((""));
-
- if(ev_out->emo_events & MU_MESAG){
- switch (msg[0]) {
-
- case WM_TOOLBAR:
- toolbar = gemtk_obj_get_tree(TOOLBAR_SSL_CERT);
- LOG(("CERTVIEWER WM_TOOLBAR"));
- tv = (struct core_window*) gemtk_wm_get_user_data(win);
- assert(tv);
- cvwin = (struct atari_sslcert_viewer_s *)
- atari_treeview_get_user_data(tv);
- switch (msg[4]) {
-
- case TOOLBAR_SSL_CERT_TRUSTED:
-
- if (toolbar[msg[4]].ob_state & OS_SELECTED) {
-
- } else {
-
- }
- break;
- }
-
-
- gemtk_win = atari_treeview_get_gemtk_window(tv);
- assert(gemtk_win);
- //gemtk_obj_get_tree(TOOLBAR_HOTLIST)[msg[4]].ob_state &= ~OS_SELECTED;
- atari_treeview_get_grect(tv, TREEVIEW_AREA_TOOLBAR, &tb_area);
- evnt_timer(150);
- gemtk_wm_exec_redraw(gemtk_win, &tb_area);
- retval = 1;
- break;
-
- case WM_CLOSED:
- // TODO set perrmissions
- toolbar = gemtk_obj_get_tree(TOOLBAR_SSL_CERT);
- tv = (struct core_window*) gemtk_wm_get_user_data(win);
- assert(tv);
- cvwin = (struct atari_sslcert_viewer_s *)
- atari_treeview_get_user_data(tv);
- if (toolbar[TOOLBAR_SSL_CERT_TRUSTED].ob_state & OS_SELECTED) {
- sslcert_viewer_accept(cvwin->ssl_session_data);
- } else {
- sslcert_viewer_reject(cvwin->ssl_session_data);
- }
- atari_sslcert_viewer_destroy(cvwin);
- retval = 1;
- break;
-
- default: break;
- }
- }
-
- return(retval);
+ */
+
+#include <ctype.h>
+#include <string.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+#include "desktop/browser.h"
+#include "content/urldb.h"
+#include "content/hlcache.h"
+#include "desktop/sslcert_viewer.h"
+#include "desktop/gui.h"
+#include "desktop/core_window.h"
+#include "utils/nsoption.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/utils.h"
+
+#include "atari/gui.h"
+#include "atari/misc.h"
+#include "atari/treeview.h"
+#include "atari/certview.h"
+#include "atari/findfile.h"
+#include "atari/gemtk/gemtk.h"
+#include "atari/res/netsurf.rsh"
+
+extern GRECT desk_area;
+
+
+/* Setup Atari Treeview Callbacks: */
+static nserror atari_sslcert_viewer_init_phase2(struct core_window *cw,
+ struct core_window_callback_table * default_callbacks);
+static void atari_sslcert_viewer_finish(struct core_window *cw);
+static void atari_sslcert_viewer_keypress(struct core_window *cw,
+ uint32_t ucs4);
+static void atari_sslcert_viewer_mouse_action(struct core_window *cw,
+ browser_mouse_state mouse,
+ int x, int y);
+static void atari_sslcert_viewer_draw(struct core_window *cw, int x,
+ int y, struct rect *clip,
+ const struct redraw_context *ctx);
+static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8]);
+
+static struct atari_treeview_callbacks atari_sslcert_viewer_treeview_callbacks = {
+ .init_phase2 = atari_sslcert_viewer_init_phase2,
+ .finish = atari_sslcert_viewer_finish,
+ .draw = atari_sslcert_viewer_draw,
+ .keypress = atari_sslcert_viewer_keypress,
+ .mouse_action = atari_sslcert_viewer_mouse_action,
+ .gemtk_user_func = handle_event
+};
+
+/* static functions */
+static void atari_sslcert_viewer_destroy(struct atari_sslcert_viewer_s * cvwin);
+
+
+static nserror atari_sslcert_viewer_init_phase2(struct core_window *cw,
+ struct core_window_callback_table *cb_t)
+{
+ struct atari_sslcert_viewer_s *cvwin;
+ struct sslcert_session_data *ssl_d;
+
+ cvwin = (struct atari_sslcert_viewer_s *)atari_treeview_get_user_data(cw);
+
+ assert(cvwin);
+
+ ssl_d = cvwin->ssl_session_data;
+
+ assert(ssl_d);
+
+ LOG((""));
+
+ return(sslcert_viewer_init(cb_t, cw, ssl_d));
+}
+
+static void atari_sslcert_viewer_finish(struct core_window *cw)
+{
+ struct atari_sslcert_viewer_s *cvwin;
+
+ assert(cw);
+
+ cvwin = (struct atari_sslcert_viewer_s *)atari_treeview_get_user_data(cw);
+
+ /* This will also free the session data: */
+ sslcert_viewer_fini(cvwin->ssl_session_data);
+
+ LOG((""));
+}
+
+static void atari_sslcert_viewer_draw(struct core_window *cw, int x,
+ int y, struct rect *clip,
+ const struct redraw_context *ctx)
+{
+ struct atari_sslcert_viewer_s *cvwin;
+
+ assert(cw);
+
+ cvwin = (struct atari_sslcert_viewer_s *)atari_treeview_get_user_data(cw);
+
+ assert(cvwin);
+
+ sslcert_viewer_redraw(cvwin->ssl_session_data, x, y, clip, ctx);
+}
+
+static void atari_sslcert_viewer_keypress(struct core_window *cw, uint32_t ucs4)
+{
+ struct atari_sslcert_viewer_s *cvwin;
+
+ assert(cw);
+
+ cvwin = (struct atari_sslcert_viewer_s *)atari_treeview_get_user_data(cw);
+
+ LOG(("ucs4: %lu\n", ucs4));
+ sslcert_viewer_keypress(cvwin->ssl_session_data, ucs4);
+}
+
+static void atari_sslcert_viewer_mouse_action(struct core_window *cw,
+ browser_mouse_state mouse,
+ int x, int y)
+{
+ struct atari_sslcert_viewer_s *cvwin;
+
+ assert(cw);
+
+ cvwin = (struct atari_sslcert_viewer_s *)atari_treeview_get_user_data(cw);
+
+ sslcert_viewer_mouse_action(cvwin->ssl_session_data, mouse, x, y);
}
-static void atari_sslcert_viewer_init(struct atari_sslcert_viewer_s * cvwin,
- struct sslcert_session_data *ssl_d)
-{
- assert(cvwin->init == false);
- assert(cvwin->window == NULL);
- assert(cvwin->tv == NULL);
-
- int flags = ATARI_TREEVIEW_WIDGETS;
- short handle = -1;
- GRECT desk;
- OBJECT * tree = gemtk_obj_get_tree(TOOLBAR_SSL_CERT);
- assert( tree );
-
- handle = wind_create(flags, 0, 0, desk_area.g_w, desk_area.g_h);
- cvwin->window = gemtk_wm_add(handle,
- GEMTK_WM_FLAG_DEFAULTS, NULL);
- if (cvwin->window == NULL ) {
- gemtk_msg_box_show(GEMTK_MSG_BOX_ALERT,
- "Failed to allocate Treeview:\nCertviewer");
- return;
- }
- wind_set_str(handle, WF_NAME, (char*)"SSL Certificate");
- gemtk_wm_set_toolbar(cvwin->window, tree, 0, 0);
- gemtk_wm_unlink(cvwin->window);
-
- cvwin->ssl_session_data = ssl_d;
- cvwin->tv = atari_treeview_create(cvwin->window,
- &atari_sslcert_viewer_treeview_callbacks,
- cvwin, flags);
-
- if (cvwin->tv == NULL) {
- /* handle it properly, clean up previous allocs */
- LOG(("Failed to allocate treeview"));
- return;
- }
-
- cvwin->init = true;
-}
-
-/*
-* documented in certview.h
+
+static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
+{
+ struct core_window *tv=NULL;
+ GRECT tb_area;
+ GUIWIN * gemtk_win;
+ struct atari_sslcert_viewer_s *cvwin = NULL;
+ short retval = 0;
+ OBJECT *toolbar;
+
+ LOG((""));
+
+ if(ev_out->emo_events & MU_MESAG){
+ switch (msg[0]) {
+
+ case WM_TOOLBAR:
+ toolbar = gemtk_obj_get_tree(TOOLBAR_SSL_CERT);
+ LOG(("CERTVIEWER WM_TOOLBAR"));
+ tv = (struct core_window*) gemtk_wm_get_user_data(win);
+ assert(tv);
+ cvwin = (struct atari_sslcert_viewer_s *)
+ atari_treeview_get_user_data(tv);
+ switch (msg[4]) {
+
+ case TOOLBAR_SSL_CERT_TRUSTED:
+
+ if (toolbar[msg[4]].ob_state & OS_SELECTED) {
+
+ } else {
+
+ }
+ break;
+ }
+
+
+ gemtk_win = atari_treeview_get_gemtk_window(tv);
+ assert(gemtk_win);
+ //gemtk_obj_get_tree(TOOLBAR_HOTLIST)[msg[4]].ob_state &= ~OS_SELECTED;
+ atari_treeview_get_grect(tv, TREEVIEW_AREA_TOOLBAR, &tb_area);
+ evnt_timer(150);
+ gemtk_wm_exec_redraw(gemtk_win, &tb_area);
+ retval = 1;
+ break;
+
+ case WM_CLOSED:
+ // TODO set perrmissions
+ toolbar = gemtk_obj_get_tree(TOOLBAR_SSL_CERT);
+ tv = (struct core_window*) gemtk_wm_get_user_data(win);
+ assert(tv);
+ cvwin = (struct atari_sslcert_viewer_s *)
+ atari_treeview_get_user_data(tv);
+ if (toolbar[TOOLBAR_SSL_CERT_TRUSTED].ob_state & OS_SELECTED) {
+ sslcert_viewer_accept(cvwin->ssl_session_data);
+ } else {
+ sslcert_viewer_reject(cvwin->ssl_session_data);
+ }
+ atari_sslcert_viewer_destroy(cvwin);
+ retval = 1;
+ break;
+
+ default: break;
+ }
+ }
+
+ return(retval);
+}
+
+static void atari_sslcert_viewer_init(struct atari_sslcert_viewer_s * cvwin,
+ struct sslcert_session_data *ssl_d)
+{
+ assert(cvwin->init == false);
+ assert(cvwin->window == NULL);
+ assert(cvwin->tv == NULL);
+
+ int flags = ATARI_TREEVIEW_WIDGETS;
+ short handle = -1;
+ GRECT desk;
+ OBJECT * tree = gemtk_obj_get_tree(TOOLBAR_SSL_CERT);
+ assert( tree );
+
+ handle = wind_create(flags, 0, 0, desk_area.g_w, desk_area.g_h);
+ cvwin->window = gemtk_wm_add(handle,
+ GEMTK_WM_FLAG_DEFAULTS, NULL);
+ if (cvwin->window == NULL ) {
+ gemtk_msg_box_show(GEMTK_MSG_BOX_ALERT,
+ "Failed to allocate Treeview:\nCertviewer");
+ return;
+ }
+ wind_set_str(handle, WF_NAME, (char*)"SSL Certificate");
+ gemtk_wm_set_toolbar(cvwin->window, tree, 0, 0);
+ gemtk_wm_unlink(cvwin->window);
+
+ cvwin->ssl_session_data = ssl_d;
+ cvwin->tv = atari_treeview_create(cvwin->window,
+ &atari_sslcert_viewer_treeview_callbacks,
+ cvwin, flags);
+
+ if (cvwin->tv == NULL) {
+ /* handle it properly, clean up previous allocs */
+ LOG(("Failed to allocate treeview"));
+ return;
+ }
+
+ cvwin->init = true;
+}
+
+/*
+* documented in certview.h
*/
-void atari_sslcert_viewer_open(struct sslcert_session_data *ssl_d)
-{
- struct atari_sslcert_viewer_s * cvwin;
-
- cvwin = calloc(1, sizeof(struct atari_sslcert_viewer_s));
-
- assert(cvwin);
-
- atari_sslcert_viewer_init(cvwin, ssl_d);
-
- if (atari_treeview_is_open(cvwin->tv) == false) {
-
- GRECT pos;
- pos.g_x = desk_area.g_w - desk_area.g_w / 4;
- pos.g_y = desk_area.g_y;
- pos.g_w = desk_area.g_w / 4;
- pos.g_h = desk_area.g_h;
-
- atari_treeview_open(cvwin->tv, &pos);
- } else {
- wind_set(gemtk_wm_get_handle(cvwin->window), WF_TOP, 1, 0,
- 0, 0);
- }
-}
-
-
-static void atari_sslcert_viewer_destroy(struct atari_sslcert_viewer_s * cvwin)
-{
- assert(cvwin);
- assert(cvwin->init);
- assert(cvwin->window);
-
- LOG((""));
-
- if (atari_treeview_is_open(cvwin->tv))
- atari_treeview_close(cvwin->tv);
- wind_delete(gemtk_wm_get_handle(cvwin->window));
- gemtk_wm_remove(cvwin->window);
- cvwin->window = NULL;
- atari_treeview_delete(cvwin->tv);
- free(cvwin);
- LOG(("done"));
-}
-
+void atari_sslcert_viewer_open(struct sslcert_session_data *ssl_d)
+{
+ struct atari_sslcert_viewer_s * cvwin;
+
+ cvwin = calloc(1, sizeof(struct atari_sslcert_viewer_s));
+
+ assert(cvwin);
+
+ atari_sslcert_viewer_init(cvwin, ssl_d);
+
+ if (atari_treeview_is_open(cvwin->tv) == false) {
+
+ GRECT pos;
+ pos.g_x = desk_area.g_w - desk_area.g_w / 4;
+ pos.g_y = desk_area.g_y;
+ pos.g_w = desk_area.g_w / 4;
+ pos.g_h = desk_area.g_h;
+
+ atari_treeview_open(cvwin->tv, &pos);
+ } else {
+ wind_set(gemtk_wm_get_handle(cvwin->window), WF_TOP, 1, 0,
+ 0, 0);
+ }
+}
+
+
+static void atari_sslcert_viewer_destroy(struct atari_sslcert_viewer_s * cvwin)
+{
+ assert(cvwin);
+ assert(cvwin->init);
+ assert(cvwin->window);
+
+ LOG((""));
+
+ if (atari_treeview_is_open(cvwin->tv))
+ atari_treeview_close(cvwin->tv);
+ wind_delete(gemtk_wm_get_handle(cvwin->window));
+ gemtk_wm_remove(cvwin->window);
+ cvwin->window = NULL;
+ atari_treeview_delete(cvwin->tv);
+ free(cvwin);
+ LOG(("done"));
+}
+
diff --git a/atari/clipboard.c b/atari/clipboard.c
index 254579bba..d80599e2b 100644
--- a/atari/clipboard.c
+++ b/atari/clipboard.c
@@ -20,69 +20,69 @@
*
*
*/
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include <stdio.h>
-#include <mint/osbind.h>
-#include <cflib.h>
-#include "atari/clipboard.h"
-#include "atari/gemtk/gemtk.h"
-
-
-static int filesize(char * path)
-{
- FILE *f;
- int fs;
-
- f = fopen( path, "r+b");
- if(!f)
- return(-1);
-
- fseek(f, 0L, SEEK_END);
- fs = ftell(f);
- fclose(f);
-
- return(fs);
-}
-
-int scrap_txt_write(char *str)
-{
- scrap_wtxt(str);
-
-
- // Send SC_CHANGED message:
- gemtk_send_msg(SC_CHANGED, 0, 2, 0, 0, 0, 0);
-
- return(0);
-
-}
-char *scrap_txt_read(void)
-{
- char * buf = NULL;
- char path[80];
- int file;
- int len;
-
- if (get_scrapdir (path))
- {
- strcat (path, "scrap.txt");
- len = filesize(path);
- if(len > 0){
- if ((file = (int) Fopen (path, 0)) >= 0)
- {
- buf = malloc(len);
- if(buf){
- len = Fread (file, len, buf);
- Fclose (file);
- buf[len] = '\0';
- return buf;
- }
- }
- }
- }
-
-}
-
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include <mint/osbind.h>
+#include <cflib.h>
+#include "atari/clipboard.h"
+#include "atari/gemtk/gemtk.h"
+
+
+static int filesize(char * path)
+{
+ FILE *f;
+ int fs;
+
+ f = fopen( path, "r+b");
+ if(!f)
+ return(-1);
+
+ fseek(f, 0L, SEEK_END);
+ fs = ftell(f);
+ fclose(f);
+
+ return(fs);
+}
+
+int scrap_txt_write(char *str)
+{
+ scrap_wtxt(str);
+
+
+ // Send SC_CHANGED message:
+ gemtk_send_msg(SC_CHANGED, 0, 2, 0, 0, 0, 0);
+
+ return(0);
+
+}
+
+char *scrap_txt_read(void)
+{
+ char * buf = NULL;
+ char path[80];
+
+ if (get_scrapdir (path))
+ {
+ int len;
+ strcat (path, "scrap.txt");
+ len = filesize(path);
+ if(len > 0){
+ int file;
+ if ((file = (int) Fopen (path, 0)) >= 0)
+ {
+ buf = malloc(len);
+ if(buf){
+ len = Fread (file, len, buf);
+ Fclose (file);
+ buf[len] = '\0';
+ return buf;
+ }
+ }
+ }
+ }
+
+}
+
diff --git a/atari/cookies.c b/atari/cookies.c
index d05707559..9082da2b7 100644
--- a/atari/cookies.c
+++ b/atari/cookies.c
@@ -1,19 +1,19 @@
-/*
- * Copyright 2013 Ole Loots <ole@monochrom.net>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
+/*
+ * Copyright 2013 Ole Loots <ole@monochrom.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <ctype.h>
@@ -35,7 +35,6 @@
#include "utils/log.h"
#include "utils/messages.h"
#include "utils/utils.h"
-#include "utils/url.h"
#include "atari/gui.h"
#include "atari/misc.h"
#include "atari/treeview.h"
@@ -103,24 +102,14 @@ static void atari_cookie_manager_mouse_action(struct core_window *cw,
browser_mouse_state mouse,
int x, int y)
{
- if((mouse & BROWSER_MOUSE_HOVER) && cookie_manager_has_selection()){
- cookie_manager_mouse_action(mouse, x, y);
- } else {
- cookie_manager_mouse_action(mouse, x, y);
- }
-
+ cookie_manager_mouse_action(mouse, x, y);
}
static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
{
- struct atari_treeview_window *tv=NULL;
GRECT tb_area;
- GUIWIN * gemtk_win;
- struct gui_window * gw;
- char *cur_url = NULL;
- char *cur_title = NULL;
short retval = 0;
LOG((""));
@@ -159,8 +148,8 @@ static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
}
return(retval);
-}
-
+}
+
void atari_cookie_manager_init(void)
{
if (atari_cookie_manager.init == false) {
@@ -200,7 +189,7 @@ void atari_cookie_manager_init(void)
}
}
atari_cookie_manager.init = true;
-}
+}
void atari_cookie_manager_open(void)
{
assert(atari_cookie_manager.init);
@@ -220,13 +209,13 @@ void atari_cookie_manager_open(void)
}
}
-
+
void atari_cookie_manager_close(void)
{
atari_treeview_close(atari_cookie_manager.tv);
}
-
+
void atari_cookie_manager_destroy(void)
{
if( atari_cookie_manager.init == false) {
diff --git a/atari/ctxmenu.c b/atari/ctxmenu.c
index fb687b809..f782c6e19 100644
--- a/atari/ctxmenu.c
+++ b/atari/ctxmenu.c
@@ -1,116 +1,116 @@
-/*
- * Copyright 2010 Ole Loots <ole@monochrom.net>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <limits.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-#include <stdbool.h>
+/*
+ * Copyright 2010 Ole Loots <ole@monochrom.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdbool.h>
#include <assert.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <mint/osbind.h>
-#include <cflib.h>
-
-#include "desktop/gui.h"
-#include "desktop/netsurf.h"
-#include "desktop/browser.h"
-#include "desktop/browser_private.h"
-#include "desktop/mouse.h"
-#include "desktop/textinput.h"
-#include "content/content.h"
-#include "content/hlcache.h"
-#include "content/urldb.h"
-#include "css/css.h"
-#include "utils/log.h"
+#include <cflib.h>
+
+#include "desktop/gui.h"
+#include "desktop/netsurf.h"
+#include "desktop/browser.h"
+#include "desktop/browser_private.h"
+#include "desktop/mouse.h"
+#include "desktop/textinput.h"
+#include "content/content.h"
+#include "content/hlcache.h"
+#include "content/urldb.h"
+#include "css/css.h"
+#include "utils/log.h"
#include "utils/messages.h"
-#include "utils/utils.h"
-
-#include "atari/gui.h"
-#include "atari/rootwin.h"
-#include "atari/misc.h"
-#include "atari/clipboard.h"
-#include "utils/nsoption.h"
-#include "atari/res/netsurf.rsh"
-#include "atari/ctxmenu.h"
-
-
-#define CNT_INVALID 0
-#define CNT_BROWSER 64
-#define CNT_HREF 128
-#define CNT_SELECTION 256
-#define CNT_INTERACTIVE 512
-#define CNT_IMG 1024
-
-
-struct s_context_info {
- unsigned long flags;
- struct contextual_content ccdata;
-};
-
-struct s_context_info ctxinfo;
-
-static struct s_context_info * get_context_info( struct gui_window * gw, short mx, short my )
-{
- hlcache_handle *h;
- GRECT area;
- struct contextual_content ccdata;
+#include "utils/utils.h"
+
+#include "atari/gui.h"
+#include "atari/rootwin.h"
+#include "atari/misc.h"
+#include "atari/clipboard.h"
+#include "utils/nsoption.h"
+#include "atari/res/netsurf.rsh"
+#include "atari/ctxmenu.h"
+
+
+#define CNT_INVALID 0
+#define CNT_BROWSER 64
+#define CNT_HREF 128
+#define CNT_SELECTION 256
+#define CNT_INTERACTIVE 512
+#define CNT_IMG 1024
+
+bool gui_window_get_scroll(struct gui_window *w, int *sx, int *sy);
+
+struct s_context_info {
+ unsigned long flags;
+ struct contextual_content ccdata;
+};
+
+struct s_context_info ctxinfo;
+
+static struct s_context_info * get_context_info( struct gui_window * gw, short mx, short my )
+{
+ hlcache_handle *h;
+ GRECT area;
struct browser_window * bw = gw->browser->bw;
- int sx, sy;
-
- h = bw->current_content;
+ int sx, sy;
+
+ h = bw->current_content;
ctxinfo.flags = 0;
window_get_grect(gw->root, BROWSER_AREA_CONTENT, &area);
if (POINT_WITHIN(mx, my, area)) {
- mx -= area.g_x;
+ mx -= area.g_x;
my -= area.g_y;
- if (!bw->current_content || content_get_type(h) != CONTENT_HTML){
- return(&ctxinfo);
- }
-
- ctxinfo.flags |= CNT_BROWSER;
+ if (!bw->current_content || content_get_type(h) != CONTENT_HTML){
+ return(&ctxinfo);
+ }
+
+ ctxinfo.flags |= CNT_BROWSER;
memset( &ctxinfo.ccdata, sizeof(struct contextual_content), 0 );
gui_window_get_scroll(gw, &sx, &sy);
-
- browser_window_get_contextual_content( gw->browser->bw, mx+sx, my+sy,
+
+ browser_window_get_contextual_content( gw->browser->bw, mx+sx, my+sy,
(struct contextual_content*)&ctxinfo.ccdata);
-
- if( ctxinfo.ccdata.link_url ){
- ctxinfo.flags |= CNT_HREF;
- }
- if( ctxinfo.ccdata.object) {
- if( content_get_type(ctxinfo.ccdata.object) == CONTENT_IMAGE ){
- ctxinfo.flags |= CNT_IMG;
- }
- }
- if ( ctxinfo.ccdata.form_features == CTX_FORM_TEXT )
+
+ if( ctxinfo.ccdata.link_url ){
+ ctxinfo.flags |= CNT_HREF;
+ }
+ if( ctxinfo.ccdata.object) {
+ if( content_get_type(ctxinfo.ccdata.object) == CONTENT_IMAGE ){
+ ctxinfo.flags |= CNT_IMG;
+ }
+ }
+ if ( ctxinfo.ccdata.form_features == CTX_FORM_TEXT )
ctxinfo.flags |= (CNT_INTERACTIVE | CNT_SELECTION);
}
return(&ctxinfo);
-
-
+
+
}
/***
@@ -147,60 +147,59 @@ static char * get_tmpfilename(const char * prefix, const char * suffix)
} while(file_exists(tmpfilename));
return(tmpfilename);
-}
-
-//TODO: do not open popup for gui_window, but for a rootwin?
-void context_popup(struct gui_window * gw, short x, short y)
-{
-
-#define POP_FIRST_ITEM POP_CTX_CUT_SEL
-#define POP_LAST_ITEM POP_CTX_SAVE_LINK_AS
-
- OBJECT * pop;
- int choice;
- struct s_context_info * ctx;
- unsigned long size;
- const char * data;
- FILE * fp_tmpfile;
+}
+
+//TODO: do not open popup for gui_window, but for a rootwin?
+void context_popup(struct gui_window * gw, short x, short y)
+{
+
+#define POP_FIRST_ITEM POP_CTX_CUT_SEL
+#define POP_LAST_ITEM POP_CTX_SAVE_LINK_AS
+
+ OBJECT * pop;
+ int choice;
+ struct s_context_info * ctx;
+ unsigned long size;
+ const char * data;
+ FILE * fp_tmpfile;
char cmdline[128];
/* skip first byte, which must hold length of commandline: */
- char * tempfile = &cmdline[1];
- int err = 0;
- char * editor, *lastslash;
- MENU pop_menu, me_data;
-
- pop = gemtk_obj_get_tree( POP_CTX );
- if (pop == NULL)
- return;
- ctx = get_context_info(gw, x, y);
-
- /*
- Disable all items by default:
- */
- for( choice = POP_FIRST_ITEM; choice<=POP_LAST_ITEM; choice++ ){
- SET_BIT(pop[ choice ].ob_state, OS_DISABLED, 1);
- }
-
- if( ctx->flags & CNT_INTERACTIVE ){
- SET_BIT(pop[ POP_CTX_PASTE_SEL ].ob_state, OS_DISABLED, 0);
- }
-
- if( (ctx->flags & CNT_BROWSER) ){
- SET_BIT(pop[ POP_CTX_SELECT_ALL ].ob_state, OS_DISABLED, 0);
- SET_BIT(pop[ POP_CTX_COPY_SEL ].ob_state, OS_DISABLED, 0);
- SET_BIT(pop[ POP_CTX_VIEW_SOURCE ].ob_state, OS_DISABLED, 0);
+ char * tempfile = &cmdline[1];
+ char * editor;
+ MENU pop_menu, me_data;
+
+ pop = gemtk_obj_get_tree( POP_CTX );
+ if (pop == NULL)
+ return;
+ ctx = get_context_info(gw, x, y);
+
+ /*
+ Disable all items by default:
+ */
+ for( choice = POP_FIRST_ITEM; choice<=POP_LAST_ITEM; choice++ ){
+ SET_BIT(pop[ choice ].ob_state, OS_DISABLED, 1);
}
-
- if( ctx->flags & CNT_HREF ){
- SET_BIT(pop[ POP_CTX_COPY_LINK ].ob_state, OS_DISABLED, 0);
- SET_BIT(pop[ POP_CTX_OPEN_NEW ].ob_state, OS_DISABLED, 0);
- SET_BIT(pop[ POP_CTX_SAVE_LINK_AS ].ob_state, OS_DISABLED, 0);
- }
-
- if( ctx->flags & CNT_IMG ){
- SET_BIT(pop[ POP_CTX_SAVE_AS ].ob_state, OS_DISABLED, 0);
- SET_BIT(pop[ POP_CTX_COPY_URL ].ob_state, OS_DISABLED, 0);
- SET_BIT(pop[ POP_CTX_OPEN_NEW ].ob_state, OS_DISABLED, 0);
+
+ if( ctx->flags & CNT_INTERACTIVE ){
+ SET_BIT(pop[ POP_CTX_PASTE_SEL ].ob_state, OS_DISABLED, 0);
+ }
+
+ if( (ctx->flags & CNT_BROWSER) ){
+ SET_BIT(pop[ POP_CTX_SELECT_ALL ].ob_state, OS_DISABLED, 0);
+ SET_BIT(pop[ POP_CTX_COPY_SEL ].ob_state, OS_DISABLED, 0);
+ SET_BIT(pop[ POP_CTX_VIEW_SOURCE ].ob_state, OS_DISABLED, 0);
+ }
+
+ if( ctx->flags & CNT_HREF ){
+ SET_BIT(pop[ POP_CTX_COPY_LINK ].ob_state, OS_DISABLED, 0);
+ SET_BIT(pop[ POP_CTX_OPEN_NEW ].ob_state, OS_DISABLED, 0);
+ SET_BIT(pop[ POP_CTX_SAVE_LINK_AS ].ob_state, OS_DISABLED, 0);
+ }
+
+ if( ctx->flags & CNT_IMG ){
+ SET_BIT(pop[ POP_CTX_SAVE_AS ].ob_state, OS_DISABLED, 0);
+ SET_BIT(pop[ POP_CTX_COPY_URL ].ob_state, OS_DISABLED, 0);
+ SET_BIT(pop[ POP_CTX_OPEN_NEW ].ob_state, OS_DISABLED, 0);
}
// point mn_tree tree to states popup:
@@ -208,121 +207,119 @@ void context_popup(struct gui_window * gw, short x, short y)
pop_menu.mn_menu = 0;
pop_menu.mn_item = POP_CTX_CUT_SEL;
pop_menu.mn_scroll = SCROLL_NO;
- pop_menu.mn_keystate = 0;
+ pop_menu.mn_keystate = 0;
menu_popup(&pop_menu, x, y, &me_data);
- choice = me_data.mn_item;
-
- switch( choice ){
- case POP_CTX_COPY_SEL:
- browser_window_key_press(gw->browser->bw, KEY_COPY_SELECTION);
- break;
-
- case POP_CTX_CUT_SEL:
- browser_window_key_press(gw->browser->bw, KEY_CUT_SELECTION);
- break;
-
+ choice = me_data.mn_item;
+
+ switch( choice ){
+ case POP_CTX_COPY_SEL:
+ browser_window_key_press(gw->browser->bw, KEY_COPY_SELECTION);
+ break;
+
+ case POP_CTX_CUT_SEL:
+ browser_window_key_press(gw->browser->bw, KEY_CUT_SELECTION);
+ break;
+
case POP_CTX_PASTE_SEL:
- browser_window_key_press(gw->browser->bw, KEY_PASTE);
- break;
-
- case POP_CTX_SELECT_ALL:
- browser_window_key_press(gw->browser->bw, KEY_SELECT_ALL);
- break;
-
- case POP_CTX_SAVE_AS:
- if (ctx->ccdata.object != NULL) {
- if( hlcache_handle_get_url(ctx->ccdata.object) != NULL ) {
- browser_window_navigate(
- gw->browser->bw,
- hlcache_handle_get_url(ctx->ccdata.object),
- hlcache_handle_get_url(gw->browser->bw->current_content),
- BROWSER_WINDOW_DOWNLOAD |
- BROWSER_WINDOW_VERIFIABLE,
- NULL,
- NULL,
- NULL
- );
- }
- }
-
- case POP_CTX_SAVE_LINK_AS:
- if (ctx->ccdata.link_url != NULL) {
- nsurl *url;
+ browser_window_key_press(gw->browser->bw, KEY_PASTE);
+ break;
+
+ case POP_CTX_SELECT_ALL:
+ browser_window_key_press(gw->browser->bw, KEY_SELECT_ALL);
+ break;
+
+ case POP_CTX_SAVE_AS:
+ if (ctx->ccdata.object != NULL) {
+ if( hlcache_handle_get_url(ctx->ccdata.object) != NULL ) {
+ browser_window_navigate(
+ gw->browser->bw,
+ hlcache_handle_get_url(ctx->ccdata.object),
+ hlcache_handle_get_url(gw->browser->bw->current_content),
+ BW_NAVIGATE_DOWNLOAD,
+ NULL,
+ NULL,
+ NULL
+ );
+ }
+ }
+
+ case POP_CTX_SAVE_LINK_AS:
+ if (ctx->ccdata.link_url != NULL) {
+ nsurl *url;
nserror error;
error = nsurl_create(ctx->ccdata.link_url, &url);
- if (error == NSERROR_OK) {
- error = browser_window_navigate(
- gw->browser->bw,
- url,
- hlcache_handle_get_url(gw->browser->bw->current_content),
- BROWSER_WINDOW_DOWNLOAD |
- BROWSER_WINDOW_VERIFIABLE,
- NULL,
- NULL,
- NULL
- );
- nsurl_unref(url);
- }
+ if (error == NSERROR_OK) {
+ error = browser_window_navigate(
+ gw->browser->bw,
+ url,
+ hlcache_handle_get_url(gw->browser->bw->current_content),
+ BW_NAVIGATE_DOWNLOAD,
+ NULL,
+ NULL,
+ NULL
+ );
+ nsurl_unref(url);
+ }
if (error != NSERROR_OK) {
warn_user(messages_get_errorcode(error), 0);
}
- }
-
- break;
-
- case POP_CTX_COPY_URL:
- if ((ctx->flags & CNT_IMG) && (ctx->ccdata.object != NULL)) {
- if( hlcache_handle_get_url(ctx->ccdata.object) != NULL ){
+ }
+
+ break;
+
+ case POP_CTX_COPY_URL:
+ if ((ctx->flags & CNT_IMG) && (ctx->ccdata.object != NULL)) {
+ if( hlcache_handle_get_url(ctx->ccdata.object) != NULL ){
scrap_txt_write((char*)nsurl_access(
- hlcache_handle_get_url(ctx->ccdata.object)));
- }
- }
- break;
-
- case POP_CTX_COPY_LINK:
- if ((ctx->flags & CNT_HREF) && ctx->ccdata.link_url != NULL) {
- scrap_txt_write((char*)ctx->ccdata.link_url);
- }
- break;
-
- case POP_CTX_OPEN_NEW:
- if ((ctx->flags & CNT_HREF) && ctx->ccdata.link_url) {
+ hlcache_handle_get_url(ctx->ccdata.object)));
+ }
+ }
+ break;
+
+ case POP_CTX_COPY_LINK:
+ if ((ctx->flags & CNT_HREF) && ctx->ccdata.link_url != NULL) {
+ scrap_txt_write((char*)ctx->ccdata.link_url);
+ }
+ break;
+
+ case POP_CTX_OPEN_NEW:
+ if ((ctx->flags & CNT_HREF) && ctx->ccdata.link_url) {
nsurl *url;
nserror error;
error = nsurl_create(ctx->ccdata.link_url, &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(
+ BW_CREATE_HISTORY | BW_CREATE_CLONE,
url,
- hlcache_handle_get_url(gw->browser->bw->current_content),
- gw->browser->bw,
+ hlcache_handle_get_url(gw->browser->bw->current_content),
+ gw->browser->bw,
NULL
- );
+ );
nsurl_unref(url);
}
if (error != NSERROR_OK) {
warn_user(messages_get_errorcode(error), 0);
}
- }
- break;
-
- case POP_CTX_VIEW_SOURCE:
- editor = nsoption_charp(atari_editor);
- if (editor != NULL && strlen(editor)>0) {
- data = content_get_source_data(gw->browser->bw->current_content,
+ }
+ break;
+
+ case POP_CTX_VIEW_SOURCE:
+ editor = nsoption_charp(atari_editor);
+ if (editor != NULL && strlen(editor)>0) {
+ data = content_get_source_data(gw->browser->bw->current_content,
&size);
if (size > 0 && data != NULL){
snprintf(tempfile, 127, "%s", get_tmpfilename("ns-", ".html"));
/* the GEMDOS cmdline contains the length of the commandline
in the first byte: */
cmdline[0] = (unsigned char)strlen(tempfile);
- LOG(("Creating temporay source file: %s\n", tempfile));
- fp_tmpfile = fopen(tempfile, "w");
- if (fp_tmpfile != NULL){
- fwrite(data, size, 1, fp_tmpfile);
+ LOG(("Creating temporay source file: %s\n", tempfile));
+ fp_tmpfile = fopen(tempfile, "w");
+ if (fp_tmpfile != NULL){
+ fwrite(data, size, 1, fp_tmpfile);
fclose(fp_tmpfile);
// Send SH_WDRAW to notify files changed:
@@ -332,22 +329,22 @@ void context_popup(struct gui_window * gw, short x, short y)
if(strlen(tempfile)<=125){
shel_write(1, 1, 1, editor, cmdline);
}
- } else {
- printf("Could not open temp file: %s!\n", tempfile );
- }
-
- } else {
- LOG(("Invalid content!"));
- }
- } else {
- form_alert(0, "[1][Set option \"atari_editor\".][OK]");
- }
- break;
-
- default: break;
- }
-
-#undef POP_FIRST_ITEM
-#undef POP_LAST_ITEM
-
-}
+ } else {
+ printf("Could not open temp file: %s!\n", tempfile );
+ }
+
+ } else {
+ LOG(("Invalid content!"));
+ }
+ } else {
+ form_alert(0, "[1][Set option \"atari_editor\".][OK]");
+ }
+ break;
+
+ default: break;
+ }
+
+#undef POP_FIRST_ITEM
+#undef POP_LAST_ITEM
+
+}
diff --git a/atari/deskmenu.c b/atari/deskmenu.c
index ee8855cb0..96b2d02ce 100644
--- a/atari/deskmenu.c
+++ b/atari/deskmenu.c
@@ -1,13 +1,30 @@
+/*
+ * Copyright 2010 Ole Loots <ole@monochrom.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
#include <stdlib.h>
#include <cflib.h>
#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/url.h"
+#include "utils/messages.h"
#include "desktop/browser.h"
#include "desktop/browser_private.h"
#include "utils/nsoption.h"
-#include "desktop/save_complete.h"
+#include "desktop/save_complete.h"
#include "atari/res/netsurf.rsh"
#include "atari/gemtk/gemtk.h"
#include "atari/deskmenu.h"
@@ -27,19 +44,19 @@
typedef void __CDECL (*menu_evnt_func)(short item, short title, void * data);
-struct s_accelerator
-{
- char ascii; /* either ascii or */
- long keycode; /* normalised keycode is valid */
- short mod; /* shift / ctrl etc */
-};
-
-struct s_menu_item_evnt {
- short title; /* to which menu this item belongs */
- short rid; /* resource ID */
- menu_evnt_func menu_func; /* click handler */
- struct s_accelerator accel; /* accelerator info */
- char * menustr;
+struct s_accelerator
+{
+ char ascii; /* either ascii or */
+ long keycode; /* normalised keycode is valid */
+ short mod; /* shift / ctrl etc */
+};
+
+struct s_menu_item_evnt {
+ short title; /* to which menu this item belongs */
+ short rid; /* resource ID */
+ menu_evnt_func menu_func; /* click handler */
+ struct s_accelerator accel; /* accelerator info */
+ char * menustr;
};
static void register_menu_str(struct s_menu_item_evnt * mi);
@@ -50,23 +67,23 @@ extern bool html_redraw_debug;
extern struct gui_window * input_window;
extern char options[PATH_MAX];
extern const char * option_homepage_url;
-extern int option_window_width;
+extern int option_window_width;
extern int option_window_height;
extern int option_window_x;
extern int option_window_y;
static OBJECT * h_gem_menu;
-
-/* Zero based resource tree ids: */
-#define T_ABOUT 0
-#define T_FILE MAINMENU_T_FILE - MAINMENU_T_FILE + 1
-#define T_EDIT MAINMENU_T_EDIT - MAINMENU_T_FILE + 1
-#define T_VIEW MAINMENU_T_VIEW - MAINMENU_T_FILE + 1
-#define T_NAV MAINMENU_T_NAVIGATE - MAINMENU_T_FILE + 1
-#define T_UTIL MAINMENU_T_UTIL - MAINMENU_T_FILE + 1
-#define T_HELP MAINMENU_T_NAVIGATE - MAINMENU_T_FILE + 1
-/* Count of the above defines: */
+
+/* Zero based resource tree ids: */
+#define T_ABOUT 0
+#define T_FILE MAINMENU_T_FILE - MAINMENU_T_FILE + 1
+#define T_EDIT MAINMENU_T_EDIT - MAINMENU_T_FILE + 1
+#define T_VIEW MAINMENU_T_VIEW - MAINMENU_T_FILE + 1
+#define T_NAV MAINMENU_T_NAVIGATE - MAINMENU_T_FILE + 1
+#define T_UTIL MAINMENU_T_UTIL - MAINMENU_T_FILE + 1
+#define T_HELP MAINMENU_T_NAVIGATE - MAINMENU_T_FILE + 1
+/* Count of the above defines: */
#define NUM_MENU_TITLES 7
@@ -102,50 +119,50 @@ static void __CDECL menu_cookies(short item, short title, void *data);
static void __CDECL menu_vlog(short item, short title, void *data);
static void __CDECL menu_help_content(short item, short title, void *data);
-struct s_menu_item_evnt menu_evnt_tbl[] =
-{
- {T_ABOUT,MAINMENU_M_ABOUT, menu_about, {0,0,0}, NULL },
- {T_FILE, MAINMENU_M_NEWWIN, menu_new_win, {0,0,0}, NULL},
- {T_FILE, MAINMENU_M_OPENURL, menu_open_url, {'G',0,K_CTRL}, NULL},
- {T_FILE, MAINMENU_M_OPENFILE, menu_open_file, {'O',0,K_CTRL}, NULL},
- {T_FILE, MAINMENU_M_CLOSEWIN, menu_close_win, {0,0,0}, NULL},
- {T_FILE, MAINMENU_M_SAVEPAGE, menu_save_page, {0,NK_F3,0}, NULL},
- {T_FILE, MAINMENU_M_QUIT, menu_quit, {'Q',0,K_CTRL}, NULL},
- {T_EDIT, MAINMENU_M_CUT, menu_cut, {'X',0,K_CTRL}, NULL},
- {T_EDIT, MAINMENU_M_COPY, menu_copy, {'C',0,K_CTRL}, NULL},
- {T_EDIT, MAINMENU_M_PASTE, menu_paste, {'V',0,K_CTRL}, NULL},
- {T_EDIT, MAINMENU_M_FIND, menu_find, {0,NK_F4,0}, NULL},
+struct s_menu_item_evnt menu_evnt_tbl[] =
+{
+ {T_ABOUT,MAINMENU_M_ABOUT, menu_about, {0,0,0}, NULL },
+ {T_FILE, MAINMENU_M_NEWWIN, menu_new_win, {0,0,0}, NULL},
+ {T_FILE, MAINMENU_M_OPENURL, menu_open_url, {'G',0,K_CTRL}, NULL},
+ {T_FILE, MAINMENU_M_OPENFILE, menu_open_file, {'O',0,K_CTRL}, NULL},
+ {T_FILE, MAINMENU_M_CLOSEWIN, menu_close_win, {0,0,0}, NULL},
+ {T_FILE, MAINMENU_M_SAVEPAGE, menu_save_page, {0,NK_F3,0}, NULL},
+ {T_FILE, MAINMENU_M_QUIT, menu_quit, {'Q',0,K_CTRL}, NULL},
+ {T_EDIT, MAINMENU_M_CUT, menu_cut, {'X',0,K_CTRL}, NULL},
+ {T_EDIT, MAINMENU_M_COPY, menu_copy, {'C',0,K_CTRL}, NULL},
+ {T_EDIT, MAINMENU_M_PASTE, menu_paste, {'V',0,K_CTRL}, NULL},
+ {T_EDIT, MAINMENU_M_FIND, menu_find, {0,NK_F4,0}, NULL},
{T_VIEW, MAINMENU_M_RELOAD, menu_reload, {0,NK_F5,0}, NULL},
{T_VIEW, MAINMENU_INC_SCALE, menu_inc_scale, {'+',0,K_CTRL}, NULL},
- {T_VIEW, MAINMENU_DEC_SCALE, menu_dec_scale, {'-',0,K_CTRL}, NULL},
- {T_VIEW, MAINMENU_M_TOOLBARS, menu_toolbars, {0,NK_F1,K_CTRL}, NULL},
- {T_VIEW, MAINMENU_M_SAVEWIN, menu_savewin, {0,0,0}, NULL},
+ {T_VIEW, MAINMENU_DEC_SCALE, menu_dec_scale, {'-',0,K_CTRL}, NULL},
+ {T_VIEW, MAINMENU_M_TOOLBARS, menu_toolbars, {0,NK_F1,K_CTRL}, NULL},
+ {T_VIEW, MAINMENU_M_SAVEWIN, menu_savewin, {0,0,0}, NULL},
{T_VIEW, MAINMENU_M_DEBUG_RENDER, menu_debug_render, {0,0,0}, NULL},
{T_VIEW, MAINMENU_M_FG_IMAGES, menu_fg_images, {0,0,0}, NULL},
- {T_VIEW, MAINMENU_M_BG_IMAGES, menu_bg_images, {0,0,0}, NULL},
- {T_VIEW, MAINMENU_M_STOP, menu_stop, {0,NK_ESC,K_ALT}, NULL},
- {T_NAV, MAINMENU_M_BACK, menu_back, {0,NK_LEFT,K_ALT}, NULL},
- {T_NAV, MAINMENU_M_FORWARD, menu_forward, {0,NK_RIGHT,K_ALT}, NULL},
- {T_NAV, MAINMENU_M_HOME, menu_home, {0,0,0}, NULL},
- {T_UTIL, MAINMENU_M_LHISTORY,menu_lhistory, {0,NK_F7,0}, NULL},
- {T_UTIL, MAINMENU_M_GHISTORY, menu_ghistory, {0,NK_F7,K_CTRL}, NULL},
- {T_UTIL, MAINMENU_M_ADD_BOOKMARK, menu_add_bookmark, {'D',0,K_CTRL}, NULL},
+ {T_VIEW, MAINMENU_M_BG_IMAGES, menu_bg_images, {0,0,0}, NULL},
+ {T_VIEW, MAINMENU_M_STOP, menu_stop, {0,NK_ESC,K_ALT}, NULL},
+ {T_NAV, MAINMENU_M_BACK, menu_back, {0,NK_LEFT,K_ALT}, NULL},
+ {T_NAV, MAINMENU_M_FORWARD, menu_forward, {0,NK_RIGHT,K_ALT}, NULL},
+ {T_NAV, MAINMENU_M_HOME, menu_home, {0,0,0}, NULL},
+ {T_UTIL, MAINMENU_M_LHISTORY,menu_lhistory, {0,NK_F7,0}, NULL},
+ {T_UTIL, MAINMENU_M_GHISTORY, menu_ghistory, {0,NK_F7,K_CTRL}, NULL},
+ {T_UTIL, MAINMENU_M_ADD_BOOKMARK, menu_add_bookmark, {'D',0,K_CTRL}, NULL},
{T_UTIL, MAINMENU_M_BOOKMARKS, menu_bookmarks, {0,NK_F6,0}, NULL},
- {T_UTIL, MAINMENU_M_COOKIES, menu_cookies, {0,0,0}, NULL},
- {T_UTIL, MAINMENU_M_CHOICES, menu_choices, {0,0,0}, NULL},
- {T_UTIL, MAINMENU_M_VLOG, menu_vlog, {'V',0,K_ALT}, NULL},
- {T_HELP, MAINMENU_M_HELP_CONTENT, menu_help_content, {0,NK_F1,0}, NULL},
- {-1, -1, NULL,{0,0,0}, NULL }
+ {T_UTIL, MAINMENU_M_COOKIES, menu_cookies, {0,0,0}, NULL},
+ {T_UTIL, MAINMENU_M_CHOICES, menu_choices, {0,0,0}, NULL},
+ {T_UTIL, MAINMENU_M_VLOG, menu_vlog, {'V',0,K_ALT}, NULL},
+ {T_HELP, MAINMENU_M_HELP_CONTENT, menu_help_content, {0,NK_F1,0}, NULL},
+ {-1, -1, NULL,{0,0,0}, NULL }
};
/*
-static void __CDECL evnt_menu(WINDOW * win, short buff[8])
-{
- int title = buff[3];
- INT16 x,y;
- char *str;
- struct gui_window * gw = window_list;
+static void __CDECL evnt_menu(WINDOW * win, short buff[8])
+{
+ int title = buff[3];
+ INT16 x,y;
+ char *str;
+ struct gui_window * gw = window_list;
int i=0;
deskmenu_dispatch_item(buff[3], buff[4]);
@@ -155,23 +172,22 @@ static void __CDECL evnt_menu(WINDOW * win, short buff[8])
/*
Menu item event handlers:
*/
-
-static void __CDECL menu_about(short item, short title, void *data)
+
+static void __CDECL menu_about(short item, short title, void *data)
{
- /*
+ /*
nsurl *url;
nserror error;
- char buf[PATH_MAX];
+ char buf[PATH_MAX];
- LOG(("%s", __FUNCTION__));
- strcpy((char*)&buf, "file://");
+ LOG(("%s", __FUNCTION__));
+ strcpy((char*)&buf, "file://");
strncat((char*)&buf, (char*)"./doc/README.TXT",
- PATH_MAX - (strlen("file://")+1) );
+ PATH_MAX - (strlen("file://")+1) );
error = nsurl_create(buf, &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -183,15 +199,15 @@ static void __CDECL menu_about(short item, short title, void *data)
}
*/
atari_about_show();
-}
-
-static void __CDECL menu_new_win(short item, short title, void *data)
-{
+}
+
+static void __CDECL menu_new_win(short item, short title, void *data)
+{
nsurl *url;
nserror error;
const char *addr;
- LOG(("%s", __FUNCTION__));
+ LOG(("%s", __FUNCTION__));
if (nsoption_charp(homepage_url) != NULL) {
addr = nsoption_charp(homepage_url);
@@ -202,8 +218,7 @@ static void __CDECL menu_new_win(short item, short title, void *data)
/* create an initial browser window */
error = nsurl_create(addr, &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -214,18 +229,17 @@ static void __CDECL menu_new_win(short item, short title, void *data)
if (error != NSERROR_OK) {
warn_user(messages_get_errorcode(error), 0);
}
-}
-
-static void __CDECL menu_open_url(short item, short title, void *data)
-{
- struct gui_window * gw;
- struct browser_window * bw ;
+}
+
+static void __CDECL menu_open_url(short item, short title, void *data)
+{
+ struct gui_window * gw;
+ struct browser_window * bw ;
LOG(("%s", __FUNCTION__));
-
- gw = input_window;
- if( gw == NULL ) {
- browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+
+ gw = input_window;
+ if( gw == NULL ) {
+ browser_window_create(BW_CREATE_HISTORY,
NULL,
NULL,
NULL,
@@ -239,12 +253,12 @@ static void __CDECL menu_open_url(short item, short title, void *data)
window_set_focus(gw->root, URL_WIDGET, NULL);
/* delete selection: */
- toolbar_key_input(gw->root->toolbar, NK_DEL);
-}
-
-static void __CDECL menu_open_file(short item, short title, void *data)
+ toolbar_key_input(gw->root->toolbar, NK_DEL);
+}
+
+static void __CDECL menu_open_file(short item, short title, void *data)
{
-
+
LOG(("%s", __FUNCTION__));
const char * filename = file_select(messages_get("OpenFile"), "");
@@ -256,8 +270,7 @@ static void __CDECL menu_open_file(short item, short title, void *data)
error = nsurl_create(urltxt, &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -271,18 +284,18 @@ static void __CDECL menu_open_file(short item, short title, void *data)
free( urltxt );
}
}
-}
-
-static void __CDECL menu_close_win(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- if( input_window == NULL )
- return;
- gui_window_destroy( input_window );
-}
-
-static void __CDECL menu_save_page(short item, short title, void *data)
-{
+}
+
+static void __CDECL menu_close_win(short item, short title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ if( input_window == NULL )
+ return;
+ gui_window_destroy( input_window );
+}
+
+static void __CDECL menu_save_page(short item, short title, void *data)
+{
LOG(("%s", __FUNCTION__));
static bool init = true;
bool is_folder=false;
@@ -306,41 +319,40 @@ static void __CDECL menu_save_page(short item, short title, void *data)
if( path != NULL ){
save_complete(input_window->browser->bw->current_content, path, NULL);
}
-
-}
-
-static void __CDECL menu_quit(short item, short title, void *data)
-{
- short buff[8];
- memset( &buff, 0, sizeof(short)*8 );
+
+}
+
+static void __CDECL menu_quit(short item, short title, void *data)
+{
+ short buff[8];
+ memset( &buff, 0, sizeof(short)*8 );
+ LOG(("%s", __FUNCTION__));
+ gemtk_wm_send_msg(NULL, AP_TERM, 0, 0, 0, 0);
+}
+
+static void __CDECL menu_cut(short item, short title, void *data)
+{
+ if( input_window != NULL )
+ browser_window_key_press( input_window->browser->bw, KEY_CUT_SELECTION);
+}
+
+static void __CDECL menu_copy(short item, short title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ if( input_window != NULL )
+ browser_window_key_press( input_window->browser->bw, KEY_COPY_SELECTION);
+}
+
+static void __CDECL menu_paste(short item, short title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ if( input_window != NULL )
+ browser_window_key_press( input_window->browser->bw, KEY_PASTE);
+}
+
+static void __CDECL menu_find(short item, short title, void *data)
+{
LOG(("%s", __FUNCTION__));
- gemtk_wm_send_msg(NULL, AP_TERM, 0, 0, 0, 0);
-}
-
-static void __CDECL menu_cut(short item, short title, void *data)
-{
- if( input_window != NULL )
- browser_window_key_press( input_window->browser->bw, KEY_CUT_SELECTION);
-}
-
-static void __CDECL menu_copy(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- if( input_window != NULL )
- browser_window_key_press( input_window->browser->bw, KEY_COPY_SELECTION);
-}
-
-static void __CDECL menu_paste(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- if( input_window != NULL )
- browser_window_key_press( input_window->browser->bw, KEY_PASTE);
-}
-
-static void __CDECL menu_find(short item, short title, void *data)
-{
- static bool visible = false;
- LOG(("%s", __FUNCTION__));
if (input_window != NULL) {
if (input_window->search) {
window_close_search(input_window->root);
@@ -348,72 +360,76 @@ static void __CDECL menu_find(short item, short title, void *data)
else {
window_open_search(input_window->root, true);
}
- }
-}
-
-static void __CDECL menu_choices(short item, short title, void *data)
+ }
+}
+
+static void __CDECL menu_choices(short item, short title, void *data)
{
LOG(("%s", __FUNCTION__));
- open_settings();
-}
-
-static void __CDECL menu_stop(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- if( input_window == NULL )
+ open_settings();
+}
+
+static void __CDECL menu_stop(short item, short title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ if( input_window == NULL )
return;
- assert(input_window && input_window->root);
- toolbar_stop_click(input_window->root->toolbar);
-
-}
-
-static void __CDECL menu_reload(short item, short title, void *data)
-{
- if(input_window == NULL)
- return;
- toolbar_reload_click(input_window->root->toolbar);
- LOG(("%s", __FUNCTION__));
+ assert(input_window && input_window->root);
+ toolbar_stop_click(input_window->root->toolbar);
+
}
+static void __CDECL menu_reload(short item, short title, void *data)
+{
+ if(input_window == NULL)
+ return;
+ toolbar_reload_click(input_window->root->toolbar);
+ LOG(("%s", __FUNCTION__));
+}
-static void __CDECL menu_inc_scale(short item, short title, void *data)
+
+static void __CDECL menu_inc_scale(short item, short title, void *data)
{
- if(input_window == NULL)
- return;
+ if(input_window == NULL)
+ return;
- gui_window_set_scale(input_window, gui_window_get_scale(input_window)+0.25);
+ browser_window_set_scale(input_window->browser->bw,
+ browser_window_get_scale(input_window->browser->bw) + 0.25,
+ true);
}
-static void __CDECL menu_dec_scale(short item, short title, void *data)
+static void __CDECL menu_dec_scale(short item, short title, void *data)
{
- if(input_window == NULL)
+ if(input_window == NULL)
return;
- gui_window_set_scale(input_window, gui_window_get_scale(input_window)-0.25);
+ browser_window_set_scale(input_window->browser->bw,
+ browser_window_get_scale(input_window->browser->bw) - 0.25,
+ true);
}
-
-
-static void __CDECL menu_toolbars(short item, short title, void *data)
+
+
+static void __CDECL menu_toolbars(short item, short title, void *data)
{
- static int state = 0;
+ static int state = 0;
LOG(("%s", __FUNCTION__));
if( input_window != null && input_window->root->toolbar != null ){
state = !state;
// TODO: implement toolbar hide
//toolbar_hide(input_window->root->toolbar, state );
- }
-}
-
-static void __CDECL menu_savewin(short item, short title, void *data)
-{
+ }
+}
+
+static void __CDECL menu_savewin(short item, short title, void *data)
+{
LOG(("%s", __FUNCTION__));
if (input_window && input_window->browser) {
GRECT rect;
wind_get_grect(gemtk_wm_get_handle(input_window->root->win), WF_CURRXYWH,
- &rect);
+ &rect);
option_window_width = rect.g_w;
option_window_height = rect.g_h;
option_window_x = rect.g_x;
@@ -424,112 +440,112 @@ static void __CDECL menu_savewin(short item, short title, void *data)
nsoption_set_int(window_y, rect.g_y);
nsoption_write((const char*)&options, NULL, NULL);
}
-
-}
-
-static void __CDECL menu_debug_render(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- html_redraw_debug = !html_redraw_debug;
- if( input_window != NULL ) {
+
+}
+
+static void __CDECL menu_debug_render(short item, short title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ html_redraw_debug = !html_redraw_debug;
+ if( input_window != NULL ) {
if ( input_window->browser != NULL
- && input_window->browser->bw != NULL) {
+ && input_window->browser->bw != NULL) {
GRECT rect;
- window_get_grect(input_window->root, BROWSER_AREA_CONTENT, &rect);
+ window_get_grect(input_window->root, BROWSER_AREA_CONTENT, &rect);
browser_window_reformat(input_window->browser->bw, false,
rect.g_w, rect.g_h );
menu_icheck(h_gem_menu, MAINMENU_M_DEBUG_RENDER,
- (html_redraw_debug) ? 1 : 0);
- }
- }
+ (html_redraw_debug) ? 1 : 0);
+ }
+ }
}
-static void __CDECL menu_fg_images(short item, short title, void *data)
-{
+static void __CDECL menu_fg_images(short item, short title, void *data)
+{
nsoption_set_bool(foreground_images, !nsoption_bool(foreground_images));
menu_icheck(h_gem_menu, MAINMENU_M_FG_IMAGES,
- (nsoption_bool(foreground_images)) ? 1 : 0);
+ (nsoption_bool(foreground_images)) ? 1 : 0);
}
-static void __CDECL menu_bg_images(short item, short title, void *data)
-{
+static void __CDECL menu_bg_images(short item, short title, void *data)
+{
nsoption_set_bool(background_images, !nsoption_bool(background_images));
menu_icheck(h_gem_menu, MAINMENU_M_BG_IMAGES,
- (nsoption_bool(background_images)) ? 1 : 0);
-}
-
-static void __CDECL menu_back(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- if( input_window == NULL )
- return;
- toolbar_back_click(input_window->root->toolbar);
-}
-
-static void __CDECL menu_forward(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- if( input_window == NULL )
- return;
- toolbar_forward_click(input_window->root->toolbar);
-}
-
-static void __CDECL menu_home(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- if( input_window == NULL )
- return;
- toolbar_home_click(input_window->root->toolbar);
-}
-
-static void __CDECL menu_lhistory(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- if( input_window == NULL )
- return;
-}
-
-static void __CDECL menu_ghistory(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- atari_global_history_open();
-}
-
-static void __CDECL menu_add_bookmark(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- if (input_window) {
- if( input_window->browser->bw->current_content != NULL ){
- atari_hotlist_add_page(
- nsurl_access(hlcache_handle_get_url(input_window->browser->bw->current_content)),
- NULL
- );
- }
- }
-}
-
-static void __CDECL menu_bookmarks(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- atari_hotlist_open();
-}
-
-static void __CDECL menu_cookies(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
- atari_cookie_manager_open();
-}
-
-static void __CDECL menu_vlog(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
+ (nsoption_bool(background_images)) ? 1 : 0);
+}
+
+static void __CDECL menu_back(short item, short title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ if( input_window == NULL )
+ return;
+ toolbar_back_click(input_window->root->toolbar);
+}
+
+static void __CDECL menu_forward(short item, short title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ if( input_window == NULL )
+ return;
+ toolbar_forward_click(input_window->root->toolbar);
+}
+
+static void __CDECL menu_home(short item, short title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ if( input_window == NULL )
+ return;
+ toolbar_home_click(input_window->root->toolbar);
+}
+
+static void __CDECL menu_lhistory(short item, short title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ if( input_window == NULL )
+ return;
+}
+
+static void __CDECL menu_ghistory(short item, short title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ atari_global_history_open();
+}
+
+static void __CDECL menu_add_bookmark(short item, short title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ if (input_window) {
+ if( input_window->browser->bw->current_content != NULL ){
+ atari_hotlist_add_page(
+ nsurl_access(hlcache_handle_get_url(input_window->browser->bw->current_content)),
+ NULL
+ );
+ }
+ }
+}
+
+static void __CDECL menu_bookmarks(short item, short title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ atari_hotlist_open();
+}
+
+static void __CDECL menu_cookies(short item, short title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
+ atari_cookie_manager_open();
+}
+
+static void __CDECL menu_vlog(short item, short title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
verbose_log = !verbose_log;
- menu_icheck(h_gem_menu, MAINMENU_M_VLOG, (verbose_log) ? 1 : 0);
-}
-
-static void __CDECL menu_help_content(short item, short title, void *data)
-{
- LOG(("%s", __FUNCTION__));
+ menu_icheck(h_gem_menu, MAINMENU_M_VLOG, (verbose_log) ? 1 : 0);
+}
+
+static void __CDECL menu_help_content(short item, short title, void *data)
+{
+ LOG(("%s", __FUNCTION__));
}
/*
@@ -618,7 +634,6 @@ static void register_menu_str( struct s_menu_item_evnt * mi )
// find keycodes / chracters:
if( str[x] <= 28 ){
// parse symbol
- unsigned short keycode=0;
switch( str[x] ){
case 0x03:
accel->keycode = NK_RIGHT;
@@ -674,8 +689,8 @@ void deskmenu_init(void)
/* Install menu: */
menu_bar(h_gem_menu, MENU_INSTALL);
- /* parse and update menu items: */
- i = 0;
+ /* parse and update menu items: */
+ i = 0;
while (menu_evnt_tbl[i].rid != -1) {
if(menu_evnt_tbl[i].rid > 0 && menu_evnt_tbl[i].title > 0){
register_menu_str( &menu_evnt_tbl[i] );
@@ -685,7 +700,7 @@ void deskmenu_init(void)
menu_evnt_tbl[i].menustr);
}
}
- i++;
+ i++;
}
deskmenu_update();
/* Redraw menu: */
@@ -700,14 +715,14 @@ void deskmenu_destroy(void)
int i;
/* Remove menu from desktop: */
- menu_bar(h_gem_menu, MENU_REMOVE);
+ menu_bar(h_gem_menu, MENU_REMOVE);
/* Free modified menu titles: */
- i=0;
- while(menu_evnt_tbl[i].rid != -1) {
- if( menu_evnt_tbl[i].menustr != NULL )
- free(menu_evnt_tbl[i].menustr);
- i++;
+ i=0;
+ while(menu_evnt_tbl[i].rid != -1) {
+ if( menu_evnt_tbl[i].menustr != NULL )
+ free(menu_evnt_tbl[i].menustr);
+ i++;
}
}
@@ -734,21 +749,21 @@ int deskmenu_dispatch_item(short title, short item)
// legacy code, is this sensible?:
/*
- while( gw ) {
- window_set_focus( gw, WIDGET_NONE, NULL );
- gw = gw->next;
+ while( gw ) {
+ window_set_focus( gw, WIDGET_NONE, NULL );
+ gw = gw->next;
}
*/
- while (menu_evnt_tbl[i].rid != -1) {
+ while (menu_evnt_tbl[i].rid != -1) {
if (menu_evnt_tbl[i].rid == item) {
- if (menu_evnt_tbl[i].menu_func != NULL) {
+ if (menu_evnt_tbl[i].menu_func != NULL) {
menu_evnt_tbl[i].menu_func(item, title, NULL);
- }
- break;
- }
- i++;
+ }
+ break;
+ }
+ i++;
}
return(retval);
@@ -769,10 +784,10 @@ int deskmenu_dispatch_keypress(unsigned short kcode, unsigned short kstate,
sascii = gemtk_keybd2ascii(kcode, K_LSHIFT);
}
- /* Iterate through the menu function table: */
- while( menu_evnt_tbl[i].rid != -1 && done == false) {
+ /* Iterate through the menu function table: */
+ while( menu_evnt_tbl[i].rid != -1 && done == false) {
if( kstate == menu_evnt_tbl[i].accel.mod
- && menu_evnt_tbl[i].accel.ascii != 0) {
+ && menu_evnt_tbl[i].accel.ascii != 0) {
if( menu_evnt_tbl[i].accel.ascii == sascii) {
if (menu_evnt_tbl[i].title > 0 && menu_evnt_tbl[i].rid > 0) {
deskmenu_dispatch_item(menu_evnt_tbl[i].title,
@@ -781,15 +796,15 @@ int deskmenu_dispatch_keypress(unsigned short kcode, unsigned short kstate,
else {
/* Keyboard shortcut not displayed within menu: */
menu_evnt_tbl[i].menu_func(0, 0, NULL);
- }
- done = true;
- break;
- }
- } else {
- /* the accel code hides in the keycode: */
- if( menu_evnt_tbl[i].accel.keycode != 0) {
- if( menu_evnt_tbl[i].accel.keycode == (nkc & 0xFF) &&
- kstate == menu_evnt_tbl[i].accel.mod) {
+ }
+ done = true;
+ break;
+ }
+ } else {
+ /* the accel code hides in the keycode: */
+ if( menu_evnt_tbl[i].accel.keycode != 0) {
+ if( menu_evnt_tbl[i].accel.keycode == (nkc & 0xFF) &&
+ kstate == menu_evnt_tbl[i].accel.mod) {
if (menu_evnt_tbl[i].title > 0 && menu_evnt_tbl[i].rid > 0) {
deskmenu_dispatch_item(menu_evnt_tbl[i].title,
menu_evnt_tbl[i].rid);
@@ -797,13 +812,13 @@ int deskmenu_dispatch_keypress(unsigned short kcode, unsigned short kstate,
else {
/* Keyboard shortcut not displayed within menu: */
menu_evnt_tbl[i].menu_func(0, 0, NULL);
- }
- done = true;
- break;
- }
- }
- }
- i++;
+ }
+ done = true;
+ break;
+ }
+ }
+ }
+ i++;
}
return((done==true) ? 1 : 0);
}
diff --git a/atari/download.c b/atari/download.c
index e4a45e82e..7e44cda89 100755
--- a/atari/download.c
+++ b/atari/download.c
@@ -1,49 +1,47 @@
-/*
- * Copyright 2010 Ole Loots <ole@monochrom.net>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
+/*
+ * Copyright 2010 Ole Loots <ole@monochrom.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
#include <stdbool.h>
-
-#include "content/urldb.h"
-#include "content/fetch.h"
-#include "desktop/gui.h"
-#include "desktop/local_history.h"
-#include "desktop/netsurf.h"
-#include "utils/nsoption.h"
-#include "desktop/save_complete.h"
-#include "desktop/textinput.h"
-#include "desktop/download.h"
-#include "render/html.h"
-#include "utils/url.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/utils.h"
-#include "atari/gui.h"
-#include "atari/misc.h"
-#include "atari/res/netsurf.rsh"
-#include "atari/download.h"
-#include "atari/osspec.h"
+
+#include "content/urldb.h"
+#include "content/fetch.h"
+#include "desktop/gui.h"
+#include "desktop/netsurf.h"
+#include "utils/nsoption.h"
+#include "desktop/save_complete.h"
+#include "desktop/textinput.h"
+#include "desktop/download.h"
+#include "render/html.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/utils.h"
+#include "atari/gui.h"
+#include "atari/misc.h"
+#include "atari/res/netsurf.rsh"
+#include "atari/download.h"
+#include "atari/osspec.h"
extern struct gui_window * input_window;
extern GRECT desk_area;
@@ -124,7 +122,7 @@ static short on_aes_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
}
return(retval);
-}
+}
static void on_redraw(struct gui_download_window *dw, GRECT *clip)
{
@@ -148,8 +146,8 @@ static void on_redraw(struct gui_download_window *dw, GRECT *clip)
((TEDINFO *)get_obspec(tree, DOWNLOAD_LBL_PERCENT))->te_ptext = dw->lbl_percent;
((TEDINFO *)get_obspec(tree, DOWNLOAD_LBL_SPEED))->te_ptext = dw->lbl_speed;
- if (dw->size_total > 0 ) {
- p = ((double)dw->size_downloaded / (double)dw->size_total * 100);
+ if (dw->size_total > 0 ) {
+ p = ((double)dw->size_downloaded / (double)dw->size_total * 100);
}
tree[DOWNLOAD_PROGRESS_DONE].ob_width = MAX( MIN( p*(DOWNLOAD_BAR_MAX/100),
DOWNLOAD_BAR_MAX ), 1);
@@ -169,58 +167,58 @@ static void on_redraw(struct gui_download_window *dw, GRECT *clip)
wind_get_grect(dw->aes_handle, WF_NEXTXYWH, &visible);
}
}
-
-static void on_abort_click(struct gui_download_window *dw)
-{
+
+static void on_abort_click(struct gui_download_window *dw)
+{
if( dw->status == NSATARI_DOWNLOAD_COMPLETE
|| dw->status == NSATARI_DOWNLOAD_ERROR ) {
gemtk_wm_send_msg(dw->guiwin, WM_CLOSED, 0,0,0,0);
- }
- else if( dw->status != NSATARI_DOWNLOAD_CANCELED ){
- dw->abort = true;
- }
-}
-
-static void on_cbrdy_click(struct gui_download_window *dw)
+ }
+ else if( dw->status != NSATARI_DOWNLOAD_CANCELED ){
+ dw->abort = true;
+ }
+}
+
+static void on_cbrdy_click(struct gui_download_window *dw)
{
- dw->close_on_finish = !dw->close_on_finish;
+ dw->close_on_finish = !dw->close_on_finish;
if (dw->close_on_finish && dw->status == NSATARI_DOWNLOAD_COMPLETE) {
gemtk_wm_send_msg(dw->guiwin, WM_CLOSED, 0,0,0,0);
}
gemtk_wm_exec_redraw(dw->guiwin, NULL);
- evnt_timer(250);
-}
-
-static void on_close(struct gui_download_window * dw)
-{
- gui_download_window_destroy(dw);
-}
-
-static void gui_download_window_destroy( struct gui_download_window * gdw)
-{
-
-
- LOG((""));
- if (gdw->status == NSATARI_DOWNLOAD_WORKING) {
- download_context_abort(gdw->ctx);
- }
-
- download_context_destroy(gdw->ctx);
-
- if (gdw->destination) {
- free( gdw->destination );
- }
- if (gdw->fd != NULL) {
- fclose(gdw->fd);
- gdw->fd = NULL;
- }
- if (gdw->fbuf != NULL) {
- free( gdw->fbuf );
- }
+ evnt_timer(250);
+}
+
+static void on_close(struct gui_download_window * dw)
+{
+ gui_download_window_destroy(dw);
+}
+
+static void gui_download_window_destroy( struct gui_download_window * gdw)
+{
+
+
+ LOG((""));
+ if (gdw->status == NSATARI_DOWNLOAD_WORKING) {
+ download_context_abort(gdw->ctx);
+ }
+
+ download_context_destroy(gdw->ctx);
+
+ if (gdw->destination) {
+ free( gdw->destination );
+ }
+ if (gdw->fd != NULL) {
+ fclose(gdw->fd);
+ gdw->fd = NULL;
+ }
+ if (gdw->fbuf != NULL) {
+ free( gdw->fbuf );
+ }
gemtk_wm_remove(gdw->guiwin);
wind_close(gdw->aes_handle);
- wind_delete(gdw->aes_handle);
- free(gdw);
+ wind_delete(gdw->aes_handle);
+ free(gdw);
}
static char * select_filepath( const char * path, const char * filename )
@@ -244,15 +242,14 @@ static char * select_filepath( const char * path, const char * filename )
printf("download file: %s\n", ret);
return(ret);
-}
+}
-struct gui_download_window * gui_download_window_create(download_context *ctx,
- struct gui_window *parent)
+static struct gui_download_window *
+gui_download_window_create(download_context *ctx, struct gui_window *parent)
{
- const char *filename;
- char *destination;
- char gdos_path[PATH_MAX];
- const char * url;
+ const char *filename;
+ char *destination;
+ char gdos_path[PATH_MAX];
struct gui_download_window * gdw;
int dlgres = 0;
OBJECT * tree = gemtk_obj_get_tree(DOWNLOAD);
@@ -261,19 +258,19 @@ struct gui_download_window * gui_download_window_create(download_context *ctx,
LOG(("Creating download window for gui window: %p", parent));
- /* TODO: Implement real form and use messages file strings! */
-
+ /* TODO: Implement real form and use messages file strings! */
+
if (tree == NULL){
die("Couldn't find AES Object tree for download window!");
return(NULL);
}
-
+
filename = download_context_get_filename((const download_context*)ctx);
snprintf(alert, 200, "[2][Accept download?|%.*s][Yes|Save as...|No]",
40,filename);
- dlgres = form_alert(2, alert);
- if( dlgres == 3){
- return( NULL );
+ dlgres = form_alert(2, alert);
+ if( dlgres == 3){
+ return( NULL );
}
else if( dlgres == 2 ){
gemdos_realpath(nsoption_charp(downloads_path), gdos_path);
@@ -288,39 +285,38 @@ struct gui_download_window * gui_download_window_create(download_context *ctx,
destination = malloc( dstsize );
snprintf(destination, dstsize, "%s/%s", gdos_path, filename);
}
-
- gdw = calloc(1, sizeof(struct gui_download_window));
+
+ gdw = calloc(1, sizeof(struct gui_download_window));
if( gdw == NULL ){
warn_user(NULL, "Out of memory!");
- free( destination );
+ free( destination );
return( NULL );
}
-
- gdw->ctx = ctx;
- gdw->abort = false;
- gdw->start = clock() / CLOCKS_PER_SEC;
- gdw->lastrdw = 0;
- gdw->status = NSATARI_DOWNLOAD_WORKING;
- gdw->parent = parent;
- gdw->fbufsize = MAX(BUFSIZ, 48000);
- gdw->size_downloaded = 0;
+
+ gdw->ctx = ctx;
+ gdw->abort = false;
+ gdw->start = clock() / CLOCKS_PER_SEC;
+ gdw->lastrdw = 0;
+ gdw->status = NSATARI_DOWNLOAD_WORKING;
+ gdw->parent = parent;
+ gdw->fbufsize = MAX(BUFSIZ, 48000);
+ gdw->size_downloaded = 0;
gdw->size_total = download_context_get_total_length(ctx);
gdw->destination = destination;
- gdw->tree = tree;
- url = download_context_get_url(ctx);
-
- gdw->fd = fopen(gdw->destination, "wb");
+ gdw->tree = tree;
+
+ gdw->fd = fopen(gdw->destination, "wb");
if( gdw->fd == NULL ){
char spare[200];
snprintf(spare, 200, "Couldn't open %s for writing!", gdw->destination);
- gemtk_msg_box_show(GEMTK_MSG_BOX_ALERT, spare);
- gui_download_window_destroy(gdw);
- return( NULL );
+ gemtk_msg_box_show(GEMTK_MSG_BOX_ALERT, spare);
+ gui_download_window_destroy(gdw);
+ return( NULL );
}
-
- gdw->fbuf = malloc( gdw->fbufsize+1 );
- if( gdw->fbuf != NULL ){
- setvbuf( gdw->fd, gdw->fbuf, _IOFBF, gdw->fbufsize );
+
+ gdw->fbuf = malloc( gdw->fbufsize+1 );
+ if( gdw->fbuf != NULL ){
+ setvbuf( gdw->fd, gdw->fbuf, _IOFBF, gdw->fbufsize );
}
gdw->aes_handle = wind_create_grect(CLOSER | NAME | MOVER, &desk_area);
@@ -328,17 +324,17 @@ struct gui_download_window * gui_download_window_create(download_context *ctx,
unsigned long gwflags = GEMTK_WM_FLAG_DEFAULTS;
gdw->guiwin = gemtk_wm_add(gdw->aes_handle, gwflags, on_aes_event);
if( gdw->guiwin == NULL || gdw->fd == NULL ){
- die("could not create guiwin");
- gui_download_window_destroy(gdw);
- return( NULL );
+ die("could not create guiwin");
+ gui_download_window_destroy(gdw);
+ return( NULL );
}
gemtk_wm_set_user_data(gdw->guiwin, gdw);
gemtk_wm_set_toolbar(gdw->guiwin, tree, 0, 0);
- gemtk_wm_set_toolbar_redraw_func(gdw->guiwin, toolbar_redraw_cb);
-
- strncpy((char*)&gdw->lbl_file, filename, MAX_SLEN_LBL_FILE-1);
- LOG(("created download: %s (total size: %d)",
- gdw->destination, gdw->size_total
+ gemtk_wm_set_toolbar_redraw_func(gdw->guiwin, toolbar_redraw_cb);
+
+ strncpy((char*)&gdw->lbl_file, filename, MAX_SLEN_LBL_FILE-1);
+ LOG(("created download: %s (total size: %d)",
+ gdw->destination, gdw->size_total
));
GRECT work, curr;
@@ -357,100 +353,104 @@ struct gui_download_window * gui_download_window_create(download_context *ctx,
return(gdw);
}
-
-
-nserror gui_download_window_data(struct gui_download_window *dw,
- const char *data, unsigned int size)
-{
-
- uint32_t clck = clock();
- uint32_t tnow = clck / (CLOCKS_PER_SEC>>3);
+
+
+static nserror gui_download_window_data(struct gui_download_window *dw,
+ const char *data, unsigned int size)
+{
+
+ uint32_t clck = clock();
+ uint32_t tnow = clck / (CLOCKS_PER_SEC>>3);
uint32_t sdiff = (clck / (CLOCKS_PER_SEC)) - dw->start;
- uint32_t p = 0;
- float speed;
- float pf = 0;
LOG((""));
- OBJECT * tree = dw->tree;
-
if(dw->abort == true){
- dw->status = NSATARI_DOWNLOAD_CANCELED;
- dw->abort = false;
+ dw->status = NSATARI_DOWNLOAD_CANCELED;
+ dw->abort = false;
download_context_abort(dw->ctx);
- gemtk_wm_exec_redraw(dw->guiwin, NULL);
- return(NSERROR_OK);
- }
-
- /* save data */
- fwrite( data , size, sizeof(unsigned char),dw->fd );
+ gemtk_wm_exec_redraw(dw->guiwin, NULL);
+ return(NSERROR_OK);
+ }
+
+ /* save data */
+ fwrite( data , size, sizeof(unsigned char),dw->fd );
dw->size_downloaded += size;
- /* Update GUI */
+ /* Update GUI */
if ((tnow - dw->lastrdw) > 1) {
+ float speed;
+
+ dw->lastrdw = tnow;
+ speed = dw->size_downloaded / sdiff;
- dw->lastrdw = tnow;
- speed = dw->size_downloaded / sdiff;
-
if( dw->size_total > 0 ){
- p = ((double)dw->size_downloaded / (double)dw->size_total * 100);
- snprintf( (char*)&dw->lbl_percent, MAX_SLEN_LBL_PERCENT,
- "%lu%s", p, "%"
- );
- } else {
- snprintf( (char*)&dw->lbl_percent, MAX_SLEN_LBL_PERCENT,
- "%s", "?%"
- );
- }
- snprintf( (char*)&dw->lbl_speed, MAX_SLEN_LBL_SPEED, "%s/s",
- human_friendly_bytesize(speed)
- );
- snprintf( (char*)&dw->lbl_done, MAX_SLEN_LBL_DONE, "%s / %s",
- human_friendly_bytesize(dw->size_downloaded),
- (dw->size_total>0) ? human_friendly_bytesize(dw->size_total) : "?"
+ uint32_t p = 0;
+ p = ((double)dw->size_downloaded / (double)dw->size_total * 100);
+ snprintf( (char*)&dw->lbl_percent, MAX_SLEN_LBL_PERCENT,
+ "%lu%s", p, "%"
+ );
+ } else {
+ snprintf( (char*)&dw->lbl_percent, MAX_SLEN_LBL_PERCENT,
+ "%s", "?%"
+ );
+ }
+ snprintf( (char*)&dw->lbl_speed, MAX_SLEN_LBL_SPEED, "%s/s",
+ human_friendly_bytesize(speed)
+ );
+ snprintf( (char*)&dw->lbl_done, MAX_SLEN_LBL_DONE, "%s / %s",
+ human_friendly_bytesize(dw->size_downloaded),
+ (dw->size_total>0) ? human_friendly_bytesize(dw->size_total) : "?"
);
- gemtk_wm_exec_redraw(dw->guiwin, NULL);
- }
- return NSERROR_OK;
-}
-
-void gui_download_window_error(struct gui_download_window *dw,
- const char *error_msg)
-{
- LOG(("%s", error_msg));
- strncpy((char*)&dw->lbl_file, error_msg, MAX_SLEN_LBL_FILE-1);
- dw->status = NSATARI_DOWNLOAD_ERROR;
+ gemtk_wm_exec_redraw(dw->guiwin, NULL);
+ }
+ return NSERROR_OK;
+}
+
+static void gui_download_window_error(struct gui_download_window *dw,
+ const char *error_msg)
+{
+ LOG(("%s", error_msg));
+ strncpy((char*)&dw->lbl_file, error_msg, MAX_SLEN_LBL_FILE-1);
+ dw->status = NSATARI_DOWNLOAD_ERROR;
gemtk_wm_exec_redraw(dw->guiwin, NULL);
gui_window_set_status(input_window, messages_get("Done") );
- // TODO: change abort to close
-}
-
-void gui_download_window_done(struct gui_download_window *dw)
+ // TODO: change abort to close
+}
+
+static void gui_download_window_done(struct gui_download_window *dw)
{
- OBJECT * tree;
LOG((""));
-// TODO: change abort to close
+// TODO: change abort to close
dw->status = NSATARI_DOWNLOAD_COMPLETE;
-
- if( dw->fd != NULL ) {
- fclose( dw->fd );
- dw->fd = NULL;
- }
- tree = dw->tree;
+ if( dw->fd != NULL ) {
+ fclose( dw->fd );
+ dw->fd = NULL;
+ }
+
if (dw->close_on_finish) {
- gemtk_wm_send_msg(dw->guiwin, WM_CLOSED, 0, 0, 0, 0);
+ gemtk_wm_send_msg(dw->guiwin, WM_CLOSED, 0, 0, 0, 0);
} else {
- snprintf( (char*)&dw->lbl_percent, MAX_SLEN_LBL_PERCENT,
- "%lu%s", 100, "%"
- );
- snprintf( (char*)&dw->lbl_done, MAX_SLEN_LBL_DONE, "%s / %s",
- human_friendly_bytesize(dw->size_downloaded),
- (dw->size_total>0) ? human_friendly_bytesize(dw->size_total) : human_friendly_bytesize(dw->size_downloaded)
- );
+ snprintf( (char*)&dw->lbl_percent, MAX_SLEN_LBL_PERCENT,
+ "%lu%s", 100, "%"
+ );
+ snprintf( (char*)&dw->lbl_done, MAX_SLEN_LBL_DONE, "%s / %s",
+ human_friendly_bytesize(dw->size_downloaded),
+ (dw->size_total>0) ? human_friendly_bytesize(dw->size_total) : human_friendly_bytesize(dw->size_downloaded)
+ );
gemtk_wm_exec_redraw(dw->guiwin, NULL);
}
- gui_window_set_status(input_window, messages_get("Done") );
-}
+ gui_window_set_status(input_window, messages_get("Done") );
+}
+
+static struct gui_download_table download_table = {
+ .create = gui_download_window_create,
+ .data = gui_download_window_data,
+ .error = gui_download_window_error,
+ .done = gui_download_window_done,
+};
+
+struct gui_download_table *atari_download_table = &download_table;
diff --git a/atari/download.h b/atari/download.h
index e25893d4a..82f89c050 100755
--- a/atari/download.h
+++ b/atari/download.h
@@ -19,6 +19,8 @@
#ifndef NS_ATARI_DOWNLOAD_H
#define NS_ATARI_DOWNLOAD_H
+extern struct gui_download_table *atari_download_table;
+
#define MAX_SLEN_LBL_DONE 64
#define MAX_SLEN_LBL_PERCENT 5
#define MAX_SLEN_LBL_SPEED 13
diff --git a/atari/encoding.c b/atari/encoding.c
index 0212d51c4..7a60eeeb9 100644
--- a/atari/encoding.c
+++ b/atari/encoding.c
@@ -16,28 +16,30 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <stdlib.h>
+
+#include "desktop/gui.h"
+
#include "atari/encoding.h"
/* TODO: this need a rework..., encoding to atari st doesn|t always work.
( gui_add_to_clipboard...) */
-utf8_convert_ret utf8_to_local_encoding(const char *string,
+nserror utf8_to_local_encoding(const char *string,
size_t len,
char **result)
{
- utf8_convert_ret r;
+ nserror r;
r = utf8_to_enc(string, "ATARIST", len, result);
- if(r != UTF8_CONVERT_OK) {
+ if(r != NSERROR_OK) {
r = utf8_to_enc(string, "UTF-8", len, result);
- assert( r == UTF8_CONVERT_OK );
+ assert( r == NSERROR_OK );
}
return r;
}
-utf8_convert_ret utf8_from_local_encoding(const char *string,
- size_t len,
- char **result)
+nserror utf8_from_local_encoding(const char *string, size_t len, char **result)
{
return utf8_from_enc(string, "ATARIST", len, result, NULL);
}
@@ -69,3 +71,9 @@ int atari_to_ucs4(unsigned char atari)
}
+static struct gui_utf8_table utf8_table = {
+ .utf8_to_local = utf8_to_local_encoding,
+ .local_to_utf8 = utf8_from_local_encoding,
+};
+
+struct gui_utf8_table *atari_utf8_table = &utf8_table;
diff --git a/atari/encoding.h b/atari/encoding.h
index c85bac9fc..d0289b613 100644
--- a/atari/encoding.h
+++ b/atari/encoding.h
@@ -1,32 +1,37 @@
-/*
- * Copyright 2012 Ole Loots <ole@monochrom.net>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
+/*
+ * Copyright 2012 Ole Loots <ole@monochrom.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef NS_ATARI_ENCODING_H
#define NS_ATARI_ENCODING_H
-#include <inttypes.h>
-#include <assert.h>
+#include <inttypes.h>
+#include <assert.h>
#include <stdbool.h>
-#include "css/css.h"
+#include "css/css.h"
#include "render/font.h"
-#include "utils/utf8.h"
-
+#include "utils/utf8.h"
+
+struct gui_utf8_table *atari_utf8_table;
+
+nserror utf8_to_local_encoding(const char *string, size_t len, char **result);
+nserror utf8_from_local_encoding(const char *string, size_t len, char **result);
+
int atari_to_ucs4( unsigned char atarichar);
#endif
diff --git a/atari/filetype.c b/atari/filetype.c
index 99daf470c..251abc6b3 100755
--- a/atari/filetype.c
+++ b/atari/filetype.c
@@ -1,70 +1,71 @@
-/*
- * Copyright 2010 Ole Loots <ole@monochrom.net>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <sys/types.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "utils/messages.h"
-#include "utils/utils.h"
-#include "utils/url.h"
-#include "utils/log.h"
-#include "content/fetch.h"
-
-/**
- * filetype -- determine the MIME type of a local file
- */
-const char *fetch_filetype(const char *unix_path)
-{
+/*
+ * Copyright 2010 Ole Loots <ole@monochrom.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <sys/types.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "utils/messages.h"
+#include "utils/utils.h"
+#include "utils/log.h"
+#include "content/fetch.h"
+
+#include "atari/filetype.h"
+
+/**
+ * filetype -- determine the MIME type of a local file
+ */
+const char *fetch_filetype(const char *unix_path)
+{
int l;
char * res = (char*)"text/html";
l = strlen(unix_path);
LOG(("unix path: %s", unix_path));
-
+
/* This line is added for devlopment versions running from the root dir: */
- if( strchr( unix_path, (int)'.' ) ){
- if (2 < l && strcasecmp(unix_path + l - 3, "f79") == 0)
- res = (char*)"text/css";
- else if (2 < l && strcasecmp(unix_path + l - 3, "css") == 0)
- res = (char*)"text/css";
- else if (2 < l && strcasecmp(unix_path + l - 3, "jpg") == 0)
- res = (char*)"image/jpeg";
- else if (3 < l && strcasecmp(unix_path + l - 4, "jpeg") == 0)
- res = (char*)"image/jpeg";
- else if (2 < l && strcasecmp(unix_path + l - 3, "gif") == 0)
- res = (char*)"image/gif";
- else if (2 < l && strcasecmp(unix_path + l - 3, "png") == 0)
- res = (char*)"image/png";
- else if (2 < l && strcasecmp(unix_path + l - 3, "jng") == 0)
- res = (char*)"image/jng";
- else if (2 < l && strcasecmp(unix_path + l - 3, "svg") == 0)
- res = (char*)"image/svg";
- else if (2 < l && strcasecmp(unix_path + l - 3, "txt") == 0)
+ if( strchr( unix_path, (int)'.' ) ){
+ if (2 < l && strcasecmp(unix_path + l - 3, "f79") == 0)
+ res = (char*)"text/css";
+ else if (2 < l && strcasecmp(unix_path + l - 3, "css") == 0)
+ res = (char*)"text/css";
+ else if (2 < l && strcasecmp(unix_path + l - 3, "jpg") == 0)
+ res = (char*)"image/jpeg";
+ else if (3 < l && strcasecmp(unix_path + l - 4, "jpeg") == 0)
+ res = (char*)"image/jpeg";
+ else if (2 < l && strcasecmp(unix_path + l - 3, "gif") == 0)
+ res = (char*)"image/gif";
+ else if (2 < l && strcasecmp(unix_path + l - 3, "png") == 0)
+ res = (char*)"image/png";
+ else if (2 < l && strcasecmp(unix_path + l - 3, "jng") == 0)
+ res = (char*)"image/jng";
+ else if (2 < l && strcasecmp(unix_path + l - 3, "svg") == 0)
+ res = (char*)"image/svg";
+ else if (2 < l && strcasecmp(unix_path + l - 3, "txt") == 0)
res = (char*)"text/plain";
} else {
- int n=0;
- int c;
FILE * fp;
char buffer[16];
fp = fopen( unix_path, "r" );
if( fp ){
+ int n=0;
+ int c;
do {
c = fgetc (fp);
if( c != EOF )
@@ -84,14 +85,8 @@ const char *fetch_filetype(const char *unix_path)
}
}
}
-
+
error:
LOG(("mime type: %s", res ));
- return( res );
-}
-
-
-char *fetch_mimetype(const char *ro_path)
-{
- return strdup("text/plain");
+ return( res );
}
diff --git a/framebuffer/login.c b/atari/filetype.h
index 7a5e195f4..97ba75b80 100644
--- a/framebuffer/login.c
+++ b/atari/filetype.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2008 Vincent Sanders <vince@simtec.co.uk>
+ * Copyright 2010 Ole Loots <ole@monochrom.net>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -16,10 +16,9 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "desktop/401login.h"
+#ifndef NS_ATARI_FILETYPE_H_
+#define NS_ATARI_FILETYPE_H_
-void gui_401login_open(nsurl *url, const char *realm,
- nserror (*cb)(bool proceed, void *pw), void *cbpw)
-{
- cb(false, cbpw);
-}
+const char *fetch_filetype(const char *unix_path);
+
+#endif
diff --git a/atari/findfile.c b/atari/findfile.c
index 7badc7149..356a9333f 100755
--- a/atari/findfile.c
+++ b/atari/findfile.c
@@ -68,59 +68,6 @@ char * local_file_to_url( const char * filename )
#undef BACKSLASH
}
-/* convert an local path to an URL, memory for URL is allocated. */
-char *path_to_url(const char *path_in)
-{
- #define BACKSLASH 0x5C
- char * path;
-
- LOG(("path2url in: %s\n", path_in));
-
- path = (char*)path_in;
-
- int urllen = strlen(path) + FILE_SCHEME_PREFIX_LEN + 1;
- char *url = malloc(urllen);
-
- snprintf(url, urllen, "%s%s", FILE_SCHEME_PREFIX, path);
-
- int i=0;
- while( url[i] != 0 ){
- if( url[i] == BACKSLASH ){
- url[i] = '/';
- }
- i++;
- }
-
- LOG(("path2url out: %s\n", url));
- return url;
- #undef BACKSLASH
-}
-
-
-char *url_to_path(const char *url)
-{
- char *url_path = curl_unescape(url, 0);
- char *path;
- char abspath[PATH_MAX+1];
-
- LOG(( "url2path in: %s (%s)\n", url, url_path ));
-
- // is the URL relative?
- if (url_path[7] == '.') {
- // yes, make it absolute...
- gemdos_realpath(url_path + (FILE_SCHEME_PREFIX_LEN-1), abspath);
- path = strdup(abspath);
- } else {
- path = strdup(url_path + (FILE_SCHEME_PREFIX_LEN));
- }
-
- curl_free(url_path);
-
- LOG(( "url2path out: %s\n", path ));
-
- return path;
-}
-
/**
* Locate a shared resource file by searching known places in order.
diff --git a/atari/findfile.h b/atari/findfile.h
index e87f7cff7..9a6f7848a 100755
--- a/atari/findfile.h
+++ b/atari/findfile.h
@@ -21,6 +21,7 @@
#define NS_ATARI_FINDFILE_H
extern char *atari_find_resource(char *buf, const char *filename, const char *def);
-char * local_file_to_url( const char * filename );
+char *local_file_to_url(const char *filename);
+
#endif /* NETSURF_ATARI_FINDFILE_H */
diff --git a/atari/gemtk/guiwin.c b/atari/gemtk/guiwin.c
index 9a5c93d9b..afb3cd790 100644
--- a/atari/gemtk/guiwin.c
+++ b/atari/gemtk/guiwin.c
@@ -129,7 +129,7 @@ static short preproc_wm(GUIWIN * gw, EVMULT_OUT *ev_out, short msg[8])
{
GRECT g, g_ro, g2;
short retval = 1;
- int val = 1, old_val;
+ int val = 1;
struct gemtk_wm_scroll_info_s *slid;
switch(msg[0]) {
@@ -1338,7 +1338,7 @@ bool gemtk_wm_has_intersection(GUIWIN *win, GRECT *work)
}
wind_get_grect(win->handle, WF_FIRSTXYWH, &area);
- while (area.g_w && area.g_w) {
+ while (area.g_w) {
//GRECT * ptr = &area;
if (RC_WITHIN(work, &area)) {
retval = false;
@@ -1375,10 +1375,8 @@ void gemtk_wm_toolbar_redraw(GUIWIN *gw, uint16_t msg, GRECT *clip)
void gemtk_wm_form_redraw(GUIWIN *gw, GRECT *clip)
{
GRECT area, area_ro, g;
- int scroll_px_x, scroll_px_y;
struct gemtk_wm_scroll_info_s *slid;
//int new_x, new_y, old_x, old_y;
- short edit_idx;
DEBUG_PRINT(("gemtk_wm_form_redraw\n"));
diff --git a/atari/gemtk/objc.c b/atari/gemtk/objc.c
index 514f6b544..855413e0b 100644
--- a/atari/gemtk/objc.c
+++ b/atari/gemtk/objc.c
@@ -27,8 +27,6 @@
char *gemtk_obj_get_text(OBJECT * tree, short idx)
{
static char p[]="";
- USERBLK *user;
- char *retval;
switch (tree[idx].ob_type & 0x00FF) {
case G_BUTTON:
@@ -71,7 +69,6 @@ char gemtk_obj_set_str_safe(OBJECT * tree, short idx, const char *txt)
char spare[204];
short type = 0;
short maxlen = 0;
- TEDINFO *ted;
type = (tree[idx].ob_type & 0xFF);
diff --git a/atari/gemtk/utils.c b/atari/gemtk/utils.c
index aac293d21..63e6330ec 100644
--- a/atari/gemtk/utils.c
+++ b/atari/gemtk/utils.c
@@ -1,19 +1,19 @@
-/*
- * Copyright 2013 Ole Loots <ole@monochrom.net>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
+/*
+ * Copyright 2013 Ole Loots <ole@monochrom.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdlib.h>
@@ -123,7 +123,6 @@ void gemtk_send_msg(short msg_type, short data2, short data3, short data4,
void gemtk_wind_get_str(short aes_handle, short mode, char *str, int len)
{
- char tmp_str[255];
// TODO: remove or implement function
diff --git a/atari/gui.c b/atari/gui.c
index e52a6589c..f267b69a8 100644
--- a/atari/gui.c
+++ b/atari/gui.c
@@ -16,9 +16,9 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/*
- This File provides all the mandatory functions prefixed with gui_
-*/
+/**
+ * \file Provides all the mandatory functions prefixed with gui_ for atari
+ */
#include <sys/types.h>
#include <sys/stat.h>
@@ -30,17 +30,17 @@
#include <stdbool.h>
#include <hubbub/hubbub.h>
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/utils.h"
+#include "utils/nsoption.h"
#include "content/urldb.h"
#include "content/fetch.h"
#include "content/fetchers/resource.h"
#include "css/utils.h"
#include "desktop/gui.h"
-#include "desktop/local_history.h"
#include "desktop/plotters.h"
#include "desktop/netsurf.h"
-#include "desktop/401login.h"
-
-#include "utils/nsoption.h"
#include "desktop/save_complete.h"
#include "desktop/textinput.h"
#include "desktop/treeview.h"
@@ -48,11 +48,6 @@
#include "desktop/browser_private.h"
#include "desktop/mouse.h"
#include "render/font.h"
-#include "utils/schedule.h"
-#include "utils/url.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/utils.h"
#include "atari/gemtk/gemtk.h"
#include "atari/gui.h"
@@ -74,6 +69,8 @@
#include "atari/osspec.h"
#include "atari/search.h"
#include "atari/deskmenu.h"
+#include "atari/download.h"
+#include "atari/filetype.h"
#include "cflib.h"
#define TODO() (0)/*printf("%s Unimplemented!\n", __FUNCTION__)*/
@@ -113,18 +110,18 @@ EVMULT_IN aes_event_in = {
EVMULT_OUT aes_event_out;
short aes_msg_out[8];
+bool gui_window_get_scroll(struct gui_window *w, int *sx, int *sy);
+static void gui_window_set_url(struct gui_window *w, const char *url);
-
-void gui_poll(bool active)
+static void gui_poll(bool active)
{
struct gui_window *tmp;
short mx, my, dummy;
- unsigned short nkc = 0;
aes_event_in.emi_tlow = schedule_run();
- if(active || rendering){
+ if(rendering){
aes_event_in.emi_tlow = nsoption_int(atari_gui_poll_timeout);
}
@@ -133,13 +130,10 @@ void gui_poll(bool active)
printf("long poll!\n");
}
- struct gui_window * g;
-
- if( !active ) {
if(input_window && input_window->root->redraw_slots.areas_used > 0) {
window_process_redraws(input_window->root);
}
- }
+
graf_mkstate(&mx, &my, &dummy, &dummy);
aes_event_in.emi_m1.g_x = mx;
@@ -186,13 +180,13 @@ void gui_poll(bool active)
}
-struct gui_window *
-gui_create_browser_window(struct browser_window *bw,
- struct browser_window *clone,
- bool new_tab) {
+static struct gui_window *
+gui_window_create(struct browser_window *bw,
+ struct gui_window *existing,
+ gui_window_create_flags flags) {
struct gui_window *gw=NULL;
- LOG(( "gw: %p, BW: %p, clone %p, tab: %d\n" , gw, bw, clone,
- (int)new_tab
+ LOG(( "gw: %p, BW: %p, existing %p, flags: %d\n" , gw, bw, existing,
+ (int)flags
));
gw = calloc(1, sizeof(struct gui_window));
@@ -200,14 +194,13 @@ gui_create_browser_window(struct browser_window *bw,
return NULL;
LOG(("new window: %p, bw: %p\n", gw, bw));
- window_create(gw, bw, clone, WIDGET_STATUSBAR|WIDGET_TOOLBAR|WIDGET_RESIZE\
+ window_create(gw, bw, existing, WIDGET_STATUSBAR|WIDGET_TOOLBAR|WIDGET_RESIZE\
|WIDGET_SCROLL);
if (gw->root->win) {
GRECT pos = {
option_window_x, option_window_y,
option_window_width, option_window_height
};
- gui_window_set_scale(gw, 1.0);
gui_window_set_url(gw, "");
gui_window_set_pointer(gw, BROWSER_POINTER_DEFAULT);
gui_set_input_gui_window(gw);
@@ -277,8 +270,11 @@ void gui_window_destroy(struct gui_window *w)
}
}
-void gui_window_get_dimensions(struct gui_window *w, int *width, int *height,
- bool scaled)
+static void
+gui_window_get_dimensions(struct gui_window *w,
+ int *width,
+ int *height,
+ bool scaled)
{
if (w == NULL)
return;
@@ -288,7 +284,7 @@ void gui_window_get_dimensions(struct gui_window *w, int *width, int *height,
*height = rect.g_h;
}
-void gui_window_set_title(struct gui_window *gw, const char *title)
+static void gui_window_set_title(struct gui_window *gw, const char *title)
{
if (gw == NULL)
@@ -299,7 +295,7 @@ void gui_window_set_title(struct gui_window *gw, const char *title)
int l;
char * conv;
l = strlen(title)+1;
- if (utf8_to_local_encoding(title, l-1, &conv) == UTF8_CONVERT_OK ) {
+ if (utf8_to_local_encoding(title, l-1, &conv) == NSERROR_OK ) {
l = MIN((uint32_t)atari_sysinfo.aes_max_win_title_len, strlen(conv));
if(gw->title == NULL)
gw->title = malloc(l);
@@ -346,24 +342,17 @@ void gui_window_set_status(struct gui_window *w, const char *text)
window_set_stauts(w->root, (char*)text);
}
-float gui_window_get_scale(struct gui_window *gw)
+static void atari_window_reformat(struct gui_window *gw)
{
- return(gw->scale);
-}
+ int width = 0, height = 0;
-void gui_window_set_scale(struct gui_window *gw, float scale)
-{
- int width = 0, heigth = 0;
-
- LOG(("scale: %f", scale));
-
- gw->scale = MAX(scale, 0.25);
-
- gui_window_get_dimensions(gw, &width, &heigth, true);
- browser_window_reformat(gw->browser->bw, false, width, heigth);
+ if (gw != NULL) {
+ gui_window_get_dimensions(gw, &width, &height, true);
+ browser_window_reformat(gw->browser->bw, false, width, height);
+ }
}
-void gui_window_redraw_window(struct gui_window *gw)
+static void gui_window_redraw_window(struct gui_window *gw)
{
CMP_BROWSER b;
GRECT rect;
@@ -374,7 +363,7 @@ void gui_window_redraw_window(struct gui_window *gw)
window_schedule_redraw_grect(gw->root, &rect);
}
-void gui_window_update_box(struct gui_window *gw, const struct rect *rect)
+static void gui_window_update_box(struct gui_window *gw, const struct rect *rect)
{
GRECT area;
struct gemtk_wm_scroll_info_s *slid;
@@ -395,7 +384,6 @@ void gui_window_update_box(struct gui_window *gw, const struct rect *rect)
bool gui_window_get_scroll(struct gui_window *w, int *sx, int *sy)
{
- int x,y;
if (w == NULL)
return false;
@@ -404,13 +392,12 @@ bool gui_window_get_scroll(struct gui_window *w, int *sx, int *sy)
return( true );
}
-void gui_window_set_scroll(struct gui_window *w, int sx, int sy)
+static void gui_window_set_scroll(struct gui_window *w, int sx, int sy)
{
- int units = 0;
- if ((w == NULL)
- || (w->browser->bw == NULL)
- || (w->browser->bw->current_content == NULL))
- return;
+ if ( (w == NULL)
+ || (w->browser->bw == NULL)
+ || (!browser_window_has_content(w->browser->bw)))
+ return;
LOG(("scroll (gui_window: %p) %d, %d\n", w, sx, sy));
window_scroll_by(w->root, sx, sy);
@@ -418,21 +405,14 @@ void gui_window_set_scroll(struct gui_window *w, int sx, int sy)
}
-void gui_window_scroll_visible(struct gui_window *w, int x0, int y0, int x1, int y1)
-{
- LOG(("%s:(%p, %d, %d, %d, %d)", __func__, w, x0, y0, x1, y1));
- gui_window_set_scroll(w,x0,y0);
-}
-
-
/* It seems this method is called when content size got adjusted,
so that we can adjust scroll info. We also have to call it when tab
change occurs.
*/
-void gui_window_update_extent(struct gui_window *gw)
+static void gui_window_update_extent(struct gui_window *gw)
{
- if( gw->browser->bw->current_content != NULL ) {
+ if(browser_window_has_content(gw->browser->bw)) {
// TODO: store content size!
if(window_get_active_gui_window(gw->root) == gw) {
window_set_content_size( gw->root,
@@ -448,13 +428,6 @@ void gui_window_update_extent(struct gui_window *gw)
}
-void gui_clear_selection(struct gui_window *g)
-{
-
-}
-
-
-
/**
* set the pointer shape
*/
@@ -534,13 +507,8 @@ void gui_window_set_pointer(struct gui_window *gw, gui_pointer_shape shape)
}
}
-void gui_window_hide_pointer(struct gui_window *w)
-{
- TODO();
-}
-
-void gui_window_set_url(struct gui_window *w, const char *url)
+static void gui_window_set_url(struct gui_window *w, const char *url)
{
int l;
@@ -591,28 +559,28 @@ static void throbber_advance( void * data )
return;
toolbar_throbber_progress(gw->root->toolbar);
- schedule(100, throbber_advance, gw );
+ atari_schedule(1000, throbber_advance, gw );
}
-void gui_window_start_throbber(struct gui_window *w)
+static void gui_window_start_throbber(struct gui_window *w)
{
GRECT work;
if (w == NULL)
return;
toolbar_set_throbber_state(w->root->toolbar, true);
- schedule(100, throbber_advance, w );
+ atari_schedule(1000, throbber_advance, w );
rendering = true;
}
-void gui_window_stop_throbber(struct gui_window *w)
+static void gui_window_stop_throbber(struct gui_window *w)
{
if (w == NULL)
return;
if (w->root->toolbar->throbber.running == false)
return;
- schedule_remove(throbber_advance, w);
+ atari_schedule(-1, throbber_advance, w);
toolbar_set_throbber_state(w->root->toolbar, false);
@@ -620,7 +588,7 @@ void gui_window_stop_throbber(struct gui_window *w)
}
/* Place caret in window */
-void gui_window_place_caret(struct gui_window *w, int x, int y, int height,
+static void gui_window_place_caret(struct gui_window *w, int x, int y, int height,
const struct rect *clip)
{
window_place_caret(w->root, 1, x, y, height, NULL);
@@ -632,7 +600,7 @@ void gui_window_place_caret(struct gui_window *w, int x, int y, int height,
/**
* clear window caret
*/
-void
+static void
gui_window_remove_caret(struct gui_window *w)
{
if (w == NULL)
@@ -646,7 +614,7 @@ gui_window_remove_caret(struct gui_window *w)
return;
}
-void
+static void
gui_window_set_icon(struct gui_window *g, hlcache_handle *icon)
{
struct bitmap *bmp_icon;
@@ -658,13 +626,7 @@ gui_window_set_icon(struct gui_window *g, hlcache_handle *icon)
}
}
-void
-gui_window_set_search_ico(hlcache_handle *ico)
-{
- TODO();
-}
-
-void gui_window_new_content(struct gui_window *w)
+static void gui_window_new_content(struct gui_window *w)
{
struct gemtk_wm_scroll_info_s *slid = gemtk_wm_get_scroll_info(w->root->win);
slid->x_pos = 0;
@@ -673,44 +635,6 @@ void gui_window_new_content(struct gui_window *w)
gui_window_redraw_window(w);
}
-bool gui_window_scroll_start(struct gui_window *w)
-{
- TODO();
- return true;
-}
-
-bool gui_window_drag_start(struct gui_window *g, gui_drag_type type,
- const struct rect *rect)
-{
- TODO();
- return true;
-}
-
-void gui_window_save_link(struct gui_window *g, const char *url,
- const char *title)
-{
- LOG(("%s -> %s", title, url ));
- TODO();
-}
-
-void gui_drag_save_object(gui_save_type type, hlcache_handle *c,
- struct gui_window *w)
-{
- LOG((""));
- TODO();
-}
-
-void gui_drag_save_selection(struct gui_window *g, const char *selection)
-{
- LOG((""));
- TODO();
-}
-
-void gui_start_selection(struct gui_window *w)
-{
-
-}
-
/**
* Core asks front end for clipboard contents.
@@ -718,10 +642,9 @@ void gui_start_selection(struct gui_window *w)
* \param buffer UTF-8 text, allocated by front end, ownership yeilded to core
* \param length Byte length of UTF-8 text in buffer
*/
-void gui_get_clipboard(char **buffer, size_t *length)
+static void gui_get_clipboard(char **buffer, size_t *length)
{
char *clip;
- size_t clip_len;
*length = 0;
*buffer = 0;
@@ -734,17 +657,18 @@ void gui_get_clipboard(char **buffer, size_t *length)
// clipboard is in atari encoding, convert it to utf8:
+ size_t clip_len;
char *utf8 = NULL;
- utf8_convert_ret ret;
clip_len = strlen(clip);
if (clip_len > 0) {
+ nserror ret;
ret = utf8_to_local_encoding(clip, clip_len, &utf8);
- if (ret == UTF8_CONVERT_OK && utf8 != NULL) {
+ if (ret == NSERROR_OK && utf8 != NULL) {
*buffer = utf8;
*length = strlen(utf8);
} else {
- assert(ret == UTF8_CONVERT_OK && utf8 != NULL);
+ assert(ret == NSERROR_OK && utf8 != NULL);
}
}
@@ -760,43 +684,27 @@ void gui_get_clipboard(char **buffer, size_t *length)
* \param styles Array of styles given to text runs, owned by core, or NULL
* \param n_styles Number of text run styles in array
*/
-void gui_set_clipboard(const char *buffer, size_t length,
+static void gui_set_clipboard(const char *buffer, size_t length,
nsclipboard_styles styles[], int n_styles)
{
if (length > 0 && buffer != NULL) {
// convert utf8 input to atari encoding:
- utf8_convert_ret ret;
+ nserror ret;
char *clip = NULL;
ret = utf8_to_local_encoding(buffer,length, &clip);
- if (ret == UTF8_CONVERT_OK) {
+ if (ret == NSERROR_OK) {
scrap_txt_write(clip);
} else {
- assert(ret == UTF8_CONVERT_OK);
+ assert(ret == NSERROR_OK);
}
free(clip);
}
}
-
-void gui_create_form_select_menu(struct browser_window *bw,
- struct form_control *control)
-{
- TODO();
-}
-
-/**
- * Broadcast an URL that we can't handle.
- */
-void gui_launch_url(const char *url)
-{
- TODO();
- LOG(("launch file: %s\n", url));
-}
-
-void gui_401login_open(nsurl *url, const char *realm,
+static void gui_401login_open(nsurl *url, const char *realm,
nserror (*cb)(bool proceed, void *pw), void *cbpw)
{
bool bres;
@@ -815,15 +723,13 @@ void gui_401login_open(nsurl *url, const char *realm,
}
-void gui_cert_verify(nsurl *url, const struct ssl_cert_info *certs,
+static void gui_cert_verify(nsurl *url, const struct ssl_cert_info *certs,
unsigned long num, nserror (*cb)(bool proceed, void *pw),
void *cbpw)
{
struct sslcert_session_data *data;
LOG((""));
- bool bres;
-
// TODO: localize string
int b = form_alert(1, "[2][SSL Verify failed, continue?][Continue|Abort|Details...]");
if(b == 1){
@@ -854,7 +760,7 @@ struct gui_window * gui_get_input_window(void)
return(input_window);
}
-void gui_quit(void)
+static void gui_quit(void)
{
LOG((""));
@@ -972,18 +878,14 @@ static inline void create_cursor(int flags, short mode, void * form,
}
}
-nsurl *gui_get_resource_url(const char *path)
+static nsurl *gui_get_resource_url(const char *path)
{
char buf[PATH_MAX];
- char *raw;
nsurl *url = NULL;
atari_find_resource((char*)&buf, path, path);
- raw = path_to_url((char*)&buf);
- if (raw != NULL) {
- nsurl_create(raw, &url);
- free(raw);
- }
+
+ netsurf_path_to_nsurl(buf, &url);
return url;
}
@@ -1098,6 +1000,49 @@ static void gui_init2(int argc, char** argv)
toolbar_init();
}
+static struct gui_window_table atari_window_table = {
+ .create = gui_window_create,
+ .destroy = gui_window_destroy,
+ .redraw = gui_window_redraw_window,
+ .update = gui_window_update_box,
+ .get_scroll = gui_window_get_scroll,
+ .set_scroll = gui_window_set_scroll,
+ .get_dimensions = gui_window_get_dimensions,
+ .update_extent = gui_window_update_extent,
+ .reformat = atari_window_reformat,
+
+ .set_title = gui_window_set_title,
+ .set_url = gui_window_set_url,
+ .set_icon = gui_window_set_icon,
+ .set_status = gui_window_set_status,
+ .set_pointer = gui_window_set_pointer,
+ .place_caret = gui_window_place_caret,
+ .remove_caret = gui_window_remove_caret,
+ .new_content = gui_window_new_content,
+ .start_throbber = gui_window_start_throbber,
+ .stop_throbber = gui_window_stop_throbber,
+};
+
+static struct gui_clipboard_table atari_clipboard_table = {
+ .get = gui_get_clipboard,
+ .set = gui_set_clipboard,
+};
+
+static struct gui_fetch_table atari_fetch_table = {
+ .filetype = fetch_filetype,
+
+ .get_resource_url = gui_get_resource_url,
+};
+
+static struct gui_browser_table atari_browser_table = {
+ .poll = gui_poll,
+ .schedule = atari_schedule,
+
+ .quit = gui_quit,
+ .cert_verify = gui_cert_verify,
+ .login = gui_401login_open,
+};
+
/* #define WITH_DBG_LOGFILE 1 */
/** Entry point from OS.
*
@@ -1113,8 +1058,22 @@ int main(int argc, char** argv)
struct stat stat_buf;
nsurl *url;
nserror ret;
+ struct netsurf_table atari_table = {
+ .browser = &atari_browser_table,
+ .window = &atari_window_table,
+ .clipboard = &atari_clipboard_table,
+ .download = atari_download_table,
+ .fetch = &atari_fetch_table,
+ .utf8 = atari_utf8_table,
+ .search = atari_search_table,
+ };
+
+ ret = netsurf_register(&atari_table);
+ if (ret != NSERROR_OK) {
+ die("NetSurf operation table failed registration");
+ }
- /* @todo logging file descriptor update belongs in a nslog_init callback */
+ /** @todo logging file descriptor update belongs in a nslog_init callback */
setbuf(stderr, NULL);
setbuf(stdout, NULL);
#ifdef WITH_DBG_LOGFILE
@@ -1146,7 +1105,7 @@ int main(int argc, char** argv)
/* common initialisation */
LOG(("Initialising core..."));
- ret = netsurf_init(messages);
+ ret = netsurf_init(messages, NULL);
if (ret != NSERROR_OK) {
die("NetSurf failed to initialise");
}
@@ -1171,8 +1130,7 @@ int main(int argc, char** argv)
/* create an initial browser window */
ret = nsurl_create(addr, &url);
if (ret == NSERROR_OK) {
- ret = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ ret = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
diff --git a/atari/gui.h b/atari/gui.h
index 6c43ec6fe..10736c5f8 100755
--- a/atari/gui.h
+++ b/atari/gui.h
@@ -149,7 +149,6 @@ struct gui_window {
char * title;
char * url;
struct bitmap * icon;
- float scale;
struct s_caret caret;
struct s_search_form_session *search;
struct gui_window *next, *prev;
@@ -163,8 +162,10 @@ extern struct gui_window *window_list;
void gui_set_input_gui_window(struct gui_window *gw);
struct gui_window *gui_get_input_window(void);
char *gui_window_get_url(struct gui_window *gw);
-char * gui_window_get_title(struct gui_window *gw);
-void gui_window_set_scale(struct gui_window *gw, float scale);
-float gui_window_get_scale(struct gui_window *gw);
+char *gui_window_get_title(struct gui_window *gw);
+
+void gui_window_set_status(struct gui_window *w, const char *text);
+void gui_window_set_pointer(struct gui_window *gw, gui_pointer_shape shape);
+void gui_window_destroy(struct gui_window *w);
#endif
diff --git a/atari/history.c b/atari/history.c
index 90ed0b8ae..6fe510825 100644
--- a/atari/history.c
+++ b/atari/history.c
@@ -1,19 +1,19 @@
-/*
- * Copyright 2013 Ole Loots <ole@monochrom.net>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
+/*
+ * Copyright 2013 Ole Loots <ole@monochrom.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
@@ -37,7 +37,6 @@
#include "utils/log.h"
#include "utils/messages.h"
#include "utils/utils.h"
-#include "utils/url.h"
#include "atari/gui.h"
#include "atari/misc.h"
#include "atari/treeview.h"
@@ -104,11 +103,8 @@ static void atari_global_history_mouse_action(struct core_window *cw,
int x, int y)
{
LOG(("x: %d, y: %d\n", x, y));
- if((mouse & BROWSER_MOUSE_HOVER) && global_history_has_selection()){
- global_history_mouse_action(mouse, x, y);
- } else {
- global_history_mouse_action(mouse, x, y);
- }
+
+ global_history_mouse_action(mouse, x, y);
}
@@ -116,12 +112,7 @@ static void atari_global_history_mouse_action(struct core_window *cw,
static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
{
- struct atari_treeview_window *tv=NULL;
GRECT tb_area;
- GUIWIN * gemtk_win;
- struct gui_window * gw;
- char *cur_url = NULL;
- char *cur_title = NULL;
short retval = 0;
LOG((""));
diff --git a/atari/hotlist.c b/atari/hotlist.c
index b4e36ae1a..62ca0cf08 100644
--- a/atari/hotlist.c
+++ b/atari/hotlist.c
@@ -1,19 +1,19 @@
-/*
- * Copyright 2013 Ole Loots <ole@monochrom.net>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
+/*
+ * Copyright 2013 Ole Loots <ole@monochrom.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
@@ -36,7 +36,6 @@
#include "utils/log.h"
#include "utils/messages.h"
#include "utils/utils.h"
-#include "utils/url.h"
#include "atari/gui.h"
#include "atari/misc.h"
#include "atari/treeview.h"
@@ -108,12 +107,8 @@ static void atari_hotlist_mouse_action(struct core_window *cw,
int x, int y)
{
LOG(("x: %d, y: %d\n", x, y));
- if((mouse & BROWSER_MOUSE_HOVER) && hotlist_has_selection()){
- hotlist_mouse_action(mouse, x, y);
- } else {
- hotlist_mouse_action(mouse, x, y);
- }
+ hotlist_mouse_action(mouse, x, y);
}
@@ -295,9 +290,6 @@ struct node;
void atari_hotlist_add_page( const char * url, const char * title )
{
- struct node * root;
- struct node * selected = NULL;
- struct node * folder = NULL;
nsurl *nsurl;
if(hl.tv == NULL)
diff --git a/atari/hotlist.h b/atari/hotlist.h
index d3ef02292..52598f27a 100644
--- a/atari/hotlist.h
+++ b/atari/hotlist.h
@@ -18,10 +18,17 @@
#ifndef NS_ATARI_HOTLIST_H
#define NS_ATARI_HOTLIST_H
+
#include <stdbool.h>
+
#include "desktop/tree.h"
#include "atari/gemtk/gemtk.h"
#include "atari/treeview.h"
+
+#ifndef PATH_MAX
+#define PATH_MAX 1024
+#endif
+
/* The hotlist window, toolbar and treeview data. */
struct atari_hotlist {
diff --git a/atari/login.c b/atari/login.c
index 461a2f985..687512ed1 100755
--- a/atari/login.c
+++ b/atari/login.c
@@ -16,24 +16,22 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "desktop/401login.h"
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <cflib.h>
+
#include "utils/config.h"
#include "content/content.h"
#include "content/hlcache.h"
#include "content/urldb.h"
#include "desktop/browser.h"
-#include "desktop/401login.h"
#include "desktop/gui.h"
#include "utils/errors.h"
#include "utils/utils.h"
#include "utils/messages.h"
#include "utils/log.h"
-#include "utils/url.h"
#include "content/urldb.h"
#include "content/fetch.h"
#include "atari/misc.h"
diff --git a/atari/misc.c b/atari/misc.c
index d330859b9..bd3158406 100755
--- a/atari/misc.c
+++ b/atari/misc.c
@@ -1,138 +1,97 @@
-/*
- * Copyright 2010 Ole Loots <ole@monochrom.net>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
+/*
+ * Copyright 2010 Ole Loots <ole@monochrom.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
#include <assert.h>
-#include <stdlib.h>
+#include <stdlib.h>
#include <stdio.h>
-#include <stdbool.h>
-#include <string.h>
+#include <stdbool.h>
+#include <string.h>
-#include <sys/types.h>
+#include <sys/types.h>
#include <mint/osbind.h>
#include "content/content.h"
-#include "content/hlcache.h"
-#include "desktop/cookie_manager.h"
+#include "content/hlcache.h"
+#include "desktop/cookie_manager.h"
#include "desktop/mouse.h"
#include "desktop/tree.h"
-#include "utils/nsoption.h"
-#include "utils/messages.h"
-#include "utils/utils.h"
-#include "utils/url.h"
-#include "utils/log.h"
+#include "utils/nsoption.h"
+#include "utils/messages.h"
+#include "utils/utils.h"
+#include "utils/log.h"
#include "content/fetch.h"
-
-#include "atari/gui.h"
-#include "atari/toolbar.h"
-
+
+#include "atari/gui.h"
+#include "atari/toolbar.h"
+
#include "atari/misc.h"
#include "atari/encoding.h"
#include "atari/gemtk/gemtk.h"
-#include "cflib.h"
-
-extern void * h_gem_rsrc;
+#include "cflib.h"
+
+extern void * h_gem_rsrc;
struct is_process_running_callback_data {
const char * fname;
bool found;
};
-
-void warn_user(const char *warning, const char *detail)
-{
- size_t len = 1 + ((warning != NULL) ? strlen(messages_get(warning)) :
- 0) + ((detail != 0) ? strlen(detail) : 0);
- char message[len];
- snprintf(message, len, messages_get(warning), detail);
+
+void warn_user(const char *warning, const char *detail)
+{
+ size_t len = 1 + ((warning != NULL) ? strlen(messages_get(warning)) :
+ 0) + ((detail != 0) ? strlen(detail) : 0);
+ char message[len];
+ snprintf(message, len, messages_get(warning), detail);
printf("%s\n", message);
- gemtk_msg_box_show(GEMTK_MSG_BOX_ALERT, message);
-}
-
-void die(const char *error)
+ gemtk_msg_box_show(GEMTK_MSG_BOX_ALERT, message);
+}
+
+void die(const char *error)
{
- printf("%s\n", error);
+ printf("%s\n", error);
gemtk_msg_box_show(GEMTK_MSG_BOX_ALERT, error);
- exit(1);
-}
-
-/**
- * Return the filename part of a full path
- *
- * \param path full path and filename
- * \return filename (will be freed with free())
- */
-
-char *filename_from_path(char *path)
-{
- char *leafname;
-
- leafname = strrchr(path, '\\');
- if( !leafname )
- leafname = strrchr(path, '/');
- if (!leafname)
- leafname = path;
- else
- leafname += 1;
-
- return strdup(leafname);
-}
-
-/**
- * Add a path component/filename to an existing path
- *
- * \param path buffer containing path + free space
- * \param length length of buffer "path"
- * \param newpart string containing path component to add to path
- * \return true on success
- */
-
-bool path_add_part(char *path, int length, const char *newpart)
-{
- if(path[strlen(path) - 1] != '/')
- strncat(path, "/", length);
-
- strncat(path, newpart, length);
-
- return true;
+ exit(1);
}
-struct gui_window * find_guiwin_by_aes_handle(short handle){
-
- struct gui_window * gw;
- gw = window_list;
-
- if( handle == 0 ){
+
+struct gui_window * find_guiwin_by_aes_handle(short handle){
+
+ struct gui_window * gw;
+ gw = window_list;
+
+ if( handle == 0 ){
return( NULL );
}
- while(gw != NULL) {
+ while(gw != NULL) {
if(gw->root->win != NULL
- && gemtk_wm_get_handle(gw->root->win) == handle) {
- return(gw);
- }
- else
- gw = gw->next;
- }
-
- return( NULL );
+ && gemtk_wm_get_handle(gw->root->win) == handle) {
+ return(gw);
+ }
+ else
+ gw = gw->next;
+ }
+
+ return( NULL );
}
-
-
+
+
static int scan_process_list(scan_process_callback cb, void *data)
{
int pid, count = 0;
@@ -227,9 +186,9 @@ bool is_process_running(const char * name)
scan_process_list(proc_running_callback, &data);
return( (data.found==1) ? true : false );
-}
-
-
+}
+
+
/**
* Callback for load_icon(). Should be removed once bitmaps get loaded directly
* from disc
@@ -244,16 +203,16 @@ static nserror load_icon_callback(hlcache_handle *handle,
/**
* utility function. Copied from NetSurf tree API.
*
- * \param name the name of the loaded icon, if it's not a full path the icon is
- * looked for in the directory specified by icons_dir
+ * \param name the name of the loaded icon, if it's not a full path
+ * the icon is looked for in the directory specified by
+ * icons_dir.
+ * \param cb callback function to deal with hlcache callback.
+ * \param pw Context pointer to be passed to callback.
* \return the icon in form of a content or NULL on failure
*/
-hlcache_handle *load_icon(const char *name, hlcache_handle_callback cb,
- void * pw )
+hlcache_handle *
+load_icon(const char *name, hlcache_handle_callback cb, void *pw)
{
- char *url = NULL;
- const char *icon_url = NULL;
- int len;
hlcache_handle *c;
nserror err;
nsurl *icon_nsurl;
@@ -262,38 +221,23 @@ hlcache_handle *load_icon(const char *name, hlcache_handle_callback cb,
/** @todo something like bitmap_from_disc is needed here */
if (!strncmp(name, "file://", 7)) {
- icon_url = name;
+ err = nsurl_create(name, &icon_nsurl);
} else {
- char *native_path;
+ char *native_path = NULL;
if (icons_dir == NULL)
return NULL;
- /* path + separator + leafname + '\0' */
- len = strlen(icons_dir) + 1 + strlen(name) + 1;
- native_path = malloc(len);
- if (native_path == NULL) {
- LOG(("malloc failed"));
- warn_user("NoMemory", 0);
- return NULL;
+ err = netsurf_mkpath(&native_path, NULL, 2, icons_dir, name);
+ if (err == NSERROR_OK) {
+ /* Convert native path to URL */
+ err = netsurf_path_to_nsurl(native_path, &icon_nsurl);
+ free(native_path);
}
-
- /* Build native path */
- memcpy(native_path, icons_dir,
- strlen(icons_dir) + 1);
- path_add_part(native_path, len, name);
-
- /* Convert native path to URL */
- url = path_to_url(native_path);
-
- free(native_path);
- icon_url = url;
}
- err = nsurl_create(icon_url, &icon_nsurl);
if (err != NSERROR_OK) {
- if (url != NULL)
- free(url);
+ warn_user(messages_get_errorcode(err), 0);
return NULL;
}
@@ -304,30 +248,26 @@ hlcache_handle *load_icon(const char *name, hlcache_handle_callback cb,
nsurl_unref(icon_nsurl);
- /* If we built the URL here, free it */
- if (url != NULL)
- free(url);
-
if (err != NSERROR_OK) {
return NULL;
}
return c;
-}
-
-void gem_set_cursor( MFORM_EX * cursor )
-{
- static unsigned char flags = 255;
- static int number = 255;
- if( flags == cursor->flags && number == cursor->number )
- return;
+}
+
+void gem_set_cursor( MFORM_EX * cursor )
+{
+ static unsigned char flags = 255;
+ static int number = 255;
+ if( flags == cursor->flags && number == cursor->number )
+ return;
if( cursor->flags & MFORM_EX_FLAG_USERFORM ) {
- gemtk_obj_mouse_sprite(cursor->tree, cursor->number);
- } else {
- graf_mouse(cursor->number, NULL );
- }
- number = cursor->number;
- flags = cursor->flags;
+ gemtk_obj_mouse_sprite(cursor->tree, cursor->number);
+ } else {
+ graf_mouse(cursor->number, NULL );
+ }
+ number = cursor->number;
+ flags = cursor->flags;
}
/**
@@ -339,7 +279,7 @@ void gem_set_cursor( MFORM_EX * cursor )
*/
long nkc_to_input_key(short nkc, long * ucs4_out)
{
- unsigned char ascii = (nkc & 0xFF);
+ unsigned char ascii = (nkc & 0xFF);
long ik = 0;
// initialize result:
@@ -352,131 +292,131 @@ long nkc_to_input_key(short nkc, long * ucs4_out)
if( ((nkc & NKF_CTRL) == NKF_CTRL) && ((nkc & (NKF_SHIFT))!=0) ) {
}
- /* cntrl key only: */
- else if( (nkc & NKF_CTRL) == NKF_CTRL ) {
- switch ( ascii ) {
- case 'A':
- ik = KEY_SELECT_ALL;
- break;
-
- case 'C':
- ik = KEY_COPY_SELECTION;
- break;
-
- case 'X':
- ik = KEY_CUT_SELECTION;
- break;
-
- case 'V':
- ik = KEY_PASTE;
- break;
-
- default:
- break;
- }
+ /* cntrl key only: */
+ else if( (nkc & NKF_CTRL) == NKF_CTRL ) {
+ switch ( ascii ) {
+ case 'A':
+ ik = KEY_SELECT_ALL;
+ break;
+
+ case 'C':
+ ik = KEY_COPY_SELECTION;
+ break;
+
+ case 'X':
+ ik = KEY_CUT_SELECTION;
+ break;
+
+ case 'V':
+ ik = KEY_PASTE;
+ break;
+
+ default:
+ break;
+ }
}
- /* shift key only: */
+ /* shift key only: */
else if( (nkc & NKF_SHIFT) != 0 ) {
- switch( ascii ) {
- case NK_TAB:
- ik = KEY_SHIFT_TAB;
- break;
-
- case NK_LEFT:
- ik = KEY_LINE_START;
- break;
-
- case NK_RIGHT:
- ik = KEY_LINE_END;
- break;
-
- case NK_UP:
- ik = KEY_PAGE_UP;
- break;
-
- case NK_DOWN:
- ik = KEY_PAGE_DOWN;
- break;
-
- default:
- break;
- }
+ switch( ascii ) {
+ case NK_TAB:
+ ik = KEY_SHIFT_TAB;
+ break;
+
+ case NK_LEFT:
+ ik = KEY_LINE_START;
+ break;
+
+ case NK_RIGHT:
+ ik = KEY_LINE_END;
+ break;
+
+ case NK_UP:
+ ik = KEY_PAGE_UP;
+ break;
+
+ case NK_DOWN:
+ ik = KEY_PAGE_DOWN;
+ break;
+
+ default:
+ break;
+ }
}
- /* No modifier keys: */
- else {
+ /* No modifier keys: */
+ else {
switch( ascii ) {
case NK_INS:
ik = KEY_PASTE;
break;
-
- case NK_BS:
- ik = KEY_DELETE_LEFT;
- break;
-
- case NK_DEL:
- ik = KEY_DELETE_RIGHT;
- break;
-
- case NK_TAB:
- ik = KEY_TAB;
- break;
-
-
- case NK_ENTER:
- ik = KEY_NL;
- break;
-
- case NK_RET:
- ik = KEY_CR;
- break;
-
- case NK_ESC:
- ik = KEY_ESCAPE;
- break;
-
- case NK_CLRHOME:
- ik = KEY_TEXT_START;
- break;
-
- case NK_RIGHT:
- ik = KEY_RIGHT;
- break;
-
- case NK_LEFT:
- ik = KEY_LEFT;
- break;
-
- case NK_UP:
- ik = KEY_UP;
+
+ case NK_BS:
+ ik = KEY_DELETE_LEFT;
+ break;
+
+ case NK_DEL:
+ ik = KEY_DELETE_RIGHT;
+ break;
+
+ case NK_TAB:
+ ik = KEY_TAB;
+ break;
+
+
+ case NK_ENTER:
+ ik = KEY_NL;
+ break;
+
+ case NK_RET:
+ ik = KEY_CR;
+ break;
+
+ case NK_ESC:
+ ik = KEY_ESCAPE;
+ break;
+
+ case NK_CLRHOME:
+ ik = KEY_TEXT_START;
+ break;
+
+ case NK_RIGHT:
+ ik = KEY_RIGHT;
+ break;
+
+ case NK_LEFT:
+ ik = KEY_LEFT;
+ break;
+
+ case NK_UP:
+ ik = KEY_UP;
break;
case NK_UNDO:
ik = KEY_UNDO;
- break;
-
- case NK_DOWN:
- ik = KEY_DOWN;
- break;
-
- case NK_M_PGUP:
- ik = KEY_PAGE_UP;
- break;
-
- case NK_M_PGDOWN:
- ik = KEY_PAGE_DOWN;
- break;
-
- default:
- break;
- }
+ break;
+
+ case NK_DOWN:
+ ik = KEY_DOWN;
+ break;
+
+ case NK_M_PGUP:
+ ik = KEY_PAGE_UP;
+ break;
+
+ case NK_M_PGDOWN:
+ ik = KEY_PAGE_DOWN;
+ break;
+
+ default:
+ break;
+ }
}
-
- if( ik == 0 && ( (nkc & NKF_CTRL)==0) ) {
+
+ if( ik == 0 && ( (nkc & NKF_CTRL)==0) ) {
if (ascii >= 9 ) {
*ucs4_out = atari_to_ucs4(ascii);
- }
- }
+ }
+ }
return ( ik );
}
@@ -510,25 +450,25 @@ const char * file_select(const char * title, const char * name) {
return( NULL );
}
-
-
-void dbg_grect(const char * str, GRECT * r)
-{
- printf("%s: x: %d, y: %d, w: %d, h: %d (x2: %d, y2: %d)\n", str,
- r->g_x, r->g_y, r->g_w, r->g_h, r->g_x + r->g_w, r->g_y + r->g_h);
-}
-
-void dbg_pxy(const char * str, short * pxy )
-{
- printf("%s: x: %d, y: %d, w: %d, h: %d\n", str,
- pxy[0], pxy[1], pxy[2], pxy[3] );
+
+
+void dbg_grect(const char * str, GRECT * r)
+{
+ printf("%s: x: %d, y: %d, w: %d, h: %d (x2: %d, y2: %d)\n", str,
+ r->g_x, r->g_y, r->g_w, r->g_h, r->g_x + r->g_w, r->g_y + r->g_h);
+}
+
+void dbg_pxy(const char * str, short * pxy )
+{
+ printf("%s: x: %d, y: %d, w: %d, h: %d\n", str,
+ pxy[0], pxy[1], pxy[2], pxy[3] );
}
-void dbg_rect(const char * str, int * pxy)
-{
- printf("%s: x0: %d, y0: %d, x1: %d, y1: %d (w: %d, h: %d)\n", str,
+void dbg_rect(const char * str, int * pxy)
+{
+ printf("%s: x0: %d, y0: %d, x1: %d, y1: %d (w: %d, h: %d)\n", str,
pxy[0], pxy[1], pxy[2], pxy[3],
pxy[2] - pxy[0],
- pxy[3] - pxy[1] );
-}
-
+ pxy[3] - pxy[1] );
+}
+
diff --git a/atari/osspec.c b/atari/osspec.c
index 5bd7320dc..11bdee112 100644
--- a/atari/osspec.c
+++ b/atari/osspec.c
@@ -1,134 +1,133 @@
-/*
- * Copyright 2010 <ole@monochrom.net>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <sys/types.h>
-#include <limits.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <stdbool.h>
-#include <stdio.h>
+/*
+ * Copyright 2010 <ole@monochrom.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <sys/types.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdbool.h>
+#include <stdio.h>
#include <string.h>
-#include <support.h>
-#include <mint/osbind.h>
-#include <mint/cookie.h>
-
-#include "utils/log.h"
+#include <support.h>
+#include <mint/osbind.h>
+#include <mint/cookie.h>
+
+#include "utils/log.h"
#include "atari/osspec.h"
-#include "atari/gemtk/gemtk.h"
-
-#ifndef PATH_MAX
-#define PATH_MAX 1024
-#endif
-
-NS_ATARI_SYSINFO atari_sysinfo;
-
-void init_os_info(void)
-{
- int16_t out[4];
- unsigned long cookie_FSMC = 0;
-
- atari_sysinfo.gemdos_version = Sversion();
-
- if( tos_getcookie (C_FSMC, &cookie_FSMC ) == C_FOUND ) {
- atari_sysinfo.gdos_FSMC = 1;
- } else {
- atari_sysinfo.gdos_FSMC = 0;
- }
- atari_sysinfo.large_sfont_pxh = 13;
- atari_sysinfo.medium_sfont_pxh = 6;
- atari_sysinfo.small_sfont_pxh = 4;
- /* todo: detect if system font is monospaced */
- atari_sysinfo.sfont_monospaced = true;
- if( appl_xgetinfo(AES_LARGEFONT, &out[0], &out[1], &out[2], &out[3] ) > 0 ){
- atari_sysinfo.large_sfont_pxh = out[0];
- }
- if( appl_xgetinfo(AES_SMALLFONT, &out[0], &out[1], &out[2], &out[3] ) > 0 ){
- atari_sysinfo.small_sfont_pxh = out[0];
- }
- atari_sysinfo.aes_max_win_title_len = 79;
- if (sys_type() & (SYS_MAGIC|SYS_NAES|SYS_XAAES)) {
- if (sys_NAES()) {
- atari_sysinfo.aes_max_win_title_len = 127;
- }
- if (sys_XAAES()) {
- atari_sysinfo.aes_max_win_title_len = 200;
- }
- }
-}
-
-int tos_getcookie(long tag, long * value)
-{
- COOKIE * cptr;
- long oldsp;
-
- if( atari_sysinfo.gemdos_version > TOS4VER ){
- return( Getcookie(tag, value) );
- }
-
- cptr = (COOKIE*)Setexc(0x0168, -1L);
- if(cptr != NULL) {
- do {
- if( cptr->c == tag ){
- if(cptr->v != 0 ){
- if( value != NULL ){
- *value = cptr->v;
- }
- return( C_FOUND );
- }
- }
- } while( (cptr++)->c != 0L );
- }
- return( C_NOTFOUND );
-}
-
-/*
-
- a fixed version of realpath() which returns valid
- paths for TOS which have no U: drive
-
-*/
-
-char * gemdos_realpath(const char * path, char * rpath)
-{
- char work[PATH_MAX+1];
+#include "atari/gemtk/gemtk.h"
+
+#ifndef PATH_MAX
+#define PATH_MAX 1024
+#endif
+
+NS_ATARI_SYSINFO atari_sysinfo;
+
+void init_os_info(void)
+{
+ int16_t out[4];
+ unsigned long cookie_FSMC = 0;
+
+ atari_sysinfo.gemdos_version = Sversion();
+
+ if( tos_getcookie (C_FSMC, &cookie_FSMC ) == C_FOUND ) {
+ atari_sysinfo.gdos_FSMC = 1;
+ } else {
+ atari_sysinfo.gdos_FSMC = 0;
+ }
+ atari_sysinfo.large_sfont_pxh = 13;
+ atari_sysinfo.medium_sfont_pxh = 6;
+ atari_sysinfo.small_sfont_pxh = 4;
+ /* todo: detect if system font is monospaced */
+ atari_sysinfo.sfont_monospaced = true;
+ if( appl_xgetinfo(AES_LARGEFONT, &out[0], &out[1], &out[2], &out[3] ) > 0 ){
+ atari_sysinfo.large_sfont_pxh = out[0];
+ }
+ if( appl_xgetinfo(AES_SMALLFONT, &out[0], &out[1], &out[2], &out[3] ) > 0 ){
+ atari_sysinfo.small_sfont_pxh = out[0];
+ }
+ atari_sysinfo.aes_max_win_title_len = 79;
+ if (sys_type() & (SYS_MAGIC|SYS_NAES|SYS_XAAES)) {
+ if (sys_NAES()) {
+ atari_sysinfo.aes_max_win_title_len = 127;
+ }
+ if (sys_XAAES()) {
+ atari_sysinfo.aes_max_win_title_len = 200;
+ }
+ }
+}
+
+int tos_getcookie(long tag, long * value)
+{
+ COOKIE * cptr;
+
+ if( atari_sysinfo.gemdos_version > TOS4VER ){
+ return( Getcookie(tag, value) );
+ }
+
+ cptr = (COOKIE*)Setexc(0x0168, -1L);
+ if(cptr != NULL) {
+ do {
+ if( cptr->c == tag ){
+ if(cptr->v != 0 ){
+ if( value != NULL ){
+ *value = cptr->v;
+ }
+ return( C_FOUND );
+ }
+ }
+ } while( (cptr++)->c != 0L );
+ }
+ return( C_NOTFOUND );
+}
+
+/*
+
+ a fixed version of realpath() which returns valid
+ paths for TOS which have no U: drive
+
+*/
+
+char * gemdos_realpath(const char * path, char * rpath)
+{
+ char work[PATH_MAX+1];
char * r;
-
- if (rpath == NULL) {
- return (NULL);
+
+ if (rpath == NULL) {
+ return (NULL);
}
// Check if the path is already absolute:
if(path[1] == ':'){
strcpy(rpath, path);
return(rpath);
- }
+ }
LOG(("realpath in: %s\n", path));
r = realpath(path, work);
if (r != NULL) {
int e = unx2dos((const char *)r, rpath);
- LOG(("realpath out: %s\n", rpath));
+ LOG(("realpath out: %s\n", rpath));
return(rpath);
}
else {
LOG(("realpath out: NULL!\n"));
}
- return (NULL);
-}
-
+ return (NULL);
+}
+
diff --git a/atari/plot/font_freetype.c b/atari/plot/font_freetype.c
index 49e46c857..7ca2d8aba 100755
--- a/atari/plot/font_freetype.c
+++ b/atari/plot/font_freetype.c
@@ -23,6 +23,7 @@
#include FT_CACHE_H
#include "utils/nsoption.h"
+#include "css/css.h"
#include "atari/plot/plot.h"
#include "atari/plot/font_freetype.h"
#include "atari/findfile.h"
diff --git a/atari/plot/font_internal.c b/atari/plot/font_internal.c
index 2b0025a71..e3c806cfe 100644
--- a/atari/plot/font_internal.c
+++ b/atari/plot/font_internal.c
@@ -72,7 +72,7 @@ fb_get_font(const plot_font_style_t *fstyle)
}
}
-static utf8_convert_ret utf8_to_font_encoding(const struct fb_font_desc* font,
+static nserror utf8_to_font_encoding(const struct fb_font_desc* font,
const char *string,
size_t len,
char **result)
diff --git a/atari/plot/font_vdi.c b/atari/plot/font_vdi.c
index 340759f02..7f3dacf63 100755
--- a/atari/plot/font_vdi.c
+++ b/atari/plot/font_vdi.c
@@ -1,49 +1,51 @@
-/*
- * Copyright 2010 Ole Loots <ole@monochrom.net>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
+/*
+ * Copyright 2010 Ole Loots <ole@monochrom.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
#ifdef WITH_VDI_FONT_DRIVER
#include <mt_gemx.h>
-#include "atari/plot/plot.h"
-#include "atari/plot/font_vdi.h"
-
-#include "utils/utf8.h"
+#include "atari/plot/plot.h"
+#include "atari/plot/font_vdi.h"
+
+#include "utils/utf8.h"
#include "utils/log.h"
-
-
-
-//static char * lstr = NULL;
-
-
-static int dtor( FONT_PLOTTER self );
-static int str_width( FONT_PLOTTER self,const plot_font_style_t *fstyle, const char * str, size_t length, int * width );
-static int str_split( FONT_PLOTTER self, const plot_font_style_t *fstyle,const char *string,
- size_t length,int x, size_t *char_offset, int *actual_x );
-static int pixel_pos( FONT_PLOTTER self, const plot_font_style_t *fstyle,const char *string,
- size_t length,int x, size_t *char_offset, int *actual_x );
-static int text( FONT_PLOTTER self, int x, int y, const char *text, size_t length, const plot_font_style_t *fstyle );
-
-static bool init = false;
-static int vdih;
-
-extern struct s_vdi_sysinfo vdi_sysinfo;
+#include "atari/encoding.h"
+
+
+
+
+//static char * lstr = NULL;
+
+
+static int dtor( FONT_PLOTTER self );
+static int str_width( FONT_PLOTTER self,const plot_font_style_t *fstyle, const char * str, size_t length, int * width );
+static int str_split( FONT_PLOTTER self, const plot_font_style_t *fstyle,const char *string,
+ size_t length,int x, size_t *char_offset, int *actual_x );
+static int pixel_pos( FONT_PLOTTER self, const plot_font_style_t *fstyle,const char *string,
+ size_t length,int x, size_t *char_offset, int *actual_x );
+static int text( FONT_PLOTTER self, int x, int y, const char *text, size_t length, const plot_font_style_t *fstyle );
+
+static bool init = false;
+static int vdih;
+
+extern struct s_vdi_sysinfo vdi_sysinfo;
static inline void atari_to_vdi_str(char *lstr, int length)
{
@@ -63,53 +65,53 @@ static inline void atari_to_vdi_str(char *lstr, int length)
}
}
}
-
-int ctor_font_plotter_vdi( FONT_PLOTTER self )
-{
- self->dtor = dtor;
- self->str_width = str_width;
- self->str_split = str_split;
- self->pixel_pos = pixel_pos;
- self->text = text;
- LOG(("%s: %s\n", (char*)__FILE__, __FUNCTION__));
- if( !init ) {
- vdih = self->vdi_handle;
- }
- init = true;
- return( 1 );
-}
-
-static int dtor( FONT_PLOTTER self )
-{
- return( 1 );
-}
-
-static int str_width( FONT_PLOTTER self,const plot_font_style_t *fstyle, const char * str,
- size_t length, int * width )
-{
- short cw, ch, cellw, cellh;
- short pxsize;
+
+int ctor_font_plotter_vdi( FONT_PLOTTER self )
+{
+ self->dtor = dtor;
+ self->str_width = str_width;
+ self->str_split = str_split;
+ self->pixel_pos = pixel_pos;
+ self->text = text;
+ LOG(("%s: %s\n", (char*)__FILE__, __FUNCTION__));
+ if( !init ) {
+ vdih = self->vdi_handle;
+ }
+ init = true;
+ return( 1 );
+}
+
+static int dtor( FONT_PLOTTER self )
+{
+ return( 1 );
+}
+
+static int str_width( FONT_PLOTTER self,const plot_font_style_t *fstyle, const char * str,
+ size_t length, int * width )
+{
+ short cw, ch, cellw, cellh;
+ short pxsize;
short fx=0;
char * lstr = NULL;
-
- utf8_to_local_encoding(str, length, &lstr);
- assert( lstr != NULL );
+
+ utf8_to_local_encoding(str, length, &lstr);
+ assert( lstr != NULL );
int slen = strlen(lstr);
- atari_to_vdi_str(lstr, slen);
-
- if( fstyle->flags & FONTF_ITALIC )
- fx |= 4;
- if( fstyle->flags & FONTF_OBLIQUE )
- fx |= 16;
- if( fstyle->weight > 450 )
- fx |= 1;
- vst_effects( self->vdi_handle, fx );
- /* TODO: replace 90 with global dpi setting */
+ atari_to_vdi_str(lstr, slen);
+
+ if( fstyle->flags & FONTF_ITALIC )
+ fx |= 4;
+ if( fstyle->flags & FONTF_OBLIQUE )
+ fx |= 16;
+ if( fstyle->weight > 450 )
+ fx |= 1;
+ vst_effects( self->vdi_handle, fx );
+ /* TODO: replace 90 with global dpi setting */
//pxsize = ceil( (fstyle->size/FONT_SIZE_SCALE) * 90 / 72 );
//vst_height( self->vdi_handle, pxsize ,&cw, &ch, &cellw, &cellh);
- pxsize = ceil( (fstyle->size/FONT_SIZE_SCALE) * 90 );
+ pxsize = ceil( (fstyle->size/FONT_SIZE_SCALE) * 90 );
vst_point( self->vdi_handle, pxsize, &cw, &ch, &cellw, &cellh);
/*
if(slen != utf8_bounded_length(str, length)){
@@ -117,51 +119,49 @@ static int str_width( FONT_PLOTTER self,const plot_font_style_t *fstyle, const c
printf("s: %s // %s\n", str, lstr );
}*/
-
- *width = slen * cellw;
- free((void*)lstr);
- return( 0 );
-}
-
-static int str_split( FONT_PLOTTER self, const plot_font_style_t * fstyle, const char *string,
- size_t length,int x, size_t *char_offset, int *actual_x )
-{
- short cw, ch, cellw, cellh;
- short pxsize;
- short fx=0;
- int i;
- char *lstr = NULL;
- size_t slen = 0;
- int last_space_x = 0;
+
+ *width = slen * cellw;
+ free((void*)lstr);
+ return( 0 );
+}
+
+static int str_split( FONT_PLOTTER self, const plot_font_style_t * fstyle, const char *string,
+ size_t length,int x, size_t *char_offset, int *actual_x )
+{
+ short cw, ch, cellw, cellh;
+ short pxsize;
+ short fx=0;
+ char *lstr = NULL;
+ size_t slen = 0;
+ int last_space_x = 0;
int last_space_idx = 0;
- size_t nxtchr = 0;
-
- utf8_to_local_encoding(string, length, &lstr );
- assert( lstr != NULL );
+ size_t nxtchr = 0;
+
+ utf8_to_local_encoding(string, length, &lstr );
+ assert( lstr != NULL );
slen = strlen(lstr);
atari_to_vdi_str(lstr, slen);
-
- if( fstyle->flags & FONTF_ITALIC )
- fx |= 4;
- if( fstyle->flags & FONTF_OBLIQUE )
- fx |= 16;
- if( fstyle->weight > 450 )
- fx |= 1;
- vst_effects( self->vdi_handle, fx );
- //pxsize = ceil( (fstyle->size/FONT_SIZE_SCALE) * 90 / 72 );
+
+ if( fstyle->flags & FONTF_ITALIC )
+ fx |= 4;
+ if( fstyle->flags & FONTF_OBLIQUE )
+ fx |= 16;
+ if( fstyle->weight > 450 )
+ fx |= 1;
+ vst_effects( self->vdi_handle, fx );
+ //pxsize = ceil( (fstyle->size/FONT_SIZE_SCALE) * 90 / 72 );
//vst_height( self->vdi_handle, pxsize ,&cw, &ch, &cellw, &cellh);
- pxsize = ceil( (fstyle->size/FONT_SIZE_SCALE) * 90 );
- vst_point( self->vdi_handle, pxsize, &cw, &ch, &cellw, &cellh);
- *actual_x = 0;
- //*char_offset = 0;
- int cpos=0;
+ pxsize = ceil( (fstyle->size/FONT_SIZE_SCALE) * 90 );
+ vst_point( self->vdi_handle, pxsize, &cw, &ch, &cellw, &cellh);
+ *actual_x = 0;
+ //*char_offset = 0;
while (nxtchr < slen) {
- if( lstr[nxtchr] == ' ' ) {
- last_space_x = *actual_x;
- last_space_idx = nxtchr;
+ if( lstr[nxtchr] == ' ' ) {
+ last_space_x = *actual_x;
+ last_space_idx = nxtchr;
}
*actual_x += cellw;
if (*actual_x > x && last_space_idx != 0) {
@@ -178,138 +178,136 @@ static int str_split( FONT_PLOTTER self, const plot_font_style_t * fstyle, const
}
*char_offset = nxtchr;
-
-// for( i=0; i<slen; i++) {
-// if( lstr[i] == ' ' ) {
-// last_space_x = *actual_x;
-// last_space_idx = cpos;
-// }
-// if( *actual_x > x ) {
-// *actual_x = last_space_x;
-// *char_offset = last_space_idx;
-// return true;
-// }
-// *actual_x += cellw;
-// cpos++;
-// }
-// *char_offset = cpos;
- free( (void*)lstr );
- return( 0 );
-}
-
-static int pixel_pos( FONT_PLOTTER self, const plot_font_style_t * fstyle,const char *string,
- size_t length,int x, size_t *char_offset, int *actual_x )
-{
- short cw, ch, cellw, cellh;
- short pxsize=0;
- short fx=0;
-
- char *lstr = NULL;
- int i=0;
- int curpx=0;
- utf8_to_local_encoding(string, length, &lstr );
- assert( lstr != NULL );
+
+// for( i=0; i<slen; i++) {
+// if( lstr[i] == ' ' ) {
+// last_space_x = *actual_x;
+// last_space_idx = cpos;
+// }
+// if( *actual_x > x ) {
+// *actual_x = last_space_x;
+// *char_offset = last_space_idx;
+// return true;
+// }
+// *actual_x += cellw;
+// cpos++;
+// }
+// *char_offset = cpos;
+ free( (void*)lstr );
+ return( 0 );
+}
+
+static int pixel_pos( FONT_PLOTTER self, const plot_font_style_t * fstyle,const char *string,
+ size_t length,int x, size_t *char_offset, int *actual_x )
+{
+ short cw, ch, cellw, cellh;
+ short pxsize=0;
+ short fx=0;
+
+ char *lstr = NULL;
+ int i=0;
+ utf8_to_local_encoding(string, length, &lstr );
+ assert( lstr != NULL );
int slen = strlen(lstr);
atari_to_vdi_str(lstr, slen);
-
- if( fstyle->flags & FONTF_ITALIC )
- fx |= 4;
- if( fstyle->flags & FONTF_OBLIQUE )
- fx |= 16;
- if( fstyle->weight > 450 )
- fx |= 1;
- vst_effects(self->vdi_handle, fx);
- pxsize = ceil( (fstyle->size/FONT_SIZE_SCALE) * 90 / 72 );
- vst_height( self->vdi_handle, pxsize ,&cw, &ch, &cellw, &cellh);
- *actual_x = 0;
- *char_offset = 0;
- for( i=0; i<slen; i++) {
- *actual_x += cellw;
- if( *actual_x > x) {
- *actual_x -= cellw;
- *char_offset = i;
- break;
- }
- }
- free((void*)lstr);
- lstr = NULL;
- return( 0 );
-}
-
-static inline void vst_rgbcolor( short vdih, uint32_t cin )
-{
+
+ if( fstyle->flags & FONTF_ITALIC )
+ fx |= 4;
+ if( fstyle->flags & FONTF_OBLIQUE )
+ fx |= 16;
+ if( fstyle->weight > 450 )
+ fx |= 1;
+ vst_effects(self->vdi_handle, fx);
+ pxsize = ceil( (fstyle->size/FONT_SIZE_SCALE) * 90 / 72 );
+ vst_height( self->vdi_handle, pxsize ,&cw, &ch, &cellw, &cellh);
+ *actual_x = 0;
+ *char_offset = 0;
+ for( i=0; i<slen; i++) {
+ *actual_x += cellw;
+ if( *actual_x > x) {
+ *actual_x -= cellw;
+ *char_offset = i;
+ break;
+ }
+ }
+ free((void*)lstr);
+ lstr = NULL;
+ return( 0 );
+}
+
+static inline void vst_rgbcolor( short vdih, uint32_t cin )
+{
#ifdef WITH_8BPP_SUPPORT
if( vdi_sysinfo.scr_bpp > 8 ) {
-#endif
+#endif
//unsigned short c[4];
RGB1000 c;
-
- rgb_to_vdi1000( (unsigned char*)&cin, &c );
- vs_color( vdih, OFFSET_CUSTOM_COLOR, (unsigned short*)&c);
- vst_color( vdih, OFFSET_CUSTOM_COLOR );
+
+ rgb_to_vdi1000( (unsigned char*)&cin, &c );
+ vs_color( vdih, OFFSET_CUSTOM_COLOR, (unsigned short*)&c);
+ vst_color( vdih, OFFSET_CUSTOM_COLOR );
#ifdef WITH_8BPP_SUPPORT
- } else {
- if( vdi_sysinfo.scr_bpp >= 4 )
- vst_color( vdih, RGB_TO_VDI(cin) );
- else
- vst_color( vdih, BLACK );
+ } else {
+ if( vdi_sysinfo.scr_bpp >= 4 )
+ vst_color( vdih, RGB_TO_VDI(cin) );
+ else
+ vst_color( vdih, BLACK );
}
-#endif
-}
-
-static int text( FONT_PLOTTER self, int x, int y, const char *text, size_t length,
- const plot_font_style_t *fstyle )
-{
- /* todo: either limit the string to max 80 chars, or use v_ftext instead of v_gtext */
- short cw, ch, cellw, cellh;
- short pxsize=8;
+#endif
+}
+
+static int text( FONT_PLOTTER self, int x, int y, const char *text, size_t length,
+ const plot_font_style_t *fstyle )
+{
+ /* todo: either limit the string to max 80 chars, or use v_ftext instead of v_gtext */
+ short cw, ch, cellw, cellh;
+ short pxsize=8;
short fx=0;
- GRECT canvas;
+ GRECT canvas;
char *lstr = NULL;
- assert( utf8_to_local_encoding(text, length, &lstr) == UTF8_CONVERT_OK);
+ assert( utf8_to_local_encoding(text, length, &lstr) == NSERROR_OK);
assert( lstr != NULL );
-
+
int slen = strlen(lstr);
if(slen > 800){
lstr[800]=0;
}
- atari_to_vdi_str(lstr, slen);
-
- if( fstyle != NULL){
- if( fstyle->flags & FONTF_ITALIC )
- fx |= 4;
- if( fstyle->flags & FONTF_OBLIQUE )
- fx |= 4;
- if( fstyle->weight > 450 )
- fx |= 1;
-
- /* TODO: netsurf uses 90 as default dpi ( somewhere defined in libcss),
- use that value or pass it as arg, to reduce netsurf dependency */
- //pxsize = ceil( (fstyle->size/FONT_SIZE_SCALE) * 90 / 72 );
- pxsize = ceil( (fstyle->size/FONT_SIZE_SCALE) * 90 / 72 );
- }
- plot_get_dimensions(&canvas);
- x += canvas.g_x;
- y += canvas.g_y;
- vst_effects( self->vdi_handle, fx );
+ atari_to_vdi_str(lstr, slen);
+
+ if( fstyle->flags & FONTF_ITALIC )
+ fx |= 4;
+ if( fstyle->flags & FONTF_OBLIQUE )
+ fx |= 4;
+ if( fstyle->weight > 450 )
+ fx |= 1;
+
+ /* TODO: netsurf uses 90 as default dpi ( somewhere defined in libcss),
+ use that value or pass it as arg, to reduce netsurf dependency */
+ //pxsize = ceil( (fstyle->size/FONT_SIZE_SCALE) * 90 / 72 );
+ pxsize = ceil( (fstyle->size/FONT_SIZE_SCALE) * 90 / 72 );
+
+ plot_get_dimensions(&canvas);
+ x += canvas.g_x;
+ y += canvas.g_y;
+ vst_effects( self->vdi_handle, fx );
vst_alignment(vdih, 0, 0, &cw, &ch );
- vst_point( self->vdi_handle, pxsize, &cw, &ch, &cellw, &cellh);
- //vst_height( self->vdi_handle, pxsize, &cw, &ch, &cellw, &cellh);
- vswr_mode( self->vdi_handle, MD_TRANS );
- vst_rgbcolor(self->vdi_handle, fstyle->foreground);
-
+ vst_point( self->vdi_handle, pxsize, &cw, &ch, &cellw, &cellh);
+ //vst_height( self->vdi_handle, pxsize, &cw, &ch, &cellw, &cellh);
+ vswr_mode( self->vdi_handle, MD_TRANS );
+ vst_rgbcolor(self->vdi_handle, fstyle->foreground);
+
if( atari_sysinfo.gdos_FSMC ){
- //printf("\nftext\n");
- v_ftext( self->vdi_handle, x, y, (char*)lstr );
+ //printf("\nftext\n");
+ v_ftext( self->vdi_handle, x, y, (char*)lstr );
} else {
- //printf("\ngtext\n");
- v_gtext( self->vdi_handle, x, y, (char*)lstr );
- }
- free( lstr );
- return( 0 );
-}
-
-#endif
+ //printf("\ngtext\n");
+ v_gtext( self->vdi_handle, x, y, (char*)lstr );
+ }
+ free( lstr );
+ return( 0 );
+}
+
+#endif
diff --git a/atari/plot/plot.c b/atari/plot/plot.c
index 2c75db335..cfec7b424 100755
--- a/atari/plot/plot.c
+++ b/atari/plot/plot.c
@@ -625,7 +625,6 @@ inline static unsigned char get_stdpx(MFDB * dst, int wdplanesz, int x, int y)
*/
inline short rgb_to_666_index(unsigned char r, unsigned char g, unsigned char b)
{
- short ret = 0;
short i;
unsigned char rgb[3] = {r,g,b};
unsigned char tval[3];
@@ -635,7 +634,7 @@ inline short rgb_to_666_index(unsigned char r, unsigned char g, unsigned char b)
diff_b = abs(r-b);
diff_c = abs(r-b);
if( diff_a < 2 && diff_b < 2 && diff_c < 2 ) {
- if( (r!=0XFF) && (g!=0XFF) && (g!=0XFF) ) {
+ if( (r!=0XFF) && (g!=0XFF) && (b!=0XFF) ) {
if( ((r&0xF0)>>4) != 0 )
//printf("conv gray: %x -> %d\n", ((r&0xF0)>>4) , (OFFSET_CUST_PAL) + ((r&0xF0)>>4) );
return( (OFFSET_CUST_PAL - OFFSET_WEB_PAL) + ((r&0xF0)>>4) );
@@ -1016,11 +1015,8 @@ static bool bitmap_convert_8(struct bitmap * img, int x,
MFDB stdform;
int dststride; /* stride of dest. image */
int dstsize; /* size of dest. in byte */
- int err;
int bw, bh;
- int process_w, process_h;
struct bitmap * scrbuf = NULL;
- struct bitmap * source;
bool cache = ( flags & BITMAPF_BUFFER_NATIVE );
bool opaque = bitmap_get_opaque( img );
@@ -1035,8 +1031,8 @@ static bool bitmap_convert_8(struct bitmap * img, int x,
assert( clip->g_h > 0 );
assert( clip->g_w > 0 );
- process_w = bw = bitmap_get_width( img );
- process_h = bh = bitmap_get_height( img );
+ bw = bitmap_get_width( img );
+ bh = bitmap_get_height( img );
// The converted bitmap can be saved for subsequent blits, when
// the bitmap is fully opaque
@@ -1526,7 +1522,7 @@ int plot_init(char * fdrvrname)
{
GRECT loc_pos= {0,0,360,400};
- int err=0,i;
+ int err=0;
if( nsoption_int(atari_dither) == 1)
atari_plot_flags |= PLOT_FLAG_DITHER;
@@ -1589,11 +1585,10 @@ int plot_init(char * fdrvrname)
bitmap_convert = (vdi_sysinfo.scr_bpp > 8) ? bitmap_convert_tc : bitmap_convert_8;
/* Setup color lookup tables and palette */
- i = 0;
- unsigned char * col;
unsigned char rgbcol[4];
- unsigned char graytone=0;
if( vdi_sysinfo.scr_bpp <= 8 ){
+ unsigned char graytone=0;
+ int i;
for( i=0; i<=255; i++ ) {
// get the current color and save it for restore:
@@ -1659,12 +1654,12 @@ int plot_init(char * fdrvrname)
int plot_finalise( void )
{
- int i=0;
delete_font_plotter(fplotter);
#ifdef WITH_8BPP_SUPPORT
if (vfmt.indexed) {
+ int i;
for (i=OFFSET_WEB_PAL; i<OFFSET_CUST_PAL+16; i++) {
vs_color(atari_plot_vdi_handle, i, &sys_pal[i][0]);
}
@@ -1857,7 +1852,6 @@ static bool plot_polygon(const int *p, unsigned int n,
{
short pxy[n*2];
unsigned int i=0;
- short d[4];
if (vdi_sysinfo.maxpolycoords > 0)
assert( (signed int)n < vdi_sysinfo.maxpolycoords);
@@ -1894,7 +1888,6 @@ bool plot_set_dimensions(int x, int y, int w, int h)
GRECT absclip = {x, y, w, h};
if (!(w == view.w && h == view.h)) {
- struct rect newclip = { 0, 0, w-1, h-1 };
view.w = (short)w;
view.h = (short)h;
doupdate = true;
diff --git a/atari/rootwin.c b/atari/rootwin.c
index 3c89e6d55..a9c958e04 100755
--- a/atari/rootwin.c
+++ b/atari/rootwin.c
@@ -38,7 +38,6 @@
#include "utils/log.h"
#include "desktop/gui.h"
-#include "desktop/local_history.h"
#include "desktop/netsurf.h"
#include "desktop/browser.h"
#include "desktop/browser_private.h"
@@ -85,6 +84,8 @@ static bool on_content_mouse_click(ROOTWIN *rootwin);
static bool on_content_mouse_move(ROOTWIN *rootwin, GRECT *content_area);
static void toolbar_redraw_cb(GUIWIN *win, uint16_t msg, GRECT *clip);
+bool gui_window_get_scroll(struct gui_window *w, int *sx, int *sy);
+
static bool redraw_active = false;
static const struct redraw_context rootwin_rdrw_ctx = {
@@ -98,11 +99,8 @@ static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
short retval = 0;
GRECT area;
static bool prev_url = false;
- static short prev_x=0;
- static short prev_y=0;
struct rootwin_data_s * data = gemtk_wm_get_user_data(win);
struct gui_window *tmp;
- OBJECT *obj;
if ((ev_out->emo_events & MU_MESAG) != 0) {
@@ -228,7 +226,7 @@ static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
int window_create(struct gui_window * gw,
struct browser_window * bw,
- struct browser_window * clone,
+ struct gui_window * existing,
unsigned long inflags)
{
int err = 0;
@@ -292,8 +290,8 @@ int window_create(struct gui_window * gw,
assert(gw->browser);
gw->browser->bw = bw;
- if(clone)
- gw->browser->bw->scale = clone->scale;
+ if(existing)
+ gw->browser->bw->scale = existing->browser->bw->scale;
else
gw->browser->bw->scale = 1;
@@ -467,7 +465,6 @@ void window_set_title(struct s_gui_win_root * rootwin, char *title)
void window_scroll_by(ROOTWIN *root, int sx, int sy)
{
- int units;
GRECT content_area;
struct gemtk_wm_scroll_info_s *slid = gemtk_wm_get_scroll_info(root->win);
@@ -509,8 +506,6 @@ void window_set_content_size(ROOTWIN *rootwin, int width, int height)
void window_set_focus(struct s_gui_win_root *rootwin,
enum focus_element_type type, void * element)
{
- struct textarea * ta;
-
assert(rootwin != NULL);
if (rootwin->focus.type != type || rootwin->focus.element != element) {
@@ -568,7 +563,6 @@ void window_set_icon(ROOTWIN *rootwin, struct bitmap * bmp )
rootwin->icon = bmp;
/* redraw window when it is iconyfied: */
if (rootwin->icon != NULL) {
- short info, dummy;
if (gemtk_wm_get_state(rootwin->win) & GEMTK_WM_STATUS_ICONIFIED) {
window_redraw_favicon(rootwin, NULL);
}
@@ -767,7 +761,6 @@ void window_redraw_favicon(ROOTWIN *rootwin, GRECT *clip_ro)
} else {
//printf("window_redraw_favicon image %p\n", rootwin->icon);
VdiHdl plot_vdi_handle = plot_get_vdi_handle();
- struct rect work_clip = { 0,0,work.g_w,work.g_h };
short pxy[4];
int xoff=0;
@@ -777,7 +770,6 @@ void window_redraw_favicon(ROOTWIN *rootwin, GRECT *clip_ro)
}
plot_set_dimensions( work.g_x+xoff, work.g_y, work.g_w,
work.g_h);
- //plot_clip(&work_clip);
wind_get_grect(rootwin->aes_handle, WF_FIRSTXYWH, &visible);
while (visible.g_h > 0 && visible.g_w > 0) {
@@ -842,7 +834,7 @@ static void window_redraw_content(ROOTWIN *rootwin, GRECT *content_area,
plot_set_dimensions(content_area->g_x, content_area->g_y,
content_area->g_w, content_area->g_h);
- oldscale = plot_set_scale(gui_window_get_scale(rootwin->active_gui_window));
+ oldscale = plot_set_scale(browser_window_get_scale(rootwin->active_gui_window->browser->bw));
/* first, we make the coords relative to the content area: */
content_area_rel.g_x = clip->g_x - content_area->g_x;
@@ -886,7 +878,7 @@ void window_place_caret(ROOTWIN *rootwin, short mode, int content_x,
short pxy[8];
GRECT mywork, caret_pos;
MFDB screen;
- int i, scroll_x, scroll_y;
+ int scroll_x, scroll_y;
uint16_t *fd_addr;
struct gemtk_wm_scroll_info_s *slid;
short colors[2] = {G_BLACK, G_WHITE};
@@ -972,6 +964,7 @@ void window_place_caret(ROOTWIN *rootwin, short mode, int content_x,
// draw the caret into the mfdb buffer:
if (render_required) {
+ int i;
assert(caret->symbol.fd_nplanes == 1);
assert(caret->symbol.fd_w == 16);
@@ -1022,7 +1015,6 @@ void window_process_redraws(ROOTWIN * rootwin)
GRECT work, visible_ro, tb_area, content_area;
short i;
short scroll_x=0, scroll_y=0;
- bool toolbar_rdrw_required;
bool caret_rdrw_required = false;
struct gemtk_wm_scroll_info_s *slid =NULL;
int caret_h = 0;
@@ -1366,7 +1358,6 @@ static short on_window_key_input(ROOTWIN *rootwin, unsigned short nkc)
{
bool done = false;
struct gui_window * gw = window_get_active_gui_window(rootwin);
- struct gui_window * gw_tmp;
if( gw == NULL )
return(false);
@@ -1396,8 +1387,6 @@ static short on_window_key_input(ROOTWIN *rootwin, unsigned short nkc)
static void on_redraw(ROOTWIN *rootwin, short msg[8])
{
- short handle;
-
GRECT clip = {msg[4], msg[5], msg[6], msg[7]};
//dbg_grect("on_redraw", &clip);
@@ -1414,7 +1403,6 @@ static void on_redraw(ROOTWIN *rootwin, short msg[8])
static void on_resized(ROOTWIN *rootwin)
{
GRECT g, work;
- OBJECT *toolbar;
struct gui_window *gw;
gw = window_get_active_gui_window(rootwin);
@@ -1497,6 +1485,8 @@ static void on_file_dropped(ROOTWIN *rootwin, short msg[8])
size, mx, my
));
+ gui_window_get_scroll(gw, &sx, &sy);
+
window_get_grect(rootwin, BROWSER_AREA_CONTENT, &content_area);
mx = mx - content_area.g_x;
my = my - content_area.g_y;
@@ -1508,19 +1498,18 @@ static void on_file_dropped(ROOTWIN *rootwin, short msg[8])
mx+sx, my+sy,
NULL);
if(processed == true) {
- utf8_convert_ret ret;
+ nserror ret;
char *utf8_fn;
ret = utf8_from_local_encoding(buff, 0, &utf8_fn);
- if (ret != UTF8_CONVERT_OK) {
+ if (ret != NSERROR_OK) {
free(buff);
/* A bad encoding should never happen */
LOG(("utf8_from_local_encoding failed"));
- assert(ret != UTF8_CONVERT_BADENC);
+ assert(ret != NSERROR_BAD_ENCODING);
/* no memory */
goto error;
}
- gui_window_get_scroll(gw, &sx, &sy);
processed = browser_window_drop_file_at_point(gw->browser->bw,
mx+sx, my+sy,
utf8_fn);
@@ -1534,8 +1523,8 @@ static void on_file_dropped(ROOTWIN *rootwin, short msg[8])
char * tmp_url = local_file_to_url(buff);
if ((tmp_url != NULL)
&& nsurl_create(tmp_url, &ns_url) == NSERROR_OK) {
- browser_window_navigate(gw->browser->bw, ns_url, NULL,
- BROWSER_WINDOW_HISTORY | BROWSER_WINDOW_VERIFIABLE,
+ browser_window_navigate(gw->browser->bw, ns_url, NULL,
+ BW_NAVIGATE_HISTORY,
NULL, NULL, NULL);
nsurl_unref(ns_url);
}
diff --git a/atari/rootwin.h b/atari/rootwin.h
index d2cd04a35..a5b22c968 100755
--- a/atari/rootwin.h
+++ b/atari/rootwin.h
@@ -46,7 +46,7 @@ enum browser_area_e {
/* Creates an normal Browser window with [toolbar], [statusbar] */
int window_create(struct gui_window * gw,
struct browser_window * bw,
- struct browser_window * clone,
+ struct gui_window * existing,
unsigned long flags );
/* Destroys WinDom part of gui_window */
int window_destroy(ROOTWIN *rootwin);
diff --git a/atari/schedule.c b/atari/schedule.c
index a91c510b3..3bef573a5 100755
--- a/atari/schedule.c
+++ b/atari/schedule.c
@@ -22,12 +22,17 @@
#include <sys/time.h>
#include <time.h>
-#include "utils/schedule.h"
+#include "utils/errors.h"
+
#include "atari/schedule.h"
+#ifdef DEBUG_SCHEDULER
#include "utils/log.h"
+#else
+#define LOG(X)
+#endif
-#define CS_NOW() ((clock() * 100) / CLOCKS_PER_SEC)
+#define MS_NOW() ((clock() * 1000) / CLOCKS_PER_SEC)
/* linked list of scheduled callbacks */
static struct nscallback *schedule_list = NULL;
@@ -47,45 +52,6 @@ static int max_scheduled;
static int cur_scheduled;
/**
- * Schedule a callback.
- *
- * \param tival interval before the callback should be made / cs
- * \param callback callback function
- * \param p user parameter, passed to callback function
- *
- * The callback function will be called as soon as possible after t cs have
- * passed.
- */
-void schedule( int cs_ival, void (*callback)(void *p), void *p)
-{
- struct nscallback *nscb;
-
- /*
- remove any callback of this kind,
- other frontend do this, too. framebuffer frontend doesn't do it.
- */
- schedule_remove(callback, p);
-
- nscb = calloc(1, sizeof(struct nscallback));
-
- nscb->timeout = CS_NOW() + cs_ival;
-#ifdef DEBUG_SCHEDULER
- LOG(("adding callback %p for %p(%p) at %d cs", nscb, callback, p, nscb->timeout ));
-#endif
- nscb->callback = callback;
- nscb->p = p;
-
- /* add to list front */
- nscb->next = schedule_list;
- schedule_list = nscb;
- cur_scheduled++;
- if( cur_scheduled > max_scheduled )
- max_scheduled = cur_scheduled;
-}
-
-
-
-/**
* Unschedule a callback.
*
* \param callback callback function
@@ -94,18 +60,18 @@ void schedule( int cs_ival, void (*callback)(void *p), void *p)
* All scheduled callbacks matching both callback and p are removed.
*/
-void schedule_remove(void (*callback)(void *p), void *p)
+static nserror schedule_remove(void (*callback)(void *p), void *p)
{
struct nscallback *cur_nscb;
struct nscallback *prev_nscb;
struct nscallback *unlnk_nscb;
- if (schedule_list == NULL)
- return;
+ /* check there is something on the list to remove */
+ if (schedule_list == NULL) {
+ return NSERROR_OK;
+ }
-#ifdef DEBUG_SCHEDULER
LOG(("removing %p, %p", callback, p));
-#endif
cur_nscb = schedule_list;
prev_nscb = NULL;
@@ -114,9 +80,8 @@ void schedule_remove(void (*callback)(void *p), void *p)
if ((cur_nscb->callback == callback) &&
(cur_nscb->p == p)) {
/* item to remove */
-#ifdef DEBUG_SCHEDULER
- LOG(("callback entry %p removing %p(%p)", cur_nscb, cur_nscb->callback, cur_nscb->p));
-#endif
+ LOG(("callback entry %p removing %p(%p)",
+ cur_nscb, cur_nscb->callback, cur_nscb->p));
/* remove callback */
unlnk_nscb = cur_nscb;
@@ -135,20 +100,51 @@ void schedule_remove(void (*callback)(void *p), void *p)
cur_nscb = prev_nscb->next;
}
}
+ return NSERROR_OK;
+}
+
+/* exported function documented in atari/schedule.h */
+nserror atari_schedule(int ival, void (*callback)(void *p), void *p)
+{
+ struct nscallback *nscb;
+ nserror ret;
+
+ /* remove any existing callback of this kind */
+ ret = schedule_remove(callback, p);
+ if ((ival < 0) || (ret != NSERROR_OK)) {
+ return ret;
+ }
+
+ nscb = calloc(1, sizeof(struct nscallback));
+
+ nscb->timeout = MS_NOW() + ival;
+
+ LOG(("adding callback %p for %p(%p) at %d ms",
+ nscb, callback, p, nscb->timeout ));
+
+ nscb->callback = callback;
+ nscb->p = p;
+
+ /* add to list front */
+ nscb->next = schedule_list;
+ schedule_list = nscb;
+ cur_scheduled++;
+ if( cur_scheduled > max_scheduled ) {
+ max_scheduled = cur_scheduled;
+ }
+
+ return NSERROR_OK;
}
-/**
- * Process events up to current time.
- */
-int
-schedule_run(void)
+/* exported function documented in atari/schedule.h */
+int schedule_run(void)
{
unsigned long nexttime;
struct nscallback *cur_nscb;
struct nscallback *prev_nscb;
struct nscallback *unlnk_nscb;
- unsigned long now = CS_NOW();
+ unsigned long now = MS_NOW();
if (schedule_list == NULL)
return -1;
@@ -170,9 +166,9 @@ schedule_run(void)
prev_nscb->next = unlnk_nscb->next;
}
-#ifdef DEBUG_SCHEDULER
- LOG(("callback entry %p running %p(%p)", unlnk_nscb, unlnk_nscb->callback, unlnk_nscb->p));
-#endif
+ LOG(("callback entry %p running %p(%p)",
+ unlnk_nscb, unlnk_nscb->callback, unlnk_nscb->p));
+
/* call callback */
unlnk_nscb->callback(unlnk_nscb->p);
free(unlnk_nscb);
@@ -180,9 +176,8 @@ schedule_run(void)
/* need to deal with callback modifying the list. */
if (schedule_list == NULL) {
-#ifdef DEBUG_SCHEDULER
LOG(("schedule_list == NULL"));
-#endif
+
return -1; /* no more callbacks scheduled */
}
@@ -204,21 +199,22 @@ schedule_run(void)
}
/* make rettime relative to now and convert to ms */
- nexttime = (nexttime - now)*10;
-#ifdef DEBUG_SCHEDULER
+ nexttime = nexttime - now;
+
LOG(("returning time to next event as %ldms", nexttime ));
-#endif
+
/*return next event time in milliseconds (24days max wait) */
- return ( nexttime );
+ return nexttime;
}
+/* exported function documented in atari/schedule.h */
void list_schedule(void)
{
struct timeval tv;
struct nscallback *cur_nscb;
- LOG(("schedule list at cs clock %ld", CS_NOW() ));
+ LOG(("schedule list at ms clock %ld", MS_NOW() ));
cur_nscb = schedule_list;
while (cur_nscb != NULL) {
diff --git a/atari/schedule.h b/atari/schedule.h
index e21b759a0..05eebb2d7 100755
--- a/atari/schedule.h
+++ b/atari/schedule.h
@@ -17,10 +17,32 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef NS_SCHEDULE_H
-#define NS_SCHEDULE_H
+#ifndef NS_ATARI_SCHEDULE_H
+#define NS_ATARI_SCHEDULE_H
-void list_schedule(void);
+/**
+ * Process events up to current time.
+ *
+ * \return The number of miliseconds until the next scheduled event.
+ */
int schedule_run(void);
+/**
+ * Schedule a callback.
+ *
+ * \param ival interval before the callback should be made in miliseconds.
+ * \param callback callback function.
+ * \param p user parameter, passed to callback function.
+ * \return NSERROR_OK on success or appropriate error code.
+ *
+ * The callback function will be called as soon as possible after \a ival
+ * ms have passed.
+ */
+nserror atari_schedule(int ival, void (*callback)(void *p), void *p);
+
+/**
+ * LOG all current scheduled events.
+ */
+void list_schedule(void);
+
#endif
diff --git a/atari/search.c b/atari/search.c
index 6d8f53bec..f79891aa5 100644
--- a/atari/search.c
+++ b/atari/search.c
@@ -1,124 +1,127 @@
-/*
- * Copyright 2013 Ole Loots <ole@monochrom.net>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- * Module Description:
- *
- *
- *
- */
-
-
-#include <limits.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-#include <stdbool.h>
-#include <assert.h>
-
-#include "desktop/gui.h"
-#include "desktop/browser.h"
-#include "desktop/browser_private.h"
-#include "desktop/search.h"
-#include "utils/log.h"
-#include "utils/messages.h"
+/*
+ * Copyright 2013 Ole Loots <ole@monochrom.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Module Description:
+ *
+ *
+ *
+ */
+
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdbool.h>
+#include <assert.h>
+
+#include "desktop/gui.h"
+#include "desktop/browser.h"
+#include "desktop/browser_private.h"
+#include "desktop/search.h"
+#include "utils/log.h"
+#include "utils/messages.h"
#include "atari/gui.h"
-#include "atari/rootwin.h"
-#include "atari/misc.h"
+#include "atari/rootwin.h"
+#include "atari/misc.h"
#include "atari/toolbar.h"
#include "atari/search.h"
-#include "atari/gemtk/gemtk.h"
-#include "atari/res/netsurf.rsh"
-
-extern struct gui_window * input_window;
-
-
-static void nsatari_search_set_status(bool found, void *p);
-static void nsatari_search_set_hourglass(bool active, void *p);
-static void nsatari_search_add_recent(const char *string, void *p);
-void nsatari_search_set_forward_state(bool active, void *p);
-void nsatari_search_set_back_state(bool active, void *p);
-
-static struct gui_search_callbacks nsatari_search_callbacks = {
- nsatari_search_set_forward_state,
- nsatari_search_set_back_state,
- nsatari_search_set_status,
- nsatari_search_set_hourglass,
- nsatari_search_add_recent
-};
-
-
-/**
-* Change the displayed search status.
-* \param found search pattern matched in text
-* \param p the pointer sent to search_verify_new() / search_create_context()
-*/
-
-void nsatari_search_set_status(bool found, void *p)
-{
+#include "atari/gemtk/gemtk.h"
+#include "atari/res/netsurf.rsh"
+
+extern struct gui_window * input_window;
+
+
+static void nsatari_search_set_status(bool found, void *p);
+static void nsatari_search_set_hourglass(bool active, void *p);
+static void nsatari_search_add_recent(const char *string, void *p);
+void nsatari_search_set_forward_state(bool active, void *p);
+void nsatari_search_set_back_state(bool active, void *p);
+
+static struct gui_search_table search_table = {
+ nsatari_search_set_status,
+ nsatari_search_set_hourglass,
+ nsatari_search_add_recent,
+ nsatari_search_set_forward_state,
+ nsatari_search_set_back_state,
+};
+
+struct gui_search_table *atari_search_table = &search_table;
+
+
+
+/**
+* Change the displayed search status.
+* \param found search pattern matched in text
+* \param p the pointer sent to search_verify_new() / search_create_context()
+*/
+
+void nsatari_search_set_status(bool found, void *p)
+{
LOG(("%p set status: %d\n", p, found));
- // TODO: maybe update GUI
-}
-
-/**
-* display hourglass while searching
-* \param active start/stop indicator
-* \param p the pointer sent to search_verify_new() / search_create_context()
-*/
-
-void nsatari_search_set_hourglass(bool active, void *p)
-{
- SEARCH_FORM_SESSION s = (SEARCH_FORM_SESSION)p;
- LOG(("active: %d, session: %p", active, p));
- if (active)
- gui_window_set_pointer(s->bw->window, GUI_POINTER_PROGRESS);
- else
- gui_window_set_pointer(s->bw->window, GUI_POINTER_DEFAULT);
-}
-
-/**
-* add search string to recent searches list
-* front is at liberty how to implement the bare notification
-* should normally store a strdup() of the string;
-* core gives no guarantee of the integrity of the const char *
-* \param string search pattern
-* \param p the pointer sent to search_verify_new() / search_create_context()
-*/
-
-void nsatari_search_add_recent(const char *string, void *p)
-{
- LOG(("%p add recent: %s\n", p, string));
-}
-
-/**
-* activate search forwards button in gui
-* \param active activate/inactivate
-* \param p the pointer sent to search_verify_new() / search_create_context()
-*/
-
-void nsatari_search_set_forward_state(bool active, void *p)
+ // TODO: maybe update GUI
+}
+
+/**
+* display hourglass while searching
+* \param active start/stop indicator
+* \param p the pointer sent to search_verify_new() / search_create_context()
+*/
+
+void nsatari_search_set_hourglass(bool active, void *p)
+{
+ SEARCH_FORM_SESSION s = (SEARCH_FORM_SESSION)p;
+ LOG(("active: %d, session: %p", active, p));
+ if (active)
+ gui_window_set_pointer(s->bw->window, GUI_POINTER_PROGRESS);
+ else
+ gui_window_set_pointer(s->bw->window, GUI_POINTER_DEFAULT);
+}
+
+/**
+* add search string to recent searches list
+* front is at liberty how to implement the bare notification
+* should normally store a strdup() of the string;
+* core gives no guarantee of the integrity of the const char *
+* \param string search pattern
+* \param p the pointer sent to search_verify_new() / search_create_context()
+*/
+
+void nsatari_search_add_recent(const char *string, void *p)
+{
+ LOG(("%p add recent: %s\n", p, string));
+}
+
+/**
+* activate search forwards button in gui
+* \param active activate/inactivate
+* \param p the pointer sent to search_verify_new() / search_create_context()
+*/
+
+void nsatari_search_set_forward_state(bool active, void *p)
{
struct gui_window *gw;
OBJECT *toolbar;
- GRECT area;
- SEARCH_FORM_SESSION s = (SEARCH_FORM_SESSION)p;
- /* deactivate back cb */
+ GRECT area;
+ SEARCH_FORM_SESSION s = (SEARCH_FORM_SESSION)p;
+ /* deactivate back cb */
LOG(("%p: set forward state: %d\n", p, active));
-
+
gw = s->bw->window;
toolbar = toolbar_get_form(gw->root->toolbar);
@@ -128,22 +131,22 @@ void nsatari_search_set_forward_state(bool active, void *p)
toolbar[TOOLBAR_BT_SEARCH_FWD].ob_state |= OS_DISABLED;
window_get_grect(gw->root, BROWSER_AREA_SEARCH, &area);
window_schedule_redraw_grect(gw->root, &area);
-
-}
-
-/**
-* activate search back button in gui
-* \param active activate/inactivate
-* \param p the pointer sent to search_verify_new() / search_create_context()
-*/
-
-void nsatari_search_set_back_state(bool active, void *p)
-{
+
+}
+
+/**
+* activate search back button in gui
+* \param active activate/inactivate
+* \param p the pointer sent to search_verify_new() / search_create_context()
+*/
+
+void nsatari_search_set_back_state(bool active, void *p)
+{
struct gui_window *gw;
OBJECT *toolbar;
GRECT area;
- SEARCH_FORM_SESSION s = (SEARCH_FORM_SESSION)p;
- /* deactivate back cb */
+ SEARCH_FORM_SESSION s = (SEARCH_FORM_SESSION)p;
+ /* deactivate back cb */
LOG(("%p: set back state: %d\n", p, active));
s->state.back_avail = active;
@@ -155,42 +158,42 @@ void nsatari_search_set_back_state(bool active, void *p)
else
toolbar[TOOLBAR_BT_SEARCH_BACK].ob_state |= OS_DISABLED;
window_get_grect(gw->root, BROWSER_AREA_SEARCH, &area);
- window_schedule_redraw_grect(gw->root, &area);
+ window_schedule_redraw_grect(gw->root, &area);
}
-
-static int apply_form(OBJECT *obj, struct s_search_form_state *s)
-{
+
+static int apply_form(OBJECT *obj, struct s_search_form_state *s)
+{
char * cstr;
assert(s != NULL);
-
+
s->flags = 0;
-
- if( (obj[TOOLBAR_CB_CASESENSE].ob_state & OS_SELECTED) != 0 )
- s->flags |= SEARCH_FLAG_CASE_SENSITIVE;
- if( (obj[TOOLBAR_CB_SHOWALL].ob_state & OS_SELECTED) != 0 )
- s->flags |= SEARCH_FLAG_SHOWALL;
+
+ if( (obj[TOOLBAR_CB_CASESENSE].ob_state & OS_SELECTED) != 0 )
+ s->flags |= SEARCH_FLAG_CASE_SENSITIVE;
+ if( (obj[TOOLBAR_CB_SHOWALL].ob_state & OS_SELECTED) != 0 )
+ s->flags |= SEARCH_FLAG_SHOWALL;
cstr = gemtk_obj_get_text(obj, TOOLBAR_TB_SRCH);
snprintf(s->text, 32, "%s", cstr);
- return ( 0 );
-
-}
-
-static void set_text(OBJECT *obj, short idx, char * text, int len)
-{
- char spare[255];
-
- if( len > 254 )
- len = 254;
- if( text != NULL ){
- strncpy(spare, text, 254);
- } else {
- strcpy(spare, "");
+ return ( 0 );
+
+}
+
+static void set_text(OBJECT *obj, short idx, char * text, int len)
+{
+ char spare[255];
+
+ if( len > 254 )
+ len = 254;
+ if( text != NULL ){
+ strncpy(spare, text, 254);
+ } else {
+ strcpy(spare, "");
}
-
- set_string(obj, idx, spare);
+
+ set_string(obj, idx, spare);
}
void nsatari_search_restore_form( struct s_search_form_session *s, OBJECT *obj)
@@ -219,75 +222,70 @@ void nsatari_search_restore_form( struct s_search_form_session *s, OBJECT *obj)
set_text(obj, TOOLBAR_TB_SRCH, s->state.text, t->te_txtlen);
}
-
-void nsatari_search_session_destroy(struct s_search_form_session *s)
-{
- if (s != NULL) {
+
+void nsatari_search_session_destroy(struct s_search_form_session *s)
+{
+ if (s != NULL) {
LOG((""));
- browser_window_search_clear(s->bw);
- free(s);
- }
-}
-
-/** checks for search parameters changes */
-static bool search_session_compare(struct s_search_form_session *s, OBJECT *obj)
-{
- bool check;
- uint32_t flags_old;
+ browser_window_search_clear(s->bw);
+ free(s);
+ }
+}
+
+/** checks for search parameters changes */
+static bool search_session_compare(struct s_search_form_session *s, OBJECT *obj)
+{
+ uint32_t flags_old;
uint32_t flags_mask = SEARCH_FLAG_SHOWALL | SEARCH_FLAG_CASE_SENSITIVE;
- struct s_search_form_state cur;
+ struct s_search_form_state cur;
assert(s != NULL && obj != NULL);
-
+
flags_old = s->state.flags;
-
- apply_form(obj, &cur);
- if ((cur.flags&flags_mask) != (flags_old&flags_mask)) {
- return( true );
- }
-
+
+ apply_form(obj, &cur);
+ if ((cur.flags&flags_mask) != (flags_old&flags_mask)) {
+ return( true );
+ }
+
char * cstr;
- cstr = gemtk_obj_get_text(obj, TOOLBAR_TB_SRCH);
- if (cstr != NULL){
- if (strcmp(cstr, (char*)&s->state.text) != 0) {
- return (true);
- }
- }
-
- return( false );
-}
-
-
-void nsatari_search_perform(struct s_search_form_session *s, OBJECT *obj,
- search_flags_t f)
-{
-
- bool fwd;
- search_flags_t flags = f;
+ cstr = gemtk_obj_get_text(obj, TOOLBAR_TB_SRCH);
+ if (cstr != NULL){
+ if (strcmp(cstr, (char*)&s->state.text) != 0) {
+ return (true);
+ }
+ }
+
+ return( false );
+}
+
+void nsatari_search_perform(struct s_search_form_session *s, OBJECT *obj,
+ search_flags_t f)
+{
assert(s!=null);
assert(input_window->browser->bw == s->bw);
-
-
+
+
if(search_session_compare(s, obj)){
- browser_window_search_clear(s->bw);
- apply_form(obj, &s->state);
- } else {
-
+ browser_window_search_clear(s->bw);
+ apply_form(obj, &s->state);
+ } else {
+
}
- /* get search direction manually: */
- if ( (f&SEARCH_FLAG_FORWARDS) != 0 )
- s->state.flags |= SEARCH_FLAG_FORWARDS;
- else
+ /* get search direction manually: */
+ if ( (f&SEARCH_FLAG_FORWARDS) != 0 )
+ s->state.flags |= SEARCH_FLAG_FORWARDS;
+ else
s->state.flags &= (~SEARCH_FLAG_FORWARDS);
-
- browser_window_search(s->bw, &nsatari_search_callbacks, s,
- s->state.flags,
- gemtk_obj_get_text(obj, TOOLBAR_TB_SRCH));
-
-}
-
+
+ browser_window_search(s->bw, s,
+ s->state.flags,
+ gemtk_obj_get_text(obj, TOOLBAR_TB_SRCH));
+
+}
+
struct s_search_form_session * nsatari_search_session_create(OBJECT * obj,
struct browser_window *bw)
diff --git a/atari/search.h b/atari/search.h
index 00671e4a7..984fd3704 100644
--- a/atari/search.h
+++ b/atari/search.h
@@ -49,6 +49,9 @@ typedef struct s_search_form_session * SEARCH_FORM_SESSION;
struct s_search_form_session * nsatari_search_session_create(OBJECT * obj,
struct browser_window *bw);
+
+struct gui_search_table *atari_search_table;
+
void nsatari_search_session_destroy(struct s_search_form_session *s);
void nsatari_search_perform(struct s_search_form_session *s, OBJECT *obj,
search_flags_t f);
diff --git a/atari/settings.c b/atari/settings.c
index fa835bfbf..000ad7d19 100644
--- a/atari/settings.c
+++ b/atari/settings.c
@@ -404,7 +404,7 @@ static void form_event(int index, int external)
MENU pop_menu, me_data;
short x, y;
- int choice, i;
+ int choice;
switch(index) {
@@ -560,9 +560,9 @@ static void form_event(int index, int external)
break;
case SETTINGS_BT_SEL_DOWNLOAD_DIR:
- case SETTINGS_BT_SEL_HOTLIST:
- case SETTINGS_BT_SEL_CA_BUNDLE:
- case SETTINGS_BT_SEL_CA_CERTS:
+ case SETTINGS_BT_SEL_HOTLIST:
+ case SETTINGS_BT_SEL_CA_BUNDLE:
+ case SETTINGS_BT_SEL_CA_CERTS:
case SETTINGS_BT_SEL_EDITOR:
handle_filesystem_select_button(index);
break;
@@ -814,8 +814,6 @@ static short on_aes_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
{
short retval = 0;
GRECT clip, work;
- static short edit_idx = 0;
- struct gemtk_wm_scroll_info_s *slid;
if ((ev_out->emo_events & MU_MESAG) != 0) {
// handle message
diff --git a/atari/statusbar.c b/atari/statusbar.c
index 3bf186c02..121762bc4 100755
--- a/atari/statusbar.c
+++ b/atari/statusbar.c
@@ -1,238 +1,236 @@
-/*
- * Copyright 2010 Ole Loots <ole@monochrom.net>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <unistd.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdbool.h>
-#include <assert.h>
-#include <math.h>
-
-#include "utils/log.h"
-#include "desktop/gui.h"
-#include "desktop/local_history.h"
-#include "desktop/netsurf.h"
-#include "desktop/browser.h"
-#include "desktop/mouse.h"
-#include "desktop/plotters.h"
-
-#include "atari/gui.h"
-#include "atari/statusbar.h"
+/*
+ * Copyright 2010 Ole Loots <ole@monochrom.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <assert.h>
+#include <math.h>
+
+#include "utils/log.h"
+#include "desktop/gui.h"
+#include "desktop/netsurf.h"
+#include "desktop/browser.h"
+#include "desktop/mouse.h"
+#include "desktop/plotters.h"
+
+#include "atari/gui.h"
+#include "atari/statusbar.h"
#include "atari/rootwin.h"
-#include "atari/misc.h"
-
-#include "atari/res/netsurf.rsh"
-#include "atari/plot/plot.h"
-#include "atari/osspec.h"
-
-#ifdef WITH_CUSTOM_STATUSBAR
-extern int atari_plot_vdi_handle;
-
-static
-void __CDECL evnt_sb_redraw( COMPONENT *c, long buff[8] )
-{
- size_t i;
- struct gui_window * gw = (struct gui_window *)mt_CompDataSearch(&app, c, CDT_OWNER);
- assert(gw != NULL);
- CMP_STATUSBAR sb = gw->root->statusbar;
- assert( sb != NULL );
- if( sb == NULL )
- return;
-
- if( sb->attached == false )
- return;
-
- LGRECT work, lclip;
- short pxy[8], d, pxyclip[4];
-
- mt_CompGetLGrect(&app, sb->comp, WF_WORKXYWH, &work);
- lclip = work;
- if ( !rc_lintersect( (LGRECT*)&buff[4], &lclip ) ) {
- return;
- }
- vsf_interior(atari_plot_vdi_handle, FIS_SOLID );
- vsl_color(atari_plot_vdi_handle, BLACK );
- vsl_type(atari_plot_vdi_handle, 1);
- vsl_width(atari_plot_vdi_handle, 1 );
- vst_color(atari_plot_vdi_handle, BLACK);
-
- vst_height(atari_plot_vdi_handle, atari_sysinfo.medium_sfont_pxh, &pxy[0], &pxy[1], &pxy[2], &pxy[3] );
- vst_alignment(atari_plot_vdi_handle, 0, 5, &d, &d );
- vst_effects(atari_plot_vdi_handle, 0 );
- pxyclip[0] = lclip.g_x;
- pxyclip[1] = lclip.g_y;
- pxyclip[2] = lclip.g_x + lclip.g_w-1;
- pxyclip[3] = lclip.g_y + lclip.g_h-1;
-
+#include "atari/misc.h"
+
+#include "atari/res/netsurf.rsh"
+#include "atari/plot/plot.h"
+#include "atari/osspec.h"
+
+#ifdef WITH_CUSTOM_STATUSBAR
+extern int atari_plot_vdi_handle;
+
+static
+void __CDECL evnt_sb_redraw( COMPONENT *c, long buff[8] )
+{
+ struct gui_window * gw = (struct gui_window *)mt_CompDataSearch(&app, c, CDT_OWNER);
+ assert(gw != NULL);
+ CMP_STATUSBAR sb = gw->root->statusbar;
+ assert( sb != NULL );
+ if( sb == NULL )
+ return;
+
+ if( sb->attached == false )
+ return;
+
+ LGRECT work, lclip;
+ short pxy[8], d, pxyclip[4];
+
+ mt_CompGetLGrect(&app, sb->comp, WF_WORKXYWH, &work);
+ lclip = work;
+ if ( !rc_lintersect( (LGRECT*)&buff[4], &lclip ) ) {
+ return;
+ }
+ vsf_interior(atari_plot_vdi_handle, FIS_SOLID );
+ vsl_color(atari_plot_vdi_handle, BLACK );
+ vsl_type(atari_plot_vdi_handle, 1);
+ vsl_width(atari_plot_vdi_handle, 1 );
+ vst_color(atari_plot_vdi_handle, BLACK);
+
+ vst_height(atari_plot_vdi_handle, atari_sysinfo.medium_sfont_pxh, &pxy[0], &pxy[1], &pxy[2], &pxy[3] );
+ vst_alignment(atari_plot_vdi_handle, 0, 5, &d, &d );
+ vst_effects(atari_plot_vdi_handle, 0 );
+ pxyclip[0] = lclip.g_x;
+ pxyclip[1] = lclip.g_y;
+ pxyclip[2] = lclip.g_x + lclip.g_w-1;
+ pxyclip[3] = lclip.g_y + lclip.g_h-1;
+
vs_clip(atari_plot_vdi_handle, 1, (short*)&pxyclip );
- vswr_mode(atari_plot_vdi_handle, MD_REPLACE );
-
- if( lclip.g_y <= work.g_y ) {
- pxy[0] = work.g_x;
- pxy[1] = work.g_y;
- pxy[2] = MIN( work.g_x + work.g_w, lclip.g_x + lclip.g_w );
- pxy[3] = work.g_y;
- v_pline(atari_plot_vdi_handle, 2, (short*)&pxy );
- }
-
- if(app.nplanes > 2) {
- vsf_color(atari_plot_vdi_handle, LWHITE);
- } else {
- vsf_color(atari_plot_vdi_handle, WHITE );
- }
-
- pxy[0] = work.g_x;
- pxy[1] = work.g_y+1;
- pxy[2] = work.g_x + work.g_w-1;
- pxy[3] = work.g_y + work.g_h-1;
+ vswr_mode(atari_plot_vdi_handle, MD_REPLACE );
+
+ if( lclip.g_y <= work.g_y ) {
+ pxy[0] = work.g_x;
+ pxy[1] = work.g_y;
+ pxy[2] = MIN( work.g_x + work.g_w, lclip.g_x + lclip.g_w );
+ pxy[3] = work.g_y;
+ v_pline(atari_plot_vdi_handle, 2, (short*)&pxy );
+ }
+
+ if(app.nplanes > 2) {
+ vsf_color(atari_plot_vdi_handle, LWHITE);
+ } else {
+ vsf_color(atari_plot_vdi_handle, WHITE );
+ }
+
+ pxy[0] = work.g_x;
+ pxy[1] = work.g_y+1;
+ pxy[2] = work.g_x + work.g_w-1;
+ pxy[3] = work.g_y + work.g_h-1;
v_bar(atari_plot_vdi_handle, pxy );
-
-
- if( sb->textlen > 0 ) {
- short curx;
- short vqw[4];
- char t[2];
- short cw = 8;
- t[1]=0;
- if( atari_sysinfo.sfont_monospaced ) {
- t[0]='A';
- int r = vqt_width(atari_plot_vdi_handle, t[0], &vqw[0], &vqw[1], &vqw[2] );
- cw = vqw[0];
- }
- vswr_mode(atari_plot_vdi_handle, MD_TRANS );
- for( curx = work.g_x + 2, i=0 ; (curx+cw < work.g_x+work.g_w ) && i < sb->textlen; i++ ){
- t[0] = sb->text[i];
- if( !atari_sysinfo.sfont_monospaced ) {
- vqt_width(atari_plot_vdi_handle, t[0], &vqw[0], &vqw[1], &vqw[2] );
- cw = vqw[0];
- }
- if( curx >= lclip.g_x - cw ) {
- v_gtext(atari_plot_vdi_handle, curx, work.g_y + 5, (char*)&t );
- }
- curx += cw;
- if( curx >= lclip.g_x + lclip.g_w )
- break;
- }
- }
+
+
+ if( sb->textlen > 0 ) {
+ size_t i;
+ short curx;
+ short vqw[4];
+ char t[2];
+ short cw = 8;
+ t[1]=0;
+ if( atari_sysinfo.sfont_monospaced ) {
+ t[0]='A';
+ int r = vqt_width(atari_plot_vdi_handle, t[0], &vqw[0], &vqw[1], &vqw[2] );
+ cw = vqw[0];
+ }
+ vswr_mode(atari_plot_vdi_handle, MD_TRANS );
+ for( curx = work.g_x + 2, i=0 ; (curx+cw < work.g_x+work.g_w ) && i < sb->textlen; i++ ){
+ t[0] = sb->text[i];
+ if( !atari_sysinfo.sfont_monospaced ) {
+ vqt_width(atari_plot_vdi_handle, t[0], &vqw[0], &vqw[1], &vqw[2] );
+ cw = vqw[0];
+ }
+ if( curx >= lclip.g_x - cw ) {
+ v_gtext(atari_plot_vdi_handle, curx, work.g_y + 5, (char*)&t );
+ }
+ curx += cw;
+ if( curx >= lclip.g_x + lclip.g_w )
+ break;
+ }
+ }
vswr_mode(atari_plot_vdi_handle, MD_REPLACE );
pxy[0] = work.g_x + work.g_w;
pxy[1] = work.g_y + work.g_h;
pxy[2] = work.g_x + work.g_w;
pxy[3] = work.g_y + work.g_h-work.g_h;
v_pline(atari_plot_vdi_handle, 2, (short*)&pxy );
-
- vs_clip(atari_plot_vdi_handle, 0, (short*)&pxyclip );
- return;
-}
-
-static void __CDECL evnt_sb_click( COMPONENT *c, long buff[8] )
-{
- static bool prevstate;
- short sbuff[8], mx, my;
- LGRECT work;
- mt_CompGetLGrect(&app, c, WF_WORKXYWH, &work);
- if( evnt.mx >= work.g_x + (work.g_w) && evnt.mx <= work.g_x + work.g_w &&
- evnt.my >= work.g_y + (work.g_h) && evnt.my <= work.g_y + work.g_h ) {
- // click within sb button
- }
-}
-
-CMP_STATUSBAR sb_create( struct gui_window * gw )
-{
- CMP_STATUSBAR s = malloc( sizeof(struct s_statusbar) );
- s->attached = false;
- s->comp = (COMPONENT*)mt_CompCreate(&app, CLT_HORIZONTAL, STATUSBAR_HEIGHT, 0);
- s->comp->rect.g_h = STATUSBAR_HEIGHT;
- s->comp->bounds.max_height = STATUSBAR_HEIGHT;
- mt_CompDataAttach( &app, s->comp, CDT_OWNER, gw );
- mt_CompEvntAttach( &app, s->comp, WM_REDRAW, evnt_sb_redraw );
- mt_CompEvntAttach( &app, s->comp, WM_XBUTTON, evnt_sb_click );
- sb_set_text( s, (char*)"" );
- return( s );
-}
-
-void sb_destroy( CMP_STATUSBAR s )
-{
- LOG(("%s\n", __FUNCTION__ ));
- if( s ) {
- if( s->comp ){
- mt_CompDelete( &app, s->comp );
- }
- free( s );
- }
-}
-
-void sb_set_text(CMP_STATUSBAR sb , const char * text)
+
+ vs_clip(atari_plot_vdi_handle, 0, (short*)&pxyclip );
+ return;
+}
+
+static void __CDECL evnt_sb_click( COMPONENT *c, long buff[8] )
+{
+ static bool prevstate;
+ LGRECT work;
+ mt_CompGetLGrect(&app, c, WF_WORKXYWH, &work);
+ if( evnt.mx >= work.g_x + (work.g_w) && evnt.mx <= work.g_x + work.g_w &&
+ evnt.my >= work.g_y + (work.g_h) && evnt.my <= work.g_y + work.g_h ) {
+ // click within sb button
+ }
+}
+
+CMP_STATUSBAR sb_create( struct gui_window * gw )
{
-
- LGRECT work;
- assert( sb != NULL );
- assert( sb->comp != NULL );
- strncpy( (char*)&sb->text, text, STATUSBAR_MAX_SLEN );
- sb->text[STATUSBAR_MAX_SLEN]=0;
- sb->textlen = strlen( (char*)&sb->text );
- if( sb->attached ){
- struct gui_window * gw = (struct gui_window *)mt_CompDataSearch(&app, sb->comp, CDT_OWNER);
- if( gw != NULL ){
- mt_CompGetLGrect(&app, sb->comp, WF_WORKXYWH, &work);
- ApplWrite( _AESapid, WM_REDRAW, gw->root->handle->handle,
- work.g_x, work.g_y, work.g_w, work.g_h );
- }
- }
+ CMP_STATUSBAR s = malloc( sizeof(struct s_statusbar) );
+ s->attached = false;
+ s->comp = (COMPONENT*)mt_CompCreate(&app, CLT_HORIZONTAL, STATUSBAR_HEIGHT, 0);
+ s->comp->rect.g_h = STATUSBAR_HEIGHT;
+ s->comp->bounds.max_height = STATUSBAR_HEIGHT;
+ mt_CompDataAttach( &app, s->comp, CDT_OWNER, gw );
+ mt_CompEvntAttach( &app, s->comp, WM_REDRAW, evnt_sb_redraw );
+ mt_CompEvntAttach( &app, s->comp, WM_XBUTTON, evnt_sb_click );
+ sb_set_text( s, (char*)"" );
+ return( s );
+}
+
+void sb_destroy( CMP_STATUSBAR s )
+{
+ LOG(("%s\n", __FUNCTION__ ));
+ if( s ) {
+ if( s->comp ){
+ mt_CompDelete( &app, s->comp );
+ }
+ free( s );
+ }
+}
+
+void sb_set_text(CMP_STATUSBAR sb , const char * text)
+{
+
+ LGRECT work;
+ assert( sb != NULL );
+ assert( sb->comp != NULL );
+ strncpy( (char*)&sb->text, text, STATUSBAR_MAX_SLEN );
+ sb->text[STATUSBAR_MAX_SLEN]=0;
+ sb->textlen = strlen( (char*)&sb->text );
+ if( sb->attached ){
+ struct gui_window * gw = (struct gui_window *)mt_CompDataSearch(&app, sb->comp, CDT_OWNER);
+ if( gw != NULL ){
+ mt_CompGetLGrect(&app, sb->comp, WF_WORKXYWH, &work);
+ ApplWrite( _AESapid, WM_REDRAW, gw->root->handle->handle,
+ work.g_x, work.g_y, work.g_w, work.g_h );
+ }
+ }
}
#else
-CMP_STATUSBAR sb_create( struct gui_window * gw )
-{
- CMP_STATUSBAR s = malloc( sizeof(struct s_statusbar) );
- s->attached = false;
- sb_set_text( s, (char*)"" );
- return( s );
-}
-
-void sb_destroy( CMP_STATUSBAR s )
-{
- LOG(("%s\n", __FUNCTION__ ));
- if( s ) {
- free( s );
- }
+CMP_STATUSBAR sb_create( struct gui_window * gw )
+{
+ CMP_STATUSBAR s = malloc( sizeof(struct s_statusbar) );
+ s->attached = false;
+ sb_set_text( s, (char*)"" );
+ return( s );
+}
+
+void sb_destroy( CMP_STATUSBAR s )
+{
+ LOG(("%s\n", __FUNCTION__ ));
+ if( s ) {
+ free( s );
+ }
}
void sb_attach(CMP_STATUSBAR sb, struct gui_window * gw)
{
sb->aes_win = gemtk_wm_get_handle(gw->root->win);
sb->attached = true;
-}
-
-void sb_set_text(CMP_STATUSBAR sb, const char * text )
-{
- assert( sb != NULL );
- strncpy(sb->text, text, STATUSBAR_MAX_SLEN);
- sb->text[STATUSBAR_MAX_SLEN]=0;
- sb->textlen = strlen(sb->text);
+}
+
+void sb_set_text(CMP_STATUSBAR sb, const char * text )
+{
+ assert( sb != NULL );
+ strncpy(sb->text, text, STATUSBAR_MAX_SLEN);
+ sb->text[STATUSBAR_MAX_SLEN]=0;
+ sb->textlen = strlen(sb->text);
if(sb->attached){
- wind_set_str(sb->aes_win, WF_INFO, sb->text);
- }
+ wind_set_str(sb->aes_win, WF_INFO, sb->text);
+ }
}
#endif
diff --git a/atari/toolbar.c b/atari/toolbar.c
index fd9051dd9..8cdad4af6 100644
--- a/atari/toolbar.c
+++ b/atari/toolbar.c
@@ -1,90 +1,91 @@
-/*
- * Copyright 2012 Ole Loots <ole@monochrom.net>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <unistd.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdbool.h>
-#include <assert.h>
-#include <math.h>
-
-#include "utils/log.h"
-#include "desktop/gui.h"
-#include "desktop/local_history.h"
-#include "desktop/netsurf.h"
-#include "desktop/browser.h"
+/*
+ * Copyright 2012 Ole Loots <ole@monochrom.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <assert.h>
+#include <math.h>
+
+#include "utils/log.h"
+#include "desktop/gui.h"
+#include "desktop/netsurf.h"
+#include "desktop/browser.h"
+#include "desktop/browser_history.h"
#include "desktop/browser_private.h"
-#include "desktop/mouse.h"
-#include "desktop/plot_style.h"
+#include "desktop/mouse.h"
+#include "desktop/plot_style.h"
#include "desktop/plotters.h"
#include "desktop/tree.h"
#include "desktop/hotlist.h"
#include "utils/nsoption.h"
#include "utils/nsurl.h"
-#include "utils/utf8.h"
-#include "atari/clipboard.h"
-#include "atari/gui.h"
-#include "atari/toolbar.h"
-#include "atari/rootwin.h"
-
-#include "atari/clipboard.h"
-#include "atari/misc.h"
-#include "atari/plot/plot.h"
-#include "cflib.h"
+#include "utils/utf8.h"
+#include "atari/clipboard.h"
+#include "atari/gui.h"
+#include "atari/toolbar.h"
+#include "atari/rootwin.h"
+
+#include "atari/clipboard.h"
+#include "atari/misc.h"
+#include "atari/plot/plot.h"
+#include "cflib.h"
#include "atari/res/netsurf.rsh"
#include "desktop/textarea.h"
#include "desktop/textinput.h"
#include "content/hlcache.h"
+#include "atari/encoding.h"
-
-#define TB_BUTTON_WIDTH 32
-#define THROBBER_WIDTH 32
-#define THROBBER_MIN_INDEX 1
-#define THROBBER_MAX_INDEX 12
-#define THROBBER_INACTIVE_INDEX 13
-enum e_toolbar_button_states {
- button_on = 0,
- button_off = 1
-};
-#define TOOLBAR_BUTTON_NUM_STATES 2
+#define TB_BUTTON_WIDTH 32
+#define THROBBER_WIDTH 32
+#define THROBBER_MIN_INDEX 1
+#define THROBBER_MAX_INDEX 12
+#define THROBBER_INACTIVE_INDEX 13
+
+enum e_toolbar_button_states {
+ button_on = 0,
+ button_off = 1
+};
+#define TOOLBAR_BUTTON_NUM_STATES 2
struct s_toolbar;
-
-struct s_tb_button
-{
- short rsc_id;
+
+struct s_tb_button
+{
+ short rsc_id;
void (*cb_click)(struct s_toolbar *tb);
hlcache_handle *icon[TOOLBAR_BUTTON_NUM_STATES];
struct s_toolbar *owner;
- enum e_toolbar_button_states state;
+ enum e_toolbar_button_states state;
short index;
- GRECT area;
-};
-
-
-extern char * option_homepage_url;
-extern void * h_gem_rsrc;
+ GRECT area;
+};
+
+
+extern char * option_homepage_url;
+extern void * h_gem_rsrc;
extern struct gui_window * input_window;
extern long atari_plot_flags;
extern int atari_plot_vdi_handle;
@@ -97,53 +98,53 @@ static int area_navigation_height = 0;
static int area_search_height = 0;
static int area_full_height = 0;
static float toolbar_url_scale = 1.0;
-
-static plot_font_style_t font_style_url = {
- .family = PLOT_FONT_FAMILY_SANS_SERIF,
- .size = 14*FONT_SIZE_SCALE,
- .weight = 400,
- .flags = FONTF_NONE,
- .background = 0xffffff,
- .foreground = 0x0
- };
-
-
+
+static plot_font_style_t font_style_url = {
+ .family = PLOT_FONT_FAMILY_SANS_SERIF,
+ .size = 14*FONT_SIZE_SCALE,
+ .weight = 400,
+ .flags = FONTF_NONE,
+ .background = 0xffffff,
+ .foreground = 0x0
+ };
+
+
/* prototypes & order for button widgets: */
-
-static struct s_tb_button tb_buttons[] =
-{
- {
- TOOLBAR_BT_BACK,
- toolbar_back_click,
- {0,0},
- 0, 0, 0, {0,0,0,0}
- },
- {
- TOOLBAR_BT_HOME,
- toolbar_home_click,
+
+static struct s_tb_button tb_buttons[] =
+{
+ {
+ TOOLBAR_BT_BACK,
+ toolbar_back_click,
{0,0},
- 0, 0, 0, {0,0,0,0}
- },
- {
- TOOLBAR_BT_FORWARD,
- toolbar_forward_click,
+ 0, 0, 0, {0,0,0,0}
+ },
+ {
+ TOOLBAR_BT_HOME,
+ toolbar_home_click,
{0,0},
- 0, 0, 0, {0,0,0,0}
- },
- {
- TOOLBAR_BT_STOP,
- toolbar_stop_click,
+ 0, 0, 0, {0,0,0,0}
+ },
+ {
+ TOOLBAR_BT_FORWARD,
+ toolbar_forward_click,
{0,0},
- 0, 0, 0, {0,0,0,0}
- },
- {
- TOOLBAR_BT_RELOAD,
- toolbar_reload_click,
+ 0, 0, 0, {0,0,0,0}
+ },
+ {
+ TOOLBAR_BT_STOP,
+ toolbar_stop_click,
{0,0},
- 0, 0, 0, {0,0,0,0}
+ 0, 0, 0, {0,0,0,0}
},
- { 0, 0, {0,0}, 0, -1, 0, {0,0,0,0}}
+ {
+ TOOLBAR_BT_RELOAD,
+ toolbar_reload_click,
+ {0,0},
+ 0, 0, 0, {0,0,0,0}
+ },
+ { 0, 0, {0,0}, 0, -1, 0, {0,0,0,0}}
};
struct s_toolbar_style {
@@ -162,12 +163,12 @@ static struct s_toolbar_style toolbar_styles[] =
{18}
};
-static const struct redraw_context toolbar_rdrw_ctx = {
- .interactive = true,
- .background_images = true,
- .plot = &atari_plotters
- };
-
+static const struct redraw_context toolbar_rdrw_ctx = {
+ .interactive = true,
+ .background_images = true,
+ .plot = &atari_plotters
+ };
+
static void tb_txt_request_redraw(void *data, int x, int y, int w, int h );
static nserror toolbar_icon_callback( hlcache_handle *handle,
const hlcache_event *event, void *pw );
@@ -175,22 +176,22 @@ static nserror toolbar_icon_callback( hlcache_handle *handle,
/**
* Find a button for a specific resource ID
*/
-static struct s_tb_button *find_button(struct s_toolbar *tb, int rsc_id)
-{
- int i = 0;
- while (i < tb->btcnt) {
- if (tb->buttons[i].rsc_id == rsc_id) {
- return(&tb->buttons[i]);
- }
- i++;
+static struct s_tb_button *find_button(struct s_toolbar *tb, int rsc_id)
+{
+ int i = 0;
+ while (i < tb->btcnt) {
+ if (tb->buttons[i].rsc_id == rsc_id) {
+ return(&tb->buttons[i]);
+ }
+ i++;
}
- return(NULL);
+ return(NULL);
}
/**
* Callback for textarea redraw
*/
-static void tb_txt_request_redraw(void *data, int x, int y, int w, int h)
+static void tb_txt_request_redraw(void *data, int x, int y, int w, int h)
{
GRECT area;
@@ -207,7 +208,7 @@ static void tb_txt_request_redraw(void *data, int x, int y, int w, int h)
area.g_h = h;
//dbg_grect("tb_txt_request_redraw", &area);
window_schedule_redraw_grect(tb->owner, &area);
- return;
+ return;
}
static void tb_txt_callback(void *data, struct textarea_msg *msg)
@@ -230,12 +231,12 @@ static void tb_txt_callback(void *data, struct textarea_msg *msg)
}
static struct s_tb_button *button_init(struct s_toolbar *tb, OBJECT * tree, int index,
- struct s_tb_button * instance)
+ struct s_tb_button * instance)
{
*instance = tb_buttons[index];
instance->owner = tb;
- return(instance);
+ return(instance);
}
@@ -265,7 +266,7 @@ void toolbar_init( void )
area_search_height = aes_toolbar[TOOLBAR_AREA_SEARCH].ob_height;
area_navigation_height = aes_toolbar[TOOLBAR_AREA_NAVIGATION].ob_height;
- init = true;
+ init = true;
}
@@ -275,20 +276,20 @@ void toolbar_exit(void)
}
-struct s_toolbar *toolbar_create(struct s_gui_win_root *owner)
-{
+struct s_toolbar *toolbar_create(struct s_gui_win_root *owner)
+{
int i;
struct s_toolbar *t;
LOG((""));
- assert(init == true);
-
- t = calloc(1, sizeof(struct s_toolbar));
+ assert(init == true);
- assert(t);
+ t = calloc(1, sizeof(struct s_toolbar));
- /* initialize the toolbar values: */
+ assert(t);
+
+ /* initialize the toolbar values: */
t->owner = owner;
t->style = 1;
t->search_visible = false;
@@ -297,20 +298,20 @@ struct s_toolbar *toolbar_create(struct s_gui_win_root *owner)
/* dublicate the form template: */
t->form = gemtk_obj_tree_copy(aes_toolbar);
-
-
- /* count buttons and add them as components: */
- i = 0;
- while(tb_buttons[i].rsc_id > 0) {
- i++;
- }
- t->btcnt = i;
+
+
+ /* count buttons and add them as components: */
+ i = 0;
+ while(tb_buttons[i].rsc_id > 0) {
+ i++;
+ }
+ t->btcnt = i;
t->buttons = malloc(t->btcnt * sizeof(struct s_tb_button));
- memset(t->buttons, 0, t->btcnt * sizeof(struct s_tb_button));
- for (i=0; i < t->btcnt; i++) {
- button_init(t, aes_toolbar, i, &t->buttons[i]);
- }
-
+ memset(t->buttons, 0, t->btcnt * sizeof(struct s_tb_button));
+ for (i=0; i < t->btcnt; i++) {
+ button_init(t, aes_toolbar, i, &t->buttons[i]);
+ }
+
/* create the url widget: */
font_style_url.size =
toolbar_styles[t->style].font_height_pt * FONT_SIZE_SCALE;
@@ -329,27 +330,27 @@ struct s_toolbar *toolbar_create(struct s_gui_win_root *owner)
ta_setup.selected_bg = 0x000000;
ta_setup.text = font_style_url;
ta_setup.text.foreground = 0x000000;
- ta_setup.text.background = 0xffffff;
- t->url.textarea = textarea_create(ta_flags, &ta_setup,
- tb_txt_callback, t);
+ ta_setup.text.background = 0xffffff;
+ t->url.textarea = textarea_create(ta_flags, &ta_setup,
+ tb_txt_callback, t);
- /* create the throbber widget: */
- t->throbber.index = THROBBER_INACTIVE_INDEX;
- t->throbber.max_index = THROBBER_MAX_INDEX;
+ /* create the throbber widget: */
+ t->throbber.index = THROBBER_INACTIVE_INDEX;
+ t->throbber.max_index = THROBBER_MAX_INDEX;
t->throbber.running = false;
LOG(("created toolbar: %p, root: %p, textarea: %p, throbber: %p", t,
- owner, t->url.textarea, t->throbber));
- return( t );
+ owner, t->url.textarea, t->throbber));
+ return( t );
}
void toolbar_destroy(struct s_toolbar *tb)
{
- free(tb->buttons);
+ free(tb->buttons);
free(tb->form);
- textarea_destroy(tb->url.textarea);
+ textarea_destroy(tb->url.textarea);
free(tb);
}
@@ -418,7 +419,7 @@ static void toolbar_reflow(struct s_toolbar *tb)
}
else if (tb->buttons[i].state == button_on) {
tb->form[tb->buttons[i].rsc_id].ob_state &= ~OS_DISABLED;
- }
+ }
}
tb->reflow = false;
// TODO: iterate through all other toolbars and set reflow = true
@@ -427,7 +428,6 @@ static void toolbar_reflow(struct s_toolbar *tb)
void toolbar_redraw(struct s_toolbar *tb, GRECT *clip)
{
GRECT area, area_ro;
- float old_scale;
if (tb->attached == false) {
return;
@@ -446,13 +446,14 @@ void toolbar_redraw(struct s_toolbar *tb, GRECT *clip)
area = area_ro;
if (rc_intersect(clip, &area)) {
+ float old_scale;
plot_set_dimensions(area_ro.g_x, area_ro.g_y, area_ro.g_w, area_ro.g_h);
- struct rect r = {
+ struct rect r = {
.x0 = MAX(0,area.g_x - area_ro.g_x),
- .y0 = MAX(0,area.g_y - area_ro.g_y),
+ .y0 = MAX(0,area.g_y - area_ro.g_y),
.x1 = MAX(0,area.g_x - area_ro.g_x) + area.g_w,
- .y1 = MAX(0,area.g_y - area_ro.g_y) + area.g_h
+ .y1 = MAX(0,area.g_y - area_ro.g_y) + area.g_h
};
//dbg_rect("tb textarea clip: ", &r);
// TODO: let this be handled by an userdef object redraw function:
@@ -470,56 +471,53 @@ void toolbar_update_buttons(struct s_toolbar *tb, struct browser_window *bw,
{
LOG((""));
- struct s_tb_button * bt;
+ struct s_tb_button * bt;
bool enable = false;
GRECT area;
- nsurl * ns_url;
- char * c_url;
- size_t c_url_len;
assert(bw != NULL);
if (button == TOOLBAR_BT_BACK || button <= 0 ) {
bt = find_button(tb, TOOLBAR_BT_BACK);
- enable = browser_window_back_available(bw);
- if (enable) {
- bt->state = button_on;
- } else {
- bt->state = button_off;
+ enable = browser_window_back_available(bw);
+ if (enable) {
+ bt->state = button_on;
+ } else {
+ bt->state = button_off;
}
}
- if (button == TOOLBAR_BT_HOME || button <= 0 ) {
+ if (button == TOOLBAR_BT_HOME || button <= 0 ) {
- }
+ }
if (button == TOOLBAR_BT_FORWARD || button <= 0 ) {
bt = find_button(tb, TOOLBAR_BT_FORWARD);
- enable = browser_window_forward_available(bw);
- if (enable) {
- bt->state = button_on;
- } else {
- bt->state = button_off;
- }
- }
+ enable = browser_window_forward_available(bw);
+ if (enable) {
+ bt->state = button_on;
+ } else {
+ bt->state = button_off;
+ }
+ }
if (button == TOOLBAR_BT_RELOAD || button <= 0 ) {
bt = find_button(tb, TOOLBAR_BT_RELOAD);
- enable = browser_window_reload_available(bw);
- if (enable) {
- bt->state = button_on;
- } else {
- bt->state = button_off;
+ enable = browser_window_reload_available(bw);
+ if (enable) {
+ bt->state = button_on;
+ } else {
+ bt->state = button_off;
}
- }
+ }
if (button == TOOLBAR_BT_STOP || button <= 0) {
bt = find_button(tb, TOOLBAR_BT_STOP);
- enable = browser_window_stop_available(bw);
- if (enable) {
- bt->state = button_on;
- } else {
- bt->state = button_off;
+ enable = browser_window_stop_available(bw);
+ if (enable) {
+ bt->state = button_on;
+ } else {
+ bt->state = button_off;
}
}
@@ -690,65 +688,65 @@ bool toolbar_key_input(struct s_toolbar *tb, short nkc)
{
assert(tb!=NULL);
-
+
GRECT work;
bool ret = false;
- struct gui_window *gw = window_get_active_gui_window(tb->owner);
-
- assert( gw != NULL );
-
- long ucs4;
- long ik = nkc_to_input_key(nkc, &ucs4);
-
- if (ik == 0) {
- if ((nkc&0xFF) >= 9) {
- ret = textarea_keypress(tb->url.textarea, ucs4);
- }
- }
- else if (ik == KEY_CR || ik == KEY_NL) {
- nsurl *url;
- char tmp_url[PATH_MAX];
- if ( textarea_get_text( tb->url.textarea, tmp_url, PATH_MAX) > 0 ) {
- window_set_focus(tb->owner, BROWSER, gw->browser);
- if (nsurl_create((const char*)&tmp_url, &url) != NSERROR_OK) {
- warn_user("NoMemory", 0);
- } else {
- browser_window_navigate(gw->browser->bw, url, NULL,
- BROWSER_WINDOW_HISTORY | BROWSER_WINDOW_VERIFIABLE,
- NULL, NULL, NULL);
- nsurl_unref(url);
- }
-
- ret = true;
- }
- }
- else if (ik == KEY_COPY_SELECTION) {
- // copy whole text
- char * text;
- int len;
- len = textarea_get_text( tb->url.textarea, NULL, 0 );
- text = malloc( len+1 );
- if (text){
- textarea_get_text( tb->url.textarea, text, len+1 );
- scrap_txt_write(text);
- free( text );
- }
+ struct gui_window *gw = window_get_active_gui_window(tb->owner);
+
+ assert( gw != NULL );
+
+ long ucs4;
+ long ik = nkc_to_input_key(nkc, &ucs4);
+
+ if (ik == 0) {
+ if ((nkc&0xFF) >= 9) {
+ ret = textarea_keypress(tb->url.textarea, ucs4);
+ }
+ }
+ else if (ik == KEY_CR || ik == KEY_NL) {
+ nsurl *url;
+ char tmp_url[PATH_MAX];
+ if ( textarea_get_text( tb->url.textarea, tmp_url, PATH_MAX) > 0 ) {
+ window_set_focus(tb->owner, BROWSER, gw->browser);
+ if (nsurl_create((const char*)&tmp_url, &url) != NSERROR_OK) {
+ warn_user("NoMemory", 0);
+ } else {
+ browser_window_navigate(gw->browser->bw, url, NULL,
+ BW_NAVIGATE_HISTORY,
+ NULL, NULL, NULL);
+ nsurl_unref(url);
+ }
+
+ ret = true;
+ }
+ }
+ else if (ik == KEY_COPY_SELECTION) {
+ // copy whole text
+ char * text;
+ int len;
+ len = textarea_get_text( tb->url.textarea, NULL, 0 );
+ text = malloc( len+1 );
+ if (text){
+ textarea_get_text( tb->url.textarea, text, len+1 );
+ scrap_txt_write(text);
+ free( text );
+ }
}
else if ( ik == KEY_PASTE) {
- char * clip = scrap_txt_read();
+ char * clip = scrap_txt_read();
if ( clip != NULL ){
- int clip_length = strlen( clip );
- if ( clip_length > 0 ) {
- char *utf8;
- utf8_convert_ret res;
- /* Clipboard is in local encoding so
- * convert to UTF8 */
- res = utf8_from_local_encoding( clip, clip_length, &utf8 );
- if ( res == UTF8_CONVERT_OK ) {
- toolbar_set_url(tb, utf8);
+ int clip_length = strlen( clip );
+ if ( clip_length > 0 ) {
+ char *utf8;
+ nserror res;
+ /* Clipboard is in local encoding so
+ * convert to UTF8 */
+ res = utf8_from_local_encoding( clip, clip_length, &utf8 );
+ if ( res == NSERROR_OK ) {
+ toolbar_set_url(tb, utf8);
free(utf8);
- ret = true;
- }
+ ret = true;
+ }
}
free( clip );
}
@@ -756,11 +754,11 @@ bool toolbar_key_input(struct s_toolbar *tb, short nkc)
else if (ik == KEY_ESCAPE) {
textarea_keypress( tb->url.textarea, KEY_SELECT_ALL );
textarea_keypress( tb->url.textarea, KEY_DELETE_LEFT );
- }
- else {
- ret = textarea_keypress( tb->url.textarea, ik );
- }
-
+ }
+ else {
+ ret = textarea_keypress( tb->url.textarea, ik );
+ }
+
return( ret );
}
@@ -768,10 +766,8 @@ bool toolbar_key_input(struct s_toolbar *tb, short nkc)
void toolbar_mouse_input(struct s_toolbar *tb, short obj, short button)
{
LOG((""));
- GRECT work;
- short mx, my, mb, kstat;
- int old;
- OBJECT * toolbar_tree;
+ GRECT work;
+ short mx, my, mb, kstat;
struct gui_window * gw;
@@ -779,10 +775,10 @@ void toolbar_mouse_input(struct s_toolbar *tb, short obj, short button)
graf_mkstate(&mx, &my, &mb, &kstat);
toolbar_get_grect(tb, TOOLBAR_AREA_URL, &work);
- mx -= work.g_x;
+ mx -= work.g_x;
my -= work.g_y;
-
- /* TODO: reset mouse state of browser window? */
+
+ /* TODO: reset mouse state of browser window? */
/* select whole text when newly focused, otherwise set caret to
end of text */
if (!window_url_widget_has_focus(tb->owner)) {
@@ -791,21 +787,21 @@ void toolbar_mouse_input(struct s_toolbar *tb, short obj, short button)
/* url widget has focus and mouse button is still pressed... */
else if (mb & 1) {
- textarea_mouse_action(tb->url.textarea, BROWSER_MOUSE_DRAG_1,
- mx, my );
- short prev_x = mx;
- short prev_y = my;
- do {
- if (abs(prev_x-mx) > 5 || abs(prev_y-my) > 5) {
- textarea_mouse_action( tb->url.textarea,
- BROWSER_MOUSE_HOLDING_1, mx, my );
- prev_x = mx;
+ textarea_mouse_action(tb->url.textarea, BROWSER_MOUSE_DRAG_1,
+ mx, my );
+ short prev_x = mx;
+ short prev_y = my;
+ do {
+ if (abs(prev_x-mx) > 5 || abs(prev_y-my) > 5) {
+ textarea_mouse_action( tb->url.textarea,
+ BROWSER_MOUSE_HOLDING_1, mx, my );
+ prev_x = mx;
prev_y = my;
window_schedule_redraw_grect(tb->owner, &work);
- window_process_redraws(tb->owner);
- }
- graf_mkstate( &mx, &my, &mb, &kstat );
- mx = mx - (work.g_x);
+ window_process_redraws(tb->owner);
+ }
+ graf_mkstate( &mx, &my, &mb, &kstat );
+ mx = mx - (work.g_x);
my = my - (work.g_y);
} while (mb & 1);
@@ -817,19 +813,15 @@ void toolbar_mouse_input(struct s_toolbar *tb, short obj, short button)
}
else {
/* when execution reaches here, mouse input is a click or dclick */
- /* TODO: recognize click + shitoolbar_update_buttonsft key */
- int mstate = BROWSER_MOUSE_PRESS_1;
- if ((kstat & (K_LSHIFT|K_RSHIFT)) != 0) {
- mstate = BROWSER_MOUSE_MOD_1;
- }
+ /* TODO: recognize click + shitoolbar_update_buttonsft key */
if (aes_event_out.emo_mclicks == 2 ) {
- textarea_mouse_action( tb->url.textarea,
+ textarea_mouse_action( tb->url.textarea,
BROWSER_MOUSE_DOUBLE_CLICK | BROWSER_MOUSE_CLICK_1, mx,
my);
toolbar_get_grect(tb, TOOLBAR_AREA_URL, &work);
window_schedule_redraw_grect(tb->owner, &work);
} else {
- textarea_mouse_action(tb->url.textarea,
+ textarea_mouse_action(tb->url.textarea,
BROWSER_MOUSE_PRESS_1, mx, my );
}
}
@@ -935,8 +927,8 @@ OBJECT *toolbar_get_form(struct s_toolbar *tb)
}
-/* public event handler */
-void toolbar_back_click(struct s_toolbar *tb)
+/* public event handler */
+void toolbar_back_click(struct s_toolbar *tb)
{
struct browser_window * bw;
struct gui_window * gw;
@@ -946,11 +938,11 @@ void toolbar_back_click(struct s_toolbar *tb)
bw = gw->browser->bw;
assert(bw != NULL);
- if( history_back_available(bw->history) )
- history_back(bw, bw->history);
-}
-
-void toolbar_reload_click(struct s_toolbar *tb)
+ if( browser_window_back_available(bw) )
+ browser_window_history_back(bw, false);
+}
+
+void toolbar_reload_click(struct s_toolbar *tb)
{
struct browser_window * bw;
struct gui_window * gw;
@@ -960,10 +952,10 @@ void toolbar_reload_click(struct s_toolbar *tb)
bw = gw->browser->bw;
assert(bw != NULL);
- browser_window_reload(bw, true);
-}
-
-void toolbar_forward_click(struct s_toolbar *tb)
+ browser_window_reload(bw, true);
+}
+
+void toolbar_forward_click(struct s_toolbar *tb)
{
struct browser_window * bw;
struct gui_window * gw;
@@ -972,12 +964,12 @@ void toolbar_forward_click(struct s_toolbar *tb)
assert(gw != NULL);
bw = gw->browser->bw;
assert(bw != NULL);
-
- if (history_forward_available(bw->history))
- history_forward(bw, bw->history);
-}
-
-void toolbar_home_click(struct s_toolbar *tb)
+
+ if (browser_window_forward_available(bw))
+ browser_window_history_forward(bw, false);
+}
+
+void toolbar_home_click(struct s_toolbar *tb)
{
struct browser_window * bw;
struct gui_window * gw;
@@ -994,23 +986,22 @@ void toolbar_home_click(struct s_toolbar *tb)
use_url = (char*)"about:welcome";
}
- if (nsurl_create(use_url, &url) != NSERROR_OK) {
- warn_user("NoMemory", 0);
- } else {
- browser_window_navigate(bw,
- url,
- NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
- NULL,
- NULL,
- NULL);
- nsurl_unref(url);
- }
-}
-
-
-void toolbar_stop_click(struct s_toolbar *tb)
+ if (nsurl_create(use_url, &url) != NSERROR_OK) {
+ warn_user("NoMemory", 0);
+ } else {
+ browser_window_navigate(bw,
+ url,
+ NULL,
+ BW_NAVIGATE_HISTORY,
+ NULL,
+ NULL,
+ NULL);
+ nsurl_unref(url);
+ }
+}
+
+
+void toolbar_stop_click(struct s_toolbar *tb)
{
struct browser_window * bw;
struct gui_window * gw;
@@ -1023,10 +1014,10 @@ void toolbar_stop_click(struct s_toolbar *tb)
assert(bw != NULL);
- browser_window_stop(bw);
+ browser_window_stop(bw);
}
-void toolbar_favorite_click(struct s_toolbar *tb)
+void toolbar_favorite_click(struct s_toolbar *tb)
{
nsurl * ns_url = NULL;
char * c_url;
@@ -1053,7 +1044,7 @@ void toolbar_favorite_click(struct s_toolbar *tb)
free(c_url);
}
-void toolbar_crypto_click(struct s_toolbar *tb)
+void toolbar_crypto_click(struct s_toolbar *tb)
{
}
diff --git a/atari/toolbar.h b/atari/toolbar.h
index be4bd038e..284376fcb 100644
--- a/atari/toolbar.h
+++ b/atari/toolbar.h
@@ -26,6 +26,7 @@
#include "desktop/browser.h"
struct s_toolbar;
+struct nsurl;
enum toolbar_textarea {
URL_INPUT_TEXT_AREA = 1
@@ -76,7 +77,7 @@ OBJECT *toolbar_get_form(struct s_toolbar *tb);
struct textarea *toolbar_get_textarea(struct s_toolbar *tb,
enum toolbar_textarea which);
char *toolbar_get_url(struct s_toolbar *tb);
-nsurl * toolbar_get_nsurl(struct s_toolbar * tb);
+struct nsurl * toolbar_get_nsurl(struct s_toolbar * tb);
void toolbar_set_throbber_state(struct s_toolbar *tb, bool active);
void toolbar_set_attached(struct s_toolbar *tb, bool attached);
void toolbar_set_visible(struct s_toolbar *tb, short area, bool visible);
diff --git a/atari/treeview.c b/atari/treeview.c
index 8c7330640..005465c47 100644
--- a/atari/treeview.c
+++ b/atari/treeview.c
@@ -1,19 +1,19 @@
-/*
- * Copyright 2013 Ole Loots <ole@monochrom.net>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
+/*
+ * Copyright 2013 Ole Loots <ole@monochrom.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <inttypes.h>
@@ -342,13 +342,11 @@ static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
static void __CDECL on_keybd_event(struct core_window *cw, EVMULT_OUT *ev_out,
short msg[8])
{
- bool r=false;
long kstate = 0;
long kcode = 0;
long ucs4;
long ik;
unsigned short nkc = 0;
- unsigned short nks = 0;
unsigned char ascii;
struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
@@ -434,8 +432,6 @@ static void __CDECL on_mbutton_event(struct core_window *cw, EVMULT_OUT *ev_out,
struct gemtk_wm_scroll_info_s *slid;
GRECT work;
short mx, my;
- int bms;
- bool ignore=false;
short cur_rel_x, cur_rel_y, dummy, mbut;
assert(tv);
@@ -467,6 +463,7 @@ static void __CDECL on_mbutton_event(struct core_window *cw, EVMULT_OUT *ev_out,
graf_mkstate(&cur_rel_x, &cur_rel_y, &mbut, &dummy);
/* check for click or hold: */
if( (mbut&1) == 0 ){
+ int bms;
bms = BROWSER_MOUSE_CLICK_1 | BROWSER_MOUSE_PRESS_1;
if(ev_out->emo_mclicks == 2 ) {
bms = BROWSER_MOUSE_DOUBLE_CLICK;
@@ -636,7 +633,6 @@ void atari_treeview_close(struct core_window *cw)
wind_close(gemtk_wm_get_handle(tv->window));
gemtk_wm_unlink(tv->window);
/* unlink the window: */
- struct atari_treeview_window *tmp = treeviews_open;
if (tv->prev_open != NULL) {
tv->prev_open->next_open = tv->next_open;
} else {
@@ -753,7 +749,6 @@ void atari_treeview_get_window_dimensions(struct core_window *cw,
{
if (cw != NULL && (width != NULL || height != NULL)) {
GRECT work;
- struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
atari_treeview_get_grect(cw, TREEVIEW_AREA_CONTENT, &work);
*width = work.g_w;
*height = work.g_h;
diff --git a/atari/verify_ssl.c b/atari/verify_ssl.c
index e6a57b7b2..5d3f86856 100755
--- a/atari/verify_ssl.c
+++ b/atari/verify_ssl.c
@@ -1,272 +1,269 @@
-/*
- * Copyright 2010 Ole Loots <ole@monochrom.net>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdbool.h>
-#include <windom.h>
-
-#include "utils/errors.h"
-#include "utils/utils.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "content/urldb.h"
-#include "content/fetch.h"
-#include "atari/res/netsurf.rsh"
-#include "atari/verify_ssl.h"
-
-/*
- todo: this file need to use the treeview api - complete rework,
- current implementation is not used in any way.
-*/
-
-extern void * h_gem_rsrc;
-extern short atari_plot_vdi_handle;
-
-
-#define CERT_INF_LINES 8
-
-static struct ssl_info_draw_param
-{
- struct ssl_cert_info * cert_infos_n;
- unsigned long num_certs;
- int current;
- int scrollx;
- int cols;
- int scrolly;
- int rows; /* assumed to be 8 */
- OBJECT * tree;
-} dp;
-
-
-static int cert_display_width( struct ssl_cert_info * cert_info )
-{
- int l1, l2;
- int max=0;
- int i;
- int add = 16; /* strlen("Issuer: "); */
-
- l1 = strlen(cert_info->issuer) + add;
- l2 = strlen(cert_info->subject) + add;
- return( MAX(l1, l2) );
-}
-
-
-static void __CDECL cert_info_draw( WINDOW * win, short buf[8], void * data)
-{
- struct ssl_info_draw_param * dp = (struct ssl_info_draw_param *)data;
- GRECT work;
- short pxy[4];
- int maxchars;
- short d, cbh, cbw;
- int i = 0;
- short x,y,w,h;
- int px_ypos, px_xpos;
- char * line = malloc(512);
- if( line == NULL )
- return;
-
- LOG(("Cert info draw, win: %p, data: %p, scrollx: %d", win, data, dp->scrollx ));
-
- WindGet( win, WF_WORKXYWH, &x, &y, &w, &h );
- /*using static values here, as RsrcUserDraw has mem leaks & a very small stack */
- pxy[0] = work.g_x = x + 8;
- pxy[1] = work.g_y = y + 80;
- pxy[2] = x + 8 + 272;
- pxy[3] = y + 80 + 176;
- work.g_w = 272;
- work.g_h = 176;
-
- maxchars = (work.g_w / 8)+1;
- vs_clip( atari_plot_vdi_handle, 1,(short*) &pxy );
- vswr_mode( atari_plot_vdi_handle, MD_REPLACE );
- vsf_interior( atari_plot_vdi_handle, 1 );
- vsf_color( atari_plot_vdi_handle, LWHITE );
- v_bar( atari_plot_vdi_handle, (short*)&pxy );
- vst_height( atari_plot_vdi_handle, 16, &d, &d, &cbw, &cbh );
- vst_alignment(atari_plot_vdi_handle, 0, 5, &d, &d );
- vst_color( atari_plot_vdi_handle, BLACK );
- vst_effects( atari_plot_vdi_handle, 0 );
- px_ypos = px_xpos = 0;
- for(i=0; i<CERT_INF_LINES; i++ ) {
- switch( i ) {
- case 0:
- sprintf(line, "Cert Version: %d", dp->cert_infos_n[dp->current].version );
- break;
-
- case 1:
- sprintf(line, "Invalid before: %s", &dp->cert_infos_n[dp->current].not_before );
- break;
-
- case 2:
- sprintf(line, "Invalid after: %s", &dp->cert_infos_n[dp->current].not_after );
- break;
-
- case 3:
- sprintf(line, "Signature type: %d", dp->cert_infos_n[dp->current].sig_type );
- break;
-
- case 4:
- sprintf(line, "Serial: %d", dp->cert_infos_n[dp->current].serial );
- break;
-
- case 5:
- sprintf(line, "Issuer: %s", &dp->cert_infos_n[dp->current].issuer );
- break;
-
- case 6:
- sprintf(line, "Subject: %s", &dp->cert_infos_n[dp->current].subject );
- break;
-
- case 7:
- sprintf(line, "Cert type: %d", dp->cert_infos_n[dp->current].cert_type );
- break;
-
- default:
- break;
- }
- if( (int)strlen(line) > dp->scrollx ) {
- if( dp->scrollx + maxchars < 511 && ( (signed int)strlen(line) - dp->scrollx) > maxchars )
- line[dp->scrollx + maxchars] = 0;
- v_gtext(atari_plot_vdi_handle, work.g_x + 1, work.g_y + px_ypos, &line[dp->scrollx]);
- }
- px_ypos += cbh;
- }
- vst_alignment(atari_plot_vdi_handle, 0, 0, &d, &d );
- vs_clip( atari_plot_vdi_handle, 0, (short*)&pxy );
- free( line );
-}
-
-
-static void do_popup( WINDOW *win, int index, int mode, void *data)
-{
- struct ssl_info_draw_param * dp = (struct ssl_info_draw_param *)data;
- char * items[dp->num_certs];
- short x, y;
- unsigned int i;
- int dispw;
- LOG(("do_popup: num certs: %d", dp->num_certs));
- for( i = 0; i<dp->num_certs; i++) {
- items[i] = malloc( 48 );
- strncpy(items[i], (char*)&dp->cert_infos_n[i].issuer, 46 );
- }
- objc_offset( FORM(win), index, &x, &y );
- dp->current = MenuPopUp( items, x, y,
- dp->num_certs, MIN( 3, dp->num_certs), 0,
- P_LIST + P_WNDW + P_CHCK );
- ObjcChange( OC_FORM, win, index, NORMAL, TRUE );
- dp->cols = cert_display_width( &dp->cert_infos_n[dp->current] );
- dp->rows = 8;
- dp->scrollx = 0;
- dp->scrolly = 0;
-
- /* Send (!) redraw ( OC_MSG ) */
- ObjcDrawParent( OC_FORM, FORM(win), VERIFY_BOX_DETAILS, 1, 7 | OC_MSG );
- for( i = 0; i<dp->num_certs; i++) {
- free( items[i] );
- }
-}
-
-
-
-bool verify_ssl_form_do( const char * url, const struct ssl_cert_info * cert_infos_n ,
- unsigned long num_certs )
-{
- OBJECT *tree;
- WINDOW * form;
-
- bool bres = false;
- bool cont = true;
- int res = 0;
- dp.cert_infos_n = (struct ssl_cert_info *)cert_infos_n;
- dp.num_certs = num_certs;
- dp.scrollx = 0;
- dp.scrolly = 0;
- dp.current = 0;
- dp.cols = cert_display_width( &dp.cert_infos_n[dp.current] );
- dp.rows = 8;
- dp.tree = tree;
-
- RsrcGaddr (h_gem_rsrc , R_TREE, VERIFY, &tree);
- ObjcString( tree, VERIFY_LBL_HOST, (char*)url );
- ObjcChange( OC_OBJC, tree, VERIFY_BT_ACCEPT, 0, 0 );
- ObjcChange( OC_OBJC, tree, VERIFY_BT_REJECT, 0, 0 );
- form = FormWindBegin( tree, (char*)"SSL Verify failed" );
- EvntDataAdd( form, WM_REDRAW, cert_info_draw, (void*)&dp, EV_BOT );
- /* this results in some extended objects which can not be freed: :( */
- /* RsrcUserDraw( OC_FORM, tree, VERIFY_BOX_DETAILS, cert_info_draw,(void*)&dp ) ; */
- ObjcAttachFormFunc( form, VERIFY_BT_NEXT_CERT, do_popup, &dp );
- /*
- ObjcAttachFormFunc( form, VERIFY_BT_NEXT_CERT, do_popup, &dp );
- ObjcAttachFormFunc( form, VERIFY_BT_NEXT_CERT, do_popup, &dp );
- */
- while( cont ) {
- res = FormWindDo( MU_MESAG );
- cont = false;
- switch( res ){
- case VERIFY_BT_ACCEPT:
- bres = true;
- break;
-
- case VERIFY_BT_NEXT_CERT:
- /* select box clicked or dragged... */
- cont = true;
- break;
-
- case VERIFY_BT_REJECT:
- bres = false;
- break;
-
- case VERIFY_BT_SCROLL_D:
- cont = true;
- dp.scrolly += 1;
- ObjcDrawParent( OC_FORM, form, VERIFY_BOX_DETAILS, 1, 7 | OC_MSG );
- break;
-
- case VERIFY_BT_SCROLL_U:
- cont = true;
- dp.scrolly -= 1;
- ObjcDrawParent( OC_FORM, form, VERIFY_BOX_DETAILS, 1, 7 | OC_MSG );
- break;
-
- case VERIFY_BT_SCROLL_R:
- LOG(( "scroll r!" ));
- cont = true;
- dp.scrollx += 1;
- if( dp.scrollx > (dp.cols - (272 / 8 )) )
- dp.scrollx -= 1;
- ObjcDrawParent( OC_FORM, form, VERIFY_BOX_DETAILS, 1, 7 | OC_MSG);
- break;
-
- case VERIFY_BT_SCROLL_L:
- cont = true;
- dp.scrollx -= 1;
- if( dp.scrollx < 0 )
- dp.scrollx = 0;
- ObjcDrawParent( OC_FORM, form, VERIFY_BOX_DETAILS, 1, 7 | OC_MSG );
- break;
-
- default:
- break;
- }
- }
- FormWindEnd( );
- return( bres );
-}
+/*
+ * Copyright 2010 Ole Loots <ole@monochrom.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <windom.h>
+
+#include "utils/errors.h"
+#include "utils/utils.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "content/urldb.h"
+#include "content/fetch.h"
+#include "atari/res/netsurf.rsh"
+#include "atari/verify_ssl.h"
+
+/*
+ todo: this file need to use the treeview api - complete rework,
+ current implementation is not used in any way.
+*/
+
+extern void * h_gem_rsrc;
+extern short atari_plot_vdi_handle;
+
+
+#define CERT_INF_LINES 8
+
+static struct ssl_info_draw_param
+{
+ struct ssl_cert_info * cert_infos_n;
+ unsigned long num_certs;
+ int current;
+ int scrollx;
+ int cols;
+ int scrolly;
+ int rows; /* assumed to be 8 */
+ OBJECT * tree;
+} dp;
+
+
+static int cert_display_width( struct ssl_cert_info * cert_info )
+{
+ int l1, l2;
+ int add = 16; /* strlen("Issuer: "); */
+
+ l1 = strlen(cert_info->issuer) + add;
+ l2 = strlen(cert_info->subject) + add;
+ return( MAX(l1, l2) );
+}
+
+
+static void __CDECL cert_info_draw( WINDOW * win, short buf[8], void * data)
+{
+ struct ssl_info_draw_param * dp = (struct ssl_info_draw_param *)data;
+ GRECT work;
+ short pxy[4];
+ int maxchars;
+ short d, cbh, cbw;
+ int i = 0;
+ short x,y,w,h;
+ int px_ypos;
+ char * line = malloc(512);
+ if( line == NULL )
+ return;
+
+ LOG(("Cert info draw, win: %p, data: %p, scrollx: %d", win, data, dp->scrollx ));
+
+ WindGet( win, WF_WORKXYWH, &x, &y, &w, &h );
+ /*using static values here, as RsrcUserDraw has mem leaks & a very small stack */
+ pxy[0] = work.g_x = x + 8;
+ pxy[1] = work.g_y = y + 80;
+ pxy[2] = x + 8 + 272;
+ pxy[3] = y + 80 + 176;
+ work.g_w = 272;
+ work.g_h = 176;
+
+ maxchars = (work.g_w / 8)+1;
+ vs_clip( atari_plot_vdi_handle, 1,(short*) &pxy );
+ vswr_mode( atari_plot_vdi_handle, MD_REPLACE );
+ vsf_interior( atari_plot_vdi_handle, 1 );
+ vsf_color( atari_plot_vdi_handle, LWHITE );
+ v_bar( atari_plot_vdi_handle, (short*)&pxy );
+ vst_height( atari_plot_vdi_handle, 16, &d, &d, &cbw, &cbh );
+ vst_alignment(atari_plot_vdi_handle, 0, 5, &d, &d );
+ vst_color( atari_plot_vdi_handle, BLACK );
+ vst_effects( atari_plot_vdi_handle, 0 );
+ px_ypos = 0;
+ for(i=0; i<CERT_INF_LINES; i++ ) {
+ switch( i ) {
+ case 0:
+ sprintf(line, "Cert Version: %d", dp->cert_infos_n[dp->current].version );
+ break;
+
+ case 1:
+ sprintf(line, "Invalid before: %s", &dp->cert_infos_n[dp->current].not_before );
+ break;
+
+ case 2:
+ sprintf(line, "Invalid after: %s", &dp->cert_infos_n[dp->current].not_after );
+ break;
+
+ case 3:
+ sprintf(line, "Signature type: %d", dp->cert_infos_n[dp->current].sig_type );
+ break;
+
+ case 4:
+ sprintf(line, "Serial: %d", dp->cert_infos_n[dp->current].serial );
+ break;
+
+ case 5:
+ sprintf(line, "Issuer: %s", &dp->cert_infos_n[dp->current].issuer );
+ break;
+
+ case 6:
+ sprintf(line, "Subject: %s", &dp->cert_infos_n[dp->current].subject );
+ break;
+
+ case 7:
+ sprintf(line, "Cert type: %d", dp->cert_infos_n[dp->current].cert_type );
+ break;
+
+ default:
+ break;
+ }
+ if( (int)strlen(line) > dp->scrollx ) {
+ if( dp->scrollx + maxchars < 511 && ( (signed int)strlen(line) - dp->scrollx) > maxchars )
+ line[dp->scrollx + maxchars] = 0;
+ v_gtext(atari_plot_vdi_handle, work.g_x + 1, work.g_y + px_ypos, &line[dp->scrollx]);
+ }
+ px_ypos += cbh;
+ }
+ vst_alignment(atari_plot_vdi_handle, 0, 0, &d, &d );
+ vs_clip( atari_plot_vdi_handle, 0, (short*)&pxy );
+ free( line );
+}
+
+
+static void do_popup( WINDOW *win, int index, int mode, void *data)
+{
+ struct ssl_info_draw_param * dp = (struct ssl_info_draw_param *)data;
+ char * items[dp->num_certs];
+ short x, y;
+ unsigned int i;
+ LOG(("do_popup: num certs: %d", dp->num_certs));
+ for( i = 0; i<dp->num_certs; i++) {
+ items[i] = malloc( 48 );
+ strncpy(items[i], (char*)&dp->cert_infos_n[i].issuer, 46 );
+ }
+ objc_offset( FORM(win), index, &x, &y );
+ dp->current = MenuPopUp( items, x, y,
+ dp->num_certs, MIN( 3, dp->num_certs), 0,
+ P_LIST + P_WNDW + P_CHCK );
+ ObjcChange( OC_FORM, win, index, NORMAL, TRUE );
+ dp->cols = cert_display_width( &dp->cert_infos_n[dp->current] );
+ dp->rows = 8;
+ dp->scrollx = 0;
+ dp->scrolly = 0;
+
+ /* Send (!) redraw ( OC_MSG ) */
+ ObjcDrawParent( OC_FORM, FORM(win), VERIFY_BOX_DETAILS, 1, 7 | OC_MSG );
+ for( i = 0; i<dp->num_certs; i++) {
+ free( items[i] );
+ }
+}
+
+
+
+bool verify_ssl_form_do( const char * url, const struct ssl_cert_info * cert_infos_n ,
+ unsigned long num_certs )
+{
+ OBJECT *tree;
+ WINDOW * form;
+
+ bool bres = false;
+ bool cont = true;
+ int res = 0;
+ dp.cert_infos_n = (struct ssl_cert_info *)cert_infos_n;
+ dp.num_certs = num_certs;
+ dp.scrollx = 0;
+ dp.scrolly = 0;
+ dp.current = 0;
+ dp.cols = cert_display_width( &dp.cert_infos_n[dp.current] );
+ dp.rows = 8;
+ dp.tree = tree;
+
+ RsrcGaddr (h_gem_rsrc , R_TREE, VERIFY, &tree);
+ ObjcString( tree, VERIFY_LBL_HOST, (char*)url );
+ ObjcChange( OC_OBJC, tree, VERIFY_BT_ACCEPT, 0, 0 );
+ ObjcChange( OC_OBJC, tree, VERIFY_BT_REJECT, 0, 0 );
+ form = FormWindBegin( tree, (char*)"SSL Verify failed" );
+ EvntDataAdd( form, WM_REDRAW, cert_info_draw, (void*)&dp, EV_BOT );
+ /* this results in some extended objects which can not be freed: :( */
+ /* RsrcUserDraw( OC_FORM, tree, VERIFY_BOX_DETAILS, cert_info_draw,(void*)&dp ) ; */
+ ObjcAttachFormFunc( form, VERIFY_BT_NEXT_CERT, do_popup, &dp );
+ /*
+ ObjcAttachFormFunc( form, VERIFY_BT_NEXT_CERT, do_popup, &dp );
+ ObjcAttachFormFunc( form, VERIFY_BT_NEXT_CERT, do_popup, &dp );
+ */
+ while( cont ) {
+ res = FormWindDo( MU_MESAG );
+ cont = false;
+ switch( res ){
+ case VERIFY_BT_ACCEPT:
+ bres = true;
+ break;
+
+ case VERIFY_BT_NEXT_CERT:
+ /* select box clicked or dragged... */
+ cont = true;
+ break;
+
+ case VERIFY_BT_REJECT:
+ bres = false;
+ break;
+
+ case VERIFY_BT_SCROLL_D:
+ cont = true;
+ dp.scrolly += 1;
+ ObjcDrawParent( OC_FORM, form, VERIFY_BOX_DETAILS, 1, 7 | OC_MSG );
+ break;
+
+ case VERIFY_BT_SCROLL_U:
+ cont = true;
+ dp.scrolly -= 1;
+ ObjcDrawParent( OC_FORM, form, VERIFY_BOX_DETAILS, 1, 7 | OC_MSG );
+ break;
+
+ case VERIFY_BT_SCROLL_R:
+ LOG(( "scroll r!" ));
+ cont = true;
+ dp.scrollx += 1;
+ if( dp.scrollx > (dp.cols - (272 / 8 )) )
+ dp.scrollx -= 1;
+ ObjcDrawParent( OC_FORM, form, VERIFY_BOX_DETAILS, 1, 7 | OC_MSG);
+ break;
+
+ case VERIFY_BT_SCROLL_L:
+ cont = true;
+ dp.scrollx -= 1;
+ if( dp.scrollx < 0 )
+ dp.scrollx = 0;
+ ObjcDrawParent( OC_FORM, form, VERIFY_BOX_DETAILS, 1, 7 | OC_MSG );
+ break;
+
+ default:
+ break;
+ }
+ }
+ FormWindEnd( );
+ return( bres );
+}
diff --git a/beos/Makefile.defaults b/beos/Makefile.defaults
index d5bf6b396..303414d8b 100644
--- a/beos/Makefile.defaults
+++ b/beos/Makefile.defaults
@@ -2,31 +2,29 @@
# BeOS-specific options
# ----------------------------------------------------------------------------
+# Where to install the netsurf binary
+NETSURF_BEOS_BIN := /boot/apps/netsurf/
- # Where to install the netsurf binary
- NETSURF_BEOS_BIN := /boot/apps/netsurf/
+# TODO:HAIKU -- not sure if ~/.netsurf applies in beos
+# Where to search for NetSurf's resources after looking in ~/.netsurf and
+# $NETSURFRES. It must have a trailing /
+NETSURF_BEOS_RESOURCES := /boot/apps/netsurf/res/
- # TODO:HAIKU -- not sure if ~/.netsurf applies in beos
- # Where to search for NetSurf's resources after looking in ~/.netsurf and
- # $NETSURFRES. It must have a trailing /
- NETSURF_BEOS_RESOURCES := /boot/apps/netsurf/res/
+# Enable NetSurf's use of libsvgtiny for displaying SVGs
+# Valid options: YES, NO, AUTO
+NETSURF_USE_NSSVG := YES
- # Enable NetSurf's use of libsvgtiny for displaying SVGs
- # Valid options: YES, NO, AUTO
- NETSURF_USE_NSSVG := YES
+# Enable NetSurf's use of librosprite for displaying RISC OS Sprites
+# Valid options: YES, NO, AUTO
+NETSURF_USE_ROSPRITE := AUTO
- # Enable NetSurf's use of librosprite for displaying RISC OS Sprites
- # Valid options: YES, NO, AUTO
- NETSURF_USE_ROSPRITE := AUTO
+# Enable NetSurf's use of libharu for PDF export.
+# Valid options: YES, NO
+NETSURF_USE_HARU_PDF := NO
- # Enable NetSurf's use of libharu for PDF export.
- # Valid options: YES, NO
- NETSURF_USE_HARU_PDF := NO
-
- # Force using glibc internal iconv implementation instead of external libiconv
- # Valid options: YES, NO
- NETSURF_USE_LIBICONV_PLUG := NO
-
- # Optimisation levels
- CFLAGS += -O2
+# Force using glibc internal iconv implementation instead of external libiconv
+# Valid options: YES, NO
+NETSURF_USE_LIBICONV_PLUG := NO
+# Optimisation levels
+CFLAGS += -O2
diff --git a/beos/Makefile.target b/beos/Makefile.target
index 499ec16e9..9a57b41cb 100644
--- a/beos/Makefile.target
+++ b/beos/Makefile.target
@@ -2,23 +2,22 @@
# BeOS target setup
# ----------------------------------------------------------------------------
-
$(eval $(call feature_enabled,PNG,-DWITH_PNG,-lpng,PNG (libpng) ))
+$(eval $(call feature_enabled,NSSVG,-DWITH_NS_SVG,-lsvgtiny,SVG (libsvgtiny)))
+# Linker flags
LDFLAGS += -L/boot/home/config/lib
# for Haiku
LDFLAGS += -L/boot/common/lib
-# some people do *not* have libm...
LDFLAGS += -lssl -lcrypto -lcss
-$(eval $(call feature_enabled,NSSVG,-DWITH_NS_SVG,-lsvgtiny,SVG (libsvgtiny)))
LDFLAGS += -ldom -lparserutils -lhubbub -lwapcaplet
-LDFLAGS += -lexpat -lcurl -liconv
+LDFLAGS += -lexpat -lcurl
-CFLAGS += -O $(WARNFLAGS) -Dnsbeos -D_BSD_SOURCE -D_POSIX_C_SOURCE \
- -Drestrict="" -Wno-multichar
-# DEBUG
-CFLAGS += -g -O0
-# -DDEBUG=1
+COMMON_WARNFLAGS += -Wno-multichar
+
+# compiler flags
+CFLAGS += -Dnsbeos -D_BSD_SOURCE -D_POSIX_C_SOURCE -Drestrict="" -g -O0
+CXXFLAGS += -Dnsbeos -D_BSD_SOURCE -D_POSIX_C_SOURCE -Drestrict="" -g -O0
BEOS_BERES := beres
BEOS_RC := rc
@@ -30,45 +29,54 @@ VERSION_MAJ := $(shell sed -n '/_major/{s/.* = \([0-9]*\).*/\1/;p;}' desktop/ver
VERSION_MIN := $(shell sed -n '/_minor/{s/.* = \([0-9]*\).*/\1/;p;}' desktop/version.c)
RSRC_BEOS = $(addprefix $(OBJROOT)/,$(subst /,_,$(patsubst %.rdef,%.rsrc,$(RDEF_BEOS))))
RESOURCES = $(RSRC_BEOS)
+
ifeq ($(HOST),beos)
- CFLAGS += -I/boot/home/config/include \
- -I/boot/home/config/include/libmng \
+ CFLAGS += -I/boot/home/config/include \
-I/boot/home/config/include/hubbub \
-I/boot/home/config/include/libcss \
-I/boot/home/config/include/parserutils
- ifneq ($(wildcard /boot/develop/lib/*/libzeta.so),)
- LDFLAGS += -lzeta
- endif
- ifneq ($(wildcard /boot/develop/lib/*/libnetwork.so),)
+ CXXFLAGS += -I/boot/home/config/include \
+ -I/boot/home/config/include/hubbub \
+ -I/boot/home/config/include/libcss \
+ -I/boot/home/config/include/parserutils
+ ifneq ($(wildcard /boot/develop/lib/*/libzeta.so),)
+ LDFLAGS += -lzeta
+ endif
+ ifneq ($(wildcard /boot/system/develop/lib/*/libnetwork.so),)
# Haiku
CFLAGS += -I/boot/common/include \
- -I/boot/common/include/libmng \
+ -I/boot/common/include/hubbub \
+ -I/boot/common/include/libcss \
+ -I/boot/common/include/parserutils
+ CXXFLAGS += -I/boot/common/include \
-I/boot/common/include/hubbub \
-I/boot/common/include/libcss \
-I/boot/common/include/parserutils
NETLDFLAGS := -lnetwork
- else
- ifneq ($(wildcard /boot/develop/lib/*/libbind.so),)
+ else
+ ifneq ($(wildcard /boot/develop/lib/*/libbind.so),)
# BONE
NETLDFLAGS := -lsocket -lbind
- else
+ else
# net_server, will probably never work
NETLDFLAGS := -lnet
- endif
endif
- else
+ endif
+else
# cross: Haiku ?
NETLDFLAGS := -lnetwork
- endif
- LDFLAGS += -lbe -ltranslation -ltracker $(NETLDFLAGS)
- ifeq ($(CC_MAJOR),2)
+endif
+
+LDFLAGS += -lbe -ltranslation -ltracker $(NETLDFLAGS)
+ifeq ($(CC_MAJOR),2)
LDFLAGS += -lstdc++.r4
- else
+else
LDFLAGS += -lstdc++ -lsupc++
endif
ifeq ($(HOST),beos)
CFLAGS += -I$(PREFIX)/include
+ CXXFLAGS += -I$(PREFIX)/include
LDFLAGS += -L$(PREFIX)/lib
$(eval $(call feature_enabled,BMP,-DWITH_BMP,-lnsbmp,BMP (libnsbmp)))
$(eval $(call feature_enabled,GIF,-DWITH_GIF,-lnsgif,GIF (libnsgif)))
@@ -101,9 +109,11 @@ RDEF_IMP_BEOS := $(addprefix $(OBJROOT)/,$(subst /,_,$(RDEF_IMP_BEOS)))
RDEP_BEOS := \
adblock.css beosdefault.css default.css internal.css quirks.css \
- netsurf.png ca-bundle.txt
+ netsurf.png favicon.png ca-bundle.txt \
+ credits.html licence.html welcome.html
RDEP_BEOS := $(addprefix beos/res/,$(RDEP_BEOS)) \
- $(wildcard beos/res/Icons/*.png) \
+ $(wildcard beos/res/icons/*.png) \
+ $(wildcard beos/res/??/*) \
$(wildcard beos/res/throbber/throbber*.png)
diff --git a/beos/about.cpp b/beos/about.cpp
index bfe836e62..2483a22c1 100644
--- a/beos/about.cpp
+++ b/beos/about.cpp
@@ -21,112 +21,58 @@
#include <stdlib.h>
#include <string.h>
extern "C" {
+#include "desktop/netsurf.h"
#include "utils/log.h"
+#include "testament.h"
+#include "utils/useragent.h"
+#include "curl/curlver.h"
}
#include "beos/about.h"
#include "beos/scaffolding.h"
#include "beos/window.h"
#include <Alert.h>
-#include <ScrollView.h>
+#include <Application.h>
+#include <Invoker.h>
#include <String.h>
-#include <TextView.h>
-static const char *authors[] = {
- "John-Mark Bell", "James Bursa", "Michael Drake",
- "Rob Kendrick", "Adrian Lees", "Vincent Sanders",
- "Daniel Silverstone", "Richard Wilson",
- "\nContributors:", "Kevin Bagust", "Stefaan Claes",
- "Matthew Hambley", "Rob Jackson", "Jeffrey Lee", "Phil Mellor",
- "Philip Pemberton", "Darren Salt", "Andrew Timmins",
- "John Tytgat", "Chris Williams",
- "\nGoogle Summer of Code Contributors:", "Adam Blokus",
- "Sean Fox", "Michael Lester", "Andrew Sidwell", NULL
-};
-
-static const char *translators[] = { "Sebastian Barthel", "Bruno D'Arcangeli",
- "Gerard van Katwijk", "Jérôme Mathevet", "Simon Voortman.", NULL
-};
-static const char *artists[] = {
- "Michael Drake", "\nContributors:", "Andrew Duffell",
- "John Duffell", "Richard Hallas", "Phil Mellor", NULL
-};
-
-static const char *documenters[] = {
- "John-Mark Bell", "James Bursa", "Michael Drake",
- "Richard Wilson", "\nContributors:", "James Shaw", NULL
-};
-
-static const char *name = "NetSurf";
-static const char *description =
- "Small as a mouse, fast as a cheetah, and available for free.\n"
- "NetSurf is a web browser for RISC OS and UNIX-like platforms.";
-static const char *url = "http://www.netsurf-browser.org/";
-static const char *url_label = "NetSurf Website";
-static const char *copyright =
- "Copyright © 2003 - 2008 The NetSurf Developers";
-
-static void add_section(BTextView *textview, const char *header,
- const char *text)
-{
- BFont titleFont;
- titleFont.SetSize(titleFont.Size() + 10);
- BFont textFont;
- text_run_array titleRuns = { 1, { 0, titleFont, { 0, 0, 0, 255 } } };
- text_run_array textRuns = { 1, { 0, textFont, { 0, 0, 0, 255 } } };
- BString h(header);
- BString t(text);
- h << "\n";
- t << "\n\n";
- if (header)
- textview->Insert(h.String(), &titleRuns);
- if (text)
- textview->Insert(t.String(), &textRuns);
-}
-
-static void add_section(BTextView *textview, const char *header,
- const char **texts)
-{
- BString t;
- while (*texts) {
- t << *texts;
- t << ", ";
- texts++;
- }
- add_section(textview, header, t.String());
-}
/**
* Creates the about alert
*/
void nsbeos_about(struct gui_window *gui)
{
- BAlert *alert;
- alert = new BAlert("about", "", /*"HomePage",*/ "Ok");
- //XXX: i18n-ize
- BTextView *tv = alert->TextView();
+ BString text;
+ text << "Netsurf : " << user_agent_string() << "\n";
+ text << "Version : " << netsurf_version << "\n";
+ text << "Build ID : " << WT_REVID << "\n";
+ text << "Date : " << WT_COMPILEDATE << "\n";
+ text << "cURL : " << LIBCURL_VERSION << "\n";
+
+ BAlert *alert = new BAlert("about", text.String(), "Credits", "Licence", "Ok");
+
+ BHandler *target = be_app;
+ BMessage *message = new BMessage(ABOUT_BUTTON);
+ BInvoker *invoker = NULL;
if (gui) {
- alert->SetFeel(B_MODAL_SUBSET_WINDOW_FEEL);
nsbeos_scaffolding *s = nsbeos_get_scaffold(gui);
if (s) {
NSBrowserWindow *w = nsbeos_get_bwindow_for_scaffolding(s);
- if (w)
+ if (w) {
+ alert->SetFeel(B_MODAL_SUBSET_WINDOW_FEEL);
alert->AddToSubset(w);
+ }
+ NSBaseView *v = nsbeos_get_baseview_for_scaffolding(s);
+ if (v) {
+ if (w)
+ message->AddPointer("Window", w);
+ target = v;
+ }
}
}
- tv->SetStylable(true);
- add_section(tv, name, description);
- add_section(tv, NULL, copyright);
- add_section(tv, "authors", authors);
- add_section(tv, "translators", translators);
- add_section(tv, "artists", artists);
- add_section(tv, "documenters", documenters);
- add_section(tv, url_label, url);
+ invoker = new BInvoker(message, target);
- // make space for controls
- alert->ResizeBy(200, 500);
- alert->MoveTo(alert->AlertPosition(alert->Frame().Width() + 1,
- alert->Frame().Height() + 1));
+ //TODO: i18n-ize
- alert->Go(NULL);
+ alert->Go(invoker);
}
diff --git a/beos/download.cpp b/beos/download.cpp
index e20281c2f..af5b49840 100644
--- a/beos/download.cpp
+++ b/beos/download.cpp
@@ -18,9 +18,12 @@
#define __STDBOOL_H__ 1
#include <stdbool.h>
+#include <sys/types.h>
extern "C" {
+#include "desktop/download.h"
#include "desktop/gui.h"
+#include "utils/utils.h"
}
#include "beos/download.h"
@@ -178,7 +181,7 @@ NSDownloadWindow::Failure(const char* error)
}
-struct gui_download_window *gui_download_window_create(download_context *ctx,
+static struct gui_download_window *gui_download_window_create(download_context *ctx,
struct gui_window *parent)
{
struct gui_download_window *download = (struct gui_download_window*)malloc(sizeof *download);
@@ -209,7 +212,7 @@ struct gui_download_window *gui_download_window_create(download_context *ctx,
}
-nserror gui_download_window_data(struct gui_download_window *dw,
+static nserror gui_download_window_data(struct gui_download_window *dw,
const char *data, unsigned int size)
{
dw->window->Progress(size);
@@ -222,7 +225,7 @@ nserror gui_download_window_data(struct gui_download_window *dw,
}
-void gui_download_window_error(struct gui_download_window *dw,
+static void gui_download_window_error(struct gui_download_window *dw,
const char *error_msg)
{
dw->window->Failure(error_msg);
@@ -232,7 +235,7 @@ void gui_download_window_error(struct gui_download_window *dw,
}
-void gui_download_window_done(struct gui_download_window *dw)
+static void gui_download_window_done(struct gui_download_window *dw)
{
dw->window->Success();
@@ -248,3 +251,12 @@ void gui_download_window_done(struct gui_download_window *dw)
dw->storageLock->Unlock();
}
+static struct gui_download_table download_table = {
+ gui_download_window_create,
+ gui_download_window_data,
+ gui_download_window_error,
+ gui_download_window_done,
+};
+
+struct gui_download_table *beos_download_table = &download_table;
+
diff --git a/beos/download.h b/beos/download.h
index 9c8d3adcd..0ce387efc 100644
--- a/beos/download.h
+++ b/beos/download.h
@@ -16,3 +16,4 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+extern struct gui_download_table *beos_download_table;
diff --git a/beos/fetch_rsrc.cpp b/beos/fetch_rsrc.cpp
index c52cafe8c..f2224d1ba 100644
--- a/beos/fetch_rsrc.cpp
+++ b/beos/fetch_rsrc.cpp
@@ -33,17 +33,18 @@
extern "C" {
#include "utils/config.h"
#include "content/fetch.h"
+#include "content/fetchers.h"
#include "content/urldb.h"
#include "desktop/netsurf.h"
#include "utils/nsoption.h"
#include "utils/log.h"
#include "utils/messages.h"
-#include "utils/url.h"
#include "utils/utils.h"
#include "utils/ring.h"
#include "utils/base64.h"
}
#include "beos/fetch_rsrc.h"
+#include "beos/filetype.h"
#include "beos/gui.h"
#include <image.h>
@@ -358,6 +359,18 @@ void fetch_rsrc_register(void)
{
lwc_string *scheme;
int err;
+ nserror ret;
+
+ const struct fetcher_operation_table fetcher_ops_rsrc = {
+ fetch_rsrc_initialise,
+ fetch_rsrc_can_fetch,
+ fetch_rsrc_setup,
+ fetch_rsrc_start,
+ fetch_rsrc_abort,
+ fetch_rsrc_free,
+ fetch_rsrc_poll,
+ fetch_rsrc_finalise
+ };
err = find_app_resources();
@@ -371,15 +384,10 @@ void fetch_rsrc_register(void)
"(couldn't intern \"rsrc\").");
}
- fetch_add_fetcher(scheme,
- fetch_rsrc_initialise,
- fetch_rsrc_can_fetch,
- fetch_rsrc_setup,
- fetch_rsrc_start,
- fetch_rsrc_abort,
- fetch_rsrc_free,
- fetch_rsrc_poll,
- fetch_rsrc_finalise);
+ ret = fetcher_add(scheme, &fetcher_ops_rsrc);
+ if (ret != NSERROR_OK) {
+ die("unable to add rsrc fetcher.");
+ }
}
void fetch_rsrc_unregister(void)
diff --git a/beos/filetype.cpp b/beos/filetype.cpp
index 7975041ac..d5bd3d77b 100644
--- a/beos/filetype.cpp
+++ b/beos/filetype.cpp
@@ -135,9 +135,3 @@ const char *fetch_filetype(const char *unix_path)
return type;
}
-
-char *fetch_mimetype(const char *unix_path)
-{
- return strdup(fetch_filetype(unix_path));
-}
-
diff --git a/beos/filetype.h b/beos/filetype.h
index ab0ef410f..72252dbd0 100644
--- a/beos/filetype.h
+++ b/beos/filetype.h
@@ -18,3 +18,4 @@
void beos_fetch_filetype_init(void);
void beos_fetch_filetype_fin(void);
+const char *fetch_filetype(const char *unix_path);
diff --git a/beos/font.cpp b/beos/font.cpp
index 5636743f5..b262562d3 100644
--- a/beos/font.cpp
+++ b/beos/font.cpp
@@ -36,6 +36,7 @@ extern "C" {
#include "utils/utils.h"
#include "utils/log.h"
#include "utils/nsoption.h"
+#include "utils/nsurl.h"
}
#include "beos/gui.h"
diff --git a/beos/gui.cpp b/beos/gui.cpp
index 04a52bbd7..cb7effead 100644
--- a/beos/gui.cpp
+++ b/beos/gui.cpp
@@ -37,6 +37,7 @@
#include <FindDirectory.h>
#include <Mime.h>
#include <Path.h>
+#include <PathFinder.h>
#include <Roster.h>
#include <Screen.h>
#include <String.h>
@@ -46,10 +47,10 @@ extern "C" {
#include "content/content.h"
#include "content/content_protected.h"
#include "content/fetch.h"
-#include "content/fetchers/curl.h"
+#include "content/fetchers.h"
#include "content/fetchers/resource.h"
+#include "content/hlcache.h"
#include "content/urldb.h"
-#include "desktop/401login.h"
#include "desktop/browser_private.h"
#include "desktop/gui.h"
#include "desktop/netsurf.h"
@@ -71,18 +72,13 @@ extern "C" {
#include "beos/window.h"
#include "beos/throbber.h"
#include "beos/filetype.h"
-//#include "beos/download.h"
+#include "beos/download.h"
#include "beos/schedule.h"
#include "beos/fetch_rsrc.h"
#include "beos/scaffolding.h"
static void *myrealloc(void *ptr, size_t len, void *pw);
-void gui_init(int argc, char** argv);
-
-
-/* Where to search for shared resources. Must have trailing / */
-#define RESPATH "/boot/apps/netsurf/res/"
//TODO: use resources
// enable using resources instead of files
@@ -131,6 +127,7 @@ NSBrowserApplication::MessageReceived(BMessage *message)
{
switch (message->what) {
case B_REFS_RECEIVED:
+ case B_UI_SETTINGS_CHANGED:
// messages for top-level
// we'll just send them to the first window
case 'back':
@@ -298,20 +295,32 @@ static char *find_resource(char *buf, const char *filename, const char *def)
return buf;
}
- strcpy(t, RESPATH);
- strcat(t, filename);
- realpath(t, buf);
- if (access(buf, R_OK) == 0)
- return buf;
+
+ BPathFinder f((void*)find_resource);
+
+ BPath p;
+ if (f.FindPath(B_FIND_PATH_APPS_DIRECTORY, "netsurf/res", p) == B_OK) {
+ strcpy(t, p.Path());
+ strcat(t, filename);
+ realpath(t, buf);
+ if (access(buf, R_OK) == 0)
+ return buf;
+ }
if (def[0] == '%') {
snprintf(t, PATH_MAX, "%s%s", path.Path(), def + 1);
- realpath(t, buf);
+ if (realpath(t, buf) == NULL) {
+ strcpy(buf, t);
+ }
} else if (def[0] == '~') {
snprintf(t, PATH_MAX, "%s%s", getenv("HOME"), def + 1);
- realpath(t, buf);
+ if (realpath(t, buf) == NULL) {
+ strcpy(buf, t);
+ }
} else {
- realpath(def, buf);
+ if (realpath(def, buf) == NULL) {
+ strcpy(buf, def);
+ }
}
return buf;
@@ -348,55 +357,25 @@ static int32 bapp_thread(void *arg)
return 0;
}
-nsurl *gui_get_resource_url(const char *path)
+static nsurl *gui_get_resource_url(const char *path)
{
nsurl *url = NULL;
BString u("rsrc:///");
+
+ /* default.css -> beosdefault.css */
if (strcmp(path, "default.css") == 0)
- u << "beosdefault.css";
- else
- u << path;
+ path = "beosdefault.css";
+
+ /* favicon.ico -> favicon.png */
+ if (strcmp(path, "favicon.ico") == 0)
+ path = "favicon.png";
+
+ u << path;
LOG(("(%s) -> '%s'\n", path, u.String()));
nsurl_create(u.String(), &url);
return url;
}
-static void gui_init2(int argc, char** argv)
-{
- const char *addr;
- nsurl *url;
- nserror error;
-
- if (argc > 1) {
- addr = argv[1];
- } else if (nsoption_charp(homepage_url) != NULL) {
- addr = nsoption_charp(homepage_url);
- } else {
- addr = NETSURF_HOMEPAGE;
- }
-
- /* create an initial browser window */
- error = nsurl_create(addr, &url);
- if (error == NSERROR_OK) {
- error = browser_window_create((browser_window_nav_flags)
- (BROWSER_WINDOW_VERIFIABLE | BROWSER_WINDOW_HISTORY),
- url,
- NULL,
- NULL,
- NULL);
- nsurl_unref(url);
- }
- if (error != NSERROR_OK) {
- warn_user(messages_get_errorcode(error), 0);
- }
-
- if (gFirstRefsReceived) {
- // resend the refs we got before having a window to send them to
- be_app_messenger.SendMessage(gFirstRefsReceived);
- delete gFirstRefsReceived;
- gFirstRefsReceived = NULL;
- }
-}
#if !defined(__HAIKU__) && !defined(B_BEOS_VERSION_DANO)
@@ -501,6 +480,11 @@ static nserror set_defaults(struct nsoption_s *defaults)
return NSERROR_OK;
}
+void nsbeos_update_system_ui_colors(void)
+{
+ set_defaults(nsoptions);
+}
+
/**
* Ensures output logging stream is correctly configured
*/
@@ -512,93 +496,29 @@ static bool nslog_stream_configure(FILE *fptr)
return true;
}
-/** Normal entry point from OS */
-int main(int argc, char** argv)
+static BPath get_messages_path()
{
- nserror ret;
- BPath options;
- if (find_directory(B_USER_SETTINGS_DIRECTORY, &options, true) == B_OK) {
- options.Append("x-vnd.NetSurf");
- }
-
- if (!replicated) {
- // create the Application object before trying to use messages
- // so we can open an alert in case of error.
- new NSBrowserApplication;
- }
-
- const char* messages = "/boot/apps/netsurf/res/en/Messages";
-
- /* initialise logging. Not fatal if it fails but not much we
- * can do about it either.
- */
- nslog_init(nslog_stream_configure, &argc, argv);
-
- /* user options setup */
- ret = nsoption_init(set_defaults, &nsoptions, &nsoptions_default);
- if (ret != NSERROR_OK) {
- die("Options failed to initialise");
- }
- nsoption_read(options.Path(), NULL);
- nsoption_commandline(&argc, argv, NULL);
-
- /* common initialisation */
- ret = netsurf_init(messages);
- if (ret != NSERROR_OK) {
- die("NetSurf failed to initialise");
- }
-
- gui_init(argc, argv);
- gui_init2(argc, argv);
-
- netsurf_main_loop();
-
- netsurf_exit();
-
- return 0;
+ BPathFinder f((void*)get_messages_path);
+
+ BPath p;
+ f.FindPath(B_FIND_PATH_APPS_DIRECTORY, "netsurf/res", p);
+ // TODO: use Haiku's BLocale stuff
+ BString lang(getenv("LC_MESSAGES"));
+ lang.Truncate(2);
+ BDirectory d(p.Path());
+ if (!d.Contains(lang.String(), B_DIRECTORY_NODE))
+ lang = "en";
+ p.Append(lang.String());
+ p.Append("Messages");
+ return p;
}
-/** called when replicated from NSBaseView::Instantiate() */
-int gui_init_replicant(int argc, char** argv)
-{
- nserror ret;
- BPath options;
- if (find_directory(B_USER_SETTINGS_DIRECTORY, &options, true) == B_OK) {
- options.Append("x-vnd.NetSurf");
- }
-
- const char* messages = "/boot/apps/netsurf/res/en/Messages";
-
- /* initialise logging. Not fatal if it fails but not much we
- * can do about it either.
- */
- nslog_init(nslog_stream_configure, &argc, argv);
-
- // FIXME: use options as readonly for replicants
- /* user options setup */
- ret = nsoption_init(set_defaults, &nsoptions, &nsoptions_default);
- if (ret != NSERROR_OK) {
- // FIXME: must not die when in replicant!
- die("Options failed to initialise");
- }
- nsoption_read(options.Path(), NULL);
- nsoption_commandline(&argc, argv, NULL);
-
- /* common initialisation */
- ret = netsurf_init(messages);
- if (ret != NSERROR_OK) {
- // FIXME: must not die when in replicant!
- die("NetSurf failed to initialise");
- }
-
- gui_init(argc, argv);
- gui_init2(argc, argv);
-
- return 0;
-}
-void gui_init(int argc, char** argv)
+static void gui_init(int argc, char** argv)
{
+ const char *addr;
+ nsurl *url;
+ nserror error;
char buf[PATH_MAX];
if (pipe(sEventPipe) < 0)
@@ -611,16 +531,14 @@ void gui_init(int argc, char** argv)
return;
}
- // ui_color() gives hardcoded values before BApplication is created.
- //FIXME:
- //nsbeos_update_system_ui_colors();
+ nsbeos_update_system_ui_colors();
fetch_rsrc_register();
check_homedir();
// make sure the cache dir exists
- create_directory(TEMP_FILENAME_PREFIX, 0600);
+ create_directory(TEMP_FILENAME_PREFIX, 0700);
//nsbeos_completion_init();
@@ -631,7 +549,7 @@ void gui_init(int argc, char** argv)
{
#define STROF(n) #n
#define FIND_THROB(n) filenames[(n)] = \
- "throbber" STROF(n) ".png";
+ "throbber/throbber" STROF(n) ".png";
char *filenames[9];
FIND_THROB(0);
FIND_THROB(1);
@@ -728,6 +646,36 @@ void gui_init(int argc, char** argv)
if (!replicated)
be_app->Unlock();
+ if (argc > 1) {
+ addr = argv[1];
+ } else if (nsoption_charp(homepage_url) != NULL) {
+ addr = nsoption_charp(homepage_url);
+ } else {
+ addr = NETSURF_HOMEPAGE;
+ }
+
+ /* create an initial browser window */
+ error = nsurl_create(addr, &url);
+ if (error == NSERROR_OK) {
+ error = browser_window_create(
+ BW_CREATE_HISTORY,
+ url,
+ NULL,
+ NULL,
+ NULL);
+ nsurl_unref(url);
+ }
+ if (error != NSERROR_OK) {
+ warn_user(messages_get_errorcode(error), 0);
+ }
+
+ if (gFirstRefsReceived) {
+ // resend the refs we got before having a window to send them to
+ be_app_messenger.SendMessage(gFirstRefsReceived);
+ delete gFirstRefsReceived;
+ gFirstRefsReceived = NULL;
+ }
+
}
@@ -765,62 +713,43 @@ void nsbeos_pipe_message_top(BMessage *message, BWindow *_this, struct beos_scaf
}
-void gui_poll(bool active)
+static void gui_poll(bool active)
{
- CURLMcode code;
fd_set read_fd_set, write_fd_set, exc_fd_set;
- int max_fd = 0;
+ int max_fd;
struct timeval timeout;
unsigned int fd_count = 0;
- bool block = true;
bigtime_t next_schedule = 0;
- // handle early deadlines
- schedule_run();
+ /* get any active fetcher fd */
+ fetcher_fdset(&read_fd_set, &write_fd_set, &exc_fd_set, &max_fd);
- FD_ZERO(&read_fd_set);
- FD_ZERO(&write_fd_set);
- FD_ZERO(&exc_fd_set);
-
- if (active) {
- code = curl_multi_fdset(fetch_curl_multi,
- &read_fd_set,
- &write_fd_set,
- &exc_fd_set,
- &max_fd);
- assert(code == CURLM_OK);
- }
+ /* run the scheduler */
+ schedule_run();
// our own event pipe
FD_SET(sEventPipe[0], &read_fd_set);
- max_fd = MAX(max_fd, sEventPipe[0] + 1);
-
- // If there are pending events elsewhere, we should not be blocking
- if (!browser_reformat_pending) {
- if (earliest_callback_timeout != B_INFINITE_TIMEOUT) {
- next_schedule = earliest_callback_timeout - system_time();
- block = false;
- }
- // we're quite late already...
- if (next_schedule < 0)
- next_schedule = 0;
+ // max of all the fds in the set, plus one for select()
+ max_fd = MAX(max_fd, sEventPipe[0]) + 1;
- } else //we're not allowed to sleep, there is other activity going on.
- block = false;
+ // compute schedule timeout
+ if (earliest_callback_timeout != B_INFINITE_TIMEOUT) {
+ next_schedule = earliest_callback_timeout - system_time();
+ } else {
+ next_schedule = earliest_callback_timeout;
+ }
- /*
- LOG(("gui_poll: browser_reformat_pending:%d earliest_callback_timeout:%Ld"
- " next_schedule:%Ld block:%d ", browser_reformat_pending,
- earliest_callback_timeout, next_schedule, block));
- */
+ // we're quite late already...
+ if (next_schedule < 0)
+ next_schedule = 0;
timeout.tv_sec = (long)(next_schedule / 1000000LL);
timeout.tv_usec = (long)(next_schedule % 1000000LL);
//LOG(("gui_poll: select(%d, ..., %Ldus", max_fd, next_schedule));
fd_count = select(max_fd, &read_fd_set, &write_fd_set, &exc_fd_set,
- block ? NULL : &timeout);
+ &timeout);
//LOG(("select: %d\n", fd_count));
if (fd_count > 0 && FD_ISSET(sEventPipe[0], &read_fd_set)) {
@@ -832,15 +761,10 @@ void gui_poll(bool active)
nsbeos_dispatch_event(message);
}
}
-
- schedule_run();
-
- if (browser_reformat_pending)
- nsbeos_window_process_reformats();
}
-void gui_quit(void)
+static void gui_quit(void)
{
urldb_save_cookies(nsoption_charp(cookie_jar));
urldb_save(nsoption_charp(url_file));
@@ -852,17 +776,16 @@ void gui_quit(void)
fetch_rsrc_unregister();
}
-
-
-void gui_create_form_select_menu(struct browser_window *bw,
- struct form_control *control)
+static char *url_to_path(const char *url)
{
- CALLED();
-}
+ char *url_path = curl_unescape(url, 0);
+ char *path;
-void
-gui_window_save_link(struct gui_window *g, const char *url, const char *title)
-{
+ /* return the absolute path including leading / */
+ path = strdup(url_path + (FILE_SCHEME_PREFIX_LEN - 1));
+ curl_free(url_path);
+
+ return path;
}
/**
@@ -918,10 +841,11 @@ void nsbeos_gui_view_source(struct hlcache_handle *content)
return;
}
lwc_string *mime = content_get_mime_type(content);
- const char *mime_string = lwc_string_data(mime);
- if (mime)
+ if (mime) {
file.WriteAttr("BEOS:TYPE", B_MIME_STRING_TYPE, 0LL,
- mime_string, lwc_string_length(mime) + 1);
+ lwc_string_data(mime), lwc_string_length(mime) + 1);
+ lwc_string_unref(mime);
+ }
}
@@ -961,12 +885,13 @@ void nsbeos_gui_view_source(struct hlcache_handle *content)
* Broadcast an URL that we can't handle.
*/
-void gui_launch_url(const char *url)
+static nserror gui_launch_url(struct nsurl *url)
{
status_t status;
// try to open it as an URI
BString mimeType = "application/x-vnd.Be.URL.";
- BString arg(url);
+ BString arg(nsurl_access(url));
+
mimeType.Append(arg, arg.FindFirst(":"));
// special case, text/x-email is used traditionally
@@ -978,11 +903,12 @@ void gui_launch_url(const char *url)
// we just check if it's registered
// if not there is likely no supporting app anyway
if (!BMimeType::IsValid(mimeType.String()))
- return;
- char *args[2] = { (char *)url, NULL };
+ return NSERROR_NO_FETCH_HANDLER;
+ char *args[2] = { (char *)nsurl_access(url), NULL };
status = be_roster->Launch(mimeType.String(), 1, args);
if (status < B_OK)
warn_user("Cannot launch url", strerror(status));
+ return NSERROR_OK;
}
@@ -1022,13 +948,6 @@ void die(const char * const error)
exit(EXIT_FAILURE);
}
-void gui_cert_verify(nsurl *url, const struct ssl_cert_info *certs,
- unsigned long num, nserror (*cb)(bool proceed, void *pw),
- void *cbpw)
-{
- CALLED();
-}
-
static void nsbeos_create_ssl_verify_window(struct browser_window *bw,
hlcache_handle *c, const struct ssl_cert_info *certs,
unsigned long num)
@@ -1036,112 +955,142 @@ static void nsbeos_create_ssl_verify_window(struct browser_window *bw,
CALLED();
}
-
-utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len,
- char **result)
+static void *myrealloc(void *ptr, size_t len, void *pw)
{
- assert(string && result);
-
- if (len == 0)
- len = strlen(string);
-
- *result = strndup(string, len);
- if (!(*result))
- return UTF8_CONVERT_NOMEM;
+ if (len == 0) {
+ free(ptr);
+ return NULL;
+ }
- return UTF8_CONVERT_OK;
+ return realloc(ptr, len);
}
-utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len,
- char **result)
-{
- assert(string && result);
- if (len == 0)
- len = strlen(string);
+static struct gui_clipboard_table beos_clipboard_table = {
+ gui_get_clipboard,
+ gui_set_clipboard,
+};
- *result = strndup(string, len);
- if (!(*result))
- return UTF8_CONVERT_NOMEM;
+static struct gui_fetch_table beos_fetch_table = {
+ fetch_filetype,
+ gui_get_resource_url,
+ NULL //fetch_mimetype
+};
- return UTF8_CONVERT_OK;
-}
+static struct gui_browser_table beos_browser_table = {
+ gui_poll,
+ beos_schedule,
+ gui_quit,
+ gui_launch_url,
+ NULL, //create_form_select_menu
+ NULL, //cert_verify
+ gui_401login_open
+};
-char *path_to_url(const char *path)
+
+/** Normal entry point from OS */
+int main(int argc, char** argv)
{
- int urllen = strlen(path) + FILE_SCHEME_PREFIX_LEN + 1;
- char *url = (char *)malloc(urllen);
+ nserror ret;
+ BPath options;
+ struct netsurf_table beos_table = {
+ &beos_browser_table,
+ beos_window_table,
+ beos_download_table,
+ &beos_clipboard_table,
+ &beos_fetch_table
+ };
- if (url == NULL) {
- return NULL;
+ ret = netsurf_register(&beos_table);
+ if (ret != NSERROR_OK) {
+ die("NetSurf operation table failed registration");
+ }
+
+ if (find_directory(B_USER_SETTINGS_DIRECTORY, &options, true) == B_OK) {
+ options.Append("x-vnd.NetSurf");
}
- if (*path == '/') {
- path++; /* file: paths are already absolute */
- }
+ if (!replicated) {
+ // create the Application object before trying to use messages
+ // so we can open an alert in case of error.
+ new NSBrowserApplication;
+ }
- snprintf(url, urllen, "%s%s", FILE_SCHEME_PREFIX, path);
+ /* initialise logging. Not fatal if it fails but not much we
+ * can do about it either.
+ */
+ nslog_init(nslog_stream_configure, &argc, argv);
- return url;
-}
+ /* user options setup */
+ ret = nsoption_init(set_defaults, &nsoptions, &nsoptions_default);
+ if (ret != NSERROR_OK) {
+ die("Options failed to initialise");
+ }
+ nsoption_read(options.Path(), NULL);
+ nsoption_commandline(&argc, argv, NULL);
-char *url_to_path(const char *url)
-{
- char *url_path = curl_unescape(url, 0);
- char *path;
+ /* common initialisation */
+ BPath messages = get_messages_path();
+ ret = netsurf_init(messages.Path(), NULL);
+ if (ret != NSERROR_OK) {
+ die("NetSurf failed to initialise");
+ }
- /* return the absolute path including leading / */
- path = strdup(url_path + (FILE_SCHEME_PREFIX_LEN - 1));
- curl_free(url_path);
+ gui_init(argc, argv);
- return path;
-}
+ netsurf_main_loop();
-static void *myrealloc(void *ptr, size_t len, void *pw)
-{
- if (len == 0) {
- free(ptr);
- return NULL;
- }
+ netsurf_exit();
- return realloc(ptr, len);
+ return 0;
}
-/**
- * Return the filename part of a full path
- *
- * \param path full path and filename
- * \return filename (will be freed with free())
- */
-
-char *filename_from_path(char *path)
+/** called when replicated from NSBaseView::Instantiate() */
+int gui_init_replicant(int argc, char** argv)
{
- char *leafname;
+ nserror ret;
+ BPath options;
+ struct netsurf_table beos_table = {
+ &beos_browser_table,
+ beos_window_table,
+ beos_download_table,
+ &beos_clipboard_table,
+ &beos_fetch_table
+ };
- leafname = strrchr(path, '/');
- if (!leafname)
- leafname = path;
- else
- leafname += 1;
+ ret = netsurf_register(&beos_table);
+ if (ret != NSERROR_OK) {
+ die("NetSurf operation table failed registration");
+ }
- return strdup(leafname);
-}
+ if (find_directory(B_USER_SETTINGS_DIRECTORY, &options, true) == B_OK) {
+ options.Append("x-vnd.NetSurf");
+ }
-/**
- * Add a path component/filename to an existing path
- *
- * \param path buffer containing path + free space
- * \param length length of buffer "path"
- * \param newpart string containing path component to add to path
- * \return true on success
- */
+ /* initialise logging. Not fatal if it fails but not much we
+ * can do about it either.
+ */
+ nslog_init(nslog_stream_configure, &argc, argv);
-bool path_add_part(char *path, int length, const char *newpart)
-{
- if(path[strlen(path) - 1] != '/')
- strncat(path, "/", length);
+ // FIXME: use options as readonly for replicants
+ /* user options setup */
+ ret = nsoption_init(set_defaults, &nsoptions, &nsoptions_default);
+ if (ret != NSERROR_OK) {
+ // FIXME: must not die when in replicant!
+ die("Options failed to initialise");
+ }
+ nsoption_read(options.Path(), NULL);
+ nsoption_commandline(&argc, argv, NULL);
- strncat(path, newpart, length);
+ /* common initialisation */
+ BPath messages = get_messages_path();
+ ret = netsurf_init(messages.Path(), NULL);
+ if (ret != NSERROR_OK) {
+ // FIXME: must not die when in replicant!
+ die("NetSurf failed to initialise");
+ }
- return true;
+ gui_init(argc, argv);
+
+ return 0;
}
diff --git a/beos/gui.h b/beos/gui.h
index b9d66320c..642441fdd 100644
--- a/beos/gui.h
+++ b/beos/gui.h
@@ -22,7 +22,7 @@
#include <FilePanel.h>
#include <Window.h>
#include <BeBuild.h>
-
+
#ifndef B_BEOS_VERSION_DANO
#define B_UI_SETTINGS_CHANGED '_UIC'
#endif
@@ -32,6 +32,9 @@
extern bool replicated;
int gui_init_replicant(int argc, char** argv);
+extern "C" void gui_401login_open(nsurl *url, const char *realm,
+ nserror (*cb)(bool proceed, void *pw), void *cbpw);
+
extern char *options_file_location;
@@ -48,9 +51,6 @@ virtual void AboutRequested();
virtual bool QuitRequested();
};
-
-extern void schedule_run(void);
-
extern BWindow *wndAbout;
extern BWindow *wndTooltip;
diff --git a/beos/gui_options.cpp b/beos/gui_options.cpp
index 2c56cf710..035c62941 100644
--- a/beos/gui_options.cpp
+++ b/beos/gui_options.cpp
@@ -24,6 +24,7 @@
extern "C" {
#include "utils/log.h"
#include "utils/nsoption.h"
+#include "utils/nsurl.h"
}
#include "beos/gui.h"
#include "beos/scaffolding.h"
diff --git a/beos/login.cpp b/beos/login.cpp
index 90cadde7b..a82fd54a3 100644
--- a/beos/login.cpp
+++ b/beos/login.cpp
@@ -31,7 +31,6 @@ extern "C" {
#include "content/content.h"
#include "content/urldb.h"
#include "desktop/browser.h"
-#include "desktop/401login.h"
#include "desktop/gui.h"
#include "utils/messages.h"
#include "utils/url.h"
@@ -167,7 +166,6 @@ extern "C" void gui_401login_open(nsurl *url, const char *realm,
nserror (*cb)(bool proceed, void *pw), void *cbpw)
{
lwc_string *host;
- url_func_result res;
host = nsurl_get_component(url, NSURL_HOST);
diff --git a/beos/plotters.cpp b/beos/plotters.cpp
index c2a99fea0..52ab4ec21 100644
--- a/beos/plotters.cpp
+++ b/beos/plotters.cpp
@@ -36,6 +36,7 @@ extern "C" {
#include "utils/log.h"
#include "utils/utils.h"
#include "utils/nsoption.h"
+#include "utils/nsurl.h"
}
#include "beos/font.h"
#include "beos/gui.h"
diff --git a/beos/res.h b/beos/res.h
index 4e6497815..278ffb545 100644
--- a/beos/res.h
+++ b/beos/res.h
@@ -16,15 +16,3 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-enum {
- R_ResizeHandle = 1000,
- R_ResBackNavActive = 1042,
- R_ResBackNavInactive = 1043,
- R_ResForwNavActive = 1044,
- R_ResForwNavInactive = 1045,
- R_ResUpNavActive = 1046,
- R_ResUpNavInactive = 1047,
- R_ResBackNavActiveSel = 1048,
- R_ResForwNavActiveSel = 1049,
- R_ResUpNavActiveSel = 1050
-};
diff --git a/beos/res.rdef b/beos/res.rdef
index 862d6d0f1..07012356c 100644
--- a/beos/res.rdef
+++ b/beos/res.rdef
@@ -18,25 +18,29 @@
#include "res.h"
-/* throbber */
-resource(400, "throbber0.png") #'data' import "res/throbber/throbber0.png";
-resource(401, "throbber1.png") #'data' import "res/throbber/throbber1.png";
-resource(402, "throbber2.png") #'data' import "res/throbber/throbber2.png";
-resource(403, "throbber3.png") #'data' import "res/throbber/throbber3.png";
-resource(404, "throbber4.png") #'data' import "res/throbber/throbber4.png";
-resource(405, "throbber5.png") #'data' import "res/throbber/throbber5.png";
-resource(406, "throbber6.png") #'data' import "res/throbber/throbber6.png";
-resource(407, "throbber7.png") #'data' import "res/throbber/throbber7.png";
-resource(408, "throbber8.png") #'data' import "res/throbber/throbber8.png";
+/* files exported as resource: via rsrc:// mapping are added by the makefile */
-/* */
-resource(500, "credits.html") #'data' import "res/en/credits.html,faf";
-resource(501, "licence.html") #'data' import "res/en/licence.html,faf";
-resource(502, "welcome.html") #'data' import "res/en/welcome.html,faf";
+/* application flags (multiple launch) */
+resource(1, "BEOS:APP_FLAGS") (#'APPF') $"01000000";
+/* application MIME signature */
+resource(1, "BEOS:APP_SIG") (#'MIMS') "application/x-vnd.NetSurf";
-resource(1, "BEOS:APP_FLAGS") (#'APPF') $"01000000";
+/* list of supported MIME types */
+resource(1, "BEOS:FILE_TYPES") message {
+ "types" = "text/html",
+ "types" = "image/gif",
+ "types" = "image/jpeg",
+ "types" = "application/x-vnd.Be-bookmark",
+ "types" = "text",
+ "types" = "application/x-vnd.Be-doc_bookmark",
+ "types" = "application/x-vnd.Be.URL.file",
+ "types" = "application/x-vnd.Be.URL.ftp",
+ "types" = "application/x-vnd.Be.URL.http",
+ "types" = "application/x-vnd.Be.URL.https"
+};
+/* BeOS large (32x32) icon */
resource(101, "BEOS:L:STD_ICON") #'ICON' array {
$"FFFFFFFFFFFFFFFFFFFFFF0E0A00D600D6000AAF0EFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFF0E0A000001DED5D5D5DE020000090EFFFFFFFFFFFFFFFFFF"
@@ -72,6 +76,7 @@ resource(101, "BEOS:L:STD_ICON") #'ICON' array {
$"FFFFFFFFFFFFFFFFFFFFFFFF0E0B000A0A0A0D0EFFFFFFFFFFFFFFFFFFFFFFFF"
};
+/* BeOS small (16x16) icon */
resource(101, "BEOS:M:STD_ICON") #'MICN' array {
$"FFFFFFFF0E0900020205000DFFFFFFFF"
$"FFFFFF09038E66666C6C93DD000EFFFF"
@@ -91,217 +96,7 @@ resource(101, "BEOS:M:STD_ICON") #'MICN' array {
$"FFFFFFFF0E0B000500000A0EFFFFFFFF"
};
-resource(1, "BEOS:APP_SIG") (#'MIMS') "application/x-vnd.NetSurf";
-
-resource(1, "BEOS:FILE_TYPES") message {
- "types" = "text/html",
- "types" = "image/gif",
- "types" = "image/jpeg",
- "types" = "application/x-vnd.Be-bookmark",
- "types" = "text",
- "types" = "application/x-vnd.Be-doc_bookmark",
- "types" = "application/x-vnd.Be.URL.file",
- "types" = "application/x-vnd.Be.URL.ftp",
- "types" = "application/x-vnd.Be.URL.http",
- "types" = "application/x-vnd.Be.URL.https"
-};
-
-resource(R_ResizeHandle) archive(, 0x00000000) BBitmap {
- "_frame" = rect { 0.0, 0.0, 13.0, 13.0 },
- "_cspace" = 4,
- "_bmflags" = 1,
- "_rowbytes" = 16,
- "_data" = array {
- $"1B1B1B1B1B1B1B1B1B1B1B1B133F3F3F1B1B1B1B1B1B1B1B1B1B1B1B133F3F3F"
- $"1B1B1B1B1B1B1B1B1B1B1B1B133F3F3F1B1B1B1B1B1B1B1B1B0C1B1B133F3F3F"
- $"1B1B1B1B1B1B1B1B1B1B3F1B133F3F3F1B1B1B1B1B1B1B1B1B1B1B1B133F3F3F"
- $"1B1B1B1B1B1B0C1B1B0D1B1B133F3F3F1B1B1B1B1B1B1B3F1B1B3F1B133F3F3F"
- $"1B1B1B1B1B1B1B1B1B1B1B1B133F3F3F1B1B1B0C1B1B0D1B1B0C1B1B133F3F3F"
- $"1B1B1B1B3F1B1B3F1B1B3F1B133F3F3F1B1B1B1B1B1B1B1B1B1B1B1B133F3F3F"
- $"131313131313131313131313133F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F"
- }
-};
-
-resource(R_ResBackNavActive) archive(, 0x00000000) BBitmap {
- "_frame" = rect { 0.0, 0.0, 18.0, 16.0 },
- "_cspace" = 4,
- "_bmflags" = 1,
- "_rowbytes" = 20,
- "_data" = array {
- $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFF3B3B18FFFF"
- $"FFFFFFFFFFFFFF3FFFFFFFFFFFFF3B353B1418FFFFFFFFFFFFFFFF3FFFFFFFFF"
- $"FF3B35353B1418FFFFFFFFFFFFFFFF3FFFFFFFFF3B3435353B3B3B3B3B3B3B3B"
- $"18FFFF3FFFFFFF3B34343535363637373737373B1418FF3FFFFF3B3434343535"
- $"363637373737373B1418FF3FFF3B343434353536363637373737373B1418FF3F"
- $"FF183B3535353536363637373737373B1418FF3FFFFF183B3536363636373737"
- $"3737373B1418FF3FFFFFFF183B3636373B3B3B3B3B3B3B3B1418FF3FFFFFFFFF"
- $"183B37373B141414141414141418FF3FFFFFFFFFFF183B373B14181818181818"
- $"18FFFF3FFFFFFFFFFFFF183B3B1418FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFF18"
- $"141418FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFF1818FFFFFFFFFFFFFFFFFF3F"
- $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F"
- }
-};
-
-resource(R_ResBackNavInactive) archive(, 0x00000000) BBitmap {
- "_frame" = rect { 0.0, 0.0, 18.0, 16.0 },
- "_cspace" = 4,
- "_bmflags" = 1,
- "_rowbytes" = 20,
- "_data" = array {
- $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFF0000FFFFFF"
- $"FFFFFFFFFFFFFF3FFFFFFFFFFFFF001800FFFFFFFFFFFFFFFFFFFF3FFFFFFFFF"
- $"FF00181800FFFFFFFFFFFFFFFFFFFF3FFFFFFFFF001C18180000000000000000"
- $"FFFFFF3FFFFFFF001C1C18181515111111111100FFFFFF3FFFFF001C1C1C1818"
- $"1515111111111100FFFFFF3FFF001C1C1C1818151515111111111100FFFFFF3F"
- $"FFFF0018181818151515111111111100FFFFFF3FFFFFFF001815151515111111"
- $"11111100FFFFFF3FFFFFFFFF001515110000000000000000FFFFFF3FFFFFFFFF"
- $"FF00111100FFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFF001100FFFFFFFFFFFFFF"
- $"FFFFFF3FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFF"
- $"FFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F"
- $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F"
- }
-};
-
-resource(R_ResForwNavActive) archive(, 0x00000000) BBitmap {
- "_frame" = rect { 0.0, 0.0, 18.0, 16.0 },
- "_cspace" = 4,
- "_bmflags" = 1,
- "_rowbytes" = 20,
- "_data" = array {
- $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFF3B3B18FF"
- $"FFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFF3B353B18FFFFFFFFFFFFFF3FFFFFFFFF"
- $"FFFFFFFF3B35363B18FFFFFFFFFFFF3FFF3B3B3B3B3B3B3B3B3536363B18FFFF"
- $"FFFFFF3FFF3B34343434353535363636373B18FFFFFFFF3FFF3B343434353535"
- $"3536363637373B18FFFFFF3FFF3B343435353535363636373737373B18FFFF3F"
- $"FF3B3535353535363636373737373B141418FF3FFF3B35353536363636373737"
- $"373B141418FFFF3FFF3B3B3B3B3B3B3B3B3737373B141418FFFFFF3FFF181414"
- $"141414143B37373B141418FFFFFFFF3FFFFF1818181818183B373B141418FFFF"
- $"FFFFFF3FFFFFFFFFFFFFFFFF3B3B141418FFFFFFFFFFFF3FFFFFFFFFFFFFFFFF"
- $"18141418FFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFF1818FFFFFFFFFFFFFFFF3F"
- $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F"
- }
-};
-
-resource(R_ResForwNavInactive) archive(, 0x00000000) BBitmap {
- "_frame" = rect { 0.0, 0.0, 18.0, 16.0 },
- "_cspace" = 4,
- "_bmflags" = 1,
- "_rowbytes" = 20,
- "_data" = array {
- $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFF0000FFFF"
- $"FFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFF001800FFFFFFFFFFFFFFFF3FFFFFFFFF"
- $"FFFFFFFF00181500FFFFFFFFFFFFFF3FFF000000000000000018151500FFFFFF"
- $"FFFFFF3FFF001C1C1C1C1818181515151100FFFFFFFFFF3FFF001C1C1C181818"
- $"18151515111100FFFFFFFF3FFF001C1C181818181515151111111100FFFFFF3F"
- $"FF0018181818181515151111111100FFFFFFFF3FFF0018181815151515111111"
- $"1100FFFFFFFFFF3FFF000000000000000011111100FFFFFFFFFFFF3FFFFFFFFF"
- $"FFFFFFFF00111100FFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFF001100FFFFFFFFFF"
- $"FFFFFF3FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFF"
- $"FFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F"
- $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F"
- }
-};
-
-resource(R_ResUpNavActive) archive(, 0x00000000) BBitmap {
- "_frame" = rect { 0.0, 0.0, 17.0, 16.0 },
- "_cspace" = 4,
- "_bmflags" = 1,
- "_rowbytes" = 20,
- "_data" = array {
- $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3FFFFFFFFFFFFFFFFF00FFFFFF"
- $"FFFFFFFFFFFF3F3FFFFFFFFFFFFFFF00E50018FFFFFFFFFFFFFF3F3FFFFFFFFF"
- $"FFFF00E5BDBD0018FFFFFFFFFFFF3F3FFFFFFFFFFF00E5BDBDBDBD0018FFFFFF"
- $"FFFF3F3FFFFFFFFF00E5BDBDBDBDBDBD0018FFFFFFFF3F3FFFFFFF00E5BDBDBD"
- $"BDBDBDBDBD0018FFFFFF3F3FFFFF00E5E5E5BDBDBDBDBD9898980018FFFF3F3F"
- $"FF00000000E5BDBDBDBDBD980000000018FF3F3FFFFF141400E5BDBDBDBDBD98"
- $"00141418FFFF3F3FFFFFFF1800E5BDBDBDBDBD98001418FFFFFF3F3FFFFFFFFF"
- $"00E5BDBDBDBDBD98001418FFFFFF3F3FFFFFFFFF00E5989898989898001418FF"
- $"FFFF3F3FFFFFFFFF0000000000000000001418FFFFFF3F3FFFFFFFFF18141414"
- $"141414141418FFFFFFFF3F3FFFFFFFFFFF181818181818181818FFFFFFFF3F3F"
- $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F"
- }
-};
-
-resource(R_ResUpNavInactive) archive(, 0x00000000) BBitmap {
- "_frame" = rect { 0.0, 0.0, 17.0, 16.0 },
- "_cspace" = 4,
- "_bmflags" = 1,
- "_rowbytes" = 20,
- "_data" = array {
- $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3FFFFFFFFFFFFFFFFF00FFFFFF"
- $"FFFFFFFFFFFF3F3FFFFFFFFFFFFFFF001C00FFFFFFFFFFFFFFFF3F3FFFFFFFFF"
- $"FFFF001C171700FFFFFFFFFFFFFF3F3FFFFFFFFFFF001C1717171700FFFFFFFF"
- $"FFFF3F3FFFFFFFFF001C17171717171700FFFFFFFFFF3F3FFFFFFF001C171717"
- $"171717171700FFFFFFFF3F3FFFFF001C1C1C171717171712121200FFFFFF3F3F"
- $"FF000000001C17171717171200000000FFFF3F3FFFFFFFFF001C171717171712"
- $"00FFFFFFFFFF3F3FFFFFFFFF001C17171717171200FFFFFFFFFF3F3FFFFFFFFF"
- $"001C17171717171200FFFFFFFFFF3F3FFFFFFFFF001C12121212121200FFFFFF"
- $"FFFF3F3FFFFFFFFF000000000000000000FFFFFFFFFF3F3FFFFFFFFFFFFFFFFF"
- $"FFFFFFFFFFFFFFFFFFFF3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F"
- $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F"
- }
-};
-
-resource(R_ResBackNavActiveSel) archive(, 0x00000000) BBitmap {
- "_frame" = rect { 0.0, 0.0, 18.0, 16.0 },
- "_cspace" = 4,
- "_bmflags" = 1,
- "_rowbytes" = 20,
- "_data" = array {
- $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFF3B3BFFFFFF"
- $"FFFFFFFFFFFFFF3FFFFFFFFFFFFF3B353BFFFFFFFFFFFFFFFFFFFF3FFFFFFFFF"
- $"FF3B35353BFFFFFFFFFFFFFFFFFFFF3FFFFFFFFF3B3435353B3B3B3B3B3B3B3B"
- $"FFFFFF3FFFFFFF3B34343535363637373737373BFFFFFF3FFFFF3B3434343535"
- $"363637373737373BFFFFFF3FFF3B343434353536363637373737373BFFFFFF3F"
- $"FFFF3B3535353536363637373737373BFFFFFF3FFFFFFF3B3536363636373737"
- $"3737373BFFFFFF3FFFFFFFFF3B3636373B3B3B3B3B3B3B3BFFFFFF3FFFFFFFFF"
- $"FF3B37373BFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFF3B373BFFFFFFFFFFFFFF"
- $"FFFFFF3FFFFFFFFFFFFFFF3B3BFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFF"
- $"FFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F"
- $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F"
- }
-};
-
-resource(R_ResForwNavActiveSel) archive(, 0x00000000) BBitmap {
- "_frame" = rect { 0.0, 0.0, 18.0, 16.0 },
- "_cspace" = 4,
- "_bmflags" = 1,
- "_rowbytes" = 20,
- "_data" = array {
- $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFF3B3BFFFF"
- $"FFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFF3B353BFFFFFFFFFFFFFFFF3FFFFFFFFF"
- $"FFFFFFFF3B35363BFFFFFFFFFFFFFF3FFF3B3B3B3B3B3B3B3B3536363BFFFFFF"
- $"FFFFFF3FFF3B34343434353535363636373BFFFFFFFFFF3FFF3B343434353535"
- $"3536363637373BFFFFFFFF3FFF3B343435353535363636373737373BFFFFFF3F"
- $"FF3B3535353535363636373737373BFFFFFFFF3FFF3B35353536363636373737"
- $"373BFFFFFFFFFF3FFF3B3B3B3B3B3B3B3B3737373BFFFFFFFFFFFF3FFFFFFFFF"
- $"FFFFFFFF3B37373BFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFF3B373BFFFFFFFFFF"
- $"FFFFFF3FFFFFFFFFFFFFFFFF3B3BFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFF"
- $"FFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F"
- $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F"
- }
-};
-
-resource(R_ResUpNavActiveSel) archive(, 0x00000000) BBitmap {
- "_frame" = rect { 0.0, 0.0, 17.0, 16.0 },
- "_cspace" = 4,
- "_bmflags" = 1,
- "_rowbytes" = 20,
- "_data" = array {
- $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3FFFFFFFFFFFFFFFFF00FFFFFF"
- $"FFFFFFFFFFFF3F3FFFFFFFFFFFFFFF00E500FFFFFFFFFFFFFFFF3F3FFFFFFFFF"
- $"FFFF00E5BDBD00FFFFFFFFFFFFFF3F3FFFFFFFFFFF00E5BDBDBDBD00FFFFFFFF"
- $"FFFF3F3FFFFFFFFF00E5BDBDBDBDBDBD00FFFFFFFFFF3F3FFFFFFF00E5BDBDBD"
- $"BDBDBDBDBD00FFFFFFFF3F3FFFFF00E5E5E5BDBDBDBDBD98989800FFFFFF3F3F"
- $"FF00000000E5BDBDBDBDBD9800000000FFFF3F3FFFFFFFFF00E5BDBDBDBDBD98"
- $"00FFFFFFFFFF3F3FFFFFFFFF00E5BDBDBDBDBD9800FFFFFFFFFF3F3FFFFFFFFF"
- $"00E5BDBDBDBDBD9800FFFFFFFFFF3F3FFFFFFFFF00E598989898989800FFFFFF"
- $"FFFF3F3FFFFFFFFF000000000000000000FFFFFFFFFF3F3FFFFFFFFFFFFFFFFF"
- $"FFFFFFFFFFFFFFFFFFFF3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F"
- $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F"
- }
-};
-
+/* Haiku vector icon */
resource(101, "BEOS:ICON") #'VICN' array {
$"6E6369660A02010203AE259A400198BFFA65AE20E548AF9547F2037F30A0FFFF"
$"00E8F1FDFFF131A0FFFB02000602B83B85BC57333C5733B83B8549EAE1481199"
@@ -363,8 +158,10 @@ resource(101, "BEOS:ICON") #'VICN' array {
$"00000000000040012FBD3E023BCFC400190117850004"
};
+/* ZETA SVG icon descriptor */
resource(101, "BEOS:D:STD_ICON") (#'iICO') $"4944585A055300";
+/* ZETA SVG compressed icon */
resource(101, "BEOS:V:STD_ICON") #'zICO' array {
$"7A10000078DAED57DD6EDB3618BDEF5310CA4D03C40C7F3E8A6466B7C002AC37"
$"2C066CCD03B8B1EC6853A44052B3644FBFF351769C7601D68B41BB5814C03AA2"
diff --git a/beos/res/credits.html b/beos/res/credits.html
new file mode 120000
index 000000000..ca85d3d27
--- /dev/null
+++ b/beos/res/credits.html
@@ -0,0 +1 @@
+en/credits.html \ No newline at end of file
diff --git a/beos/res/de/welcome.html b/beos/res/de/welcome.html
new file mode 120000
index 000000000..b2ddfc796
--- /dev/null
+++ b/beos/res/de/welcome.html
@@ -0,0 +1 @@
+../../../!NetSurf/Resources/de/welcome.html,faf \ No newline at end of file
diff --git a/beos/res/en b/beos/res/en
deleted file mode 120000
index d1dfaa9d2..000000000
--- a/beos/res/en
+++ /dev/null
@@ -1 +0,0 @@
-../../!NetSurf/Resources/en \ No newline at end of file
diff --git a/gtk/res/C/credits.html b/beos/res/en/credits.html
index 1ba17392b..1ba17392b 120000
--- a/gtk/res/C/credits.html
+++ b/beos/res/en/credits.html
diff --git a/gtk/res/C/licence.html b/beos/res/en/licence.html
index 147dd6db2..147dd6db2 120000
--- a/gtk/res/C/licence.html
+++ b/beos/res/en/licence.html
diff --git a/gtk/res/C/welcome.html b/beos/res/en/welcome.html
index 28362130a..28362130a 120000
--- a/gtk/res/C/welcome.html
+++ b/beos/res/en/welcome.html
diff --git a/beos/res/favicon.png b/beos/res/favicon.png
new file mode 120000
index 000000000..d968c3827
--- /dev/null
+++ b/beos/res/favicon.png
@@ -0,0 +1 @@
+../../gtk/res/favicon.png \ No newline at end of file
diff --git a/beos/res/Icons b/beos/res/icons
index 4a0ebabc6..4a0ebabc6 120000
--- a/beos/res/Icons
+++ b/beos/res/icons
diff --git a/beos/res/it/credits.html b/beos/res/it/credits.html
new file mode 120000
index 000000000..6e1e15ed5
--- /dev/null
+++ b/beos/res/it/credits.html
@@ -0,0 +1 @@
+../../../!NetSurf/Resources/it/credits.html,faf \ No newline at end of file
diff --git a/beos/res/it/licence.html b/beos/res/it/licence.html
new file mode 120000
index 000000000..3a7c056b6
--- /dev/null
+++ b/beos/res/it/licence.html
@@ -0,0 +1 @@
+../../../!NetSurf/Resources/it/licence.html,faf \ No newline at end of file
diff --git a/beos/res/it/welcome.html b/beos/res/it/welcome.html
new file mode 120000
index 000000000..dea1e839c
--- /dev/null
+++ b/beos/res/it/welcome.html
@@ -0,0 +1 @@
+../../../!NetSurf/Resources/it/welcome.html,faf \ No newline at end of file
diff --git a/beos/res/ja/welcome.html b/beos/res/ja/welcome.html
new file mode 120000
index 000000000..827796f02
--- /dev/null
+++ b/beos/res/ja/welcome.html
@@ -0,0 +1 @@
+../../../!NetSurf/Resources/ja/welcome.html,faf \ No newline at end of file
diff --git a/beos/res/licence.html b/beos/res/licence.html
new file mode 120000
index 000000000..86f8c54bf
--- /dev/null
+++ b/beos/res/licence.html
@@ -0,0 +1 @@
+en/licence.html \ No newline at end of file
diff --git a/beos/res/welcome.html b/beos/res/welcome.html
new file mode 120000
index 000000000..1abdc5e8a
--- /dev/null
+++ b/beos/res/welcome.html
@@ -0,0 +1 @@
+en/welcome.html \ No newline at end of file
diff --git a/beos/scaffolding.cpp b/beos/scaffolding.cpp
index 252a816dc..45815fa1a 100644
--- a/beos/scaffolding.cpp
+++ b/beos/scaffolding.cpp
@@ -24,6 +24,7 @@
#include <string.h>
#include <BeBuild.h>
+#include <Bitmap.h>
#include <Box.h>
#include <Button.h>
#include <Dragger.h>
@@ -51,8 +52,8 @@
#include <fs_attr.h>
extern "C" {
#include "content/content.h"
+#include "desktop/browser_history.h"
#include "desktop/browser_private.h"
-#include "desktop/local_history.h"
#include "desktop/gui.h"
#include "desktop/netsurf.h"
#include "desktop/plotters.h"
@@ -61,10 +62,11 @@ extern "C" {
#include "render/font.h"
#include "render/form.h"
#include "utils/messages.h"
-#include "utils/schedule.h"
#include "utils/utils.h"
#include "utils/log.h"
}
+#include "beos/about.h"
+#include "beos/bitmap.h"
#include "beos/gui.h"
#include "beos/plotters.h"
#include "beos/scaffolding.h"
@@ -72,7 +74,7 @@ extern "C" {
//#include "beos/completion.h"
#include "beos/throbber.h"
#include "beos/window.h"
-//#include "beos/schedule.h"
+#include "beos/schedule.h"
//#include "beos/download.h"
#define TOOLBAR_HEIGHT 32
@@ -80,6 +82,7 @@ extern "C" {
struct beos_history_window;
+class NSIconTextControl;
class NSBrowserWindow;
class NSThrobber;
@@ -103,7 +106,7 @@ struct beos_scaffolding {
BControl *reload_button;
BControl *home_button;
- BTextControl *url_bar;
+ NSIconTextControl *url_bar;
//BMenuField *url_bar_completion;
NSThrobber *throbber;
@@ -154,6 +157,210 @@ extern int main(int argc, char** argv);
// in fetch_rsrc.cpp
extern BResources *gAppResources;
+// #pragma mark - class NSIconTextControl
+
+#define ICON_WIDTH 16
+
+class NSIconTextControl : public BTextControl {
+public:
+ NSIconTextControl(BRect frame, const char* name,
+ const char* label, const char* initialText,
+ BMessage* message,
+ uint32 resizeMode
+ = B_FOLLOW_LEFT | B_FOLLOW_TOP,
+ uint32 flags
+ = B_WILL_DRAW | B_NAVIGABLE | B_DRAW_ON_CHILDREN);
+virtual ~NSIconTextControl();
+
+virtual void FrameResized(float newWidth, float newHeight);
+virtual void Draw(BRect updateRect);
+virtual void DrawAfterChildren(BRect updateRect);
+virtual void AttachedToWindow();
+
+void SetBitmap(const BBitmap *bitmap);
+void FixupTextRect();
+
+private:
+ BPoint fIconOffset;
+ BRect fIconFrame;
+ const BBitmap *fIconBitmap;
+};
+
+NSIconTextControl::NSIconTextControl(BRect frame, const char* name,
+ const char* label, const char* initialText,
+ BMessage* message,
+ uint32 resizeMode,
+ uint32 flags)
+ : BTextControl(frame, name, label, initialText, message, resizeMode, flags),
+ fIconOffset(0,0),
+ fIconBitmap(NULL)
+{
+ BRect r(Bounds());
+ fIconFrame = r;
+ fIconFrame.right = fIconFrame.left + ICON_WIDTH - 1;
+ fIconFrame.bottom = fIconFrame.top + ICON_WIDTH - 1;
+ fIconFrame.OffsetBy((int32)((r.IntegerHeight() - ICON_WIDTH + 3) / 2),
+ (int32)((r.IntegerHeight() - ICON_WIDTH + 1) / 2));
+ FixupTextRect();
+}
+
+
+NSIconTextControl::~NSIconTextControl()
+{
+ delete fIconBitmap;
+}
+
+
+void
+NSIconTextControl::FrameResized(float newWidth, float newHeight)
+{
+ BTextControl::FrameResized(newWidth, newHeight);
+ FixupTextRect();
+}
+
+
+void
+NSIconTextControl::Draw(BRect updateRect)
+{
+ FixupTextRect();
+ BTextControl::Draw(updateRect);
+}
+
+
+void
+NSIconTextControl::DrawAfterChildren(BRect updateRect)
+{
+ BTextControl::DrawAfterChildren(updateRect);
+
+ PushState();
+
+ SetDrawingMode(B_OP_ALPHA);
+ DrawBitmap(fIconBitmap, fIconFrame);
+
+ //XXX: is this needed?
+ PopState();
+}
+
+
+void
+NSIconTextControl::AttachedToWindow()
+{
+ BTextControl::AttachedToWindow();
+ FixupTextRect();
+}
+
+
+void
+NSIconTextControl::SetBitmap(const BBitmap *bitmap)
+{
+ delete fIconBitmap;
+ fIconBitmap = NULL;
+
+ // keep a copy
+ if (bitmap)
+ fIconBitmap = new BBitmap(bitmap);
+ // invalidate just the icon area
+ Invalidate(fIconFrame);
+}
+
+
+void
+NSIconTextControl::FixupTextRect()
+{
+ // FIXME: this flickers on resize, quite ugly
+ BRect r(TextView()->TextRect());
+
+ // don't fix the fix
+ if (r.left > ICON_WIDTH)
+ return;
+
+ r.left += r.bottom - r.top;
+ TextView()->SetTextRect(r);
+}
+
+
+#undef ICON_WIDTH
+
+// #pragma mark - class NSResizeKnob
+
+class NSResizeKnob : public BView {
+public:
+ NSResizeKnob(BRect frame, BView *target);
+virtual ~NSResizeKnob();
+
+virtual void MouseDown(BPoint where);
+virtual void MouseUp(BPoint where);
+virtual void MouseMoved(BPoint where, uint32 code,
+ const BMessage* dragMessage);
+
+virtual void Draw(BRect updateRect);
+
+void SetBitmap(const BBitmap *bitmap);
+
+private:
+ const BBitmap *fBitmap;
+ BView *fTarget;
+ BPoint fOffset;
+};
+
+NSResizeKnob::NSResizeKnob(BRect frame, BView *target)
+ : BView(frame, "NSResizeKnob", B_FOLLOW_BOTTOM | B_FOLLOW_RIGHT, B_WILL_DRAW),
+ fBitmap(NULL),
+ fTarget(target),
+ fOffset(-1, -1)
+{
+ SetViewColor(0, 255, 0);
+}
+
+
+NSResizeKnob::~NSResizeKnob()
+{
+}
+
+
+void
+NSResizeKnob::MouseDown(BPoint where)
+{
+ SetMouseEventMask(B_POINTER_EVENTS,
+ B_NO_POINTER_HISTORY | B_LOCK_WINDOW_FOCUS);
+ fOffset = where;
+}
+
+
+void
+NSResizeKnob::MouseUp(BPoint where)
+{
+ fOffset.Set(-1, -1);
+}
+
+
+void
+NSResizeKnob::MouseMoved(BPoint where, uint32 code,
+ const BMessage* dragMessage)
+{
+ if (fOffset.x >= 0) {
+ fTarget->ResizeBy(where.x - fOffset.x, where.y - fOffset.y);
+ }
+}
+
+
+void
+NSResizeKnob::Draw(BRect updateRect)
+{
+ if (!fBitmap)
+ return;
+ DrawBitmap(fBitmap);
+}
+
+
+void
+NSResizeKnob::SetBitmap(const BBitmap *bitmap)
+{
+ fBitmap = bitmap;
+ Invalidate();
+}
+
+
// #pragma mark - class NSThrobber
class NSThrobber : public BView {
@@ -241,6 +448,7 @@ NSBaseView::MessageReceived(BMessage *message)
{
switch (message->what) {
case B_SIMPLE_DATA:
+ case B_ABOUT_REQUESTED:
case B_ARGV_RECEIVED:
case B_REFS_RECEIVED:
case B_COPY:
@@ -339,6 +547,7 @@ NSBaseView::MessageReceived(BMessage *message)
case TOOLBAR_THROBBER:
case TOOLBAR_EDIT:
case CHOICES_SHOW:
+ case ABOUT_BUTTON:
case APPLICATION_QUIT:
if (Window())
Window()->DetachCurrentMessage();
@@ -394,10 +603,6 @@ NSBaseView::Instantiate(BMessage *archive)
replicated = true;
//TODO:FIXME: fix replicants
- // netsurf_init() needs different args now...
- //netsurf_init(2, info->args);
- //return NULL;
-
// do as much as possible in this thread to avoid deadlocks
gui_init_replicant(2, info->args);
@@ -445,13 +650,28 @@ NSBaseView::AllAttached()
g->url_bar->SetTarget(this);
- SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
+ rgb_color c = ui_color(B_PANEL_BACKGROUND_COLOR);
+ SetViewColor(c);
- g->tool_bar->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
- g->dragger->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
+ g->tool_bar->SetViewColor(c);
+ g->back_button->SetViewColor(c);
+ g->back_button->SetLowColor(c);
+ g->forward_button->SetViewColor(c);
+ g->forward_button->SetLowColor(c);
+ g->stop_button->SetViewColor(c);
+ g->stop_button->SetLowColor(c);
+ g->reload_button->SetViewColor(c);
+ g->reload_button->SetLowColor(c);
+ g->home_button->SetViewColor(c);
+ g->home_button->SetLowColor(c);
+ g->url_bar->SetViewColor(c);
+ g->throbber->SetViewColor(c);
+ g->scroll_view->SetViewColor(c);
- g->status_bar->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
- g->status_bar->SetLowColor(ui_color(B_PANEL_BACKGROUND_COLOR)) ;
+ g->dragger->SetViewColor(c);
+
+ g->status_bar->SetViewColor(c);
+ g->status_bar->SetLowColor(c);
#if defined(__HAIKU__) || defined(B_DANO_VERSION)
g->status_bar->SetHighColor(ui_color(B_PANEL_TEXT_COLOR));
#endif
@@ -606,6 +826,11 @@ void nsbeos_scaffolding_dispatch_event(nsbeos_scaffolding *scaffold, BMessage *m
case B_QUIT_REQUESTED:
nsbeos_scaffolding_destroy(scaffold);
break;
+ case B_ABOUT_REQUESTED:
+ {
+ nsbeos_about(scaffold->top_level);
+ break;
+ }
case B_NETPOSITIVE_DOWN:
//XXX WRITEME
break;
@@ -661,10 +886,10 @@ void nsbeos_scaffolding_dispatch_event(nsbeos_scaffolding *scaffold, BMessage *m
if (/*message->WasDropped() &&*/ i == 0) {
browser_window_navigate(bw, nsurl, NULL,
(browser_window_nav_flags)
- (BROWSER_WINDOW_HISTORY | BROWSER_WINDOW_VERIFIABLE),
+ (BW_NAVIGATE_HISTORY),
NULL, NULL, NULL);
} else {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE,
+ error = browser_window_create(BW_CREATE_CLONE,
nsurl,
NULL,
bw,
@@ -688,7 +913,7 @@ void nsbeos_scaffolding_dispatch_event(nsbeos_scaffolding *scaffold, BMessage *m
for (i = 1; message->FindString("argv", i, &urltxt) >= B_OK; i++) {
error = nsurl_create(urltxt.String(), &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE,
+ error = browser_window_create(BW_CREATE_CLONE,
url,
NULL,
bw,
@@ -702,8 +927,7 @@ void nsbeos_scaffolding_dispatch_event(nsbeos_scaffolding *scaffold, BMessage *m
break;
}
case B_UI_SETTINGS_CHANGED:
- //FIXME:
- //nsbeos_update_system_ui_colors();
+ nsbeos_update_system_ui_colors();
nsbeos_scaffolding_update_colors(scaffold);
break;
case B_NETPOSITIVE_OPEN_URL:
@@ -723,8 +947,7 @@ void nsbeos_scaffolding_dispatch_event(nsbeos_scaffolding *scaffold, BMessage *m
browser_window_navigate(bw,
nsurl,
NULL,
- (browser_window_nav_flags)(BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE),
+ (browser_window_nav_flags)(BW_NAVIGATE_HISTORY | BW_NAVIGATE_UNVERIFIABLE),
NULL,
NULL,
NULL);
@@ -748,17 +971,17 @@ void nsbeos_scaffolding_dispatch_event(nsbeos_scaffolding *scaffold, BMessage *m
case B_NETPOSITIVE_BACK:
case BROWSER_NAVIGATE_BACK:
case 'back':
- if (!history_back_available(bw->history))
+ if (!browser_window_history_back_available(bw))
break;
- history_back(bw, bw->history);
+ browser_window_history_back(bw, false);
nsbeos_window_update_back_forward(scaffold);
break;
case B_NETPOSITIVE_FORWARD:
case BROWSER_NAVIGATE_FORWARD:
case 'forw':
- if (!history_forward_available(bw->history))
+ if (!browser_window_history_forward_available(bw))
break;
- history_forward(bw, bw->history);
+ browser_window_history_forward(bw, false);
nsbeos_window_update_back_forward(scaffold);
break;
case B_NETPOSITIVE_STOP:
@@ -794,8 +1017,7 @@ void nsbeos_scaffolding_dispatch_event(nsbeos_scaffolding *scaffold, BMessage *m
browser_window_navigate(bw,
url,
NULL,
- (browser_window_nav_flags)(BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE),
+ (browser_window_nav_flags)(BW_NAVIGATE_HISTORY),
NULL,
NULL,
NULL);
@@ -823,8 +1045,7 @@ void nsbeos_scaffolding_dispatch_event(nsbeos_scaffolding *scaffold, BMessage *m
browser_window_navigate(bw,
url,
NULL,
- (browser_window_nav_flags)(BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE),
+ (browser_window_nav_flags)(BW_NAVIGATE_HISTORY),
NULL,
NULL,
NULL);
@@ -907,7 +1128,7 @@ void nsbeos_scaffolding_dispatch_event(nsbeos_scaffolding *scaffold, BMessage *m
error = nsurl_create(text.String(), &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE,
+ error = browser_window_create(BW_CREATE_CLONE,
url,
NULL,
bw,
@@ -1016,6 +1237,43 @@ void nsbeos_scaffolding_dispatch_event(nsbeos_scaffolding *scaffold, BMessage *m
break;
case CHOICES_SHOW:
break;
+ case ABOUT_BUTTON:
+ /* XXX: doesn't work yet! bug in rsrc:/
+ BString url("rsrc:/about.en.html,text/html");
+ browser_window_create(url.String(), NULL, NULL, true, false);
+ */
+ {
+ int32 button;
+ if (message->FindInt32("which", &button) == B_OK) {
+ const char *goto_url = NULL;
+ nserror nserr;
+ nsurl *url;
+ switch (button) {
+ case 0:
+ goto_url = "about:credits";
+ break;
+ case 1:
+ goto_url = "about:licence";
+ break;
+ default:
+ break;
+ }
+ if (goto_url == NULL)
+ break;
+ nserr = nsurl_create(goto_url, &url);
+ if (nserr == NSERROR_OK) {
+ nserr = browser_window_navigate(bw,
+ url, NULL,
+ (browser_window_nav_flags)(BW_NAVIGATE_HISTORY),
+ NULL, NULL, NULL);
+ nsurl_unref(url);
+ }
+ if (nserr != NSERROR_OK) {
+ warn_user(messages_get_errorcode(nserr), 0);
+ }
+ }
+ }
+ break;
case APPLICATION_QUIT:
netsurf_quit = true;
break;
@@ -1040,8 +1298,8 @@ void nsbeos_window_update_back_forward(struct beos_scaffolding *g)
if (!g->top_view->LockLooper())
return;
- g->back_button->SetEnabled(history_back_available(bw->history));
- g->forward_button->SetEnabled(history_forward_available(bw->history));
+ g->back_button->SetEnabled(browser_window_history_back_available(bw));
+ g->forward_button->SetEnabled(browser_window_history_forward_available(bw));
g->top_view->UnlockLooper();
@@ -1064,7 +1322,7 @@ void nsbeos_throb(void *p)
g->top_view->UnlockLooper();
- schedule(10, nsbeos_throb, p);
+ beos_schedule(100, nsbeos_throb, p);
}
@@ -1094,6 +1352,11 @@ NSBrowserWindow *nsbeos_get_bwindow_for_scaffolding(nsbeos_scaffolding *scaffold
return scaffold->window;
}
+NSBaseView *nsbeos_get_baseview_for_scaffolding(nsbeos_scaffolding *scaffold)
+{
+ return scaffold->top_view;
+}
+
static void recursively_set_menu_items_target(BMenu *menu, BHandler *handler)
{
menu->SetTargetForItems(handler);
@@ -1128,6 +1391,16 @@ void nsbeos_attach_toplevel_view(nsbeos_scaffolding *g, BView *view)
g->top_view->AddChild(g->scroll_view);
+ // for replicants, add a NSResizeKnob to allow resizing
+ if (!g->window) {
+ BRect frame = g->scroll_view->Bounds();
+ frame.left = frame.right - B_V_SCROLL_BAR_WIDTH;
+ frame.top = frame.bottom - B_H_SCROLL_BAR_HEIGHT;
+ NSResizeKnob *knob = new NSResizeKnob(frame, g->top_view);
+ //TODO: set bitmap
+ g->scroll_view->AddChild(knob);
+ }
+
view->MakeFocus();
// resize the horiz scrollbar to make room for the status bar and add it.
@@ -1173,6 +1446,8 @@ void nsbeos_attach_toplevel_view(nsbeos_scaffolding *g, BView *view)
g->url_bar->SetTarget(view);
+ nsbeos_scaffolding_update_colors(g);
+
if (g->window) {
recursively_set_menu_items_target(g->menu_bar, view);
@@ -1221,7 +1496,7 @@ void nsbeos_attach_toplevel_view(nsbeos_scaffolding *g, BView *view)
}
-static BMenuItem *make_menu_item(const char *name, BMessage *message)
+static BMenuItem *make_menu_item(const char *name, BMessage *message, bool enabled=false)
{
BMenuItem *item;
BString label(messages_get(name));
@@ -1271,6 +1546,8 @@ static BMenuItem *make_menu_item(const char *name, BMessage *message)
item = new BMenuItem(label.String(), message, key, mods);
+ item->SetEnabled(enabled);
+
return item;
}
@@ -1455,7 +1732,7 @@ nsbeos_scaffolding *nsbeos_new_scaffolding(struct gui_window *toplevel)
menu->AddItem(item);
message = new BMessage(APPLICATION_QUIT);
- item = make_menu_item("Quit", message);
+ item = make_menu_item("Quit", message, true);
menu->AddItem(item);
// Page menu
@@ -1503,11 +1780,11 @@ nsbeos_scaffolding *nsbeos_new_scaffolding(struct gui_window *toplevel)
menu->AddItem(item);
message = new BMessage(BROWSER_NEW_WINDOW);
- item = make_menu_item("NewWindow", message);
+ item = make_menu_item("NewWindow", message, true);
menu->AddItem(item);
message = new BMessage(BROWSER_VIEW_SOURCE);
- item = make_menu_item("ViewSrc", message);
+ item = make_menu_item("ViewSrc", message, true);
menu->AddItem(item);
// Object menu
@@ -1534,15 +1811,15 @@ nsbeos_scaffolding *nsbeos_new_scaffolding(struct gui_window *toplevel)
g->menu_bar->AddItem(menu);
message = new BMessage(BROWSER_NAVIGATE_HOME);
- item = make_menu_item("Home", message);
+ item = make_menu_item("Home", message, true);
menu->AddItem(item);
message = new BMessage(BROWSER_NAVIGATE_BACK);
- item = make_menu_item("Back", message);
+ item = make_menu_item("Back", message, true);
menu->AddItem(item);
message = new BMessage(BROWSER_NAVIGATE_FORWARD);
- item = make_menu_item("Forward", message);
+ item = make_menu_item("Forward", message, true);
menu->AddItem(item);
message = new BMessage(BROWSER_NAVIGATE_UP);
@@ -1550,11 +1827,11 @@ nsbeos_scaffolding *nsbeos_new_scaffolding(struct gui_window *toplevel)
menu->AddItem(item);
message = new BMessage(BROWSER_NAVIGATE_RELOAD);
- item = make_menu_item("Reload", message);
+ item = make_menu_item("Reload", message, true);
menu->AddItem(item);
message = new BMessage(BROWSER_NAVIGATE_STOP);
- item = make_menu_item("Stop", message);
+ item = make_menu_item("Stop", message, true);
menu->AddItem(item);
// View menu
@@ -1800,9 +2077,12 @@ nsbeos_scaffolding *nsbeos_new_scaffolding(struct gui_window *toplevel)
rect.InsetBySelf(5, 5);
message = new BMessage('urle');
message->AddPointer("scaffolding", g);
- g->url_bar = new BTextControl(rect, "url_bar", "url", "", message,
+ g->url_bar = new NSIconTextControl(rect, "url_bar", "", "", message,
B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP);
- g->url_bar->SetDivider(g->url_bar->StringWidth("url "));
+ g->url_bar->SetDivider(0);
+ rect = g->url_bar->TextView()->TextRect();
+ rect.left += 16;
+ g->url_bar->TextView()->SetTextRect(rect);
g->tool_bar->AddChild(g->url_bar);
@@ -1910,7 +2190,7 @@ void gui_window_start_throbber(struct gui_window* _g)
nsbeos_window_update_back_forward(g);
- schedule(10, nsbeos_throb, g);
+ beos_schedule(100, nsbeos_throb, g);
}
void gui_window_stop_throbber(struct gui_window* _g)
@@ -1919,7 +2199,7 @@ void gui_window_stop_throbber(struct gui_window* _g)
nsbeos_window_update_back_forward(g);
- schedule_remove(nsbeos_throb, g);
+ beos_schedule(-1, nsbeos_throb, g);
if (!g->top_view->LockLooper())
return;
@@ -1936,17 +2216,25 @@ void gui_window_stop_throbber(struct gui_window* _g)
/**
* add retrieved favicon to the gui
*/
-void gui_window_set_icon(struct gui_window *g, hlcache_handle *icon)
+void gui_window_set_icon(struct gui_window *_g, hlcache_handle *icon)
{
-}
+ BBitmap *bitmap = NULL;
+ struct bitmap *bmp_icon;
-/**
-* set gui display of a retrieved favicon representing the search provider
-* \param ico may be NULL for local calls; then access current cache from
-* search_web_ico()
-*/
-void gui_window_set_search_ico(hlcache_handle *ico)
-{
+ bmp_icon = (icon != NULL) ? content_get_bitmap(icon) : NULL;
+
+ if (bmp_icon) {
+ bitmap = nsbeos_bitmap_get_primary(bmp_icon);
+ }
+
+ struct beos_scaffolding *g = nsbeos_get_scaffold(_g);
+
+ if (!g->top_view->LockLooper())
+ return;
+
+ g->url_bar->SetBitmap(bitmap);
+
+ g->top_view->UnlockLooper();
}
diff --git a/beos/scaffolding.h b/beos/scaffolding.h
index 7b7080322..78ba14222 100644
--- a/beos/scaffolding.h
+++ b/beos/scaffolding.h
@@ -25,7 +25,6 @@
#include <NetPositive.h>
extern "C" {
-#include "desktop/gui.h"
#include "desktop/plotters.h"
}
@@ -173,6 +172,7 @@ typedef enum {
/* misc actions */
CHOICES_SHOW,
+ ABOUT_BUTTON,
APPLICATION_QUIT,
} menu_action;
@@ -181,6 +181,8 @@ NSBrowserWindow *nsbeos_find_last_window(void);
NSBrowserWindow *nsbeos_get_bwindow_for_scaffolding(nsbeos_scaffolding *scaffold);
+NSBaseView *nsbeos_get_baseview_for_scaffolding(nsbeos_scaffolding *scaffold);
+
nsbeos_scaffolding *nsbeos_new_scaffolding(struct gui_window *toplevel);
bool nsbeos_scaffolding_is_busy(nsbeos_scaffolding *scaffold);
@@ -197,5 +199,11 @@ void nsbeos_scaffolding_destroy(nsbeos_scaffolding *scaffold);
void nsbeos_scaffolding_popup_menu(nsbeos_scaffolding *g, BPoint where);
+void gui_window_set_title(struct gui_window *_g, const char *title);
+void gui_window_set_url(struct gui_window *_g, const char *url);
+void gui_window_set_icon(struct gui_window *_g, hlcache_handle *icon);
+void gui_window_set_status(struct gui_window *_g, const char *text);
+void gui_window_start_throbber(struct gui_window* _g);
+void gui_window_stop_throbber(struct gui_window* _g);
#endif /* NETSURF_BEOS_SCAFFOLDING_H */
diff --git a/beos/schedule.cpp b/beos/schedule.cpp
index db0992e63..bcfb9632d 100644
--- a/beos/schedule.cpp
+++ b/beos/schedule.cpp
@@ -23,7 +23,9 @@
#include <List.h>
extern "C" {
-#include "utils/schedule.h"
+#include "utils/errors.h"
+#include "beos/schedule.h"
+#include "content/content.h"
#include "desktop/browser.h"
#ifdef DEBUG_BEOS_SCHEDULE
@@ -65,7 +67,7 @@ nsbeos_schedule_kill_callback(void *_target, void *_match)
return false;
}
-void
+static void
schedule_remove(void (*callback)(void *p), void *p)
{
LOG(("schedule_remove() for %p(%p)", cb->callback, cb->context));
@@ -75,22 +77,26 @@ schedule_remove(void (*callback)(void *p), void *p)
cb_match.callback = callback;
cb_match.context = p;
-
callbacks->DoForEach(nsbeos_schedule_kill_callback, &cb_match);
}
-void
-schedule(int t, void (*callback)(void *p), void *p)
+nserror beos_schedule(int t, void (*callback)(void *p), void *p)
{
- LOG(("schedule(%d, %p, %p)", t, cb->callback, cb->context));
- if (callbacks == NULL)
+ LOG(("t:%d cb:%p p:%p", t, cb->callback, cb->context));
+
+ if (callbacks == NULL) {
callbacks = new BList;
+ }
- bigtime_t timeout = system_time() + t * 10 * 1000LL;
- const int msec_timeout = t * 10;
- _nsbeos_callback_t *cb = (_nsbeos_callback_t *)malloc(sizeof(_nsbeos_callback_t));
/* Kill any pending schedule of this kind. */
schedule_remove(callback, p);
+
+ if (t < 0) {
+ return NSERROR_OK;
+ }
+
+ bigtime_t timeout = system_time() + t * 1000LL;
+ _nsbeos_callback_t *cb = (_nsbeos_callback_t *)malloc(sizeof(_nsbeos_callback_t));
cb->callback = callback;
cb->context = p;
cb->callback_killed = cb->callback_fired = false;
@@ -99,6 +105,8 @@ schedule(int t, void (*callback)(void *p), void *p)
earliest_callback_timeout = timeout;
}
callbacks->AddItem(cb);
+
+ return NSERROR_OK;
}
bool
diff --git a/beos/schedule.h b/beos/schedule.h
index 02205baf4..18f1efd4d 100644
--- a/beos/schedule.h
+++ b/beos/schedule.h
@@ -19,8 +19,11 @@
#ifndef NETSURF_BEOS_CALLBACK_H
#define NETSURF_BEOS_CALLBACK_H 1
-typedef void (*beos_callback)(void *p);
-
extern bigtime_t earliest_callback_timeout;
+extern "C" nserror beos_schedule(int t, void (*callback)(void *p), void *p);
+
+extern "C" bool schedule_run(void);
+
+
#endif /* NETSURF_BEOS_CALLBACK_H */
diff --git a/beos/window.cpp b/beos/window.cpp
index 5c5df96b3..c00a45f4c 100644
--- a/beos/window.cpp
+++ b/beos/window.cpp
@@ -21,11 +21,13 @@
#define __STDBOOL_H__ 1
#include <assert.h>
extern "C" {
+#include "content/content.h"
#include "content/urldb.h"
#include "css/utils.h"
#include "desktop/browser_private.h"
#include "desktop/mouse.h"
#include "utils/nsoption.h"
+#include "desktop/netsurf.h"
#include "desktop/textinput.h"
#include "render/font.h"
#include "utils/log.h"
@@ -80,7 +82,7 @@ struct gui_window {
// those are the last queued event of their kind,
// we can safely drop others and avoid wasting cpu.
// number of pending resizes
- vint32 pending_resizes;
+ int32 pending_resizes;
// accumulated rects of pending redraws
//volatile BMessage *lastRedraw;
// UNUSED YET
@@ -335,8 +337,9 @@ float nsbeos_get_scale_for_gui(struct gui_window *g)
}
/* Create a gui_window */
-struct gui_window *gui_create_browser_window(struct browser_window *bw,
- struct browser_window *clone, bool new_tab)
+static struct gui_window *gui_window_create(struct browser_window *bw,
+ struct gui_window *existing,
+ gui_window_create_flags flags)
{
struct gui_window *g; /**< what we're creating to return */
@@ -351,8 +354,8 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
g->bw = bw;
g->mouse.state = 0;
g->current_pointer = GUI_POINTER_DEFAULT;
- if (clone != NULL)
- bw->scale = clone->scale;
+ if (existing != NULL)
+ bw->scale = existing->bw->scale;
else
bw->scale = (float) nsoption_int(scale) / 100;
@@ -405,12 +408,6 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
}
-void gui_window_scroll_visible(struct gui_window *g, int x0, int y0,
- int x1, int y1)
-{
- gui_window_set_scroll(g, x0, y0);
-}
-
void nsbeos_dispatch_event(BMessage *message)
{
struct gui_window *gui = NULL;
@@ -463,11 +460,9 @@ void nsbeos_dispatch_event(BMessage *message)
break;
case B_ABOUT_REQUESTED:
{
+ if (gui == NULL)
+ gui = window_list;
nsbeos_about(gui);
- /* XXX: doesn't work yet! bug in rsrc:/
- BString url("rsrc:/about.en.html,text/html");
- browser_window_create(url.String(), NULL, NULL, true, false);
- */
break;
}
case _UPDATE_:
@@ -650,8 +645,7 @@ void nsbeos_dispatch_event(BMessage *message)
case B_MOUSE_WHEEL_CHANGED:
break;
case B_UI_SETTINGS_CHANGED:
- //FIXME:
- //nsbeos_update_system_ui_colors();
+ nsbeos_update_system_ui_colors();
break;
case 'nsLO': // login
{
@@ -890,9 +884,7 @@ void nsbeos_window_resize_event(BView *view, gui_window *g, BMessage *event)
width++;
height++;
-
- g->bw->reformat_pending = true;
- browser_reformat_pending = true;
+ browser_window_schedule_reformat(g->bw);
return;
}
@@ -908,57 +900,46 @@ void nsbeos_window_moved_event(BView *view, gui_window *g, BMessage *event)
//view->Invalidate(view->Bounds());
view->UnlockLooper();
- //g->bw->reformat_pending = true;
- //browser_reformat_pending = true;
-
-
return;
}
void nsbeos_reflow_all_windows(void)
{
- for (struct gui_window *g = window_list; g; g = g->next)
- g->bw->reformat_pending = true;
-
- browser_reformat_pending = true;
+ for (struct gui_window *g = window_list; g; g = g->next) {
+ browser_window_schedule_reformat(g->bw);
+ }
}
+
/**
- * Process pending reformats
+ * callback from core to reformat a window.
*/
-
-void nsbeos_window_process_reformats(void)
+static void beos_window_reformat(struct gui_window *g)
{
- struct gui_window *g;
-
- browser_reformat_pending = false;
- for (g = window_list; g; g = g->next) {
- NSBrowserFrameView *view = g->view;
- if (!g->bw->reformat_pending)
- continue;
- if (!view || !view->LockLooper())
- continue;
- g->bw->reformat_pending = false;
- BRect bounds = view->Bounds();
- view->UnlockLooper();
+ if (g == NULL) {
+ return;
+ }
+
+ NSBrowserFrameView *view = g->view;
+ if (view && view->LockLooper()) {
+ BRect bounds = view->Bounds();
+ view->UnlockLooper();
#warning XXX why - 1 & - 2 !???
- browser_window_reformat(g->bw,
- false,
- bounds.Width() + 1 /* - 2*/,
- bounds.Height() + 1);
- }
-
+ browser_window_reformat(g->bw,
+ false,
+ bounds.Width() + 1 /* - 2*/,
+ bounds.Height() + 1);
+ }
}
-
void nsbeos_window_destroy_browser(struct gui_window *g)
{
browser_window_destroy(g->bw);
}
-void gui_window_destroy(struct gui_window *g)
+static void gui_window_destroy(struct gui_window *g)
{
if (!g)
return;
@@ -1021,7 +1002,7 @@ void nsbeos_redraw_caret(struct gui_window *g)
g->view->UnlockLooper();
}
-void gui_window_redraw_window(struct gui_window *g)
+static void gui_window_redraw_window(struct gui_window *g)
{
if (g->view == NULL)
return;
@@ -1036,7 +1017,7 @@ void gui_window_redraw_window(struct gui_window *g)
g->view->UnlockLooper();
}
-void gui_window_update_box(struct gui_window *g, const struct rect *rect)
+static void gui_window_update_box(struct gui_window *g, const struct rect *rect)
{
hlcache_handle *c = g->bw->current_content;
@@ -1058,7 +1039,7 @@ void gui_window_update_box(struct gui_window *g, const struct rect *rect)
g->view->UnlockLooper();
}
-bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
+static bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
{
//CALLED();
if (g->view == NULL)
@@ -1076,7 +1057,7 @@ bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
return true;
}
-void gui_window_set_scroll(struct gui_window *g, int sx, int sy)
+static void gui_window_set_scroll(struct gui_window *g, int sx, int sy)
{
//CALLED();
if (g->view == NULL)
@@ -1094,7 +1075,7 @@ void gui_window_set_scroll(struct gui_window *g, int sx, int sy)
}
-void gui_window_update_extent(struct gui_window *g)
+static void gui_window_update_extent(struct gui_window *g)
{
//CALLED();
if (!g->bw->current_content)
@@ -1176,7 +1157,7 @@ const uint8 kWatch2CursorBits[] = {
};
-void gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape)
+static void gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape)
{
BCursor *cursor = NULL;
bool allocated = false;
@@ -1216,12 +1197,7 @@ void gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape)
delete cursor;
}
-void gui_window_hide_pointer(struct gui_window *g)
-{
- //XXX no BView::HideCursor... use empty one
-}
-
-void gui_window_place_caret(struct gui_window *g, int x, int y, int height,
+static void gui_window_place_caret(struct gui_window *g, int x, int y, int height,
const struct rect *clip)
{
//CALLED();
@@ -1242,7 +1218,7 @@ void gui_window_place_caret(struct gui_window *g, int x, int y, int height,
g->view->UnlockLooper();
}
-void gui_window_remove_caret(struct gui_window *g)
+static void gui_window_remove_caret(struct gui_window *g)
{
int oh = g->careth;
@@ -1264,7 +1240,7 @@ void gui_window_remove_caret(struct gui_window *g)
g->view->UnlockLooper();
}
-void gui_window_new_content(struct gui_window *g)
+static void gui_window_new_content(struct gui_window *g)
{
if (!g->toplevel)
return;
@@ -1280,29 +1256,7 @@ void gui_window_new_content(struct gui_window *g)
g->view->UnlockLooper();
}
-bool gui_window_scroll_start(struct gui_window *g)
-{
- return true;
-}
-
-bool gui_window_drag_start(struct gui_window *g, gui_drag_type type,
- const struct rect *rect)
-{
- return true;
-}
-
-void gui_drag_save_object(gui_save_type type, hlcache_handle *c,
- struct gui_window *g)
-{
-
-}
-
-void gui_drag_save_selection(struct gui_window *g, const char *selection)
-{
-
-}
-
-void gui_start_selection(struct gui_window *g)
+static void gui_start_selection(struct gui_window *g)
{
if (!g->view->LockLooper())
return;
@@ -1312,10 +1266,6 @@ void gui_start_selection(struct gui_window *g)
g->view->UnlockLooper();
}
-void gui_clear_selection(struct gui_window *g)
-{
-}
-
void gui_get_clipboard(char **buffer, size_t *length)
{
BMessage *clip;
@@ -1370,7 +1320,7 @@ void gui_set_clipboard(const char *buffer, size_t length,
}
}
-void gui_window_get_dimensions(struct gui_window *g, int *width, int *height,
+static void gui_window_get_dimensions(struct gui_window *g, int *width, int *height,
bool scaled)
{
if (g->view && g->view->LockLooper()) {
@@ -1385,3 +1335,36 @@ void gui_window_get_dimensions(struct gui_window *g, int *width, int *height,
}
}
+static struct gui_window_table window_table = {
+ gui_window_create,
+ gui_window_destroy,
+ gui_window_redraw_window,
+ gui_window_update_box,
+ gui_window_get_scroll,
+ gui_window_set_scroll,
+ gui_window_get_dimensions,
+ gui_window_update_extent,
+ beos_window_reformat,
+
+ /* from scaffold */
+ gui_window_set_title,
+ gui_window_set_url,
+ gui_window_set_icon,
+ gui_window_set_status,
+ gui_window_set_pointer,
+ gui_window_place_caret,
+ gui_window_remove_caret,
+ gui_window_start_throbber,
+ gui_window_stop_throbber,
+ NULL, //drag_start
+ NULL, //save_link
+ NULL, //scroll_visible
+ NULL, //scroll_start
+ gui_window_new_content,
+ NULL, //file_gadget_open
+ NULL, //drag_save_object
+ NULL, //drag_save_selection
+ gui_start_selection
+};
+
+struct gui_window_table *beos_window_table = &window_table;
diff --git a/beos/window.h b/beos/window.h
index fc8a4f832..af814d817 100644
--- a/beos/window.h
+++ b/beos/window.h
@@ -20,11 +20,14 @@
#define NETSURF_BEOS_WINDOW_H 1
extern "C" {
+#include "content/content.h"
#include "desktop/gui.h"
#include "desktop/browser.h"
}
#include "beos/scaffolding.h"
+extern struct gui_window_table *beos_window_table;
+
class NSBrowserFrameView : public BView {
public:
NSBrowserFrameView(BRect frame, struct gui_window *gui);
@@ -48,9 +51,7 @@ private:
void nsbeos_dispatch_event(BMessage *message);
-
void nsbeos_reflow_all_windows(void);
-void nsbeos_window_process_reformats(void);
nsbeos_scaffolding *nsbeos_get_scaffold(struct gui_window *g);
struct browser_window *nsbeos_get_browser_for_gui(struct gui_window *g);
@@ -61,4 +62,7 @@ void nsbeos_window_destroy_browser(struct gui_window *g);
struct browser_window *nsbeos_get_browser_window(struct gui_window *g);
+void gui_get_clipboard(char **buffer, size_t *length);
+void gui_set_clipboard(const char *buffer, size_t length, nsclipboard_styles styles[], int n_styles);
+
#endif /* NETSURF_BEOS_WINDOW_H */
diff --git a/cocoa/BookmarksController.m b/cocoa/BookmarksController.m
index 2f8d9d839..64c2ef37a 100644
--- a/cocoa/BookmarksController.m
+++ b/cocoa/BookmarksController.m
@@ -27,6 +27,8 @@
#import "desktop/hotlist.h"
#import "desktop/tree.h"
#import "utils/messages.h"
+#import "utils/utils.h"
+#import "content/hlcache.h"
@interface BookmarksController ()
- (void) noteAppWillTerminate: (NSNotification *) note;
@@ -140,14 +142,12 @@ static const char *cocoa_hotlist_path( void )
error = browser_window_navigate([tab browser],
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
} else {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
diff --git a/cocoa/BrowserView.m b/cocoa/BrowserView.m
index ca5808c90..2a3382c8c 100644
--- a/cocoa/BrowserView.m
+++ b/cocoa/BrowserView.m
@@ -24,11 +24,11 @@
#import "cocoa/BrowserWindowController.h"
#import "desktop/browser_private.h"
-#import "desktop/local_history.h"
#import "desktop/plotters.h"
#import "desktop/textinput.h"
#import "utils/nsoption.h"
#import "utils/messages.h"
+#import "content/hlcache.h"
@interface BrowserView ()
@@ -38,7 +38,6 @@
- (void) scrollVertical: (CGFloat) amount;
- (CGFloat) pageScroll;
-+ (void)reformatTimerFired: (NSTimer *) timer;
- (void) reformat;
- (void) popUpContextMenuForEvent: (NSEvent *) event;
@@ -60,8 +59,6 @@
static const CGFloat CaretWidth = 1.0;
static const NSTimeInterval CaretBlinkTime = 0.8;
-static NSMutableArray *cocoa_reformat_pending = nil;
-
- initWithFrame: (NSRect) frame;
{
@@ -438,13 +435,7 @@ static browser_mouse_state cocoa_mouse_flags_for_event( NSEvent *evt )
- (void) adjustFrame;
{
- browser->reformat_pending = true;
- browser_reformat_pending = true;
-
- if (cocoa_reformat_pending == nil) {
- cocoa_reformat_pending = [[NSMutableArray alloc] init];
- }
- [cocoa_reformat_pending addObject: self];
+ browser_window_schedule_reformat(browser);
[super adjustFrame];
}
@@ -492,24 +483,6 @@ static browser_mouse_state cocoa_mouse_flags_for_event( NSEvent *evt )
browser_window_reformat( browser, false, cocoa_pt_to_px( NSWidth( size ) ), cocoa_pt_to_px( NSHeight( size ) ) );
}
-+ (void)reformatTimerFired: (NSTimer *) timer;
-{
- if (browser_reformat_pending) {
- [cocoa_reformat_pending makeObjectsPerformSelector: @selector( reformat )];
- [cocoa_reformat_pending removeAllObjects];
- browser_reformat_pending = false;
- }
-}
-
-+ (void) initialize;
-{
- NSTimer *timer = [[NSTimer alloc] initWithFireDate: nil interval: 0.02
- target: self selector: @selector(reformatTimerFired:)
- userInfo: nil repeats: YES];
- [[NSRunLoop currentRunLoop] addTimer: timer forMode: NSRunLoopCommonModes];
- [timer release];
-}
-
- (void) popUpContextMenuForEvent: (NSEvent *) event;
{
if (content_get_type( browser->current_content ) != CONTENT_HTML) return;
@@ -580,9 +553,9 @@ static browser_mouse_state cocoa_mouse_flags_for_event( NSEvent *evt )
error = nsurl_create([[sender representedObject] UTF8String], &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_TAB,
+ error = browser_window_create(BW_CREATE_HISTORY |
+ BW_CREATE_TAB |
+ BW_CREATE_CLONE,
url,
NULL,
browser,
@@ -601,8 +574,8 @@ static browser_mouse_state cocoa_mouse_flags_for_event( NSEvent *evt )
error = nsurl_create([[sender representedObject] UTF8String], &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY |
+ BW_CREATE_CLONE,
url,
NULL,
browser,
@@ -622,8 +595,7 @@ static browser_mouse_state cocoa_mouse_flags_for_event( NSEvent *evt )
browser_window_navigate(browser,
url,
NULL,
- BROWSER_WINDOW_DOWNLOAD |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_DOWNLOAD,
NULL,
NULL,
NULL);
@@ -687,8 +659,7 @@ static browser_mouse_state cocoa_mouse_flags_for_event( NSEvent *evt )
browser_window_navigate(browser,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_DOWNLOAD,
NULL,
NULL,
NULL);
diff --git a/cocoa/BrowserViewController.m b/cocoa/BrowserViewController.m
index 77ee57bd1..f1b25d9d0 100644
--- a/cocoa/BrowserViewController.m
+++ b/cocoa/BrowserViewController.m
@@ -19,16 +19,19 @@
#import "cocoa/BrowserViewController.h"
#import "cocoa/BrowserView.h"
#import "cocoa/BrowserWindowController.h"
+#import "cocoa/fetch.h"
+#import "desktop/browser_history.h"
#import "desktop/browser_private.h"
-#import "desktop/local_history.h"
#import "desktop/textinput.h"
#import "utils/nsoption.h"
#import "utils/corestrings.h"
#import "utils/filename.h"
+#import "utils/file.h"
#import "utils/messages.h"
#import "utils/url.h"
+#import "content/hlcache.h"
@implementation BrowserViewController
@@ -77,8 +80,7 @@
browser_window_navigate(browser,
urlns,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -115,16 +117,16 @@
- (IBAction) goBack: (id) sender;
{
- if (browser && history_back_available( browser->history )) {
- history_back(browser, browser->history);
+ if (browser && browser_window_history_back_available( browser )) {
+ browser_window_history_back(browser, false);
[self updateBackForward];
}
}
- (IBAction) goForward: (id) sender;
{
- if (browser && history_forward_available( browser->history )) {
- history_forward(browser, browser->history);
+ if (browser && browser_window_history_forward_available( browser )) {
+ browser_window_history_forward(browser, false);
[self updateBackForward];
}
}
@@ -139,8 +141,7 @@
error = browser_window_navigate(browser,
urlns,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -166,7 +167,7 @@
struct hlcache_handle *content;
size_t size;
const char *source;
- const char *path = NULL;
+ char *path = NULL;
if (browser == NULL)
return;
@@ -178,14 +179,7 @@
return;
/* try to load local files directly. */
- lwc_string *scheme = nsurl_get_component(hlcache_handle_get_url(content), NSURL_SCHEME);
- if (scheme == NULL)
- return;
-
- bool match;
- if (lwc_string_isequal(scheme, corestring_lwc_file, &match) == lwc_error_ok && match == true)
- path = url_to_path(nsurl_access(hlcache_handle_get_url(content)));
- lwc_string_unref(scheme);
+ netsurf_nsurl_to_path(hlcache_handle_get_url(content), &path);
if (path == NULL) {
/* We cannot release the requested filename until after it
@@ -272,8 +266,8 @@ static inline bool compare_float( float a, float b )
- (void) updateBackForward;
{
[browserView updateHistory];
- [self setCanGoBack: browser != NULL && history_back_available( browser->history )];
- [self setCanGoForward: browser != NULL && history_forward_available( browser->history )];
+ [self setCanGoBack: browser != NULL && browser_window_history_back_available( browser )];
+ [self setCanGoForward: browser != NULL && browser_window_history_forward_available( browser )];
}
- (void) contentUpdated;
@@ -287,7 +281,7 @@ struct history_add_menu_item_data {
id target;
};
-static bool history_add_menu_item_cb( const struct history *history, int x0, int y0, int x1, int y1,
+static bool history_add_menu_item_cb( const struct browser_window *bw, int x0, int y0, int x1, int y1,
const struct history_entry *page, void *user_data )
{
struct history_add_menu_item_data *data = user_data;
@@ -305,7 +299,7 @@ static bool history_add_menu_item_cb( const struct history *history, int x0, int
++data->index;
[item setTarget: data->target];
- [item setTitle: [NSString stringWithUTF8String: history_entry_get_title( page )]];
+ [item setTitle: [NSString stringWithUTF8String: browser_window_history_entry_get_title( page )]];
[item setRepresentedObject: [NSValue valueWithPointer: page]];
return true;
@@ -314,7 +308,7 @@ static bool history_add_menu_item_cb( const struct history *history, int x0, int
- (IBAction) historyItemSelected: (id) sender;
{
struct history_entry *entry = [[sender representedObject] pointerValue];
- history_go( browser, browser->history, entry, false );
+ browser_window_history_go( browser, entry, false );
[self updateBackForward];
}
@@ -325,7 +319,7 @@ static bool history_add_menu_item_cb( const struct history *history, int x0, int
.menu = menu,
.target = self
};
- history_enumerate_back( browser->history, history_add_menu_item_cb, &data );
+ browser_window_history_enumerate_back( browser, history_add_menu_item_cb, &data );
while (data.index < [menu numberOfItems]) [menu removeItemAtIndex: data.index];
}
@@ -336,7 +330,7 @@ static bool history_add_menu_item_cb( const struct history *history, int x0, int
.menu = menu,
.target = self
};
- history_enumerate_forward( browser->history, history_add_menu_item_cb, &data );
+ browser_window_history_enumerate_forward( browser, history_add_menu_item_cb, &data );
while (data.index < [menu numberOfItems]) [menu removeItemAtIndex: data.index];
}
diff --git a/cocoa/BrowserWindowController.m b/cocoa/BrowserWindowController.m
index 2edb9a1db..cfc45cd7c 100644
--- a/cocoa/BrowserWindowController.m
+++ b/cocoa/BrowserWindowController.m
@@ -28,6 +28,8 @@
#import "desktop/browser.h"
#import "utils/nsoption.h"
#import "utils/messages.h"
+#import "utils/utils.h"
+#import "utils/nsurl.h"
@interface BrowserWindowController ()
@@ -160,9 +162,8 @@
error = nsurl_create(NETSURF_HOMEPAGE, &url);
}
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_TAB,
+ error = browser_window_create(BW_CREATE_HISTORY |
+ BW_CREATE_TAB,
url,
NULL,
[activeBrowser browser],
diff --git a/cocoa/DownloadWindowController.h b/cocoa/DownloadWindowController.h
index b93c24c65..798ebd1b6 100644
--- a/cocoa/DownloadWindowController.h
+++ b/cocoa/DownloadWindowController.h
@@ -18,6 +18,7 @@
#import <Cocoa/Cocoa.h>
+struct gui_download_table *cocoa_download_table;
@interface DownloadWindowController : NSWindowController {
struct download_context *context;
@@ -50,3 +51,4 @@
- (void) abort;
@end
+
diff --git a/cocoa/DownloadWindowController.m b/cocoa/DownloadWindowController.m
index 82be52e51..e7b78a4ec 100644
--- a/cocoa/DownloadWindowController.m
+++ b/cocoa/DownloadWindowController.m
@@ -53,7 +53,7 @@ static void cocoa_register_download( DownloadWindowController *download );
context = ctx;
totalSize = download_context_get_total_length( context );
- [self setURL: [NSURL URLWithString: [NSString stringWithUTF8String: download_context_get_url( context )]]];
+ [self setURL: [NSURL URLWithString: [NSString stringWithUTF8String: nsurl_access(download_context_get_url( context ))]]];
[self setMIMEType: [NSString stringWithUTF8String: download_context_get_mime_type( context )]];
[self setStartDate: [NSDate date]];
@@ -327,7 +327,7 @@ static NSString *cocoa_time_string( unsigned seconds )
#pragma mark -
#pragma mark NetSurf interface functions
-struct gui_download_window *gui_download_window_create(download_context *ctx,
+static struct gui_download_window *gui_download_window_create(download_context *ctx,
struct gui_window *parent)
{
DownloadWindowController * const window = [[DownloadWindowController alloc] initWithContext: ctx];
@@ -338,21 +338,21 @@ struct gui_download_window *gui_download_window_create(download_context *ctx,
return (struct gui_download_window *)window;
}
-nserror gui_download_window_data(struct gui_download_window *dw,
+static nserror gui_download_window_data(struct gui_download_window *dw,
const char *data, unsigned int size)
{
DownloadWindowController * const window = (DownloadWindowController *)dw;
return [window receivedData: [NSData dataWithBytes: data length: size]] ? NSERROR_OK : NSERROR_SAVE_FAILED;
}
-void gui_download_window_error(struct gui_download_window *dw,
+static void gui_download_window_error(struct gui_download_window *dw,
const char *error_msg)
{
DownloadWindowController * const window = (DownloadWindowController *)dw;
[window showError: [NSString stringWithUTF8String: error_msg]];
}
-void gui_download_window_done(struct gui_download_window *dw)
+static void gui_download_window_done(struct gui_download_window *dw)
{
DownloadWindowController * const window = (DownloadWindowController *)dw;
[window downloadDone];
@@ -376,3 +376,12 @@ static void cocoa_unregister_download( DownloadWindowController *download )
[cocoa_all_downloads removeObject: download];
}
+
+static struct gui_download_table download_table = {
+ .create = gui_download_window_create,
+ .data = gui_download_window_data,
+ .error = gui_download_window_error,
+ .done = gui_download_window_done,
+};
+
+struct gui_download_table *cocoa_download_table = &download_table;
diff --git a/cocoa/FormSelectMenu.m b/cocoa/FormSelectMenu.m
index 3aaeae524..d1548b244 100644
--- a/cocoa/FormSelectMenu.m
+++ b/cocoa/FormSelectMenu.m
@@ -19,7 +19,7 @@
#import "cocoa/FormSelectMenu.h"
#import "cocoa/coordinates.h"
-#import "desktop/browser_private.h"
+#import "desktop/browser.h"
#import "render/form.h"
@interface FormSelectMenu ()
@@ -87,7 +87,7 @@
- (void) itemSelected: (id) sender;
{
- form_select_process_selection( browser->current_content, control, [sender tag] );
+ form_select_process_selection( control, [sender tag] );
}
- (void) menuDidClose: (NSMenu *) sender;
diff --git a/cocoa/HistoryView.m b/cocoa/HistoryView.m
index 45f7facbf..7b192336e 100644
--- a/cocoa/HistoryView.m
+++ b/cocoa/HistoryView.m
@@ -23,8 +23,7 @@
#import "cocoa/LocalHistoryController.h"
#import "cocoa/BrowserView.h"
-#import "desktop/browser_private.h"
-#import "desktop/local_history.h"
+#import "desktop/browser_history.h"
#import "desktop/plotters.h"
@implementation HistoryView
@@ -41,7 +40,7 @@
- (NSSize) size;
{
int width, height;
- history_size( browser->history, &width, &height );
+ browser_window_history_size( browser, &width, &height );
return cocoa_size( width, height );
}
@@ -65,14 +64,14 @@
cocoa_set_clip( rect );
- history_redraw( browser->history, &ctx );
+ browser_window_history_redraw( browser, &ctx );
}
- (void) mouseUp: (NSEvent *)theEvent;
{
const NSPoint location = [self convertPoint: [theEvent locationInWindow] fromView: nil];
const bool newWindow = [theEvent modifierFlags] & NSCommandKeyMask;
- if (history_click( browser, browser->history,
+ if (browser_window_history_click( browser,
cocoa_pt_to_px( location.x ), cocoa_pt_to_px( location.y ),
newWindow )) {
[browserView setHistoryVisible: NO];
@@ -94,7 +93,7 @@
[[NSCursor arrowCursor] set];
}
-static bool cursor_rects_cb( const struct history *history, int x0, int y0, int x1, int y1,
+static bool cursor_rects_cb( const struct browser_window *bw, int x0, int y0, int x1, int y1,
const struct history_entry *page, void *user_data )
{
HistoryView *view = user_data;
@@ -102,8 +101,8 @@ static bool cursor_rects_cb( const struct history *history, int x0, int y0, int
NSRect rect = NSIntersectionRect( [view visibleRect], cocoa_rect( x0, y0, x1, y1 ) );
if (!NSIsEmptyRect( rect )) {
- NSString *toolTip = [NSString stringWithFormat: @"%s\n%s", history_entry_get_title(page),
- history_entry_get_url( page )];
+ NSString *toolTip = [NSString stringWithFormat: @"%s\n%s", browser_window_history_entry_get_title(page),
+ browser_window_history_entry_get_url( page )];
[view addToolTipRect: rect owner: toolTip userData: nil];
NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect: rect
@@ -138,7 +137,7 @@ static bool cursor_rects_cb( const struct history *history, int x0, int y0, int
[self removeTrackingArea: area];
}
- history_enumerate( browser->history, cursor_rects_cb, self );
+ browser_window_history_enumerate( browser, cursor_rects_cb, self );
[super updateTrackingAreas];
}
diff --git a/cocoa/Makefile.defaults b/cocoa/Makefile.defaults
index b2f64ec56..501d17585 100644
--- a/cocoa/Makefile.defaults
+++ b/cocoa/Makefile.defaults
@@ -2,36 +2,35 @@
# Cocoa-specific options
# ----------------------------------------------------------------------------
- # Force using glibc internal iconv implementation instead of external libiconv
- # Valid options: YES, NO
- NETSURF_USE_LIBICONV_PLUG := NO
-
- # Enable NetSurf's use of librosprite for displaying RISC OS Sprites
- # Valid options: YES, NO, AUTO
- NETSURF_USE_ROSPRITE := NO
-
- # Enable NetSurf's use of libwebp for displaying WebPs
- # Valid options: YES, NO
- NETSURF_USE_WEBP := NO
-
- # Enable NetSurf's use of librsvg in conjunction with Cairo to display SVGs
- # Valid options: YES, NO, AUTO
- NETSURF_USE_RSVG := AUTO
-
- # Enable NetSurf's use of libsvgtiny for displaying SVGs
- # Valid options: YES, NO, AUTO
- NETSURF_USE_NSSVG := AUTO
-
- NETSURF_USE_MNG := NO
- NETSURF_USE_BMP := NO
- NETSURF_USE_GIF := NO
- NETSURF_USE_PNG := NO
- NETSURF_USE_JPEG := NO
- NETSURF_USE_IMAGEIO := YES
-
- DEVELOPER_PATH := /Developer
- MACOSX_VERSION := 10.5
- SDK_VERSION := $(MACOSX_VERSION)
-
- # Optimisation levels
- CFLAGS += -O2
+# Force using glibc internal iconv implementation instead of external libiconv
+# Valid options: YES, NO
+NETSURF_USE_LIBICONV_PLUG := NO
+
+# Enable NetSurf's use of librosprite for displaying RISC OS Sprites
+# Valid options: YES, NO, AUTO
+NETSURF_USE_ROSPRITE := NO
+
+# Enable NetSurf's use of libwebp for displaying WebPs
+# Valid options: YES, NO
+NETSURF_USE_WEBP := NO
+
+# Enable NetSurf's use of librsvg in conjunction with Cairo to display SVGs
+# Valid options: YES, NO, AUTO
+NETSURF_USE_RSVG := AUTO
+
+# Enable NetSurf's use of libsvgtiny for displaying SVGs
+# Valid options: YES, NO, AUTO
+NETSURF_USE_NSSVG := AUTO
+
+NETSURF_USE_BMP := NO
+NETSURF_USE_GIF := NO
+NETSURF_USE_PNG := NO
+NETSURF_USE_JPEG := NO
+NETSURF_USE_IMAGEIO := YES
+
+DEVELOPER_PATH := /Developer
+MACOSX_VERSION := 10.5
+SDK_VERSION := $(MACOSX_VERSION)
+
+# Optimisation levels
+CFLAGS += -O2
diff --git a/cocoa/Makefile.target b/cocoa/Makefile.target
index 8bd13c29b..d5b983a98 100644
--- a/cocoa/Makefile.target
+++ b/cocoa/Makefile.target
@@ -2,67 +2,65 @@
# Mac OS X target setup
# ----------------------------------------------------------------------------
- POSTEXES += NetSurf.app
+POSTEXES += NetSurf.app
- LDFLAGS += -L/usr/lib
- LDFLAGS += $(shell $(PKG_CONFIG) --libs libhubbub libcss libdom)
- LDFLAGS += -L/usr/X11/lib
- LDFLAGS += -lm -lcurl -liconv
- LDFLAGS += -lssl -lcrypto
+LDFLAGS += -L/usr/lib
+LDFLAGS += $(shell $(PKG_CONFIG) --libs libhubbub libcss libdom)
+LDFLAGS += -L/usr/X11/lib
+LDFLAGS += -lm -lcurl
+LDFLAGS += -lssl -lcrypto
- CFLAGS += -O $(WARNFLAGS) -Dnscocoa \
- -D_BSD_SOURCE -D_POSIX_C_SOURCE \
- -std=c99 -g -Os
+CFLAGS += -Dnscocoa -D_BSD_SOURCE -D_POSIX_C_SOURCE -std=c99 -g -Os
- CFLAGS += $(shell $(PKG_CONFIG) --cflags libhubbub libcss libdom)
+CFLAGS += $(shell $(PKG_CONFIG) --cflags libhubbub libcss libdom)
- # shut up zconf.h and zlib.h
- #CFLAGS += -D_LARGEFILE64_SOURCE=1
+# shut up zconf.h and zlib.h
+#CFLAGS += -D_LARGEFILE64_SOURCE=1
ifneq ($(WITH_MACPORTS),)
LDFLAGS += -L/opt/local/lib
CFLAGS += -I/opt/local/include
endif
- # for timerisset()
- CFLAGS += -D_DARWIN_C_SOURCE
+# for timerisset()
+CFLAGS += -D_DARWIN_C_SOURCE
- MACOSX_VERSION ?= 10.5
- SDK_VERSION ?= $(MACOSX_VERSION)
- SDK_PATH ?= $(DEVELOPER_PATH)/SDKs/MacOSX$(SDK_VERSION).sdk
- SDK_FLAGS := -isysroot $(SDK_PATH) -mmacosx-version-min=$(MACOSX_VERSION)
- CFLAGS := $(SDK_FLAGS) $(CFLAGS)
- LDFLAGS := $(SDK_FLAGS) -Wl,-syslibroot,$(SDK_PATH) $(LDFLAGS)
- CXXFLAGS := $(SDK_FLAGS) $(CXXFLAGS)
+MACOSX_VERSION ?= 10.5
+SDK_VERSION ?= $(MACOSX_VERSION)
+SDK_PATH ?= $(DEVELOPER_PATH)/SDKs/MacOSX$(SDK_VERSION).sdk
+SDK_FLAGS := -isysroot $(SDK_PATH) -mmacosx-version-min=$(MACOSX_VERSION)
+CFLAGS := $(SDK_FLAGS) $(CFLAGS)
+LDFLAGS := $(SDK_FLAGS) -Wl,-syslibroot,$(SDK_PATH) $(LDFLAGS)
+CXXFLAGS := $(SDK_FLAGS) $(CXXFLAGS)
- CFLAGS += -I/usr/X11/include
- CFLAGS += -include cocoa/Prefix.pch
+CFLAGS += -I/usr/X11/include
+CFLAGS += -include cocoa/Prefix.pch
# VERSION_FULL := $(shell sed -n '/\"/{s/.*"\(.*\)\".*/\1/;p;}' desktop/version.c)
# TODO: this needs fixing properly everywhere
- VERSION_FULL := "3.0 (Dev)"
- VERSION_MAJ := $(shell sed -n '/_major/{s/.* = \([0-9]*\).*/\1/;p;}' desktop/version.c)
- VERSION_MIN := $(shell sed -n '/_minor/{s/.* = \([0-9]*\).*/\1/;p;}' desktop/version.c)
+VERSION_FULL := "3.0 (Dev)"
+VERSION_MAJ := $(shell sed -n '/_major/{s/.* = \([0-9]*\).*/\1/;p;}' desktop/version.c)
+VERSION_MIN := $(shell sed -n '/_minor/{s/.* = \([0-9]*\).*/\1/;p;}' desktop/version.c)
- LDFLAGS += -Wl,-framework,Cocoa -Wl,-framework,Carbon $(NETLDFLAGS)
+LDFLAGS += -Wl,-framework,Cocoa -Wl,-framework,Carbon $(NETLDFLAGS)
- NETSURF_FEATURE_BMP_CFLAGS := -DWITH_BMP
- NETSURF_FEATURE_GIF_CFLAGS := -DWITH_GIF
- NETSURF_FEATURE_PNG_CFLAGS := -DWITH_PNG
- NETSURF_FEATURE_NSSVG_CFLAGS := -DWITH_NS_SVG
+NETSURF_FEATURE_BMP_CFLAGS := -DWITH_BMP
+NETSURF_FEATURE_GIF_CFLAGS := -DWITH_GIF
+NETSURF_FEATURE_PNG_CFLAGS := -DWITH_PNG
+NETSURF_FEATURE_NSSVG_CFLAGS := -DWITH_NS_SVG
- $(eval $(call pkg_config_find_and_add_enabled,BMP,libnsbmp,BMP))
- $(eval $(call pkg_config_find_and_add_enabled,GIF,libnsgif,GIF))
- $(eval $(call pkg_config_find_and_add_enabled,PNG,libpng,PNG))
- $(eval $(call pkg_config_find_and_add_enabled,NSSVG,libsvgtiny,SVG))
- $(eval $(call feature_enabled,IMAGEIO,-DWITH_APPLE_IMAGE,,Apple ImageIO ))
+$(eval $(call pkg_config_find_and_add_enabled,BMP,libnsbmp,BMP))
+$(eval $(call pkg_config_find_and_add_enabled,GIF,libnsgif,GIF))
+$(eval $(call pkg_config_find_and_add_enabled,PNG,libpng,PNG))
+$(eval $(call pkg_config_find_and_add_enabled,NSSVG,libsvgtiny,SVG))
+$(eval $(call feature_enabled,IMAGEIO,-DWITH_APPLE_IMAGE,,Apple ImageIO ))
- ifneq ($(UNIVERSAL),)
+ifneq ($(UNIVERSAL),)
UNIVERSAL_FLAGS := $(foreach arch,$(UNIVERSAL),-arch $(arch) )
CFLAGS += $(UNIVERSAL_FLAGS)
LDFLAGS += $(UNIVERSAL_FLAGS)
CXXFLAGS += $(UNIVERSAL_FLAGS)
- endif
+endif
# ----------------------------------------------------------------------------
# Source file setup
@@ -95,8 +93,6 @@ S_COCOA := \
schedule.m \
selection.m \
thumbnail.m \
- url.m \
- utf8.m \
utils.m \
ArrowBox.m \
ArrowWindow.m \
@@ -242,4 +238,3 @@ clean-package-cocoa:
$(Q)$(RM) NetSurf.dmg
$(VQ)echo " CLEAN: NetSurf.app"
$(Q)$(RM) -r NetSurf.app
-
diff --git a/cocoa/NetSurfAppDelegate.m b/cocoa/NetSurfAppDelegate.m
index 4a66212e8..34605a95c 100644
--- a/cocoa/NetSurfAppDelegate.m
+++ b/cocoa/NetSurfAppDelegate.m
@@ -24,6 +24,8 @@
#import "desktop/browser.h"
#import "utils/nsoption.h"
#import "utils/messages.h"
+#import "utils/utils.h"
+#import "utils/nsurl.h"
@interface NetSurfAppDelegate ()
@@ -50,8 +52,7 @@
}
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -74,8 +75,7 @@
for (NSURL *url in [openPanel URLs]) {
error = nsurl_create([[url absoluteString] UTF8String], &u);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
u,
NULL,
NULL,
@@ -97,8 +97,7 @@
error = nsurl_create([urlAsString UTF8String], &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -181,8 +180,7 @@
error = nsurl_create([[urltxt absoluteString] UTF8String], &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
diff --git a/cocoa/NetsurfApp.m b/cocoa/NetsurfApp.m
index 33e3bfa43..f9cc98885 100644
--- a/cocoa/NetsurfApp.m
+++ b/cocoa/NetsurfApp.m
@@ -20,13 +20,15 @@
#import "cocoa/NetsurfApp.h"
#import "cocoa/gui.h"
#import "cocoa/plotter.h"
+#import "cocoa/DownloadWindowController.h"
+#import "cocoa/SearchWindowController.h"
+#import "cocoa/selection.h"
+#import "cocoa/fetch.h"
#import "desktop/gui.h"
#import "content/urldb.h"
-#import "content/fetch.h"
#import "css/utils.h"
#import "desktop/gui.h"
-#import "desktop/local_history.h"
#import "desktop/mouse.h"
#import "desktop/netsurf.h"
#import "utils/nsoption.h"
@@ -35,7 +37,6 @@
#import "desktop/textinput.h"
#import "desktop/tree.h"
#import "render/html.h"
-#import "utils/url.h"
#import "utils/filename.h"
#import "utils/log.h"
#import "utils/messages.h"
@@ -183,8 +184,21 @@ int main( int argc, char **argv )
{
nsurl *url;
nserror error;
+ struct netsurf_table cocoa_table = {
+ .browser = cocoa_browser_table,
+ .window = cocoa_window_table,
+ .clipboard = cocoa_clipboard_table,
+ .download = cocoa_download_table,
+ .fetch = cocoa_fetch_table,
+ .search = cocoa_search_table,
+ };
cocoa_autorelease();
+
+ error = netsurf_register(&cocoa_table);
+ if (error != NSERROR_OK) {
+ die("NetSurf operation table failed registration");
+ }
const char * const messages = [[[NSBundle mainBundle] pathForResource: @"Messages" ofType: @""] UTF8String];
const char * const options = cocoa_get_options_file();
@@ -203,7 +217,7 @@ int main( int argc, char **argv )
nsoption_commandline(&argc, argv, NULL);
/* common initialisation */
- error = netsurf_init(messages);
+ error = netsurf_init(messages, NULL);
if (error != NSERROR_OK) {
die("NetSurf failed to initialise");
}
@@ -222,8 +236,7 @@ int main( int argc, char **argv )
error = nsurl_create(argv[i], &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
diff --git a/cocoa/PreferencesWindowController.m b/cocoa/PreferencesWindowController.m
index a3abe2908..54e7b91d0 100644
--- a/cocoa/PreferencesWindowController.m
+++ b/cocoa/PreferencesWindowController.m
@@ -25,6 +25,7 @@
#import "desktop/browser_private.h"
#import "content/content.h"
#import "utils/nsoption.h"
+#import "content/hlcache.h"
@implementation PreferencesWindowController
diff --git a/cocoa/SearchWindowController.h b/cocoa/SearchWindowController.h
index a1aac2e3f..896983b30 100644
--- a/cocoa/SearchWindowController.h
+++ b/cocoa/SearchWindowController.h
@@ -49,4 +49,6 @@ typedef enum {
- (void) search: (SearchDirection)direction;
+struct gui_search_table *cocoa_search_table;
+
@end
diff --git a/cocoa/SearchWindowController.m b/cocoa/SearchWindowController.m
index 06147fa1a..e4dfb737f 100644
--- a/cocoa/SearchWindowController.m
+++ b/cocoa/SearchWindowController.m
@@ -20,20 +20,20 @@
#import "cocoa/SearchWindowController.h"
#import "cocoa/BrowserViewController.h"
+#import "desktop/gui.h"
#import "desktop/browser.h"
#import "desktop/search.h"
static void cocoa_search_set_back( bool active, void *p );
static void cocoa_search_set_forward( bool active, void *p );
-static struct gui_search_callbacks cocoa_search_callbacks = {
+static struct gui_search_table search_table = {
.forward_state = cocoa_search_set_forward,
.back_state = cocoa_search_set_back,
- .status = NULL,
- .hourglass = NULL,
- .add_recent = NULL
};
+struct gui_search_table *cocoa_search_table = &search_table;
+
@implementation SearchWindowController
@synthesize caseSensitive;
@@ -76,7 +76,7 @@ static struct gui_search_callbacks cocoa_search_callbacks = {
if (selectAll) flags |= SEARCH_FLAG_SHOWALL;
struct browser_window *bw = [browser browser];
- browser_window_search( bw, &cocoa_search_callbacks, self, flags, [searchString UTF8String] );
+ browser_window_search( bw, self, flags, [searchString UTF8String] );
}
- (IBAction) searchStringDidChange: (id) sender;
diff --git a/cocoa/apple_image.m b/cocoa/apple_image.m
index ab17f8ab4..c6f9df324 100644
--- a/cocoa/apple_image.m
+++ b/cocoa/apple_image.m
@@ -25,7 +25,8 @@
#include "image/bitmap.h"
#include "desktop/plotters.h"
#include "utils/utils.h"
-#include "utils/schedule.h"
+
+#include "cocoa/schedule.h"
typedef struct apple_image_content {
struct content base;
@@ -147,7 +148,7 @@ static void animate_image_cb( void *ptr )
data.redraw.object = &ai->base;
content_broadcast( &ai->base, CONTENT_MSG_REDRAW, data );
- schedule( ai->frameTimes[ai->currentFrame], animate_image_cb, ai );
+ cocoa_schedule(ai->frameTimes[ai->currentFrame], animate_image_cb, ai );
}
/**
@@ -190,10 +191,10 @@ bool apple_image_convert(struct content *c)
ai->frameTimes = calloc( ai->frames , sizeof(int));
for (NSUInteger i = 0; i < frames; i++) {
[image setProperty: NSImageCurrentFrame withValue: [NSNumber numberWithUnsignedInteger: i]];
- ai->frameTimes[i] = 100 * [[image valueForProperty: NSImageCurrentFrameDuration] floatValue];
+ ai->frameTimes[i] = 1000 * [[image valueForProperty: NSImageCurrentFrameDuration] floatValue];
}
[image setProperty: NSImageCurrentFrame withValue: [NSNumber numberWithUnsignedInteger: 0]];
- schedule( ai->frameTimes[0], animate_image_cb, ai );
+ cocoa_schedule( ai->frameTimes[0], animate_image_cb, ai );
}
return true;
@@ -206,7 +207,7 @@ void apple_image_destroy(struct content *c)
[(id)ai_c->bitmap release];
ai_c->bitmap = NULL;
- schedule_remove( animate_image_cb, c );
+ cocoa_schedule(-1, animate_image_cb, c );
}
diff --git a/cocoa/fetch.h b/cocoa/fetch.h
new file mode 100644
index 000000000..1b0991ef5
--- /dev/null
+++ b/cocoa/fetch.h
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2011 Sven Weidauer <sven.weidauer@gmail.com>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+extern struct gui_fetch_table *cocoa_fetch_table;
diff --git a/cocoa/fetch.m b/cocoa/fetch.m
index ff1496246..df424c3e8 100644
--- a/cocoa/fetch.m
+++ b/cocoa/fetch.m
@@ -19,7 +19,10 @@
#import <Cocoa/Cocoa.h>
#import "utils/log.h"
-#import "content/fetch.h"
+#import "utils/nsurl.h"
+#import "desktop/gui.h"
+
+#import "cocoa/fetch.h"
static char cocoafiletype[200];
@@ -40,9 +43,9 @@ static const struct mimemap_s {
};
-const char *fetch_filetype(const char *unix_path)
+static const char *fetch_filetype(const char *unix_path)
{
- NSString *uti;
+ NSString *uti;
NSString *mimeType = nil;
NSError *utiError = nil;
@@ -56,7 +59,7 @@ const char *fetch_filetype(const char *unix_path)
LOG(("uti call failed"));
- strncpy(cocoafiletype, "text/html", sizeof(cocoafiletype));
+ strncpy(cocoafiletype, "text/html", sizeof(cocoafiletype));
return cocoafiletype;
}
@@ -81,19 +84,30 @@ const char *fetch_filetype(const char *unix_path)
eidx++;
}
- strncpy(cocoafiletype,
- cocoamimemap[eidx].mimetype,
+ strncpy(cocoafiletype,
+ cocoamimemap[eidx].mimetype,
sizeof(cocoafiletype));
}
}
LOG(( "\tMIME type for '%s' is '%s'", unix_path, cocoafiletype ));
-
+
return cocoafiletype;
}
-
-char *fetch_mimetype(const char *ro_path)
+static nsurl *gui_get_resource_url(const char *path)
{
- return strdup( fetch_filetype( ro_path ) );
+ nsurl *url = NULL;
+ NSString *nspath = [[NSBundle mainBundle] pathForResource: [NSString stringWithUTF8String: path] ofType: @""];
+ if (nspath == nil) return NULL;
+ nsurl_create([[[NSURL fileURLWithPath: nspath] absoluteString] UTF8String], &url);
+ return url;
}
+
+static struct gui_fetch_table fetch_table = {
+ .filetype = fetch_filetype,
+
+ .get_resource_url = gui_get_resource_url,
+};
+
+struct gui_fetch_table *cocoa_fetch_table = &fetch_table;
diff --git a/cocoa/gui.h b/cocoa/gui.h
index 413727fe6..757140030 100644
--- a/cocoa/gui.h
+++ b/cocoa/gui.h
@@ -18,6 +18,10 @@
#import <Cocoa/Cocoa.h>
+extern struct gui_window_table *cocoa_window_table;
+extern struct gui_clipboard_table *cocoa_clipboard_table;
+extern struct gui_browser_table *cocoa_browser_table;
+
extern NSString * const kCookiesFileOption;
extern NSString * const kURLsFileOption;
extern NSString * const kHotlistFileOption;
diff --git a/cocoa/gui.m b/cocoa/gui.m
index b2ff01dc0..8f08fc7fa 100644
--- a/cocoa/gui.m
+++ b/cocoa/gui.m
@@ -24,16 +24,20 @@
#import "cocoa/BrowserViewController.h"
#import "cocoa/BrowserWindowController.h"
#import "cocoa/FormSelectMenu.h"
+#import "cocoa/fetch.h"
+#import "cocoa/schedule.h"
#import "desktop/gui.h"
#import "desktop/netsurf.h"
#import "desktop/browser_private.h"
#import "utils/nsoption.h"
#import "desktop/textinput.h"
-#import "desktop/401login.h"
#import "utils/utils.h"
+#import "utils/log.h"
#import "image/ico.h"
#import "content/fetchers/resource.h"
+#import "content/hlcache.h"
+#import "content/content.h"
NSString * const kCookiesFileOption = @"CookiesFile";
NSString * const kURLsFileOption = @"URLsFile";
@@ -45,20 +49,11 @@ NSString * const kAlwaysCloseMultipleTabs = @"AlwaysCloseMultipleTabs";
#define UNIMPL() NSLog( @"Function '%s' unimplemented", __func__ )
-nsurl *gui_get_resource_url(const char *path)
-{
- nsurl *url = NULL;
- NSString *nspath = [[NSBundle mainBundle] pathForResource: [NSString stringWithUTF8String: path] ofType: @""];
- if (nspath == nil) return NULL;
- nsurl_create([[[NSURL fileURLWithPath: nspath] absoluteString] UTF8String], &url);
- return url;
-}
-
-void gui_poll(bool active)
+static void gui_poll(bool active)
{
cocoa_autorelease();
- NSEvent *event = [NSApp nextEventMatchingMask: NSAnyEventMask untilDate: active ? nil : [NSDate distantFuture]
+ NSEvent *event = [NSApp nextEventMatchingMask: NSAnyEventMask untilDate: [NSDate distantFuture]
inMode: NSDefaultRunLoopMode dequeue: YES];
if (nil != event) {
@@ -67,28 +62,24 @@ void gui_poll(bool active)
}
}
-void gui_quit(void)
-{
- // nothing to do
-}
-
struct browser_window;
-struct gui_window *gui_create_browser_window(struct browser_window *bw,
- struct browser_window *clone, bool new_tab)
+static struct gui_window *gui_window_create(struct browser_window *bw,
+ struct gui_window *existing,
+ gui_window_create_flags flags)
{
BrowserWindowController *window = nil;
- if (clone != NULL) {
- bw->scale = clone->scale;
- window = [(BrowserViewController *)(clone->window) windowController];
+ if (existing != NULL) {
+ bw->scale = (float) nsoption_int(scale) / 100;
+ window = [(BrowserViewController *)(existing) windowController];
} else {
bw->scale = (float) nsoption_int(scale) / 100;
}
BrowserViewController *result = [[BrowserViewController alloc] initWithBrowser: bw];
- if (!new_tab || nil == window) {
+ if (!(flags & GW_CREATE_TAB) || nil == window) {
window = [[[BrowserWindowController alloc] init] autorelease];
[[window window] makeKeyAndOrderFront: nil];
}
@@ -97,7 +88,7 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
return (struct gui_window *)result;
}
-void gui_window_destroy(struct gui_window *g)
+static void gui_window_destroy(struct gui_window *g)
{
BrowserViewController *vc = (BrowserViewController *)g;
@@ -105,17 +96,17 @@ void gui_window_destroy(struct gui_window *g)
[vc release];
}
-void gui_window_set_title(struct gui_window *g, const char *title)
+static void gui_window_set_title(struct gui_window *g, const char *title)
{
[(BrowserViewController *)g setTitle: [NSString stringWithUTF8String: title]];
}
-void gui_window_redraw_window(struct gui_window *g)
+static void gui_window_redraw_window(struct gui_window *g)
{
[[(BrowserViewController *)g browserView] setNeedsDisplay: YES];
}
-void gui_window_update_box(struct gui_window *g, const struct rect *rect)
+static void gui_window_update_box(struct gui_window *g, const struct rect *rect)
{
const NSRect nsrect = cocoa_scaled_rect_wh( [(BrowserViewController *)g browser]->scale,
rect->x0, rect->y0,
@@ -123,7 +114,7 @@ void gui_window_update_box(struct gui_window *g, const struct rect *rect)
[[(BrowserViewController *)g browserView] setNeedsDisplayInRect: nsrect];
}
-bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
+static bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
{
NSCParameterAssert( g != NULL && sx != NULL && sy != NULL );
@@ -133,19 +124,25 @@ bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
return true;
}
-void gui_window_set_scroll(struct gui_window *g, int sx, int sy)
+static void gui_window_set_scroll(struct gui_window *g, int sx, int sy)
{
[[(BrowserViewController *)g browserView] scrollPoint: cocoa_point( sx, sy )];
}
-void gui_window_scroll_visible(struct gui_window *g, int x0, int y0,
- int x1, int y1)
+/**
+ * callback from core to reformat a window.
+ */
+static void cocoa_window_reformat(struct gui_window *gw)
{
- gui_window_set_scroll( g, x0, y0 );
+ if (gw != NULL) {
+ [[(BrowserViewController *)gw browserView] reformat ];
+ }
}
-void gui_window_get_dimensions(struct gui_window *g, int *width, int *height,
- bool scaled)
+
+static void gui_window_get_dimensions(struct gui_window *g,
+ int *width, int *height,
+ bool scaled)
{
NSCParameterAssert( width != NULL && height != NULL );
@@ -159,7 +156,7 @@ void gui_window_get_dimensions(struct gui_window *g, int *width, int *height,
*height = cocoa_pt_to_px( NSHeight( frame ) );
}
-void gui_window_update_extent(struct gui_window *g)
+static void gui_window_update_extent(struct gui_window *g)
{
BrowserViewController * const window = (BrowserViewController *)g;
@@ -170,12 +167,12 @@ void gui_window_update_extent(struct gui_window *g)
[[window browserView] setMinimumSize: cocoa_scaled_size( browser->scale, width, height )];
}
-void gui_window_set_status(struct gui_window *g, const char *text)
+static void gui_window_set_status(struct gui_window *g, const char *text)
{
[(BrowserViewController *)g setStatus: [NSString stringWithUTF8String: text]];
}
-void gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape)
+static void gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape)
{
switch (shape) {
case GUI_POINTER_DEFAULT:
@@ -208,28 +205,24 @@ void gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape)
}
}
-void gui_window_hide_pointer(struct gui_window *g)
-{
-}
-
-void gui_window_set_url(struct gui_window *g, const char *url)
+static void gui_window_set_url(struct gui_window *g, const char *url)
{
[(BrowserViewController *)g setUrl: [NSString stringWithUTF8String: url]];
}
-void gui_window_start_throbber(struct gui_window *g)
+static void gui_window_start_throbber(struct gui_window *g)
{
[(BrowserViewController *)g setIsProcessing: YES];
[(BrowserViewController *)g updateBackForward];
}
-void gui_window_stop_throbber(struct gui_window *g)
+static void gui_window_stop_throbber(struct gui_window *g)
{
[(BrowserViewController *)g setIsProcessing: NO];
[(BrowserViewController *)g updateBackForward];
}
-void gui_window_set_icon(struct gui_window *g, hlcache_handle *icon)
+static void gui_window_set_icon(struct gui_window *g, hlcache_handle *icon)
{
NSBitmapImageRep *bmp = icon != NULL ? (NSBitmapImageRep *)content_get_bitmap( icon ) : NULL;
@@ -246,56 +239,25 @@ void gui_window_set_icon(struct gui_window *g, hlcache_handle *icon)
[image release];
}
-void gui_window_set_search_ico(hlcache_handle *ico)
-{
- UNIMPL();
-}
-
-void gui_window_place_caret(struct gui_window *g, int x, int y, int height,
+static void gui_window_place_caret(struct gui_window *g, int x, int y, int height,
const struct rect *clip)
{
[[(BrowserViewController *)g browserView] addCaretAt: cocoa_point( x, y )
height: cocoa_px_to_pt( height )];
}
-void gui_window_remove_caret(struct gui_window *g)
+static void gui_window_remove_caret(struct gui_window *g)
{
[[(BrowserViewController *)g browserView] removeCaret];
}
-void gui_window_new_content(struct gui_window *g)
+static void gui_window_new_content(struct gui_window *g)
{
[(BrowserViewController *)g contentUpdated];
}
-bool gui_window_scroll_start(struct gui_window *g)
-{
- return true;
-}
-
-bool gui_window_drag_start(struct gui_window *g, gui_drag_type type,
- const struct rect *rect)
-{
- return true;
-}
-
-void gui_window_save_link(struct gui_window *g, const char *url,
- const char *title)
-{
- UNIMPL();
-}
-
-void gui_drag_save_object(gui_save_type type, hlcache_handle *c,
- struct gui_window *g)
-{
-}
-
-void gui_drag_save_selection(struct gui_window *g, const char *selection)
-{
-}
-
-void gui_create_form_select_menu(struct browser_window *bw,
+static void gui_create_form_select_menu(struct browser_window *bw,
struct form_control *control)
{
FormSelectMenu *menu = [[FormSelectMenu alloc] initWithControl: control forWindow: bw];
@@ -303,14 +265,15 @@ void gui_create_form_select_menu(struct browser_window *bw,
[menu release];
}
-void gui_launch_url(const char *url)
+static nserror gui_launch_url(nsurl *url)
{
- [[NSWorkspace sharedWorkspace] openURL: [NSURL URLWithString: [NSString stringWithUTF8String: url]]];
+ [[NSWorkspace sharedWorkspace] openURL: [NSURL URLWithString: [NSString stringWithUTF8String: nsurl_access(url)]]];
+ return NSERROR_OK;
}
struct ssl_cert_info;
-void gui_cert_verify(nsurl *url, const struct ssl_cert_info *certs,
+static void gui_cert_verify(nsurl *url, const struct ssl_cert_info *certs,
unsigned long num, nserror (*cb)(bool proceed, void *pw),
void *cbpw)
{
@@ -318,9 +281,39 @@ void gui_cert_verify(nsurl *url, const struct ssl_cert_info *certs,
}
-void gui_401login_open(nsurl *url, const char *realm,
- nserror (*cb)(bool proceed, void *pw), void *cbpw)
-{
- cb( false, cbpw );
-}
+static struct gui_window_table window_table = {
+ .create = gui_window_create,
+ .destroy = gui_window_destroy,
+ .redraw = gui_window_redraw_window,
+ .update = gui_window_update_box,
+ .get_scroll = gui_window_get_scroll,
+ .set_scroll = gui_window_set_scroll,
+ .get_dimensions = gui_window_get_dimensions,
+ .update_extent = gui_window_update_extent,
+ .reformat = cocoa_window_reformat,
+
+ .set_title = gui_window_set_title,
+ .set_url = gui_window_set_url,
+ .set_icon = gui_window_set_icon,
+ .set_status = gui_window_set_status,
+ .set_pointer = gui_window_set_pointer,
+ .place_caret = gui_window_place_caret,
+ .remove_caret = gui_window_remove_caret,
+ .new_content = gui_window_new_content,
+ .start_throbber = gui_window_start_throbber,
+ .stop_throbber = gui_window_stop_throbber,
+};
+
+struct gui_window_table *cocoa_window_table = &window_table;
+
+
+static struct gui_browser_table browser_table = {
+ .poll = gui_poll,
+ .schedule = cocoa_schedule,
+
+ .launch_url = gui_launch_url,
+ .create_form_select_menu = gui_create_form_select_menu,
+ .cert_verify = gui_cert_verify,
+};
+struct gui_browser_table *cocoa_browser_table = &browser_table;
diff --git a/cocoa/schedule.h b/cocoa/schedule.h
new file mode 100644
index 000000000..43b2c1462
--- /dev/null
+++ b/cocoa/schedule.h
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2011 Sven Weidauer <sven.weidauer@gmail.com>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+nserror cocoa_schedule(int t, void (*callback)(void *p), void *p);
diff --git a/cocoa/schedule.m b/cocoa/schedule.m
index 1ad75b390..f0896bd9d 100644
--- a/cocoa/schedule.m
+++ b/cocoa/schedule.m
@@ -17,7 +17,10 @@
*/
#import <Cocoa/Cocoa.h>
-#import "utils/schedule.h"
+
+#import "utils/errors.h"
+
+#import "cocoa/schedule.h"
@interface ScheduledCallback : NSObject {
void (*callback)( void *userData );
@@ -73,18 +76,15 @@ static NSMutableSet *timerSet = nil;
@end
-/* In platform specific schedule.c. */
-void schedule(int t, void (*callback)(void *p), void *p)
-{
- ScheduledCallback *cb = [[ScheduledCallback alloc] initWithCallback: callback userData: p];
- [cb schedule: (NSTimeInterval)t / 100];
- [cb release];
-}
-
-void schedule_remove(void (*callback)(void *p), void *p)
+/* exported interface documented in cocoa/schedule.h */
+nserror cocoa_schedule(int t, void (*callback)(void *p), void *p)
{
ScheduledCallback *cb = [[ScheduledCallback alloc] initWithCallback: callback userData: p];
[timerSet removeObject: cb];
+ if (t >= 0) {
+ [cb schedule: (NSTimeInterval)t / 1000];
+ }
[cb release];
-}
+ return NSERROR_OK;
+}
diff --git a/cocoa/selection.h b/cocoa/selection.h
new file mode 100644
index 000000000..67331ea83
--- /dev/null
+++ b/cocoa/selection.h
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2011 Sven Weidauer <sven.weidauer@gmail.com>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+struct gui_clipboard_table *cocoa_clipboard_table;
diff --git a/cocoa/selection.m b/cocoa/selection.m
index 237c61ce2..c8d6c7d5e 100644
--- a/cocoa/selection.m
+++ b/cocoa/selection.m
@@ -19,28 +19,21 @@
#import <Cocoa/Cocoa.h>
#import "cocoa/BrowserViewController.h"
+#import "cocoa/selection.h"
+#import "desktop/gui.h"
#import "desktop/browser_private.h"
static NSMutableString *cocoa_clipboard_string;
-void gui_start_selection(struct gui_window *g)
-{
-}
-
-void gui_clear_selection(struct gui_window *g)
-{
-}
-
-
/**
* Core asks front end for clipboard contents.
*
* \param buffer UTF-8 text, allocated by front end, ownership yeilded to core
* \param length Byte length of UTF-8 text in buffer
*/
-void gui_get_clipboard(char **buffer, size_t *length)
+static void gui_get_clipboard(char **buffer, size_t *length)
{
NSPasteboard *pb = [NSPasteboard generalPasteboard];
NSString *string = [pb stringForType: NSStringPboardType];
@@ -70,7 +63,7 @@ void gui_get_clipboard(char **buffer, size_t *length)
* \param styles Array of styles given to text runs, owned by core, or NULL
* \param n_styles Number of text run styles in array
*/
-void gui_set_clipboard(const char *buffer, size_t length,
+static void gui_set_clipboard(const char *buffer, size_t length,
nsclipboard_styles styles[], int n_styles)
{
/* Empty clipboard string */
@@ -104,3 +97,9 @@ void gui_set_clipboard(const char *buffer, size_t length,
}
}
+static struct gui_clipboard_table clipboard_table = {
+ .get = gui_get_clipboard,
+ .set = gui_set_clipboard,
+};
+
+struct gui_clipboard_table *cocoa_clipboard_table = &clipboard_table;
diff --git a/cocoa/url.m b/cocoa/url.m
deleted file mode 100644
index 931f459a3..000000000
--- a/cocoa/url.m
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2011 Sven Weidauer <sven.weidauer@gmail.com>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#import <Cocoa/Cocoa.h>
-
-#import "utils/url.h"
-
-
-char *url_to_path(const char *url)
-{
- NSURL *nsurl = [NSURL URLWithString: [NSString stringWithUTF8String: url]];
- return strdup([[nsurl path] UTF8String]);
-}
-
-char *path_to_url(const char *path)
-{
- return strdup( [[[NSURL fileURLWithPath: [NSString stringWithUTF8String: path]]
- absoluteString] UTF8String] );
-}
diff --git a/cocoa/utf8.m b/cocoa/utf8.m
deleted file mode 100644
index 2ec829888..000000000
--- a/cocoa/utf8.m
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2011 Sven Weidauer <sven.weidauer@gmail.com>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#import <Cocoa/Cocoa.h>
-
-#import "utils/utf8.h"
-
-utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len,
- char **result)
-{
- NSCParameterAssert( NULL != result );
-
- char *newString = malloc( len + 1 );
- if (NULL == newString) return UTF8_CONVERT_NOMEM;
- memcpy( newString, string, len );
- newString[len] = 0;
- *result = newString;
- return UTF8_CONVERT_OK;
-}
-
-utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len,
- char **result)
-{
- /* same function, local encoding = UTF-8 */
- return utf8_to_local_encoding( string, len, result );
-}
diff --git a/cocoa/utils.m b/cocoa/utils.m
index cd9313d34..61226ad2a 100644
--- a/cocoa/utils.m
+++ b/cocoa/utils.m
@@ -41,16 +41,3 @@ void PDF_Password(char **owner_pass, char **user_pass, char *path)
UNIMPL();
}
-char *filename_from_path(char *path)
-{
- return strdup( [[[NSString stringWithUTF8String: path] lastPathComponent] UTF8String] );
-}
-
-bool path_add_part(char *path, int length, const char *newpart)
-{
- NSString *newPath = [[NSString stringWithUTF8String: path] stringByAppendingPathComponent: [NSString stringWithUTF8String: newpart]];
-
- strncpy( path, [newPath UTF8String], length );
-
- return true;
-}
diff --git a/content/Makefile b/content/Makefile
index 557e6c787..ab257eaea 100644
--- a/content/Makefile
+++ b/content/Makefile
@@ -1,6 +1,11 @@
# Content sources
S_CONTENT := content.c content_factory.c dirlist.c fetch.c hlcache.c \
- llcache.c mimesniff.c urldb.c
+ llcache.c mimesniff.c urldb.c no_backing_store.c
-S_CONTENT := $(addprefix content/,$(S_CONTENT)) \ No newline at end of file
+# Make filesystem backing store available
+ifeq ($(NETSURF_FS_BACKING_STORE),YES)
+ S_CONTENT += fs_backing_store.c
+endif
+
+S_CONTENT := $(addprefix content/,$(S_CONTENT))
diff --git a/content/backing_store.h b/content/backing_store.h
new file mode 100644
index 000000000..849e11aeb
--- /dev/null
+++ b/content/backing_store.h
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * Low-level source data cache backing store interface
+ */
+
+#ifndef NETSURF_CONTENT_LLCACHE_PRIVATE_H_
+#define NETSURF_CONTENT_LLCACHE_PRIVATE_H_
+
+#include "content/llcache.h"
+
+/** storage control flags */
+enum backing_store_flags {
+ BACKING_STORE_NONE = 0, /**< no special processing */
+ BACKING_STORE_META = 1, /**< data is metadata */
+ BACKING_STORE_MMAP = 2, /**< when data is retrived this indicates the
+ * returned buffer may be memory mapped,
+ * flag must be cleared if the storage is
+ * allocated and is not memory mapped.
+ */
+};
+
+/** low level cache backing store operation table
+ *
+ * The low level cache (source objects) has the capability to make
+ * objects and their metadata (headers etc) persistant by writing to a
+ * backing store using these operations.
+ */
+struct gui_llcache_table {
+ /**
+ * Initialise the backing store.
+ *
+ * @param parameters to configure backing store.
+ * @return NSERROR_OK on success or error code on faliure.
+ */
+ nserror (*initialise)(const struct llcache_store_parameters *parameters);
+
+ /**
+ * Finalise the backing store.
+ *
+ * @return NSERROR_OK on success or error code on faliure.
+ */
+ nserror (*finalise)(void);
+
+ /**
+ * Place an object in the backing store.
+ *
+ * @param url The url is used as the unique primary key for the data.
+ * @param flags The flags to control how the obejct is stored.
+ * @param data The objects data.
+ * @param datalen The length of the \a data.
+ * @return NSERROR_OK on success or error code on faliure.
+ */
+ nserror (*store)(struct nsurl *url, enum backing_store_flags flags,
+ const uint8_t *data, const size_t datalen);
+
+ /**
+ * Retrive an object from the backing store.
+ *
+ * @param url The url is used as the unique primary key for the data.
+ * @param flags The flags to control how the object is retrived.
+ * @param data The objects data.
+ * @param datalen The length of the \a data retrieved.
+ * @return NSERROR_OK on success or error code on faliure.
+ */
+ nserror (*fetch)(struct nsurl *url, enum backing_store_flags *flags,
+ uint8_t **data, size_t *datalen);
+
+ /**
+ * Invalidate a source object from the backing store.
+ *
+ * The entry (if present in the backing store) must no longer
+ * be returned as a result to the fetch or meta operations.
+ *
+ * @param url The url is used as the unique primary key to invalidate.
+ * @return NSERROR_OK on success or error code on faliure.
+ */
+ nserror (*invalidate)(struct nsurl *url);
+};
+
+extern struct gui_llcache_table* null_llcache_table;
+extern struct gui_llcache_table* filesystem_llcache_table;
+
+#endif
diff --git a/content/content.c b/content/content.c
index 1c667f12d..4641571bd 100644
--- a/content/content.c
+++ b/content/content.c
@@ -31,15 +31,13 @@
#include <string.h>
#include <strings.h>
#include <time.h>
+
#include "utils/config.h"
#include "content/content_protected.h"
#include "content/hlcache.h"
-#include "css/css.h"
#include "image/bitmap.h"
#include "desktop/browser.h"
#include "utils/nsoption.h"
-#include "render/html.h"
-#include "render/textplain.h"
#include "utils/http.h"
#include "utils/log.h"
@@ -840,15 +838,15 @@ bool content_drop_file_at_point(struct hlcache_handle *h,
}
-void content_search(struct hlcache_handle *h,
- struct gui_search_callbacks *gui_callbacks, void *gui_data,
+void content_search(struct hlcache_handle *h, void *context,
search_flags_t flags, const char *string)
{
struct content *c = hlcache_handle_get_content(h);
assert(c != 0);
- if (c->handler->search != NULL)
- c->handler->search(c, gui_callbacks, gui_data, flags, string);
+ if (c->handler->search != NULL) {
+ c->handler->search(c, context, flags, string);
+ }
}
@@ -857,18 +855,22 @@ void content_search_clear(struct hlcache_handle *h)
struct content *c = hlcache_handle_get_content(h);
assert(c != 0);
- if (c->handler->search_clear != NULL)
+ if (c->handler->search_clear != NULL) {
c->handler->search_clear(c);
+ }
}
-
-void content_debug_dump(struct hlcache_handle *h, FILE *f)
+/* exported interface documented in content/content.h */
+nserror content_debug_dump(struct hlcache_handle *h, FILE *f, enum content_debug op)
{
struct content *c = hlcache_handle_get_content(h);
assert(c != 0);
- if (c->handler->debug_dump != NULL)
- c->handler->debug_dump(c, f);
+ if (c->handler->debug_dump == NULL) {
+ return NSERROR_NOT_IMPLEMENTED;
+ }
+
+ return c->handler->debug_dump(c, f, op);
}
diff --git a/content/content.h b/content/content.h
index 467fa6055..752370034 100644
--- a/content/content.h
+++ b/content/content.h
@@ -83,9 +83,16 @@ typedef enum {
CONTENT_MSG_POINTER, /**< Wants a specific mouse pointer set */
CONTENT_MSG_SELECTION, /**< A selection made or cleared */
CONTENT_MSG_CARET, /**< Caret movement / hiding */
- CONTENT_MSG_DRAG /**< A drag started or ended */
+ CONTENT_MSG_DRAG, /**< A drag started or ended */
+ CONTENT_MSG_GADGETCLICK/**< A gadget has been clicked on (mainly for file) */
} content_msg;
+/** Debugging dump operations */
+enum content_debug {
+ CONTENT_DEBUG_RENDER, /** Debug the contents rendering. */
+ CONTENT_DEBUG_DOM /** Debug teh contents Document Object. */
+};
+
/** RFC5988 metadata link */
struct content_rfc5988_link {
struct content_rfc5988_link *next; /**< next rfc5988_link in list */
@@ -190,6 +197,10 @@ union content_msg_data {
} type;
const struct rect *rect;
} drag;
+ /** CONTENT_MSG_GADGETCLICK - User clicked on a form gadget */
+ struct {
+ struct form_control *gadget;
+ } gadget_click;
};
/** parameters to content redraw */
@@ -261,11 +272,20 @@ bool content_scroll_at_point(struct hlcache_handle *h,
int x, int y, int scrx, int scry);
bool content_drop_file_at_point(struct hlcache_handle *h,
int x, int y, char *file);
-void content_search(struct hlcache_handle *h,
- struct gui_search_callbacks *gui_callbacks, void *gui_data,
+
+void content_search(struct hlcache_handle *h, void *context,
search_flags_t flags, const char *string);
void content_search_clear(struct hlcache_handle *h);
-void content_debug_dump(struct hlcache_handle *h, FILE *f);
+
+/**
+ * Dump debug information to file.
+ *
+ * \param h content handle to debug.
+ * \param f File to write output to.
+ * \param op Debug operation type.
+ */
+nserror content_debug_dump(struct hlcache_handle *h, FILE *f, enum content_debug op);
+
struct content_rfc5988_link *content_find_rfc5988_link(struct hlcache_handle *c,
lwc_string *rel);
diff --git a/content/content_protected.h b/content/content_protected.h
index 57ce35775..7d51e1b8c 100644
--- a/content/content_protected.h
+++ b/content/content_protected.h
@@ -73,12 +73,10 @@ struct content_handler {
int scrx, int scry);
bool (*drop_file_at_point)(struct content *c, int x, int y,
char *file);
- void (*search)(struct content *c,
- struct gui_search_callbacks *gui_callbacks,
- void *gui_data, search_flags_t flags,
- const char *string);
+ void (*search)(struct content *c, void *context, search_flags_t flags,
+ const char *string);
void (*search_clear)(struct content *c);
- void (*debug_dump)(struct content *c, FILE *f);
+ nserror (*debug_dump)(struct content *c, FILE *f, enum content_debug op);
nserror (*clone)(const struct content *old, struct content **newc);
bool (*matches_quirks)(const struct content *c, bool quirks);
content_type (*type)(void);
diff --git a/content/content_type.h b/content/content_type.h
index 6488692fe..9f8c2f307 100644
--- a/content/content_type.h
+++ b/content/content_type.h
@@ -25,9 +25,6 @@
#ifndef _NETSURF_DESKTOP_CONTENT_TYPE_H_
#define _NETSURF_DESKTOP_CONTENT_TYPE_H_
-#include "utils/config.h"
-
-
/** The type of a content. */
typedef enum {
CONTENT_NONE = 0x00,
diff --git a/content/dirlist.c b/content/dirlist.c
index 433e21026..1d7a67e1f 100644
--- a/content/dirlist.c
+++ b/content/dirlist.c
@@ -24,10 +24,11 @@
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
-#include "content/dirlist.h"
+
+#include "utils/nsurl.h"
#include "utils/messages.h"
-static const char footer[] = "</div>\n</body>\n</html>\n";
+#include "content/dirlist.h"
static int dirlist_filesize_calculate(unsigned long *bytesize);
static int dirlist_filesize_value(unsigned long bytesize);
@@ -264,7 +265,7 @@ bool dirlist_generate_headings(char *buffer, int buffer_length)
* dirlist_generate_bottom()
*/
-bool dirlist_generate_row(bool even, bool directory, char *url, char *name,
+bool dirlist_generate_row(bool even, bool directory, nsurl *url, char *name,
const char *mimetype, long long size, char *date, char *time,
char *buffer, int buffer_length)
{
@@ -290,7 +291,7 @@ bool dirlist_generate_row(bool even, bool directory, char *url, char *name,
"\t<span class=\"date\">%s</span>\n"
"\t<span class=\"time\">%s</span>\n"
"</a>\n",
- url, even ? "even" : "odd",
+ nsurl_access(url), even ? "even" : "odd",
directory ? "dir" : "file",
name, mimetype, size_string, unit, date, time);
if (error < 0 || error >= buffer_length)
diff --git a/content/dirlist.h b/content/dirlist.h
index bf90ec6d4..687f50688 100644
--- a/content/dirlist.h
+++ b/content/dirlist.h
@@ -39,7 +39,7 @@ bool dirlist_generate_title(const char *title, char *buffer, int buffer_length);
bool dirlist_generate_parent_link(const char *parent, char *buffer,
int buffer_length);
bool dirlist_generate_headings(char *buffer, int buffer_length);
-bool dirlist_generate_row(bool even, bool directory, char *url, char *name,
+bool dirlist_generate_row(bool even, bool directory, nsurl *url, char *name,
const char *mimetype, long long size, char *date, char *time,
char *buffer, int buffer_length);
bool dirlist_generate_bottom(char *buffer, int buffer_length);
diff --git a/content/fetch.c b/content/fetch.c
index 1ff925ae3..9a0796294 100644
--- a/content/fetch.c
+++ b/content/fetch.c
@@ -19,12 +19,15 @@
*/
/** \file
- * Fetching of data from a URL (implementation).
+ * Implementation of fetching of data from a URL.
+ *
+ * The implementation is the fetch factory and the generic operations
+ * around the fetcher specific methods.
*
* Active fetches are held in the circular linked list ::fetch_ring. There may
* be at most ::option_max_fetchers_per_host active requests per Host: header.
* There may be at most ::option_max_fetchers active requests overall. Inactive
- * fetchers are stored in the ::queue_ring waiting for use.
+ * fetches are stored in the ::queue_ring waiting for use.
*/
#include <assert.h>
@@ -33,18 +36,13 @@
#include <string.h>
#include <strings.h>
#include <time.h>
-
#include <libwapcaplet/libwapcaplet.h>
+#include <curl/curl.h>
#include "utils/config.h"
-#include "content/fetch.h"
-#include "content/fetchers/resource.h"
-#include "content/fetchers/about.h"
-#include "content/fetchers/curl.h"
-#include "content/fetchers/data.h"
-#include "content/fetchers/file.h"
-#include "content/urldb.h"
#include "desktop/netsurf.h"
+#include "desktop/gui_factory.h"
+#include "utils/corestrings.h"
#include "utils/nsoption.h"
#include "utils/log.h"
#include "utils/messages.h"
@@ -52,27 +50,50 @@
#include "utils/utils.h"
#include "utils/ring.h"
+#include "content/fetch.h"
+#include "content/fetchers.h"
+#include "content/fetchers/resource.h"
+#include "content/fetchers/about.h"
+#include "content/fetchers/curl.h"
+#include "content/fetchers/data.h"
+#include "content/fetchers/file.h"
+#include "javascript/fetcher.h"
+#include "content/urldb.h"
+
/* Define this to turn on verbose fetch logging */
#undef DEBUG_FETCH_VERBOSE
-bool fetch_active; /**< Fetches in progress, please call fetch_poll(). */
+/** Verbose fetcher logging */
+#ifdef DEBUG_FETCH_VERBOSE
+#define FETCH_LOG(x) LOG(x)
+#else
+#define FETCH_LOG(x)
+#endif
+
+/** The maximum number of fetchers that can be added */
+#define MAX_FETCHERS 10
+
+/** The time in ms between polling the fetchers.
+ *
+ * \todo The schedule timeout should be profiled to see if there is a
+ * better value or even if it needs to be dynamic.
+ */
+#define SCHEDULE_TIME 10
+
+/** The fdset timeout in ms */
+#define FDSET_TIMEOUT 1000
-/** Information about a fetcher for a given scheme. */
+/**
+ * Information about a fetcher for a given scheme.
+ */
typedef struct scheme_fetcher_s {
- lwc_string *scheme_name; /**< The scheme. */
- fetcher_can_fetch can_fetch; /**< Ensure an URL can be fetched. */
- fetcher_setup_fetch setup_fetch; /**< Set up a fetch. */
- fetcher_start_fetch start_fetch; /**< Start a fetch. */
- fetcher_abort_fetch abort_fetch; /**< Abort a fetch. */
- fetcher_free_fetch free_fetch; /**< Free a fetch. */
- fetcher_poll_fetcher poll_fetcher; /**< Poll this fetcher. */
- fetcher_finalise finaliser; /**< Clean up this fetcher. */
- int refcount; /**< When zero, clean up the fetcher. */
- struct scheme_fetcher_s *next_fetcher; /**< Next fetcher in the list. */
- struct scheme_fetcher_s *prev_fetcher; /**< Prev fetcher in the list. */
+ lwc_string *scheme; /**< The scheme. */
+
+ struct fetcher_operation_table ops; /**< The fetchers operations. */
+ int refcount; /**< When zero the fetcher is no longer in use. */
} scheme_fetcher;
-static scheme_fetcher *fetchers = NULL;
+static scheme_fetcher fetchers[MAX_FETCHERS];
/** Information for a single fetch. */
struct fetch {
@@ -84,176 +105,351 @@ struct fetch {
void *p; /**< Private data for callback. */
lwc_string *host; /**< Host part of URL, interned */
long http_code; /**< HTTP response code, or 0. */
- scheme_fetcher *ops; /**< Fetcher operations for this fetch,
- NULL if not set. */
+ int fetcherd; /**< Fetcher descriptor for this fetch */
void *fetcher_handle; /**< The handle for the fetcher. */
bool fetch_is_active; /**< This fetch is active. */
struct fetch *r_prev; /**< Previous active fetch in ::fetch_ring. */
struct fetch *r_next; /**< Next active fetch in ::fetch_ring. */
};
-static struct fetch *fetch_ring = 0; /**< Ring of active fetches. */
-static struct fetch *queue_ring = 0; /**< Ring of queued fetches */
+static struct fetch *fetch_ring = NULL; /**< Ring of active fetches. */
+static struct fetch *queue_ring = NULL; /**< Ring of queued fetches */
-#define fetch_ref_fetcher(F) F->refcount++
-static void fetch_unref_fetcher(scheme_fetcher *fetcher);
-static void fetch_dispatch_jobs(void);
-static bool fetch_choose_and_dispatch(void);
-static bool fetch_dispatch_job(struct fetch *fetch);
+/******************************************************************************
+ * fetch internals *
+ ******************************************************************************/
-/* Static lwc_strings */
-static lwc_string *fetch_http_lwc;
-static lwc_string *fetch_https_lwc;
+static inline void fetch_ref_fetcher(int fetcherd)
+{
+ fetchers[fetcherd].refcount++;
+}
+static inline void fetch_unref_fetcher(int fetcherd)
+{
+ fetchers[fetcherd].refcount--;
+ if (fetchers[fetcherd].refcount == 0) {
+ fetchers[fetcherd].ops.finalise(fetchers[fetcherd].scheme);
+ lwc_string_unref(fetchers[fetcherd].scheme);
+ }
+}
/**
- * Initialise the fetcher.
+ * Find a suitable fetcher for a scheme.
*/
-
-void fetch_init(void)
+static int get_fetcher_for_scheme(lwc_string *scheme)
{
- fetch_curl_register();
- fetch_data_register();
- fetch_file_register();
- fetch_resource_register();
- fetch_about_register();
- fetch_active = false;
+ int fetcherd;
+ bool match;
- if (lwc_intern_string("http", SLEN("http"), &fetch_http_lwc) !=
- lwc_error_ok) {
- die("Failed to initialise the fetch module "
- "(couldn't intern \"http\").");
+ for (fetcherd = 0; fetcherd < MAX_FETCHERS; fetcherd++) {
+ if ((fetchers[fetcherd].refcount > 0) &&
+ (lwc_string_isequal(fetchers[fetcherd].scheme,
+ scheme, &match) == lwc_error_ok) &&
+ (match == true)) {
+ return fetcherd;
+ }
}
+ return -1;
+}
+
+/**
+ * Dispatch a single job
+ */
+static bool fetch_dispatch_job(struct fetch *fetch)
+{
+ RING_REMOVE(queue_ring, fetch);
+ FETCH_LOG(("Attempting to start fetch %p, fetcher %p, url %s", fetch,
+ fetch->fetcher_handle, nsurl_access(fetch->url)));
- if (lwc_intern_string("https", SLEN("https"), &fetch_https_lwc) !=
- lwc_error_ok) {
- die("Failed to initialise the fetch module "
- "(couldn't intern \"https\").");
+ if (!fetchers[fetch->fetcherd].ops.start(fetch->fetcher_handle)) {
+ RING_INSERT(queue_ring, fetch); /* Put it back on the end of the queue */
+ return false;
+ } else {
+ RING_INSERT(fetch_ring, fetch);
+ fetch->fetch_is_active = true;
+ return true;
}
}
+/**
+ * Choose and dispatch a single job. Return false if we failed to dispatch
+ * anything.
+ *
+ * We don't check the overall dispatch size here because we're not called unless
+ * there is room in the fetch queue for us.
+ */
+static bool fetch_choose_and_dispatch(void)
+{
+ bool same_host;
+ struct fetch *queueitem;
+ queueitem = queue_ring;
+ do {
+ /* We can dispatch the selected item if there is room in the
+ * fetch ring
+ */
+ int countbyhost;
+ RING_COUNTBYLWCHOST(struct fetch, fetch_ring, countbyhost,
+ queueitem->host);
+ if (countbyhost < nsoption_int(max_fetchers_per_host)) {
+ /* We can dispatch this item in theory */
+ return fetch_dispatch_job(queueitem);
+ }
+ /* skip over other items with the same host */
+ same_host = true;
+ while (same_host == true && queueitem->r_next != queue_ring) {
+ if (lwc_string_isequal(queueitem->host,
+ queueitem->r_next->host, &same_host) ==
+ lwc_error_ok && same_host == true) {
+ queueitem = queueitem->r_next;
+ }
+ }
+ queueitem = queueitem->r_next;
+ } while (queueitem != queue_ring);
+ return false;
+}
+
+static void dump_rings(void)
+{
+#ifdef DEBUG_FETCH_VERBOSE
+ struct fetch *q;
+ struct fetch *f;
+
+ q = queue_ring;
+ if (q) {
+ do {
+ LOG(("queue_ring: %s", nsurl_access(q->url)));
+ q = q->r_next;
+ } while (q != queue_ring);
+ }
+ f = fetch_ring;
+ if (f) {
+ do {
+ LOG(("fetch_ring: %s", nsurl_access(f->url)));
+ f = f->r_next;
+ } while (f != fetch_ring);
+ }
+#endif
+}
/**
- * Clean up for quit.
+ * Dispatch as many jobs as we have room to dispatch.
*
- * Must be called before exiting.
+ * @return true if there are active fetchers that require polling else false.
*/
+static bool fetch_dispatch_jobs(void)
+{
+ int all_active;
+ int all_queued;
+
+ RING_GETSIZE(struct fetch, queue_ring, all_queued);
+ RING_GETSIZE(struct fetch, fetch_ring, all_active);
+
+ FETCH_LOG(("queue_ring %i, fetch_ring %i", all_queued, all_active));
+ dump_rings();
-void fetch_quit(void)
+ while ((all_queued != 0) &&
+ (all_active < nsoption_int(max_fetchers)) &&
+ fetch_choose_and_dispatch()) {
+ all_queued--;
+ all_active++;
+ FETCH_LOG(("%d queued, %d fetching",
+ all_queued, all_active));
+ }
+
+ FETCH_LOG(("Fetch ring is now %d elements.", all_active));
+ FETCH_LOG(("Queue ring is now %d elements.", all_queued));
+
+ return (all_active > 0);
+}
+
+static void fetcher_poll(void *unused)
{
- while (fetchers != NULL) {
- if (fetchers->refcount != 1) {
- LOG(("Fetcher for scheme %s still active?!",
- lwc_string_data(fetchers->scheme_name)));
- /* We shouldn't do this, but... */
- fetchers->refcount = 1;
+ int fetcherd;
+
+ if (fetch_dispatch_jobs()) {
+ FETCH_LOG(("Polling fetchers"));
+ for (fetcherd = 0; fetcherd < MAX_FETCHERS; fetcherd++) {
+ if (fetchers[fetcherd].refcount > 0) {
+ /* fetcher present */
+ fetchers[fetcherd].ops.poll(fetchers[fetcherd].scheme);
+ }
}
- fetch_unref_fetcher(fetchers);
- }
- lwc_string_unref(fetch_http_lwc);
- lwc_string_unref(fetch_https_lwc);
+ /* schedule active fetchers to run again in 10ms */
+ guit->browser->schedule(SCHEDULE_TIME, fetcher_poll, NULL);
+ }
}
+/******************************************************************************
+ * Public API *
+ ******************************************************************************/
-bool fetch_add_fetcher(lwc_string *scheme,
- fetcher_initialise initialiser,
- fetcher_can_fetch can_fetch,
- fetcher_setup_fetch setup_fetch,
- fetcher_start_fetch start_fetch,
- fetcher_abort_fetch abort_fetch,
- fetcher_free_fetch free_fetch,
- fetcher_poll_fetcher poll_fetcher,
- fetcher_finalise finaliser)
+/* exported interface documented in content/fetch.h */
+nserror fetcher_init(void)
{
- scheme_fetcher *new_fetcher;
- if (!initialiser(scheme))
- return false;
- new_fetcher = malloc(sizeof(scheme_fetcher));
- if (new_fetcher == NULL) {
- finaliser(scheme);
- return false;
- }
- new_fetcher->scheme_name = scheme;
- new_fetcher->refcount = 0;
- new_fetcher->can_fetch = can_fetch;
- new_fetcher->setup_fetch = setup_fetch;
- new_fetcher->start_fetch = start_fetch;
- new_fetcher->abort_fetch = abort_fetch;
- new_fetcher->free_fetch = free_fetch;
- new_fetcher->poll_fetcher = poll_fetcher;
- new_fetcher->finaliser = finaliser;
- new_fetcher->next_fetcher = fetchers;
- fetchers = new_fetcher;
- fetch_ref_fetcher(new_fetcher);
- return true;
+ fetch_curl_register();
+ fetch_data_register();
+ fetch_file_register();
+ fetch_resource_register();
+ fetch_about_register();
+ fetch_javascript_register();
+
+ return NSERROR_OK;
}
+/* exported interface documented in content/fetchers.h */
+void fetcher_quit(void)
+{
+ int fetcherd; /* fetcher index */
+ for (fetcherd = 0; fetcherd < MAX_FETCHERS; fetcherd++) {
+ if (fetchers[fetcherd].refcount > 1) {
+ /* fetcher still has reference at quit. This
+ * should not happen as the fetch should have
+ * been aborted in llcache shutdown.
+ *
+ * This appears to be normal behaviour if a
+ * curl operation is still in progress at exit
+ * as the abort waits for curl to complete.
+ *
+ * We could make the user wait for curl to
+ * complete but we are exiting anyway so thats
+ * unhelpful. Instead we just log it and force
+ * the reference count to allow the fetcher to
+ * be stopped.
+ */
+ LOG(("Fetcher for scheme %s still has %d active users at quit.",
+ lwc_string_data(fetchers[fetcherd].scheme),
+ fetchers[fetcherd].refcount));
+
+ fetchers[fetcherd].refcount = 1;
+ }
+ if (fetchers[fetcherd].refcount == 1) {
-void fetch_unref_fetcher(scheme_fetcher *fetcher)
+ fetch_unref_fetcher(fetcherd);
+ }
+ }
+}
+
+/* exported interface documented in content/fetchers.h */
+nserror
+fetcher_add(lwc_string *scheme, const struct fetcher_operation_table *ops)
{
- if (--fetcher->refcount == 0) {
- fetcher->finaliser(fetcher->scheme_name);
- lwc_string_unref(fetcher->scheme_name);
- if (fetcher == fetchers) {
- fetchers = fetcher->next_fetcher;
- if (fetchers)
- fetchers->prev_fetcher = NULL;
- } else {
- fetcher->prev_fetcher->next_fetcher =
- fetcher->next_fetcher;
- if (fetcher->next_fetcher != NULL)
- fetcher->next_fetcher->prev_fetcher =
- fetcher->prev_fetcher;
+ int fetcherd;
+
+ /* find unused fetcher descriptor */
+ for (fetcherd = 0; fetcherd < MAX_FETCHERS; fetcherd++) {
+ if (fetchers[fetcherd].refcount == 0) {
+ break;
}
- free(fetcher);
}
+ if (fetcherd == MAX_FETCHERS) {
+ return NSERROR_INIT_FAILED;
+ }
+
+ if (!ops->initialise(scheme)) {
+ return NSERROR_INIT_FAILED;
+ }
+
+ fetchers[fetcherd].scheme = scheme;
+ fetchers[fetcherd].ops = *ops;
+
+ fetch_ref_fetcher(fetcherd);
+
+ return NSERROR_OK;
}
+/* exported interface documented in content/fetch.h */
+nserror fetcher_fdset(fd_set *read_fd_set,
+ fd_set *write_fd_set,
+ fd_set *except_fd_set,
+ int *maxfd_out)
+{
+ CURLMcode code;
+ int maxfd;
+ int fetcherd; /* fetcher index */
+
+ if (!fetch_dispatch_jobs()) {
+ FETCH_LOG(("No jobs"));
+ *maxfd_out = -1;
+ return NSERROR_OK;
+ }
-/**
- * Start fetching data for the given URL.
- *
- * The function returns immediately. The fetch may be queued for later
- * processing.
- *
- * A pointer to an opaque struct fetch is returned, which can be passed to
- * fetch_abort() to abort the fetch at any time. Returns 0 if memory is
- * exhausted (or some other fatal error occurred).
- *
- * The caller must supply a callback function which is called when anything
- * interesting happens. The callback function is first called with msg
- * FETCH_HEADER, with the header in data, then one or more times
- * with FETCH_DATA with some data for the url, and finally with
- * FETCH_FINISHED. Alternatively, FETCH_ERROR indicates an error occurred:
- * data contains an error message. FETCH_REDIRECT may replace the FETCH_HEADER,
- * FETCH_DATA, FETCH_FINISHED sequence if the server sends a replacement URL.
- *
- */
+ FETCH_LOG(("Polling fetchers"));
-struct fetch * fetch_start(nsurl *url, nsurl *referer,
- fetch_callback callback,
- void *p, bool only_2xx, const char *post_urlenc,
- const struct fetch_multipart_data *post_multipart,
- bool verifiable, bool downgrade_tls,
- const char *headers[])
+ for (fetcherd = 0; fetcherd < MAX_FETCHERS; fetcherd++) {
+ if (fetchers[fetcherd].refcount > 0) {
+ /* fetcher present */
+ fetchers[fetcherd].ops.poll(fetchers[fetcherd].scheme);
+ }
+ }
+
+ FD_ZERO(read_fd_set);
+ FD_ZERO(write_fd_set);
+ FD_ZERO(except_fd_set);
+ code = curl_multi_fdset(fetch_curl_multi,
+ read_fd_set,
+ write_fd_set,
+ except_fd_set,
+ &maxfd);
+ assert(code == CURLM_OK);
+
+ if (maxfd >= 0) {
+ /* change the scheduled poll to happen is a 1000ms as
+ * we assume fetching an fdset means the fetchers will
+ * be run by the client waking up on data available on
+ * the fd and re-calling fetcher_fdset() if this does
+ * not happen the fetch polling will continue as
+ * usual.
+ */
+ /** @note adjusting the schedule time is only done for
+ * curl currently. This is because as it is assumed to
+ * be the only fetcher that can possibly have fd to
+ * select on. All the other fetchers continue to need
+ * polling frequently.
+ */
+ guit->browser->schedule(FDSET_TIMEOUT, fetcher_poll, NULL);
+ }
+
+ *maxfd_out = maxfd;
+
+ return NSERROR_OK;
+}
+
+/* exported interface documented in content/fetch.h */
+struct fetch *
+fetch_start(nsurl *url,
+ nsurl *referer,
+ fetch_callback callback,
+ void *p,
+ bool only_2xx,
+ const char *post_urlenc,
+ const struct fetch_multipart_data *post_multipart,
+ bool verifiable,
+ bool downgrade_tls,
+ const char *headers[])
{
struct fetch *fetch;
- scheme_fetcher *fetcher = fetchers;
lwc_string *scheme;
bool match;
fetch = malloc(sizeof (*fetch));
- if (fetch == NULL)
+ if (fetch == NULL) {
return NULL;
+ }
/* The URL we're fetching must have a scheme */
scheme = nsurl_get_component(url, NSURL_SCHEME);
assert(scheme != NULL);
-#ifdef DEBUG_FETCH_VERBOSE
- LOG(("fetch %p, url '%s'", fetch, nsurl_access(url)));
-#endif
+ /* try and obtain a fetcher for this scheme */
+ fetch->fetcherd = get_fetcher_for_scheme(scheme);
+ if (fetch->fetcherd == -1) {
+ lwc_string_unref(scheme);
+ free(fetch);
+ return NULL;
+ }
+
+ FETCH_LOG(("fetch %p, url '%s'", fetch, nsurl_access(url)));
/* construct a new fetch structure */
fetch->callback = callback;
@@ -266,10 +462,9 @@ struct fetch * fetch_start(nsurl *url, nsurl *referer,
fetch->referer = NULL;
fetch->send_referer = false;
fetch->fetcher_handle = NULL;
- fetch->ops = NULL;
fetch->fetch_is_active = false;
fetch->host = nsurl_get_component(url, NSURL_HOST);
-
+
if (referer != NULL) {
lwc_string *ref_scheme;
fetch->referer = nsurl_ref(referer);
@@ -279,7 +474,7 @@ struct fetch * fetch_start(nsurl *url, nsurl *referer,
/* Determine whether to send the Referer header */
if (nsoption_bool(send_referer) && ref_scheme != NULL) {
- /* User permits us to send the header
+ /* User permits us to send the header
* Only send it if:
* 1) The fetch and referer schemes match
* or 2) The fetch is https and the referer is http
@@ -292,15 +487,15 @@ struct fetch * fetch_start(nsurl *url, nsurl *referer,
bool match1;
bool match2;
if (lwc_string_isequal(scheme, ref_scheme,
- &match) != lwc_error_ok) {
+ &match) != lwc_error_ok) {
match = false;
}
- if (lwc_string_isequal(scheme, fetch_https_lwc,
- &match1) != lwc_error_ok) {
+ if (lwc_string_isequal(scheme, corestring_lwc_https,
+ &match1) != lwc_error_ok) {
match1 = false;
}
- if (lwc_string_isequal(ref_scheme, fetch_http_lwc,
- &match2) != lwc_error_ok) {
+ if (lwc_string_isequal(ref_scheme, corestring_lwc_http,
+ &match2) != lwc_error_ok) {
match2= false;
}
if (match == true || (match1 == true && match2 == true))
@@ -310,261 +505,93 @@ struct fetch * fetch_start(nsurl *url, nsurl *referer,
lwc_string_unref(ref_scheme);
}
- /* Pick the scheme ops */
- while (fetcher) {
- if ((lwc_string_isequal(fetcher->scheme_name, scheme,
- &match) == lwc_error_ok) && (match == true)) {
- fetch->ops = fetcher;
- break;
- }
- fetcher = fetcher->next_fetcher;
- }
-
- if (fetch->ops == NULL)
- goto failed;
-
- /* Got a scheme fetcher, try and set up the fetch */
- fetch->fetcher_handle = fetch->ops->setup_fetch(fetch, url,
- only_2xx, downgrade_tls,
- post_urlenc, post_multipart,
- headers);
-
- if (fetch->fetcher_handle == NULL)
- goto failed;
-
- /* Rah, got it, so ref the fetcher. */
- fetch_ref_fetcher(fetch->ops);
-
/* these aren't needed past here */
lwc_string_unref(scheme);
- /* Dump us in the queue and ask the queue to run. */
- RING_INSERT(queue_ring, fetch);
- fetch_dispatch_jobs();
-
- return fetch;
-
-failed:
- lwc_string_unref(scheme);
-
- if (fetch->host != NULL)
- lwc_string_unref(fetch->host);
- if (fetch->url != NULL)
- nsurl_unref(fetch->url);
- if (fetch->referer != NULL)
- nsurl_unref(fetch->referer);
-
- free(fetch);
-
- return NULL;
-}
+ /* try and set up the fetch */
+ fetch->fetcher_handle = fetchers[fetch->fetcherd].ops.setup(fetch, url,
+ only_2xx, downgrade_tls,
+ post_urlenc, post_multipart,
+ headers);
+ if (fetch->fetcher_handle == NULL) {
+ if (fetch->host != NULL)
+ lwc_string_unref(fetch->host);
-/**
- * Dispatch as many jobs as we have room to dispatch.
- */
-void fetch_dispatch_jobs(void)
-{
- int all_active, all_queued;
-#ifdef DEBUG_FETCH_VERBOSE
- struct fetch *q;
- struct fetch *f;
-#endif
-
- if (!queue_ring)
- return; /* Nothing to do, the queue is empty */
- RING_GETSIZE(struct fetch, queue_ring, all_queued);
- RING_GETSIZE(struct fetch, fetch_ring, all_active);
+ if (fetch->url != NULL)
+ nsurl_unref(fetch->url);
-#ifdef DEBUG_FETCH_VERBOSE
- LOG(("queue_ring %i, fetch_ring %i", all_queued, all_active));
+ if (fetch->referer != NULL)
+ nsurl_unref(fetch->referer);
- q = queue_ring;
- if (q) {
- do {
- LOG(("queue_ring: %s", q->url));
- q = q->r_next;
- } while (q != queue_ring);
- }
- f = fetch_ring;
- if (f) {
- do {
- LOG(("fetch_ring: %s", f->url));
- f = f->r_next;
- } while (f != fetch_ring);
- }
-#endif
+ free(fetch);
- while ( all_queued && all_active < nsoption_int(max_fetchers) ) {
- /*LOG(("%d queued, %d fetching", all_queued, all_active));*/
- if (fetch_choose_and_dispatch()) {
- all_queued--;
- all_active++;
- } else {
- /* Either a dispatch failed or we ran out. Just stop */
- break;
- }
+ return NULL;
}
- fetch_active = (all_active > 0);
-#ifdef DEBUG_FETCH_VERBOSE
- LOG(("Fetch ring is now %d elements.", all_active));
- LOG(("Queue ring is now %d elements.", all_queued));
-#endif
-}
+ /* Rah, got it, so ref the fetcher. */
+ fetch_ref_fetcher(fetch->fetcherd);
-/**
- * Choose and dispatch a single job. Return false if we failed to dispatch
- * anything.
- *
- * We don't check the overall dispatch size here because we're not called unless
- * there is room in the fetch queue for us.
- */
-bool fetch_choose_and_dispatch(void)
-{
- bool same_host;
- struct fetch *queueitem;
- queueitem = queue_ring;
- do {
- /* We can dispatch the selected item if there is room in the
- * fetch ring
- */
- int countbyhost;
- RING_COUNTBYLWCHOST(struct fetch, fetch_ring, countbyhost,
- queueitem->host);
- if (countbyhost < nsoption_int(max_fetchers_per_host)) {
- /* We can dispatch this item in theory */
- return fetch_dispatch_job(queueitem);
- }
- /* skip over other items with the same host */
- same_host = true;
- while (same_host == true && queueitem->r_next != queue_ring) {
- if (lwc_string_isequal(queueitem->host,
- queueitem->r_next->host, &same_host) ==
- lwc_error_ok && same_host == true) {
- queueitem = queueitem->r_next;
- }
- }
- queueitem = queueitem->r_next;
- } while (queueitem != queue_ring);
- return false;
-}
-
+ /* Dump new fetch in the queue. */
+ RING_INSERT(queue_ring, fetch);
-/**
- * Dispatch a single job
- */
-bool fetch_dispatch_job(struct fetch *fetch)
-{
- RING_REMOVE(queue_ring, fetch);
-#ifdef DEBUG_FETCH_VERBOSE
- LOG(("Attempting to start fetch %p, fetcher %p, url %s", fetch,
- fetch->fetcher_handle, nsurl_access(fetch->url)));
-#endif
- if (!fetch->ops->start_fetch(fetch->fetcher_handle)) {
- RING_INSERT(queue_ring, fetch); /* Put it back on the end of the queue */
- return false;
- } else {
- RING_INSERT(fetch_ring, fetch);
- fetch->fetch_is_active = true;
- return true;
+ /* Ask the queue to run. */
+ if (fetch_dispatch_jobs()) {
+ FETCH_LOG(("scheduling poll"));
+ /* schedule active fetchers to run again in 10ms */
+ guit->browser->schedule(10, fetcher_poll, NULL);
}
-}
+ return fetch;
+}
-/**
- * Abort a fetch.
- */
-
+/* exported interface documented in content/fetch.h */
void fetch_abort(struct fetch *f)
{
assert(f);
-#ifdef DEBUG_FETCH_VERBOSE
- LOG(("fetch %p, fetcher %p, url '%s'", f, f->fetcher_handle,
- nsurl_access(f->url)));
-#endif
- f->ops->abort_fetch(f->fetcher_handle);
+ FETCH_LOG(("fetch %p, fetcher %p, url '%s'", f, f->fetcher_handle,
+ nsurl_access(f->url)));
+ fetchers[f->fetcherd].ops.abort(f->fetcher_handle);
}
-
-/**
- * Free a fetch structure and associated resources.
- */
-
+/* exported interface documented in content/fetch.h */
void fetch_free(struct fetch *f)
{
-#ifdef DEBUG_FETCH_VERBOSE
- LOG(("Freeing fetch %p, fetcher %p", f, f->fetcher_handle));
-#endif
- f->ops->free_fetch(f->fetcher_handle);
- fetch_unref_fetcher(f->ops);
- nsurl_unref(f->url);
- if (f->referer != NULL)
- nsurl_unref(f->referer);
- if (f->host != NULL)
- lwc_string_unref(f->host);
- free(f);
-}
+ FETCH_LOG(("Freeing fetch %p, fetcher %p", f, f->fetcher_handle));
+ fetchers[f->fetcherd].ops.free(f->fetcher_handle);
-/**
- * Do some work on current fetches.
- *
- * Must be called regularly to make progress on fetches.
- */
+ fetch_unref_fetcher(f->fetcherd);
-void fetch_poll(void)
-{
- scheme_fetcher *fetcher = fetchers;
- scheme_fetcher *next_fetcher;
-
- fetch_dispatch_jobs();
-
- if (!fetch_active)
- return; /* No point polling, there's no fetch active. */
- while (fetcher != NULL) {
- next_fetcher = fetcher->next_fetcher;
- if (fetcher->poll_fetcher != NULL) {
- /* LOG(("Polling fetcher for %s",
- lwc_string_data(fetcher->scheme_name))); */
- fetcher->poll_fetcher(fetcher->scheme_name);
- }
- fetcher = next_fetcher;
+ nsurl_unref(f->url);
+ if (f->referer != NULL) {
+ nsurl_unref(f->referer);
}
+ if (f->host != NULL) {
+ lwc_string_unref(f->host);
+ }
+ free(f);
}
-/**
- * Check if a URL's scheme can be fetched.
- *
- * \param url URL to check
- * \return true if the scheme is supported
- */
+/* exported interface documented in content/fetch.h */
bool fetch_can_fetch(const nsurl *url)
{
- scheme_fetcher *fetcher = fetchers;
- bool match;
lwc_string *scheme = nsurl_get_component(url, NSURL_SCHEME);
+ int fetcherd;
- while (fetcher != NULL) {
- if (lwc_string_isequal(fetcher->scheme_name, scheme, &match) == lwc_error_ok && match == true) {
- break;
- }
+ fetcherd = get_fetcher_for_scheme(scheme);
+ lwc_string_unref(scheme);
- fetcher = fetcher->next_fetcher;
+ if (fetcherd == -1) {
+ return false;
}
- lwc_string_unref(scheme);
-
- return fetcher == NULL ? false : fetcher->can_fetch(url);
+ return fetchers[fetcherd].ops.acceptable(url);
}
-
-/**
- * Change the callback function for a fetch.
- */
-
+/* exported interface documented in content/fetch.h */
void fetch_change_callback(struct fetch *fetch,
fetch_callback callback,
void *p)
@@ -574,22 +601,13 @@ void fetch_change_callback(struct fetch *fetch,
fetch->p = p;
}
-
-/**
- * Get the HTTP response code.
- */
-
+/* exported interface documented in content/fetch.h */
long fetch_http_code(struct fetch *fetch)
{
return fetch->http_code;
}
-/**
- * Determine if a fetch was verifiable
- *
- * \param fetch Fetch to consider
- * \return Verifiable status of fetch
- */
+/* exported interface documented in content/fetch.h */
bool fetch_get_verifiable(struct fetch *fetch)
{
assert(fetch);
@@ -597,14 +615,9 @@ bool fetch_get_verifiable(struct fetch *fetch)
return fetch->verifiable;
}
-/**
- * Clone a linked list of fetch_multipart_data.
- *
- * \param list List to clone
- * \return Pointer to head of cloned list, or NULL on failure
- */
-struct fetch_multipart_data *fetch_multipart_data_clone(
- const struct fetch_multipart_data *list)
+/* exported interface documented in content/fetch.h */
+struct fetch_multipart_data *
+fetch_multipart_data_clone(const struct fetch_multipart_data *list)
{
struct fetch_multipart_data *clone, *last = NULL;
struct fetch_multipart_data *result = NULL;
@@ -639,6 +652,21 @@ struct fetch_multipart_data *fetch_multipart_data_clone(
return NULL;
}
+ if (clone->file) {
+ clone->rawfile = strdup(list->rawfile);
+ if (clone->rawfile == NULL) {
+ free(clone->value);
+ free(clone->name);
+ free(clone);
+ if (result != NULL)
+ fetch_multipart_data_destroy(result);
+
+ return NULL;
+ }
+ } else {
+ clone->rawfile = NULL;
+ }
+
clone->next = NULL;
if (result == NULL)
@@ -652,11 +680,7 @@ struct fetch_multipart_data *fetch_multipart_data_clone(
return result;
}
-/**
- * Free a linked list of fetch_multipart_data.
- *
- * \param list Pointer to head of list to free
- */
+/* exported interface documented in content/fetch.h */
void fetch_multipart_data_destroy(struct fetch_multipart_data *list)
{
struct fetch_multipart_data *next;
@@ -665,10 +689,15 @@ void fetch_multipart_data_destroy(struct fetch_multipart_data *list)
next = list->next;
free(list->name);
free(list->value);
+ if (list->file) {
+ FETCH_LOG(("Freeing rawfile: %s", list->rawfile));
+ free(list->rawfile);
+ }
free(list);
}
}
+/* exported interface documented in content/fetch.h */
void
fetch_send_callback(const fetch_msg *msg, struct fetch *fetch)
{
@@ -676,42 +705,42 @@ fetch_send_callback(const fetch_msg *msg, struct fetch *fetch)
}
+/* exported interface documented in content/fetch.h */
void fetch_remove_from_queues(struct fetch *fetch)
{
- int all_active, all_queued;
+ FETCH_LOG(("Fetch %p, fetcher %p can be freed",
+ fetch, fetch->fetcher_handle));
/* Go ahead and free the fetch properly now */
-#ifdef DEBUG_FETCH_VERBOSE
- LOG(("Fetch %p, fetcher %p can be freed", fetch, fetch->fetcher_handle));
-#endif
-
if (fetch->fetch_is_active) {
RING_REMOVE(fetch_ring, fetch);
} else {
RING_REMOVE(queue_ring, fetch);
}
+#ifdef DEBUG_FETCH_VERBOSE
+ int all_active;
+ int all_queued;
+
RING_GETSIZE(struct fetch, fetch_ring, all_active);
RING_GETSIZE(struct fetch, queue_ring, all_queued);
- fetch_active = (all_active > 0);
-
-#ifdef DEBUG_FETCH_VERBOSE
LOG(("Fetch ring is now %d elements.", all_active));
+
LOG(("Queue ring is now %d elements.", all_queued));
#endif
}
-void
-fetch_set_http_code(struct fetch *fetch, long http_code)
+/* exported interface documented in content/fetch.h */
+void fetch_set_http_code(struct fetch *fetch, long http_code)
{
-#ifdef DEBUG_FETCH_VERBOSE
- LOG(("Setting HTTP code to %ld", http_code));
-#endif
+ FETCH_LOG(("Setting HTTP code to %ld", http_code));
+
fetch->http_code = http_code;
}
+/* exported interface documented in content/fetch.h */
const char *fetch_get_referer_to_send(struct fetch *fetch)
{
if (fetch->send_referer)
@@ -719,8 +748,8 @@ const char *fetch_get_referer_to_send(struct fetch *fetch)
return NULL;
}
-void
-fetch_set_cookie(struct fetch *fetch, const char *data)
+/* exported interface documented in content/fetch.h */
+void fetch_set_cookie(struct fetch *fetch, const char *data)
{
assert(fetch && data);
@@ -743,4 +772,3 @@ fetch_set_cookie(struct fetch *fetch, const char *data)
urldb_set_cookie(data, fetch->url, fetch->referer);
}
}
-
diff --git a/content/fetch.h b/content/fetch.h
index d23b3cd4b..37539ef2b 100644
--- a/content/fetch.h
+++ b/content/fetch.h
@@ -25,8 +25,6 @@
#include <stdbool.h>
-#include <libwapcaplet/libwapcaplet.h>
-
#include "utils/config.h"
#include "utils/nsurl.h"
@@ -79,6 +77,7 @@ struct fetch_multipart_data {
bool file; /**< Item is a file */
char *name; /**< Name of item */
char *value; /**< Item value */
+ char *rawfile; /**< Raw filename if file is true */
struct fetch_multipart_data *next; /**< Next in linked list */
};
@@ -94,76 +93,110 @@ struct ssl_cert_info {
int cert_type; /**< Certificate type */
};
-extern bool fetch_active;
-
typedef void (*fetch_callback)(const fetch_msg *msg, void *p);
-
-void fetch_init(void);
-struct fetch * fetch_start(nsurl *url, nsurl *referer,
- fetch_callback callback,
- void *p, bool only_2xx, const char *post_urlenc,
- const struct fetch_multipart_data *post_multipart,
- bool verifiable, bool downgrade_tls,
- const char *headers[]);
+/**
+ * Start fetching data for the given URL.
+ *
+ * The function returns immediately. The fetch may be queued for later
+ * processing.
+ *
+ * A pointer to an opaque struct fetch is returned, which can be passed to
+ * fetch_abort() to abort the fetch at any time. Returns NULL if memory is
+ * exhausted (or some other fatal error occurred).
+ *
+ * The caller must supply a callback function which is called when anything
+ * interesting happens. The callback function is first called with msg
+ * FETCH_HEADER, with the header in data, then one or more times
+ * with FETCH_DATA with some data for the url, and finally with
+ * FETCH_FINISHED. Alternatively, FETCH_ERROR indicates an error occurred:
+ * data contains an error message. FETCH_REDIRECT may replace the FETCH_HEADER,
+ * FETCH_DATA, FETCH_FINISHED sequence if the server sends a replacement URL.
+ *
+ */
+struct fetch *fetch_start(nsurl *url, nsurl *referer,
+ fetch_callback callback,
+ void *p, bool only_2xx, const char *post_urlenc,
+ const struct fetch_multipart_data *post_multipart,
+ bool verifiable, bool downgrade_tls,
+ const char *headers[]);
+
+/**
+ * Abort a fetch.
+ */
void fetch_abort(struct fetch *f);
-void fetch_poll(void);
-void fetch_quit(void);
-const char *fetch_filetype(const char *unix_path);
-char *fetch_mimetype(const char *ro_path);
+
+
+/**
+ * Check if a URL's scheme can be fetched.
+ *
+ * \param url URL to check
+ * \return true if the scheme is supported
+ */
bool fetch_can_fetch(const nsurl *url);
-void fetch_change_callback(struct fetch *fetch,
- fetch_callback callback,
- void *p);
+
+/**
+ * Change the callback function for a fetch.
+ */
+void fetch_change_callback(struct fetch *fetch, fetch_callback callback, void *p);
+
+/**
+ * Get the HTTP response code.
+ */
long fetch_http_code(struct fetch *fetch);
+
+/**
+ * Determine if a fetch was verifiable
+ *
+ * \param fetch Fetch to consider
+ * \return Verifiable status of fetch
+ */
bool fetch_get_verifiable(struct fetch *fetch);
+/**
+ * Free a linked list of fetch_multipart_data.
+ *
+ * \param list Pointer to head of list to free
+ */
void fetch_multipart_data_destroy(struct fetch_multipart_data *list);
-struct fetch_multipart_data *fetch_multipart_data_clone(
- const struct fetch_multipart_data *list);
-
-/* API for fetchers themselves */
-
-typedef bool (*fetcher_initialise)(lwc_string *scheme);
-typedef bool (*fetcher_can_fetch)(const nsurl *url);
-typedef void *(*fetcher_setup_fetch)(struct fetch *parent_fetch, nsurl *url,
- bool only_2xx, bool downgrade_tls, const char *post_urlenc,
- const struct fetch_multipart_data *post_multipart,
- const char **headers);
-typedef bool (*fetcher_start_fetch)(void *fetch);
-typedef void (*fetcher_abort_fetch)(void *fetch);
-typedef void (*fetcher_free_fetch)(void *fetch);
-typedef void (*fetcher_poll_fetcher)(lwc_string *scheme);
-typedef void (*fetcher_finalise)(lwc_string *scheme);
-
-/** Register a fetcher for a scheme
+
+/**
+ * Clone a linked list of fetch_multipart_data.
*
- * \param scheme scheme fetcher is for (caller relinquishes ownership)
- * \param initialiser fetcher initialiser
- * \param can_fetch fetcher can fetch function
- * \param setup_fetch fetcher fetch setup function
- * \param start_fetch fetcher fetch start function
- * \param abort_fetch fetcher fetch abort function
- * \param free_fetch fetcher fetch free function
- * \param poll_fetcher fetcher poll function
- * \param finaliser fetcher finaliser
- * \return true iff success
- */
-bool fetch_add_fetcher(lwc_string *scheme,
- fetcher_initialise initialiser,
- fetcher_can_fetch can_fetch,
- fetcher_setup_fetch setup_fetch,
- fetcher_start_fetch start_fetch,
- fetcher_abort_fetch abort_fetch,
- fetcher_free_fetch free_fetch,
- fetcher_poll_fetcher poll_fetcher,
- fetcher_finalise finaliser);
+ * \param list List to clone
+ * \return Pointer to head of cloned list, or NULL on failure
+ */
+struct fetch_multipart_data *fetch_multipart_data_clone(const struct fetch_multipart_data *list);
+/**
+ * send message to fetch
+ */
void fetch_send_callback(const fetch_msg *msg, struct fetch *fetch);
+
+/**
+ * remove a queued fetch
+ */
void fetch_remove_from_queues(struct fetch *fetch);
+
+/**
+ * Free a fetch structure and associated resources.
+ */
void fetch_free(struct fetch *f);
+
+/**
+ * set the http code of a fetch
+ */
void fetch_set_http_code(struct fetch *fetch, long http_code);
+
+/**
+ * get the referer from the fetch
+ */
const char *fetch_get_referer_to_send(struct fetch *fetch);
+
+/**
+ * set cookie data on a fetch
+ */
void fetch_set_cookie(struct fetch *fetch, const char *data);
+
#endif
diff --git a/content/fetchers.h b/content/fetchers.h
new file mode 100644
index 000000000..95034bbff
--- /dev/null
+++ b/content/fetchers.h
@@ -0,0 +1,152 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * \file content/fetchers.h
+ *
+ * Interface for fetchers factory.
+ */
+
+#ifndef _NETSURF_DESKTOP_FETCHERS_H_
+#define _NETSURF_DESKTOP_FETCHERS_H_
+
+#include "utils/config.h"
+#include <libwapcaplet/libwapcaplet.h>
+
+struct nsurl;
+struct fetch_multipart_data;
+struct fetch;
+
+/**
+ * Fetcher operations API
+ *
+ * These are the operations a fetcher must implement.
+ *
+ * Each fetcher is called once for initialisaion and finalisation.
+ * The poll entry point will be called to allow all active fetches to progress.
+ * The flow of a fetch operation is:
+ * URL is checked for aceptability.
+ * setup with all applicable data.
+ * start is called before teh first poll
+ * after completion or abort it is freed
+ *
+ */
+struct fetcher_operation_table {
+ /**
+ * The initialiser for the fetcher.
+ *
+ * Called once to initialise the fetcher.
+ */
+ bool (*initialise)(lwc_string *scheme);
+
+ /**
+ * Can this fetcher accept a url.
+ *
+ * \param url the URL to check
+ * \return true if the fetcher can handle the url else false.
+ */
+ bool (*acceptable)(const struct nsurl *url);
+
+ /**
+ * Setup a fetch
+ */
+ void *(*setup)(struct fetch *parent_fetch, struct nsurl *url,
+ bool only_2xx, bool downgrade_tls, const char *post_urlenc,
+ const struct fetch_multipart_data *post_multipart,
+ const char **headers);
+
+ /**
+ * start a fetch.
+ */
+ bool (*start)(void *fetch);
+
+ /**
+ * abort a fetch.
+ */
+ void (*abort)(void *fetch);
+
+ /**
+ * free a fetch allocated through the setup method.
+ */
+ void (*free)(void *fetch);
+
+ /**
+ * poll a fetcher to let it make progress.
+ */
+ void (*poll)(lwc_string *scheme);
+
+ /**
+ * Finalise the fetcher.
+ */
+ void (*finalise)(lwc_string *scheme);
+};
+
+
+/**
+ * Register a fetcher for a scheme
+ *
+ * \param scheme The scheme fetcher is for (caller relinquishes ownership)
+ * \param ops The operations for the fetcher.
+ * \return NSERROR_OK or appropriate error code.
+ */
+nserror fetcher_add(lwc_string *scheme, const struct fetcher_operation_table *ops);
+
+
+/**
+ * Initialise all registered fetchers.
+ *
+ * \return NSERROR_OK or error code
+ */
+nserror fetcher_init(void);
+
+
+/**
+ * Clean up for quit.
+ *
+ * Must be called before exiting.
+ */
+void fetcher_quit(void);
+
+
+/**
+ * Get the set of file descriptors the fetchers are currently using.
+ *
+ * This obtains the file descriptors the fetch system is using to
+ * obtain data. It will cause the fetchers to make progress, if
+ * possible, potentially completing fetches before requiring activity
+ * on file descriptors.
+ *
+ * If a set of descriptors is returned (maxfd is not -1) The caller is
+ * expected to wait on them (with select etc.) and continue to obtain
+ * the fdset with this call. This will switch the fetchers from polled
+ * mode to waiting for network activity which is much more efficient.
+ *
+ * \note If the caller does not subsequently obtain the fdset again
+ * the fetchers will fall back to the less efficient polled
+ * operation. The fallback to polled operation will only occour after
+ * a timeout which introduces additional delay.
+ *
+ * \param read_fd_set[out] The fd set for read.
+ * \param write_fd_set[out] The fd set for write.
+ * \param except_fd_set[out] The fd set for exceptions.
+ * \param maxfd[out] The highest fd number in the set or -1 if no fd available.
+ * \return NSERROR_OK on success or appropriate error code.
+ */
+nserror fetcher_fdset(fd_set *read_fd_set, fd_set *write_fd_set, fd_set *except_fd_set, int *maxfd);
+
+#endif
diff --git a/content/fetchers/Makefile b/content/fetchers/Makefile
index 06e38e4c8..855154232 100644
--- a/content/fetchers/Makefile
+++ b/content/fetchers/Makefile
@@ -5,4 +5,4 @@ S_FETCHERS := curl.c data.c file.c about.c resource.c
S_FETCHERS := $(addprefix content/fetchers/,$(S_FETCHERS))
# The following files depend on the testament
-content/fetchers/about.c: testament utils/testament.h
+content/fetchers/about.c: testament $(OBJROOT)/testament.h
diff --git a/content/fetchers/about.c b/content/fetchers/about.c
index cac8b2b01..8c4d29a91 100644
--- a/content/fetchers/about.c
+++ b/content/fetchers/about.c
@@ -41,19 +41,20 @@
#include <libwapcaplet/libwapcaplet.h>
+#include "testament.h"
+
#include "utils/config.h"
-#include "content/dirlist.h"
#include "content/fetch.h"
+#include "content/fetchers.h"
#include "content/fetchers/about.h"
#include "content/urldb.h"
#include "desktop/netsurf.h"
#include "utils/nsoption.h"
+#include "utils/corestrings.h"
#include "utils/log.h"
#include "utils/messages.h"
-#include "utils/url.h"
#include "utils/utils.h"
#include "utils/ring.h"
-#include "utils/testament.h"
#include "image/image_cache.h"
struct fetch_about_context;
@@ -489,8 +490,8 @@ static bool fetch_about_testament_handler(struct fetch_about_context *ctx)
slen = snprintf(buffer, sizeof buffer,
- "Built by %s (%s) from %s at revision %s\n\n",
- GECOS, USERNAME, WT_BRANCHPATH, WT_REVID);
+ "Built by %s (%s) from %s at revision %s on %s\n\n",
+ GECOS, USERNAME, WT_BRANCHPATH, WT_REVID, WT_COMPILEDATE);
msg.data.header_or_data.len = slen;
if (fetch_about_send_callback(&msg, ctx))
@@ -837,23 +838,19 @@ static void fetch_about_poll(lwc_string *scheme)
} while ( (c = next) != ring && ring != NULL);
}
-void fetch_about_register(void)
+nserror fetch_about_register(void)
{
- lwc_string *scheme;
-
- if (lwc_intern_string("about", SLEN("about"),
- &scheme) != lwc_error_ok) {
- die("Failed to initialise the fetch module "
- "(couldn't intern \"about\").");
- }
-
- fetch_add_fetcher(scheme,
- fetch_about_initialise,
- fetch_about_can_fetch,
- fetch_about_setup,
- fetch_about_start,
- fetch_about_abort,
- fetch_about_free,
- fetch_about_poll,
- fetch_about_finalise);
+ lwc_string *scheme = lwc_string_ref(corestring_lwc_about);
+ const struct fetcher_operation_table fetcher_ops = {
+ .initialise = fetch_about_initialise,
+ .acceptable = fetch_about_can_fetch,
+ .setup = fetch_about_setup,
+ .start = fetch_about_start,
+ .abort = fetch_about_abort,
+ .free = fetch_about_free,
+ .poll = fetch_about_poll,
+ .finalise = fetch_about_finalise
+ };
+
+ return fetcher_add(scheme, &fetcher_ops);
}
diff --git a/content/fetchers/about.h b/content/fetchers/about.h
index f22be6a5d..9544971a6 100644
--- a/content/fetchers/about.h
+++ b/content/fetchers/about.h
@@ -23,6 +23,6 @@
#ifndef NETSURF_CONTENT_FETCHERS_FETCH_ABOUT_H
#define NETSURF_CONTENT_FETCHERS_FETCH_ABOUT_H
-void fetch_about_register(void);
+nserror fetch_about_register(void);
#endif
diff --git a/content/fetchers/curl.c b/content/fetchers/curl.c
index 1dfc44631..51b0f9974 100644
--- a/content/fetchers/curl.c
+++ b/content/fetchers/curl.c
@@ -19,7 +19,7 @@
*/
/** \file
- * Fetching of data from a URL (implementation).
+ * Fetching of data from an URL (implementation).
*
* This implementation uses libcurl's 'multi' interface.
*
@@ -36,32 +36,27 @@
#include <strings.h>
#include <time.h>
#include <sys/stat.h>
+#include <openssl/ssl.h>
#include <libwapcaplet/libwapcaplet.h>
#include "utils/config.h"
-#include <openssl/ssl.h>
-#include "content/fetch.h"
-#include "content/fetchers/curl.h"
-#include "content/urldb.h"
#include "desktop/netsurf.h"
+#include "desktop/gui_factory.h"
+#include "utils/corestrings.h"
#include "utils/nsoption.h"
#include "utils/log.h"
#include "utils/messages.h"
-#include "utils/schedule.h"
#include "utils/utils.h"
#include "utils/ring.h"
#include "utils/useragent.h"
+#include "utils/file.h"
-/* BIG FAT WARNING: This is here because curl doesn't give you an FD to
- * poll on, until it has processed a bit of the handle. So we need schedules
- * in order to make this work.
- */
-#include <desktop/browser.h>
+#include "content/fetch.h"
+#include "content/fetchers.h"
+#include "content/fetchers/curl.h"
+#include "content/urldb.h"
-/* uncomment this to use scheduler based calling
-#define FETCHER_CURLL_SCHEDULED 1
-*/
/** SSL certificate info */
struct cert_info {
@@ -163,6 +158,16 @@ void fetch_curl_register(void)
curl_version_info_data *data;
int i;
lwc_string *scheme;
+ const struct fetcher_operation_table fetcher_ops = {
+ .initialise = fetch_curl_initialise,
+ .acceptable = fetch_curl_can_fetch,
+ .setup = fetch_curl_setup,
+ .start = fetch_curl_start,
+ .abort = fetch_curl_abort,
+ .free = fetch_curl_free,
+ .poll = fetch_curl_poll,
+ .finalise = fetch_curl_finalise
+ };
LOG(("curl_version %s", curl_version()));
@@ -176,6 +181,25 @@ void fetch_curl_register(void)
die("Failed to initialise the fetch module "
"(curl_multi_init failed).");
+#if LIBCURL_VERSION_NUM >= 0x071e00
+ /* We've been built against 7.30.0 or later: configure caching */
+ {
+ CURLMcode mcode;
+ int maxconnects = nsoption_int(max_fetchers) +
+ nsoption_int(max_cached_fetch_handles);
+
+#undef SETOPT
+#define SETOPT(option, value) \
+ mcode = curl_multi_setopt(fetch_curl_multi, option, value); \
+ if (mcode != CURLM_OK) \
+ goto curl_multi_setopt_failed;
+
+ SETOPT(CURLMOPT_MAXCONNECTS, maxconnects);
+ SETOPT(CURLMOPT_MAX_TOTAL_CONNECTIONS, maxconnects);
+ SETOPT(CURLMOPT_MAX_HOST_CONNECTIONS, nsoption_int(max_fetchers_per_host));
+ }
+#endif
+
/* Create a curl easy handle with the options that are common to all
fetches. */
fetch_blank_curl = curl_easy_init();
@@ -235,37 +259,17 @@ void fetch_curl_register(void)
for (i = 0; data->protocols[i]; i++) {
if (strcmp(data->protocols[i], "http") == 0) {
- if (lwc_intern_string("http", SLEN("http"),
- &scheme) != lwc_error_ok) {
- die("Failed to initialise the fetch module "
- "(couldn't intern \"http\").");
- }
+ scheme = lwc_string_ref(corestring_lwc_http);
} else if (strcmp(data->protocols[i], "https") == 0) {
- if (lwc_intern_string("https", SLEN("https"),
- &scheme) != lwc_error_ok) {
- die("Failed to initialise the fetch module "
- "(couldn't intern \"https\").");
- }
+ scheme = lwc_string_ref(corestring_lwc_https);
} else {
/* Ignore non-http(s) protocols */
continue;
}
- if (!fetch_add_fetcher(scheme,
- fetch_curl_initialise,
- fetch_curl_can_fetch,
- fetch_curl_setup,
- fetch_curl_start,
- fetch_curl_abort,
- fetch_curl_free,
-#ifdef FETCHER_CURLL_SCHEDULED
- NULL,
-#else
- fetch_curl_poll,
-#endif
- fetch_curl_finalise)) {
+ if (fetcher_add(scheme, &fetcher_ops) != NSERROR_OK) {
LOG(("Unable to register cURL fetcher for %s",
data->protocols[i]));
}
@@ -275,6 +279,12 @@ void fetch_curl_register(void)
curl_easy_setopt_failed:
die("Failed to initialise the fetch module "
"(curl_easy_setopt failed).");
+
+#if LIBCURL_VERSION_NUM >= 0x071e00
+curl_multi_setopt_failed:
+ die("Failed to initialise the fetch module "
+ "(curl_multi_setopt failed).");
+#endif
}
@@ -490,9 +500,7 @@ bool fetch_curl_initiate_fetch(struct curl_fetch_info *fetch, CURL *handle)
/* add to the global curl multi handle */
codem = curl_multi_add_handle(fetch_curl_multi, fetch->curl_handle);
assert(codem == CURLM_OK || codem == CURLM_CALL_MULTI_PERFORM);
-
- schedule(1, (schedule_callback_fn)fetch_curl_poll, NULL);
-
+
return true;
}
@@ -524,6 +532,11 @@ CURL *fetch_curl_get_handle(lwc_string *host)
void fetch_curl_cache_handle(CURL *handle, lwc_string *host)
{
+#if LIBCURL_VERSION_NUM >= 0x071e00
+ /* 7.30.0 or later has its own connection caching; suppress ours */
+ curl_easy_cleanup(handle);
+ return;
+#else
struct cache_handle *h = 0;
int c;
RING_FINDBYLWCHOST(curl_handle_ring, h, host);
@@ -561,6 +574,7 @@ void fetch_curl_cache_handle(CURL *handle, lwc_string *host)
h->handle = handle;
h->host = lwc_string_ref(host);
RING_INSERT(curl_handle_ring, h);
+#endif
}
@@ -687,16 +701,14 @@ fetch_curl_sslctxfun(CURL *curl_handle, void *_sslctx, void *parm)
parm);
if (f->downgrade_tls) {
+ /* Disable TLS 1.1/1.2 if the server can't cope with them */
#ifdef SSL_OP_NO_TLSv1_1
- /* Disable TLS1.1, if the server can't cope with it */
options |= SSL_OP_NO_TLSv1_1;
#endif
- }
-
#ifdef SSL_OP_NO_TLSv1_2
- /* Disable TLS1.2, as it causes some servers to stall. */
- options |= SSL_OP_NO_TLSv1_2;
+ options |= SSL_OP_NO_TLSv1_2;
#endif
+ }
SSL_CTX_set_options(sslctx, options);
@@ -817,12 +829,6 @@ void fetch_curl_poll(lwc_string *scheme_ignored)
}
curl_msg = curl_multi_info_read(fetch_curl_multi, &queue);
}
-
-#ifdef FETCHER_CURLL_SCHEDULED
- if (running != 0) {
- schedule(1, (schedule_callback_fn)fetch_curl_poll, fetch_curl_poll);
- }
-#endif
}
@@ -915,10 +921,12 @@ void fetch_curl_done(CURL *curl_handle, CURLcode result)
BIO_get_mem_ptr(mem, &buf);
(void) BIO_set_close(mem, BIO_NOCLOSE);
BIO_free(mem);
- snprintf(ssl_certs[i].not_before,
- min(sizeof ssl_certs[i].not_before,
- (unsigned) buf->length + 1),
- "%s", buf->data);
+ memcpy(ssl_certs[i].not_before,
+ buf->data,
+ min(sizeof(ssl_certs[i].not_before) - 1,
+ (unsigned)buf->length));
+ ssl_certs[i].not_before[min(sizeof(ssl_certs[i].not_before) - 1,
+ (unsigned)buf->length)] = 0;
BUF_MEM_free(buf);
mem = BIO_new(BIO_s_mem());
@@ -927,10 +935,13 @@ void fetch_curl_done(CURL *curl_handle, CURLcode result)
BIO_get_mem_ptr(mem, &buf);
(void) BIO_set_close(mem, BIO_NOCLOSE);
BIO_free(mem);
- snprintf(ssl_certs[i].not_after,
- min(sizeof ssl_certs[i].not_after,
- (unsigned) buf->length + 1),
- "%s", buf->data);
+ memcpy(ssl_certs[i].not_after,
+ buf->data,
+ min(sizeof(ssl_certs[i].not_after) - 1,
+ (unsigned)buf->length));
+ ssl_certs[i].not_after[min(sizeof(ssl_certs[i].not_after) - 1,
+ (unsigned)buf->length)] = 0;
+
BUF_MEM_free(buf);
ssl_certs[i].sig_type =
@@ -946,24 +957,30 @@ void fetch_curl_done(CURL *curl_handle, CURLcode result)
BIO_get_mem_ptr(mem, &buf);
(void) BIO_set_close(mem, BIO_NOCLOSE);
BIO_free(mem);
- snprintf(ssl_certs[i].issuer,
- min(sizeof ssl_certs[i].issuer,
- (unsigned) buf->length + 1),
- "%s", buf->data);
+ memcpy(ssl_certs[i].issuer,
+ buf->data,
+ min(sizeof(ssl_certs[i].issuer) - 1,
+ (unsigned) buf->length));
+ ssl_certs[i].issuer[min(sizeof(ssl_certs[i].issuer) - 1,
+ (unsigned) buf->length)] = 0;
BUF_MEM_free(buf);
mem = BIO_new(BIO_s_mem());
X509_NAME_print_ex(mem,
X509_get_subject_name(certs[i].cert),
- 0, XN_FLAG_SEP_CPLUS_SPC |
- XN_FLAG_DN_REV | XN_FLAG_FN_NONE);
+ 0,
+ XN_FLAG_SEP_CPLUS_SPC |
+ XN_FLAG_DN_REV |
+ XN_FLAG_FN_NONE);
BIO_get_mem_ptr(mem, &buf);
(void) BIO_set_close(mem, BIO_NOCLOSE);
BIO_free(mem);
- snprintf(ssl_certs[i].subject,
- min(sizeof ssl_certs[i].subject,
- (unsigned) buf->length + 1),
- "%s", buf->data);
+ memcpy(ssl_certs[i].subject,
+ buf->data,
+ min(sizeof(ssl_certs[i].subject) - 1,
+ (unsigned)buf->length));
+ ssl_certs[i].subject[min(sizeof(ssl_certs[i].subject) - 1,
+ (unsigned) buf->length)] = 0;
BUF_MEM_free(buf);
ssl_certs[i].cert_type =
@@ -1263,15 +1280,15 @@ fetch_curl_post_convert(const struct fetch_multipart_data *control)
{
struct curl_httppost *post = 0, *last = 0;
CURLFORMcode code;
+ nserror ret;
for (; control; control = control->next) {
if (control->file) {
- char *leafname = 0;
-
- leafname = filename_from_path(control->value);
-
- if (leafname == NULL)
+ char *leafname = NULL;
+ ret = guit->file->basename(control->value, &leafname, NULL);
+ if (ret != NSERROR_OK) {
continue;
+ }
/* We have to special case filenames of "", so curl
* a) actually attempts the fetch and
@@ -1298,10 +1315,10 @@ fetch_curl_post_convert(const struct fetch_multipart_data *control)
LOG(("curl_formadd: %d (%s)",
code, control->name));
} else {
- char *mimetype = fetch_mimetype(control->value);
+ char *mimetype = guit->fetch->mimetype(control->value);
code = curl_formadd(&post, &last,
CURLFORM_COPYNAME, control->name,
- CURLFORM_FILE, control->value,
+ CURLFORM_FILE, control->rawfile,
CURLFORM_FILENAME, leafname,
CURLFORM_CONTENTTYPE,
(mimetype != 0 ? mimetype : "text/plain"),
diff --git a/content/fetchers/data.c b/content/fetchers/data.c
index fbaa24780..94ba63827 100644
--- a/content/fetchers/data.c
+++ b/content/fetchers/data.c
@@ -31,13 +31,14 @@
#include "utils/config.h"
#include "content/fetch.h"
+#include "content/fetchers.h"
#include "content/fetchers/data.h"
#include "content/urldb.h"
#include "desktop/netsurf.h"
+#include "utils/corestrings.h"
#include "utils/nsoption.h"
#include "utils/log.h"
#include "utils/messages.h"
-#include "utils/url.h"
#include "utils/utils.h"
#include "utils/ring.h"
#include "utils/base64.h"
@@ -324,22 +325,19 @@ static void fetch_data_poll(lwc_string *scheme)
} while ( (c = next) != ring && ring != NULL);
}
-void fetch_data_register(void)
+nserror fetch_data_register(void)
{
- lwc_string *scheme;
-
- if (lwc_intern_string("data", SLEN("data"), &scheme) != lwc_error_ok) {
- die("Failed to initialise the fetch module "
- "(couldn't intern \"data\").");
- }
-
- fetch_add_fetcher(scheme,
- fetch_data_initialise,
- fetch_data_can_fetch,
- fetch_data_setup,
- fetch_data_start,
- fetch_data_abort,
- fetch_data_free,
- fetch_data_poll,
- fetch_data_finalise);
+ lwc_string *scheme = lwc_string_ref(corestring_lwc_data);
+ const struct fetcher_operation_table fetcher_ops = {
+ .initialise = fetch_data_initialise,
+ .acceptable = fetch_data_can_fetch,
+ .setup = fetch_data_setup,
+ .start = fetch_data_start,
+ .abort = fetch_data_abort,
+ .free = fetch_data_free,
+ .poll = fetch_data_poll,
+ .finalise = fetch_data_finalise
+ };
+
+ return fetcher_add(scheme, &fetcher_ops);
}
diff --git a/content/fetchers/data.h b/content/fetchers/data.h
index 76f02cb3b..f6017e07a 100644
--- a/content/fetchers/data.h
+++ b/content/fetchers/data.h
@@ -23,6 +23,6 @@
#ifndef NETSURF_CONTENT_FETCHERS_FETCH_DATA_H
#define NETSURF_CONTENT_FETCHERS_FETCH_DATA_H
-void fetch_data_register(void);
+nserror fetch_data_register(void);
#endif
diff --git a/content/fetchers/file.c b/content/fetchers/file.c
index c574c2160..f08be6288 100644
--- a/content/fetchers/file.c
+++ b/content/fetchers/file.c
@@ -18,6 +18,8 @@
/* file: URL handling. Based on the data fetcher by Rob Kendrick */
+#include "utils/config.h"
+
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
@@ -34,26 +36,28 @@
#include <limits.h>
#include <stdarg.h>
-#include "utils/config.h"
-
#ifdef HAVE_MMAP
#include <sys/mman.h>
#endif
#include <libwapcaplet/libwapcaplet.h>
-#include "content/dirlist.h"
-#include "content/fetch.h"
-#include "content/fetchers/file.h"
-#include "content/urldb.h"
#include "desktop/netsurf.h"
+#include "desktop/gui_factory.h"
+#include "utils/corestrings.h"
#include "utils/nsoption.h"
#include "utils/errors.h"
#include "utils/log.h"
#include "utils/messages.h"
-#include "utils/url.h"
#include "utils/utils.h"
#include "utils/ring.h"
+#include "utils/file.h"
+
+#include "content/dirlist.h"
+#include "content/fetch.h"
+#include "content/fetchers.h"
+#include "content/urldb.h"
+#include "content/fetchers/file.h"
/* Maximum size of read buffer */
#define FETCH_FILE_MAX_BUF_SIZE (1024 * 1024)
@@ -135,13 +139,14 @@ fetch_file_setup(struct fetch *fetchh,
{
struct fetch_file_context *ctx;
int i;
+ nserror ret;
ctx = calloc(1, sizeof(*ctx));
if (ctx == NULL)
return NULL;
- ctx->path = url_to_path(nsurl_access(url));
- if (ctx->path == NULL) {
+ ret = guit->file->nsurl_to_path(url, &ctx->path);
+ if (ret != NSERROR_OK) {
free(ctx);
return NULL;
}
@@ -304,7 +309,7 @@ static void fetch_file_process_plain(struct fetch_file_context *ctx,
/* content type */
if (fetch_file_send_header(ctx, "Content-Type: %s",
- fetch_filetype(ctx->path)))
+ guit->fetch->filetype(ctx->path)))
goto fetch_file_process_aborted;
/* content length */
@@ -384,7 +389,7 @@ fetch_file_process_aborted:
/* content type */
if (fetch_file_send_header(ctx, "Content-Type: %s",
- fetch_filetype(ctx->path)))
+ guit->fetch->filetype(ctx->path)))
goto fetch_file_process_aborted;
/* content length */
@@ -487,6 +492,98 @@ static char *gen_nice_title(char *path)
return title;
}
+/**
+ * generate an output row of the directory listing.
+ *
+ * @param ent current directory entry.
+ */
+static nserror
+process_dir_ent(struct fetch_file_context *ctx,
+ struct dirent *ent,
+ bool even,
+ char *buffer,
+ size_t buffer_len)
+{
+ nserror ret;
+ char *urlpath = NULL; /* buffer for leaf entry path */
+ struct stat ent_stat; /* stat result of leaf entry */
+ char datebuf[64]; /* buffer for date text */
+ char timebuf[64]; /* buffer for time text */
+ nsurl *url;
+
+ /* skip hidden files */
+ if (ent->d_name[0] == '.') {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ ret = netsurf_mkpath(&urlpath, NULL, 2, ctx->path, ent->d_name);
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+
+ if (stat(urlpath, &ent_stat) != 0) {
+ ent_stat.st_mode = 0;
+ datebuf[0] = 0;
+ timebuf[0] = 0;
+ } else {
+ /* Get date in output format */
+ if (strftime((char *)&datebuf, sizeof datebuf, "%a %d %b %Y",
+ localtime(&ent_stat.st_mtime)) == 0) {
+ datebuf[0] = '-';
+ datebuf[1] = 0;
+ }
+
+ /* Get time in output format */
+ if (strftime((char *)&timebuf, sizeof timebuf, "%H:%M",
+ localtime(&ent_stat.st_mtime)) == 0) {
+ timebuf[0] = '-';
+ timebuf[1] = 0;
+ }
+ }
+
+ ret = guit->file->path_to_nsurl(urlpath, &url);
+ if (ret != NSERROR_OK) {
+ free(urlpath);
+ return ret;
+ }
+
+ if (S_ISREG(ent_stat.st_mode)) {
+ /* regular file */
+ dirlist_generate_row(even,
+ false,
+ url,
+ ent->d_name,
+ guit->fetch->filetype(urlpath),
+ ent_stat.st_size,
+ datebuf, timebuf,
+ buffer, buffer_len);
+ } else if (S_ISDIR(ent_stat.st_mode)) {
+ /* directory */
+ dirlist_generate_row(even,
+ true,
+ url,
+ ent->d_name,
+ messages_get("FileDirectory"),
+ -1,
+ datebuf, timebuf,
+ buffer, buffer_len);
+ } else {
+ /* something else */
+ dirlist_generate_row(even,
+ false,
+ url,
+ ent->d_name,
+ "",
+ -1,
+ datebuf, timebuf,
+ buffer, buffer_len);
+ }
+
+ nsurl_unref(url);
+ free(urlpath);
+
+ return NSERROR_OK;
+}
static void fetch_file_process_dir(struct fetch_file_context *ctx,
struct stat *fdstat)
@@ -497,13 +594,7 @@ static void fetch_file_process_dir(struct fetch_file_context *ctx,
char *title; /* pretty printed title */
nserror err; /* result from url routines */
nsurl *up; /* url of parent */
- char *path; /* url for list entries */
- struct stat ent_stat; /* stat result of leaf entry */
- char datebuf[64]; /* buffer for date text */
- char timebuf[64]; /* buffer for time text */
- char urlpath[PATH_MAX]; /* buffer for leaf entry path */
- struct dirent *ent; /* current directory entry */
struct dirent **listing = NULL; /* directory entry listing */
int i; /* directory entry index */
int n; /* number of directory entries */
@@ -568,78 +659,17 @@ static void fetch_file_process_dir(struct fetch_file_context *ctx,
goto fetch_file_process_dir_aborted;
for (i = 0; i < n; i++) {
- ent = listing[i];
-
- if (ent->d_name[0] == '.')
- continue;
-
- strncpy(urlpath, ctx->path, sizeof urlpath);
- if (path_add_part(urlpath, sizeof urlpath,
- ent->d_name) == false)
- continue;
-
- if (stat(urlpath, &ent_stat) != 0) {
- ent_stat.st_mode = 0;
- datebuf[0] = 0;
- timebuf[0] = 0;
- } else {
- /* Get date in output format */
- if (strftime((char *)&datebuf, sizeof datebuf,
- "%a %d %b %Y",
- localtime(&ent_stat.st_mtime)) == 0) {
- strncpy(datebuf, "-", sizeof datebuf);
- }
- /* Get time in output format */
- if (strftime((char *)&timebuf, sizeof timebuf,
- "%H:%M",
- localtime(&ent_stat.st_mtime)) == 0) {
- strncpy(timebuf, "-", sizeof timebuf);
- }
- }
+ err = process_dir_ent(ctx, listing[i], even, buffer,
+ sizeof(buffer));
- if((path = path_to_url(urlpath)) == NULL)
- continue;
+ if (err == NSERROR_OK) {
+ msg.data.header_or_data.len = strlen(buffer);
+ if (fetch_file_send_callback(&msg, ctx))
+ goto fetch_file_process_dir_aborted;
- if (S_ISREG(ent_stat.st_mode)) {
- /* regular file */
- dirlist_generate_row(even,
- false,
- path,
- ent->d_name,
- fetch_filetype(urlpath),
- ent_stat.st_size,
- datebuf, timebuf,
- buffer, sizeof(buffer));
- } else if (S_ISDIR(ent_stat.st_mode)) {
- /* directory */
- dirlist_generate_row(even,
- true,
- path,
- ent->d_name,
- messages_get("FileDirectory"),
- -1,
- datebuf, timebuf,
- buffer, sizeof(buffer));
- } else {
- /* something else */
- dirlist_generate_row(even,
- false,
- path,
- ent->d_name,
- "",
- -1,
- datebuf, timebuf,
- buffer, sizeof(buffer));
+ even = !even;
}
-
- free(path);
-
- msg.data.header_or_data.len = strlen(buffer);
- if (fetch_file_send_callback(&msg, ctx))
- goto fetch_file_process_dir_aborted;
-
- even = !even;
}
/* directory listing bottom */
@@ -731,22 +761,19 @@ static void fetch_file_poll(lwc_string *scheme)
} while ( (c = next) != ring && ring != NULL);
}
-void fetch_file_register(void)
+nserror fetch_file_register(void)
{
- lwc_string *scheme;
-
- if (lwc_intern_string("file", SLEN("file"), &scheme) != lwc_error_ok) {
- die("Failed to initialise the fetch module "
- "(couldn't intern \"file\").");
- }
-
- fetch_add_fetcher(scheme,
- fetch_file_initialise,
- fetch_file_can_fetch,
- fetch_file_setup,
- fetch_file_start,
- fetch_file_abort,
- fetch_file_free,
- fetch_file_poll,
- fetch_file_finalise);
+ lwc_string *scheme = lwc_string_ref(corestring_lwc_file);
+ const struct fetcher_operation_table fetcher_ops = {
+ .initialise = fetch_file_initialise,
+ .acceptable = fetch_file_can_fetch,
+ .setup = fetch_file_setup,
+ .start = fetch_file_start,
+ .abort = fetch_file_abort,
+ .free = fetch_file_free,
+ .poll = fetch_file_poll,
+ .finalise = fetch_file_finalise
+ };
+
+ return fetcher_add(scheme, &fetcher_ops);
}
diff --git a/content/fetchers/file.h b/content/fetchers/file.h
index d1621b9ba..b3c39db9f 100644
--- a/content/fetchers/file.h
+++ b/content/fetchers/file.h
@@ -23,6 +23,6 @@
#ifndef NETSURF_CONTENT_FETCHERS_FETCH_FILE_H
#define NETSURF_CONTENT_FETCHERS_FETCH_FILE_H
-void fetch_file_register(void);
+nserror fetch_file_register(void);
#endif
diff --git a/content/fetchers/resource.c b/content/fetchers/resource.c
index 0119c6b3b..18e302140 100644
--- a/content/fetchers/resource.c
+++ b/content/fetchers/resource.c
@@ -37,17 +37,19 @@
#include <libwapcaplet/libwapcaplet.h>
#include "utils/config.h"
-#include "content/dirlist.h"
-#include "content/fetch.h"
-#include "content/fetchers/resource.h"
-#include "content/urldb.h"
-#include "desktop/gui.h"
+#include "utils/errors.h"
+#include "utils/corestrings.h"
#include "utils/nsoption.h"
#include "utils/log.h"
#include "utils/messages.h"
-#include "utils/url.h"
#include "utils/utils.h"
#include "utils/ring.h"
+#include "desktop/gui_factory.h"
+
+#include "content/fetch.h"
+#include "content/fetchers.h"
+#include "content/fetchers/resource.h"
+#include "content/urldb.h"
struct fetch_resource_context;
@@ -81,6 +83,7 @@ static const char *fetch_resource_paths[] = {
"licence.html",
"welcome.html",
"favicon.ico",
+ "default.ico",
"netsurf.png",
"icons/arrow-l.png",
"icons/content.png",
@@ -206,7 +209,7 @@ static bool fetch_resource_initialise(lwc_string *scheme)
}
}
- e->url = gui_get_resource_url(fetch_resource_paths[i]);
+ e->url = guit->fetch->get_resource_url(fetch_resource_paths[i]);
if (e->url == NULL) {
lwc_string_unref(e->path);
} else {
@@ -353,23 +356,19 @@ static void fetch_resource_poll(lwc_string *scheme)
} while ( (c = next) != ring && ring != NULL);
}
-void fetch_resource_register(void)
+nserror fetch_resource_register(void)
{
- lwc_string *scheme;
-
- if (lwc_intern_string("resource", SLEN("resource"),
- &scheme) != lwc_error_ok) {
- die("Failed to initialise the fetch module "
- "(couldn't intern \"resource\").");
- }
-
- fetch_add_fetcher(scheme,
- fetch_resource_initialise,
- fetch_resource_can_fetch,
- fetch_resource_setup,
- fetch_resource_start,
- fetch_resource_abort,
- fetch_resource_free,
- fetch_resource_poll,
- fetch_resource_finalise);
+ lwc_string *scheme = lwc_string_ref(corestring_lwc_resource);
+ const struct fetcher_operation_table fetcher_ops = {
+ .initialise = fetch_resource_initialise,
+ .acceptable = fetch_resource_can_fetch,
+ .setup = fetch_resource_setup,
+ .start = fetch_resource_start,
+ .abort = fetch_resource_abort,
+ .free = fetch_resource_free,
+ .poll = fetch_resource_poll,
+ .finalise = fetch_resource_finalise
+ };
+
+ return fetcher_add(scheme, &fetcher_ops);
}
diff --git a/content/fetchers/resource.h b/content/fetchers/resource.h
index 79d8e37c4..cf4d6edac 100644
--- a/content/fetchers/resource.h
+++ b/content/fetchers/resource.h
@@ -35,6 +35,6 @@
*
* should only be called from the fetch initialise
*/
-void fetch_resource_register(void);
+nserror fetch_resource_register(void);
#endif
diff --git a/content/fs_backing_store.c b/content/fs_backing_store.c
new file mode 100644
index 000000000..fde17ed62
--- /dev/null
+++ b/content/fs_backing_store.c
@@ -0,0 +1,1256 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * Low-level resource cache persistent storage implementation.
+ *
+ * file based backing store.
+ *
+ * \todo Consider improving eviction sorting to include objects size
+ * and remaining lifetime and other cost metrics.
+ *
+ * \todo make backing store have a more efficient small object storage.
+ *
+ */
+
+#include <unistd.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <time.h>
+#include <stdlib.h>
+
+#include "utils/filepath.h"
+#include "utils/file.h"
+#include "utils/nsurl.h"
+#include "utils/log.h"
+#include "utils/utils.h"
+#include "utils/messages.h"
+#include "desktop/gui.h"
+
+#include "content/backing_store.h"
+
+/** Default number of bits of the ident to use in index hash */
+#define DEFAULT_IDENT_SIZE 20
+
+/** Default number of bits to use for an entry index. */
+#define DEFAULT_ENTRY_SIZE 16
+
+/** Backing store file format version */
+#define CONTROL_VERSION 110
+
+/** Get address from ident */
+#define BS_ADDRESS(ident, state) ((ident) & ((1 << state->ident_bits) - 1))
+
+/** Lookup store entry index from ident */
+#define BS_ENTRY_INDEX(ident, state) state->addrmap[(ident) & ((1 << state->ident_bits) - 1)]
+
+/** Get store entry from ident. */
+#define BS_ENTRY(ident, state) state->entries[state->addrmap[(ident) & ((1 << state->ident_bits) - 1)]]
+
+enum store_entry_flags {
+ STORE_ENTRY_FLAG_NONE = 0,
+};
+
+/**
+ * The type used to store index values refering to store entries. Care
+ * must be taken with this type as it is used to build address to
+ * entry mapping so changing the size will have large impacts on
+ * memory usage.
+ */
+typedef uint16_t entry_index_t;
+
+/**
+ * The type used as a binary identifier for each entry derived from
+ * the url. A larger identifier will have fewer collisions but
+ * requires proportionately more storage.
+ */
+typedef uint32_t entry_ident_t;
+
+/**
+ * Backing store object index entry.
+ *
+ * @note Order is important to avoid structure packing overhead.
+ */
+struct store_entry {
+ int64_t last_used; /**< unix time the entry was last used */
+ entry_ident_t ident; /**< entry identifier */
+ uint32_t data_alloc; /**< currently allocated size of data on disc */
+ uint32_t meta_alloc; /**< currently allocated size of metadata on disc */
+ uint16_t use_count; /**< number of times this entry has been accessed */
+ uint16_t flags; /**< entry flags (unused) */
+ uint16_t data_block; /**< small object data block entry (unused) */
+ uint16_t meta_block; /**< small object meta block entry (unused) */
+};
+
+/**
+ * Parameters controlling the backing store.
+ */
+struct store_state {
+ char *path; /**< The path to the backing store */
+ size_t limit; /**< The backing store upper bound target size */
+ size_t hysteresis; /**< The hysteresis around the target size */
+
+ unsigned int ident_bits; /**< log2 number of bits to use for address. */
+
+ struct store_entry *entries; /**< store entries. */
+ unsigned int entry_bits; /**< log2 number of bits in entry index. */
+ unsigned int last_entry; /**< index of last usable entry. */
+
+ /** flag indicating if the entries have been made persistant
+ * since they were last changed.
+ */
+ bool entries_dirty;
+
+ /** URL identifier to entry index mapping.
+ *
+ * This is an open coded index on the entries url field and
+ * provides a computationaly inexpensive way to go from the
+ * url to an entry.
+ */
+ entry_index_t *addrmap;
+
+ uint64_t total_alloc; /**< total size of all allocated storage. */
+
+ size_t hit_count; /**< number of cache hits */
+ uint64_t hit_size; /**< size of storage served */
+ size_t miss_count; /**< number of cache misses */
+
+};
+
+/**
+ * Global storage state.
+ *
+ * @todo Investigate if there is a way to have a context rather than
+ * use a global.
+ */
+struct store_state *storestate;
+
+
+
+/**
+ * Remove a backing store entry from the entry table.
+ *
+ * This finds the store entry associated with the given key and
+ * removes it from the table. The removed entry is returned but is
+ * only valid until the next set_store_entry call.
+ *
+ * @param state The store state to use.
+ * @param url The value used as the unique key to search entries for.
+ * @param bse Pointer used to return value.
+ * @return NSERROR_OK and bse updated on succes or NSERROR_NOT_FOUND
+ * if no entry coresponds to the url.
+ */
+static nserror
+remove_store_entry(struct store_state *state,
+ entry_ident_t ident,
+ struct store_entry **bse)
+{
+ entry_index_t sei; /* store entry index */
+
+ sei = BS_ENTRY_INDEX(ident, state);
+ if (sei == 0) {
+ LOG(("ident 0x%08x not in index", ident));
+ return NSERROR_NOT_FOUND;
+ }
+
+ if (state->entries[sei].ident != ident) {
+ /* entry ident did not match */
+ LOG(("ident 0x%08x did not match entry index %d", ident, sei));
+ return NSERROR_NOT_FOUND;
+ }
+
+ /* sei is entry to be removed, we swap it to the end of the
+ * table so there are no gaps and the returned entry is held
+ * in storage with reasonable lifetime.
+ */
+
+ /* remove entry from map */
+ BS_ENTRY_INDEX(ident, state) = 0;
+
+ /* global allocation accounting */
+ state->total_alloc -= state->entries[sei].data_alloc;
+ state->total_alloc -= state->entries[sei].meta_alloc;
+
+ state->last_entry--;
+
+ if (sei == state->last_entry) {
+ /* the removed entry was the last one, how convenient */
+ *bse = &state->entries[sei];
+ } else {
+ /* need to swap entries */
+ struct store_entry tent;
+
+ tent = state->entries[sei];
+ state->entries[sei] = state->entries[state->last_entry];
+ state->entries[state->last_entry] = tent;
+
+ /* update map for moved entry */
+ BS_ENTRY_INDEX(state->entries[sei].ident, state) = sei;
+
+ *bse = &state->entries[state->last_entry];
+ }
+
+ return NSERROR_OK;
+}
+
+
+/**
+ * Generate a filename for an object.
+ *
+ * this generates the filename for an object on disc. It is necessary
+ * for this to generate a filename which conforms to the limitations
+ * of all the filesystems the cache can be placed upon.
+ *
+ * From http://en.wikipedia.org/wiki/Comparison_of_file_systems#Limits
+ * the relevant subset is:
+ * - path elements no longer than 8 characters
+ * - acceptable characters are A-Z, 0-9
+ * - short total path lengths (255 or less)
+ *
+ * The short total path lengths mean the encoding must represent as
+ * much data as possible in the least number of characters.
+ *
+ * To achieve all these goals we use RFC4648 base32 encoding which packs
+ * 5bits into each character of the filename.
+ *
+ * @note Version 1.00 of the cache implementation used base64 to
+ * encode this, however that did not meet the requirement for only
+ * using uppercase characters.
+ *
+ * @param state The store state to use.
+ * @param ident The identifier to use.
+ * @return The filename string or NULL on allocation error.
+ */
+static char *
+store_fname(struct store_state *state,
+ entry_ident_t ident,
+ enum backing_store_flags flags)
+{
+ char *fname = NULL;
+ uint8_t b32u_i[8]; /* base32 encoded ident */
+ uint8_t b32u_d[6][2]; /* base64 ident as separate components */
+ const char *dat;
+
+ /* RFC4648 base32 encoding table */
+ static const uint8_t encoding_table[] = {
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+ 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
+ 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
+ 'Y', 'Z', '2', '3', '4', '5', '6', '7'
+ };
+
+ /* base32 encode ident */
+ b32u_i[0] = b32u_d[0][0] = encoding_table[(ident ) & 0x1f];
+ b32u_i[1] = b32u_d[1][0] = encoding_table[(ident >> 5) & 0x1f];
+ b32u_i[2] = b32u_d[2][0] = encoding_table[(ident >> 10) & 0x1f];
+ b32u_i[3] = b32u_d[3][0] = encoding_table[(ident >> 15) & 0x1f];
+ b32u_i[4] = b32u_d[4][0] = encoding_table[(ident >> 20) & 0x1f];
+ b32u_i[5] = b32u_d[5][0] = encoding_table[(ident >> 25) & 0x1f];
+ b32u_i[6] = encoding_table[(ident >> 30) & 0x1f];
+ /* null terminate strings */
+ b32u_i[7] = b32u_d[0][1] = b32u_d[1][1] = b32u_d[2][1] =
+ b32u_d[3][1] = b32u_d[4][1] = b32u_d[5][1] = 0;
+
+ if ((flags & BACKING_STORE_META) != 0) {
+ dat = "m"; /* metadata */
+ } else {
+ dat = "d"; /* data */
+ }
+
+ /* number of chars with usefully encoded data in base 32 */
+ switch(((state->ident_bits + 4) / 5)) {
+ case 1:
+ netsurf_mkpath(&fname, NULL, 3, state->path, dat,
+ b32u_i);
+ break;
+
+ case 2:
+ netsurf_mkpath(&fname, NULL, 4, state->path, dat,
+ b32u_d[0],
+ b32u_i);
+ break;
+
+ case 3:
+ netsurf_mkpath(&fname, NULL, 5, state->path, dat,
+ b32u_d[0], b32u_d[1],
+ b32u_i);
+ break;
+
+ case 4:
+ netsurf_mkpath(&fname, NULL, 6, state->path, dat,
+ b32u_d[0], b32u_d[1], b32u_d[2],
+ b32u_i);
+ break;
+
+ case 5:
+ netsurf_mkpath(&fname, NULL, 7, state->path, dat,
+ b32u_d[0], b32u_d[1], b32u_d[2], b32u_d[3],
+ b32u_i);
+ break;
+
+ case 6:
+ netsurf_mkpath(&fname, NULL, 8, state->path, dat,
+ b32u_d[0], b32u_d[1], b32u_d[2], b32u_d[3],
+ b32u_d[4],
+ b32u_i);
+ break;
+
+ case 7:
+ netsurf_mkpath(&fname, NULL, 9, state->path, dat,
+ b32u_d[0], b32u_d[1], b32u_d[2], b32u_d[3],
+ b32u_d[4], b32u_d[5],
+ b32u_i);
+ break;
+
+ default:
+ assert("Invalid path depth in store_fname()" == NULL);
+ }
+
+ return fname;
+}
+
+
+/**
+ * Remove the entry and files associated with an identifier.
+ *
+ * @param state The store state to use.
+ * @param ident The identifier to use.
+ * @return NSERROR_OK on sucess or error code on failure.
+ */
+static nserror
+unlink_ident(struct store_state *state, entry_ident_t ident)
+{
+ char *fname;
+ nserror ret;
+ struct store_entry *bse;
+
+ /* LOG(("ident %08x", ident)); */
+
+ /* use the url hash as the entry identifier */
+ ret = remove_store_entry(state, ident, &bse);
+ if (ret != NSERROR_OK) {
+ /* LOG(("entry not found")); */
+ return ret;
+ }
+
+ fname = store_fname(state, bse->ident, BACKING_STORE_META);
+ if (fname == NULL) {
+ return NSERROR_NOMEM;
+ }
+ unlink(fname);
+ free(fname);
+
+ fname = store_fname(state, bse->ident, BACKING_STORE_NONE);
+ if (fname == NULL) {
+ return NSERROR_NOMEM;
+ }
+ unlink(fname);
+ free(fname);
+
+ return NSERROR_OK;
+}
+
+
+/**
+ * Quick sort comparison.
+ */
+static int compar(const void *va, const void *vb)
+{
+ const struct store_entry *a = &BS_ENTRY(*(entry_ident_t *)va, storestate);
+ const struct store_entry *b = &BS_ENTRY(*(entry_ident_t *)vb, storestate);
+
+ if (a->use_count < b->use_count) {
+ return -1;
+ } else if (a->use_count > b->use_count) {
+ return 1;
+ }
+ /* use count is the same - now consider last use time */
+
+ if (a->last_used < b->last_used) {
+ return -1;
+ } else if (a->last_used > b->last_used) {
+ return 1;
+ }
+
+ /* they are the same */
+ return 0;
+}
+
+
+/**
+ * Evict entries from backing store as per configuration.
+ *
+ * Entries are evicted to ensure the cache remains within the
+ * configured limits on size and number of entries.
+ *
+ * The approach is to check if the cache limits have been exceeded and
+ * if so build and sort list of entries to evict. The list is sorted
+ * by use count and then by age, so oldest object with least number of uses
+ * get evicted first.
+ *
+ * @param state The store state to use.
+ * @return NSERROR_OK on success or error code on failure.
+ */
+static nserror store_evict(struct store_state *state)
+{
+ entry_ident_t *elist; /* sorted list of entry identifiers */
+ unsigned int ent;
+ unsigned int ent_count;
+ size_t removed; /* size of removed entries */
+ nserror ret = NSERROR_OK;
+
+ /* check if the cache has exceeded configured limit */
+ if ((state->total_alloc < state->limit) &&
+ (state->last_entry < (1U << state->entry_bits))) {
+ /* cache within limits */
+ return NSERROR_OK;
+ }
+
+ LOG(("Evicting entries to reduce %d by %d",
+ state->total_alloc, state->hysteresis));
+
+ /* allocate storage for the list */
+ elist = malloc(sizeof(entry_ident_t) * state->last_entry);
+ if (elist == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ /* sort the list avoiding entry 0 which is the empty sentinel */
+ for (ent = 1; ent < state->last_entry; ent++) {
+ elist[ent - 1] = state->entries[ent].ident;
+ }
+ ent_count = ent - 1; /* important to keep this as the entry count will change when entries are removed */
+ qsort(elist, ent_count, sizeof(entry_ident_t), compar);
+
+ /* evict entries in listed order */
+ removed = 0;
+ for (ent = 0; ent < ent_count; ent++) {
+
+ removed += BS_ENTRY(elist[ent], state).data_alloc;
+ removed += BS_ENTRY(elist[ent], state).meta_alloc;
+
+ ret = unlink_ident(state, elist[ent]);
+ if (ret != NSERROR_OK) {
+ break;
+ }
+
+ if (removed > state->hysteresis) {
+ break;
+ }
+ }
+
+ free(elist);
+
+ LOG(("removed %d in %d entries", removed, ent));
+
+ return ret;
+}
+
+
+/**
+ * Lookup a backing store entry in the entry table from a url.
+ *
+ * This finds the store entry associated with the given
+ * key. Additionally if an entry is found it updates the usage data
+ * about the entry.
+ *
+ * @param state The store state to use.
+ * @param url The value used as the unique key to search entries for.
+ * @param bse Pointer used to return value.
+ * @return NSERROR_OK and bse updated on success or NSERROR_NOT_FOUND
+ * if no entry corresponds to the url.
+ */
+static nserror
+get_store_entry(struct store_state *state, nsurl *url, struct store_entry **bse)
+{
+ entry_ident_t ident;
+ unsigned int sei; /* store entry index */
+
+ LOG(("url:%s", nsurl_access(url)));
+
+ /* use the url hash as the entry identifier */
+ ident = nsurl_hash(url);
+
+ sei = BS_ENTRY_INDEX(ident, state);
+
+ if (sei == 0) {
+ return NSERROR_NOT_FOUND;
+ }
+
+ if (state->entries[sei].ident != ident) {
+ /* entry ident did not match */
+ LOG(("ident did not match entry"));
+ return NSERROR_NOT_FOUND;
+ }
+
+ *bse = &state->entries[sei];
+
+ state->entries[sei].last_used = time(NULL);
+ state->entries[sei].use_count++;
+
+ state->entries_dirty = true;
+
+ return NSERROR_OK;
+}
+
+
+/**
+ * Set a backing store entry in the entry table from a url.
+ *
+ * This creates a backing store entry in the entry table for a url.
+ *
+ * @param url The value used as the unique key to search entries for.
+ * @param bse Pointer used to return value.
+ * @return NSERROR_OK and \a bse updated on success or NSERROR_NOT_FOUND
+ * if no entry coresponds to the url.
+ */
+static nserror
+set_store_entry(struct store_state *state,
+ nsurl *url,
+ enum backing_store_flags flags,
+ const uint8_t *data,
+ const size_t datalen,
+ struct store_entry **bse)
+{
+ entry_ident_t ident;
+ entry_index_t sei; /* store entry index */
+ struct store_entry *se;
+ nserror ret;
+ bool isrep; /* is the store repalcing an existing entry or not */
+
+ LOG(("url:%s", nsurl_access(url)));
+
+ /* evict entries as required and ensure there is at least one
+ * new entry available.
+ */
+ ret = store_evict(state);
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+
+ /* use the url hash as the entry identifier */
+ ident = nsurl_hash(url);
+
+ sei = BS_ENTRY_INDEX(ident, state);
+
+ /** @todo Should this deal with cache eviction? */
+
+ if (sei == 0) {
+ /* allocating the next available entry */
+ sei = state->last_entry;
+ state->last_entry++;
+ BS_ENTRY_INDEX(ident, state) = sei;
+ isrep = false;
+ } else {
+ /* updating or replacing existing entry */
+ /** @todo should we be checking the entry ident
+ * matches the url. Thats a collision in the address
+ * mapping right? and is it important?
+ */
+ isrep = true;
+ }
+
+ se = &state->entries[sei];
+
+ se->ident = ident;
+ se->flags = STORE_ENTRY_FLAG_NONE;
+ se->use_count = 1;
+ se->last_used = time(NULL);
+
+ /* account for allocation */
+ if ((flags & BACKING_STORE_META) != 0) {
+ if (isrep) {
+ state->total_alloc -= se->meta_alloc;
+ } else {
+ se->data_alloc = 0;
+ }
+ se->meta_alloc = datalen;
+ } else {
+ if (isrep) {
+ state->total_alloc -= se->data_alloc;
+ } else {
+ se->meta_alloc = 0;
+ }
+ se->data_alloc = datalen;
+ }
+ state->total_alloc += datalen;
+
+ state->entries_dirty = true;
+
+ *bse = se;
+
+ return NSERROR_OK;
+}
+
+
+
+
+/**
+ * Open a file using a store ident.
+ *
+ * @param state The store state to use.
+ * @param ident The identifier of the file to open.
+ * @param flags The backing store flags.
+ * @pram openflags The flags used with the open call.
+ * @return An fd from the open call or -1 on error.
+ */
+static int
+store_open(struct store_state *state,
+ uint32_t ident,
+ enum backing_store_flags flags,
+ int openflags)
+{
+ char *fname;
+ nserror ret;
+ int fd;
+
+ fname = store_fname(state, ident, flags);
+ if (fname == NULL) {
+ LOG(("filename error"));
+ return -1;
+ }
+
+ /** @todo mkdir only on write flag */
+ /* ensure path to file is usable */
+ ret = netsurf_mkdir_all(fname);
+ if (ret != NSERROR_OK) {
+ LOG(("file path \"%s\" could not be created", fname));
+ free(fname);
+ return -1;
+ }
+
+ LOG(("opening %s", fname));
+ fd = open(fname, openflags, S_IRUSR | S_IWUSR);
+
+ free(fname);
+
+ return fd;
+}
+
+/**
+ * Construct address ident to filesystem entry map
+ *
+ * To allow a filesystem entry to be found from it's identifier we
+ * construct an mapping index. This is a hash map from the entries URL
+ * (its unique key) to filesystem entry.
+ *
+ * As the entire entry list must be iterated over to construct the map
+ * we also compute the total storage in use.
+ *
+ * @param state The backing store global state.
+ * @return NSERROR_OK on sucess or NSERROR_NOMEM if the map storage
+ * could not be allocated.
+ */
+static nserror
+build_entrymap(struct store_state *state)
+{
+ unsigned int eloop;
+
+ LOG(("Allocating %d bytes for max of %d buckets",
+ (1 << state->ident_bits) * sizeof(entry_index_t),
+ 1 << state->ident_bits));
+
+ state->addrmap = calloc(1 << state->ident_bits, sizeof(entry_index_t));
+ if (state->addrmap == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ state->total_alloc = 0;
+
+ for (eloop = 1; eloop < state->last_entry; eloop++) {
+ /*
+ LOG(("entry:%d ident:0x%08x used:%d",
+ eloop,
+ BS_ADDRESS(state->entries[eloop].ident, state),
+ state->entries[eloop].use_count));
+ */
+
+ /* update the address map to point at the entry */
+ BS_ENTRY_INDEX(state->entries[eloop].ident, state) = eloop;
+
+ /* account for the storage space */
+ state->total_alloc += state->entries[eloop].data_alloc +
+ state->entries[eloop].meta_alloc;
+ }
+
+ return NSERROR_OK;
+}
+
+/**
+ * Write filesystem entries to file.
+ *
+ * @todo consider atomic replace using rename.
+ *
+ * @param state The backing store state to read the entries from.
+ * @return NSERROR_OK on sucess or error code on faliure.
+ */
+static nserror write_entries(struct store_state *state)
+{
+ int fd;
+ char *fname = NULL;
+ ssize_t written;
+ nserror ret;
+
+ if (state->entries_dirty == false) {
+ /* entries have not been updated since last write */
+ return NSERROR_OK;
+ }
+
+ ret = netsurf_mkpath(&fname, NULL, 2, state->path, "entries");
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+
+ fd = open(fname, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
+ free(fname);
+ if (fd == -1) {
+ return NSERROR_SAVE_FAILED;
+ }
+
+ written = write(fd, state->entries,
+ state->last_entry * sizeof(struct store_entry));
+ close(fd);
+ if (written < 0) {
+ /** @todo Delete the file? */
+ return NSERROR_SAVE_FAILED;
+ }
+
+ return NSERROR_OK;
+}
+
+/**
+ * Read description entries into memory.
+ *
+ * @param state The backing store state to put the loaded entries in.
+ * @return NSERROR_OK on sucess or error code on faliure.
+ */
+static nserror
+read_entries(struct store_state *state)
+{
+ int fd;
+ ssize_t rd;
+ size_t entries_size;
+ char *fname = NULL;
+ nserror ret;
+
+ ret = netsurf_mkpath(&fname, NULL, 2, state->path, "entries");
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+
+ entries_size = (1 << state->entry_bits) * sizeof(struct store_entry);
+
+ LOG(("Allocating %d bytes for max of %d entries",
+ entries_size, 1 << state->entry_bits));
+
+ state->entries = calloc(1, entries_size);
+ if (state->entries == NULL) {
+ free(fname);
+ return NSERROR_NOMEM;
+ }
+
+ fd = open(fname, O_RDWR);
+ free(fname);
+ if (fd != -1) {
+ rd = read(fd, state->entries, entries_size);
+ close(fd);
+ if (rd > 0) {
+ state->last_entry = rd / sizeof(struct store_entry);
+ LOG(("Read %d entries", state->last_entry));
+ }
+ } else {
+ /* could rebuild entries from fs */
+ state->last_entry = 1;
+ }
+ return NSERROR_OK;
+}
+
+/**
+ * Write the cache tag file.
+ *
+ * @param state The cache state.
+ * @return NSERROR_OK on sucess or error code on faliure.
+ */
+static nserror
+write_cache_tag(struct store_state *state)
+{
+ FILE *fcachetag;
+ nserror ret;
+ char *fname = NULL;
+
+ ret = netsurf_mkpath(&fname, NULL, 2, state->path, "CACHEDIR.TAG");
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+
+ fcachetag = fopen(fname, "wb");
+
+ free(fname);
+
+ if (fcachetag == NULL) {
+ return NSERROR_NOT_FOUND;
+ }
+
+ fprintf(fcachetag,
+ "Signature: 8a477f597d28d172789f06886806bc55\n"
+ "# This file is a cache directory tag created by NetSurf.\n"
+ "# For information about cache directory tags, see:\n"
+ "# http://www.brynosaurus.com/cachedir/\n");
+
+ fclose(fcachetag);
+
+ return NSERROR_OK;
+}
+
+/**
+ * Write the control file for the current state.
+ *
+ * @param state The state to write to the control file.
+ * @return NSERROR_OK on sucess or error code on faliure.
+ */
+static nserror
+write_control(struct store_state *state)
+{
+ FILE *fcontrol;
+ nserror ret;
+ char *fname = NULL;
+
+ ret = netsurf_mkpath(&fname, NULL, 2, state->path, "control");
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+
+ LOG(("writing control file \"%s\"", fname));
+
+ ret = netsurf_mkdir_all(fname);
+ if (ret != NSERROR_OK) {
+ free(fname);
+ return ret;
+ }
+
+ fcontrol = fopen(fname, "wb");
+
+ free(fname);
+
+ if (fcontrol == NULL) {
+ return NSERROR_NOT_FOUND;
+ }
+
+ fprintf(fcontrol, "%u%c", CONTROL_VERSION, 0);
+ fprintf(fcontrol, "%u%c", state->entry_bits, 0);
+ fprintf(fcontrol, "%u%c", state->ident_bits, 0);
+ fprintf(fcontrol, "%u%c", state->last_entry, 0);
+
+ fclose(fcontrol);
+
+ return NSERROR_OK;
+}
+
+
+/**
+ * Read and parse the control file.
+ *
+ * @param state The state to read from the control file.
+ * @return NSERROR_OK on sucess or error code on faliure.
+ */
+static nserror
+read_control(struct store_state *state)
+{
+ nserror ret;
+ FILE *fcontrol;
+ unsigned int ctrlversion;
+ unsigned int addrbits;
+ unsigned int entrybits;
+ char *fname = NULL;
+
+ ret = netsurf_mkpath(&fname, NULL, 2, state->path, "control");
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+
+ LOG(("opening control file \"%s\"", fname));
+
+ fcontrol = fopen(fname, "rb");
+
+ free(fname);
+
+ if (fcontrol == NULL) {
+ /* unable to open control file */
+ if (errno == ENOENT) {
+ return NSERROR_NOT_FOUND;
+ } else {
+ return NSERROR_INIT_FAILED;
+ }
+ }
+
+ /* read control and setup new state */
+
+ /* first line is version */
+ if (fscanf(fcontrol, "%u", &ctrlversion) != 1) {
+ goto control_error;
+ }
+
+ if (ctrlversion != CONTROL_VERSION) {
+ goto control_error;
+ }
+
+ if (fgetc(fcontrol) != 0) {
+ goto control_error;
+ }
+
+ /* second line is log2 max number of entries */
+ if (fscanf(fcontrol, "%u", &entrybits) != 1) {
+ goto control_error;
+ }
+ if (fgetc(fcontrol) != 0) {
+ goto control_error;
+ }
+
+ /* second line is log2 size of address hash */
+ if (fscanf(fcontrol, "%u", &addrbits) != 1) {
+ goto control_error;
+ }
+ if (fgetc(fcontrol) != 0) {
+ goto control_error;
+ }
+
+ fclose(fcontrol);
+
+ state->entry_bits = entrybits;
+ state->ident_bits = addrbits;
+
+ return NSERROR_OK;
+
+control_error: /* problem with the control file */
+
+ fclose(fcontrol);
+
+ return NSERROR_INIT_FAILED;
+}
+
+
+
+
+/* Functions exported in the backing store table */
+
+/**
+ * Initialise the backing store.
+ *
+ * @param parameters to configure backing store.
+ * @return NSERROR_OK on success or error code on faliure.
+ */
+static nserror
+initialise(const struct llcache_store_parameters *parameters)
+{
+ struct store_state *newstate;
+ nserror ret;
+
+ /* check backing store is not already initialised */
+ if (storestate != NULL) {
+ return NSERROR_INIT_FAILED;
+ }
+
+ /* if we are not allowed any space simply give up on init */
+ if (parameters->limit == 0) {
+ return NSERROR_OK;
+ }
+
+ /* if the path to the cache directory is not set do not init */
+ if (parameters->path == NULL) {
+ return NSERROR_OK;
+ }
+
+ /* allocate new store state and set defaults */
+ newstate = calloc(1, sizeof(struct store_state));
+ if (newstate == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ newstate->path = strdup(parameters->path);
+ newstate->limit = parameters->limit;
+ newstate->hysteresis = parameters->hysteresis;
+
+ if (parameters->address_size == 0) {
+ newstate->ident_bits = DEFAULT_IDENT_SIZE;
+ } else {
+ newstate->ident_bits = parameters->address_size;
+ }
+
+ if (parameters->entry_size == 0) {
+ newstate->entry_bits = DEFAULT_ENTRY_SIZE;
+ } else {
+ newstate->entry_bits = parameters->entry_size;
+ }
+
+ ret = read_control(newstate);
+ if (ret != NSERROR_OK) {
+ LOG(("read control failed %s", messages_get_errorcode(ret)));
+ ret = write_control(newstate);
+ if (ret == NSERROR_OK) {
+ write_cache_tag(newstate);
+ }
+ }
+ if (ret != NSERROR_OK) {
+ /* that went well obviously */
+ free(newstate->path);
+ free(newstate);
+ return ret;
+ }
+
+ /* ensure the maximum number of entries can be represented in
+ * the type available to store it.
+ */
+ if (newstate->entry_bits > (8 * sizeof(entry_index_t))) {
+ newstate->entry_bits = (8 * sizeof(entry_index_t));
+ }
+
+ /* read filesystem entries */
+ ret = read_entries(newstate);
+ if (ret != NSERROR_OK) {
+ /* that went well obviously */
+ free(newstate->path);
+ free(newstate);
+ return ret;
+ }
+
+ /* build entry hash map */
+ ret = build_entrymap(newstate);
+ if (ret != NSERROR_OK) {
+ /* that obviously went well */
+ free(newstate->path);
+ free(newstate);
+ return ret;
+ }
+
+ storestate = newstate;
+
+ LOG(("FS backing store init successful"));
+
+ LOG(("path:%s limit:%d hyst:%d addr:%d entries:%d", newstate->path, newstate->limit, newstate->hysteresis, newstate->ident_bits, newstate->entry_bits));
+ LOG(("Using %d/%d", newstate->total_alloc, newstate->limit));
+
+ return NSERROR_OK;
+}
+
+
+/**
+ * Finalise the backing store.
+ *
+ * @return NSERROR_OK on success.
+ */
+static nserror
+finalise(void)
+{
+ if (storestate != NULL) {
+ write_entries(storestate);
+
+ /* avoid division by zero */
+ if (storestate->miss_count == 0) {
+ storestate->miss_count = 1;
+ }
+ LOG(("hits:%d misses:%d hit ratio:%d returned:%d bytes",
+ storestate->hit_count, storestate->miss_count,
+ storestate->hit_count / storestate->miss_count,
+ storestate->hit_size));
+
+ free(storestate->path);
+ free(storestate);
+ storestate = NULL;
+ }
+ return NSERROR_OK;
+}
+
+
+/**
+ * Place an object in the backing store.
+ *
+ * @param url The url is used as the unique primary key for the data.
+ * @param flags The flags to control how the object is stored.
+ * @param data The objects source data.
+ * @param datalen The length of the \a data.
+ * @return NSERROR_OK on success or error code on faliure.
+ */
+static nserror
+store(nsurl *url,
+ enum backing_store_flags flags,
+ const uint8_t *data,
+ const size_t datalen)
+{
+ nserror ret;
+ struct store_entry *bse;
+ ssize_t written;
+ int fd;
+
+ /* check backing store is initialised */
+ if (storestate == NULL) {
+ return NSERROR_INIT_FAILED;
+ }
+
+ /* set the store entry up */
+ ret = set_store_entry(storestate, url, flags, data, datalen, &bse);
+ if (ret != NSERROR_OK) {
+ LOG(("store entry setting failed"));
+ return ret;
+ }
+
+ fd = store_open(storestate, bse->ident, flags, O_CREAT | O_WRONLY);
+ if (fd < 0) {
+ perror("");
+ LOG(("Open failed %d",fd));
+ return NSERROR_SAVE_FAILED;
+ }
+
+
+ LOG(("Writing %d bytes from %p", datalen, data));
+ written = write(fd, data, datalen);
+
+ close(fd);
+ if (written < 0 || (size_t) written < datalen) {
+ /** @todo Delete the file? */
+ return NSERROR_SAVE_FAILED;
+ }
+
+ return NSERROR_OK;
+}
+
+/**
+ * Retrive an object from the backing store.
+ *
+ * @param url The url is used as the unique primary key for the data.
+ * @param flags The flags to control how the object is stored.
+ * @param data The objects data.
+ * @param datalen The length of the \a data retrieved.
+ * @return NSERROR_OK on success or error code on faliure.
+ */
+static nserror
+fetch(nsurl *url,
+ enum backing_store_flags *flags,
+ uint8_t **data_out,
+ size_t *datalen_out)
+{
+ nserror ret;
+ struct store_entry *bse;
+ uint8_t *data;
+ size_t datalen;
+ int fd;
+ ssize_t rd;
+
+ /* check backing store is initialised */
+ if (storestate == NULL) {
+ return NSERROR_INIT_FAILED;
+ }
+
+ ret = get_store_entry(storestate, url, &bse);
+ if (ret != NSERROR_OK) {
+ LOG(("entry not found"));
+ storestate->miss_count++;
+ return ret;
+ }
+ storestate->hit_count++;
+
+ LOG(("retriving cache file for url:%s", nsurl_access(url)));
+
+ fd = store_open(storestate, bse->ident, *flags, O_RDONLY);
+ if (fd < 0) {
+ LOG(("Open failed"));
+ /** @todo should this invalidate the entry? */
+ return NSERROR_NOT_FOUND;
+ }
+
+ data = *data_out;
+ datalen = *datalen_out;
+
+ /* need to deal with buffers */
+ if (data == NULL) {
+ if (datalen == 0) {
+ /* caller did not know the files length */
+ if (((*flags) & BACKING_STORE_META) != 0) {
+ datalen = bse->meta_alloc;
+ } else {
+ datalen = bse->data_alloc;
+ }
+ }
+
+ data = malloc(datalen);
+ if (data == NULL) {
+ close(fd);
+ return NSERROR_NOMEM;
+ }
+ }
+
+ /** @todo should this check datalen is sufficient */
+
+ LOG(("Reading %d bytes into %p from file", datalen, data));
+
+ /** @todo this read should be an a loop */
+ rd = read(fd, data, datalen);
+ if (rd <= 0) {
+ LOG(("read returned %d", rd));
+ close(fd);
+ if ((*data_out) == NULL) {
+ free(data);
+ }
+ return NSERROR_NOT_FOUND;
+ }
+
+ close(fd);
+
+ storestate->hit_size += datalen;
+
+ *data_out = data;
+ *datalen_out = datalen;
+
+ return NSERROR_OK;
+}
+
+
+/**
+ * Invalidate a source object from the backing store.
+ *
+ * The entry (if present in the backing store) must no longer
+ * be returned as a result to the fetch or meta operations.
+ *
+ * @param url The url is used as the unique primary key to invalidate.
+ * @return NSERROR_OK on success or error code on faliure.
+ */
+static nserror
+invalidate(nsurl *url)
+{
+ /* check backing store is initialised */
+ if (storestate == NULL) {
+ return NSERROR_INIT_FAILED;
+ }
+
+ LOG(("url:%s", nsurl_access(url)));
+
+ return unlink_ident(storestate, nsurl_hash(url));
+}
+
+
+static struct gui_llcache_table llcache_table = {
+ .initialise = initialise,
+ .finalise = finalise,
+ .store = store,
+ .fetch = fetch,
+ .invalidate = invalidate,
+};
+
+struct gui_llcache_table *filesystem_llcache_table = &llcache_table;
diff --git a/content/hlcache.c b/content/hlcache.c
index e8b2836db..0d7996524 100644
--- a/content/hlcache.c
+++ b/content/hlcache.c
@@ -24,17 +24,17 @@
#include <stdlib.h>
#include <string.h>
-#include "content/content.h"
-#include "content/hlcache.h"
-#include "content/mimesniff.h"
+#include "desktop/gui_factory.h"
#include "utils/http.h"
#include "utils/log.h"
#include "utils/messages.h"
#include "utils/ring.h"
-#include "utils/schedule.h"
-#include "utils/url.h"
#include "utils/utils.h"
+#include "content/content.h"
+#include "content/mimesniff.h"
+#include "content/hlcache.h"
+
typedef struct hlcache_entry hlcache_entry;
typedef struct hlcache_retrieval_ctx hlcache_retrieval_ctx;
@@ -94,23 +94,427 @@ struct hlcache_s {
static struct hlcache_s *hlcache = NULL;
-static void hlcache_clean(void *ignored);
+/******************************************************************************
+ * High-level cache internals *
+ ******************************************************************************/
-static nserror hlcache_llcache_callback(llcache_handle *handle,
- const llcache_event *event, void *pw);
-static nserror hlcache_migrate_ctx(hlcache_retrieval_ctx *ctx,
- lwc_string *effective_type);
+
+/**
+ * Attempt to clean the cache
+ */
+static void hlcache_clean(void *ignored)
+{
+ hlcache_entry *entry, *next;
+
+ for (entry = hlcache->content_list; entry != NULL; entry = next) {
+ next = entry->next;
+
+ if (entry->content == NULL)
+ continue;
+
+ if (content__get_status(entry->content) ==
+ CONTENT_STATUS_LOADING)
+ continue;
+
+ if (content_count_users(entry->content) != 0)
+ continue;
+
+ /** \todo This is over-zealous: all unused contents
+ * will be immediately destroyed. Ideally, we want to
+ * purge all unused contents that are using stale
+ * source data, and enough fresh contents such that
+ * the cache fits in the configured cache size limit.
+ */
+
+ /* Remove entry from cache */
+ if (entry->prev == NULL)
+ hlcache->content_list = entry->next;
+ else
+ entry->prev->next = entry->next;
+
+ if (entry->next != NULL)
+ entry->next->prev = entry->prev;
+
+ /* Destroy content */
+ content_destroy(entry->content);
+
+ /* Destroy entry */
+ free(entry);
+ }
+
+ /* Attempt to clean the llcache */
+ llcache_clean(false);
+
+ /* Re-schedule ourselves */
+ guit->browser->schedule(hlcache->params.bg_clean_time, hlcache_clean, NULL);
+}
+
+/**
+ * Determine if the specified MIME type is acceptable
+ *
+ * \param mime_type MIME type to consider
+ * \param accepted_types Array of acceptable types, or NULL for any
+ * \param computed_type Pointer to location to receive computed type of object
+ * \return True if the type is acceptable, false otherwise
+ */
static bool hlcache_type_is_acceptable(lwc_string *mime_type,
- content_type accepted_types, content_type *computed_type);
+ content_type accepted_types, content_type *computed_type)
+{
+ content_type type;
+
+ type = content_factory_type_from_mime_type(mime_type);
+
+ *computed_type = type;
+
+ return ((accepted_types & type) != 0);
+}
+
+/**
+ * Veneer between content callback API and hlcache callback API
+ *
+ * \param c Content to emit message for
+ * \param msg Message to emit
+ * \param data Data for message
+ * \param pw Pointer to private data (hlcache_handle)
+ */
+static void hlcache_content_callback(struct content *c, content_msg msg,
+ union content_msg_data data, void *pw)
+{
+ hlcache_handle *handle = pw;
+ hlcache_event event;
+ nserror error = NSERROR_OK;
+
+ event.type = msg;
+ event.data = data;
+
+ if (handle->cb != NULL)
+ error = handle->cb(handle, &event, handle->pw);
+
+ if (error != NSERROR_OK)
+ LOG(("Error in callback: %d", error));
+}
+
+/**
+ * Find a content for the high-level cache handle
+ *
+ * \param ctx High-level cache retrieval context
+ * \param effective_type Effective MIME type of content
+ * \return NSERROR_OK on success,
+ * NSERROR_NEED_DATA on success where data is needed,
+ * appropriate error otherwise
+ *
+ * \pre handle::state == HLCACHE_HANDLE_NEW
+ * \pre Headers must have been received for associated low-level handle
+ * \post Low-level handle is either released, or associated with new content
+ * \post High-level handle is registered with content
+ */
static nserror hlcache_find_content(hlcache_retrieval_ctx *ctx,
- lwc_string *effective_type);
-static void hlcache_content_callback(struct content *c,
- content_msg msg, union content_msg_data data, void *pw);
+ lwc_string *effective_type)
+{
+ hlcache_entry *entry;
+ hlcache_event event;
+ nserror error = NSERROR_OK;
+
+ /* Search list of cached contents for a suitable one */
+ for (entry = hlcache->content_list; entry != NULL; entry = entry->next) {
+ hlcache_handle entry_handle = { entry, NULL, NULL };
+ const llcache_handle *entry_llcache;
+
+ if (entry->content == NULL)
+ continue;
+
+ /* Ignore contents in the error state */
+ if (content_get_status(&entry_handle) == CONTENT_STATUS_ERROR)
+ continue;
+
+ /* Ensure that content is shareable */
+ if (content_is_shareable(entry->content) == false)
+ continue;
+
+ /* Ensure that quirks mode is acceptable */
+ if (content_matches_quirks(entry->content,
+ ctx->child.quirks) == false)
+ continue;
+
+ /* Ensure that content uses same low-level object as
+ * low-level handle */
+ entry_llcache = content_get_llcache_handle(entry->content);
+
+ if (llcache_handle_references_same_object(entry_llcache,
+ ctx->llcache))
+ break;
+ }
+
+ if (entry == NULL) {
+ /* No existing entry, so need to create one */
+ entry = malloc(sizeof(hlcache_entry));
+ if (entry == NULL)
+ return NSERROR_NOMEM;
+
+ /* Create content using llhandle */
+ entry->content = content_factory_create_content(ctx->llcache,
+ ctx->child.charset, ctx->child.quirks,
+ effective_type);
+ if (entry->content == NULL) {
+ free(entry);
+ return NSERROR_NOMEM;
+ }
+
+ /* Insert into cache */
+ entry->prev = NULL;
+ entry->next = hlcache->content_list;
+ if (hlcache->content_list != NULL)
+ hlcache->content_list->prev = entry;
+ hlcache->content_list = entry;
+
+ /* Signal to caller that we created a content */
+ error = NSERROR_NEED_DATA;
+
+ hlcache->miss_count++;
+ } else {
+ /* Found a suitable content: no longer need low-level handle */
+ llcache_handle_release(ctx->llcache);
+ hlcache->hit_count++;
+ }
+
+ /* Associate handle with content */
+ if (content_add_user(entry->content,
+ hlcache_content_callback, ctx->handle) == false)
+ return NSERROR_NOMEM;
+
+ /* Associate cache entry with handle */
+ ctx->handle->entry = entry;
+
+ /* Catch handle up with state of content */
+ if (ctx->handle->cb != NULL) {
+ content_status status = content_get_status(ctx->handle);
+
+ if (status == CONTENT_STATUS_LOADING) {
+ event.type = CONTENT_MSG_LOADING;
+ ctx->handle->cb(ctx->handle, &event, ctx->handle->pw);
+ } else if (status == CONTENT_STATUS_READY) {
+ event.type = CONTENT_MSG_LOADING;
+ ctx->handle->cb(ctx->handle, &event, ctx->handle->pw);
+
+ if (ctx->handle->cb != NULL) {
+ event.type = CONTENT_MSG_READY;
+ ctx->handle->cb(ctx->handle, &event,
+ ctx->handle->pw);
+ }
+ } else if (status == CONTENT_STATUS_DONE) {
+ event.type = CONTENT_MSG_LOADING;
+ ctx->handle->cb(ctx->handle, &event, ctx->handle->pw);
+
+ if (ctx->handle->cb != NULL) {
+ event.type = CONTENT_MSG_READY;
+ ctx->handle->cb(ctx->handle, &event,
+ ctx->handle->pw);
+ }
+
+ if (ctx->handle->cb != NULL) {
+ event.type = CONTENT_MSG_DONE;
+ ctx->handle->cb(ctx->handle, &event,
+ ctx->handle->pw);
+ }
+ }
+ }
+
+ return error;
+}
+
+/**
+ * Migrate a retrieval context into its final destination content
+ *
+ * \param ctx Context to migrate
+ * \param effective_type The effective MIME type of the content, or NULL
+ * \return NSERROR_OK on success,
+ * NSERROR_NEED_DATA on success where data is needed,
+ * appropriate error otherwise
+ */
+static nserror hlcache_migrate_ctx(hlcache_retrieval_ctx *ctx,
+ lwc_string *effective_type)
+{
+ content_type type = CONTENT_NONE;
+ nserror error = NSERROR_OK;
+
+ ctx->migrate_target = true;
+
+ if ((effective_type != NULL) &&
+ hlcache_type_is_acceptable(effective_type,
+ ctx->accepted_types,
+ &type)) {
+ error = hlcache_find_content(ctx, effective_type);
+ if (error != NSERROR_OK && error != NSERROR_NEED_DATA) {
+ if (ctx->handle->cb != NULL) {
+ hlcache_event hlevent;
+
+ hlevent.type = CONTENT_MSG_ERROR;
+ hlevent.data.error = messages_get("MiscError");
+
+ ctx->handle->cb(ctx->handle, &hlevent,
+ ctx->handle->pw);
+ }
+
+ llcache_handle_abort(ctx->llcache);
+ llcache_handle_release(ctx->llcache);
+ }
+ } else if (type == CONTENT_NONE &&
+ (ctx->flags & HLCACHE_RETRIEVE_MAY_DOWNLOAD)) {
+ /* Unknown type, and we can download, so convert */
+ llcache_handle_force_stream(ctx->llcache);
+
+ if (ctx->handle->cb != NULL) {
+ hlcache_event hlevent;
+
+ hlevent.type = CONTENT_MSG_DOWNLOAD;
+ hlevent.data.download = ctx->llcache;
+
+ ctx->handle->cb(ctx->handle, &hlevent,
+ ctx->handle->pw);
+ }
+
+ /* Ensure caller knows we need data */
+ error = NSERROR_NEED_DATA;
+ } else {
+ /* Unacceptable type: report error */
+ if (ctx->handle->cb != NULL) {
+ hlcache_event hlevent;
+
+ hlevent.type = CONTENT_MSG_ERROR;
+ hlevent.data.error = messages_get("UnacceptableType");
+
+ ctx->handle->cb(ctx->handle, &hlevent,
+ ctx->handle->pw);
+ }
+
+ llcache_handle_abort(ctx->llcache);
+ llcache_handle_release(ctx->llcache);
+ }
+
+ ctx->migrate_target = false;
+
+ /* No longer require retrieval context */
+ RING_REMOVE(hlcache->retrieval_ctx_ring, ctx);
+ free((char *) ctx->child.charset);
+ free(ctx);
+
+ return error;
+}
+
+/**
+ * Handler for low-level cache events
+ *
+ * \param handle Handle for which event is issued
+ * \param event Event data
+ * \param pw Pointer to client-specific data
+ * \return NSERROR_OK on success, appropriate error otherwise
+ */
+static nserror hlcache_llcache_callback(llcache_handle *handle,
+ const llcache_event *event, void *pw)
+{
+ hlcache_retrieval_ctx *ctx = pw;
+ lwc_string *effective_type = NULL;
+ nserror error;
+
+ assert(ctx->llcache == handle);
+
+ switch (event->type) {
+ case LLCACHE_EVENT_HAD_HEADERS:
+ error = mimesniff_compute_effective_type(handle, NULL, 0,
+ ctx->flags & HLCACHE_RETRIEVE_SNIFF_TYPE,
+ ctx->accepted_types == CONTENT_IMAGE,
+ &effective_type);
+ if (error == NSERROR_OK || error == NSERROR_NOT_FOUND) {
+ /* If the sniffer was successful or failed to find
+ * a Content-Type header when sniffing was
+ * prohibited, we must migrate the retrieval context. */
+ error = hlcache_migrate_ctx(ctx, effective_type);
+
+ if (effective_type != NULL)
+ lwc_string_unref(effective_type);
+ }
+
+ /* No need to report that we need data:
+ * we'll get some anyway if there is any */
+ if (error == NSERROR_NEED_DATA)
+ error = NSERROR_OK;
+
+ return error;
+
+ break;
+ case LLCACHE_EVENT_HAD_DATA:
+ error = mimesniff_compute_effective_type(handle,
+ event->data.data.buf, event->data.data.len,
+ ctx->flags & HLCACHE_RETRIEVE_SNIFF_TYPE,
+ ctx->accepted_types == CONTENT_IMAGE,
+ &effective_type);
+ if (error != NSERROR_OK) {
+ assert(0 && "MIME sniff failed with data");
+ }
+
+ error = hlcache_migrate_ctx(ctx, effective_type);
+
+ lwc_string_unref(effective_type);
+
+ return error;
+
+ break;
+ case LLCACHE_EVENT_DONE:
+ /* DONE event before we could determine the effective MIME type.
+ */
+ error = mimesniff_compute_effective_type(handle,
+ NULL, 0, false, false, &effective_type);
+ if (error == NSERROR_OK) {
+ error = hlcache_migrate_ctx(ctx, effective_type);
+
+ lwc_string_unref(effective_type);
+
+ return error;
+ }
+
+ if (ctx->handle->cb != NULL) {
+ hlcache_event hlevent;
+
+ hlevent.type = CONTENT_MSG_ERROR;
+ hlevent.data.error = messages_get("BadType");
+
+ ctx->handle->cb(ctx->handle, &hlevent, ctx->handle->pw);
+ }
+ break;
+ case LLCACHE_EVENT_ERROR:
+ if (ctx->handle->cb != NULL) {
+ hlcache_event hlevent;
+
+ hlevent.type = CONTENT_MSG_ERROR;
+ hlevent.data.error = event->data.msg;
+
+ ctx->handle->cb(ctx->handle, &hlevent, ctx->handle->pw);
+ }
+ break;
+ case LLCACHE_EVENT_PROGRESS:
+ break;
+ case LLCACHE_EVENT_REDIRECT:
+ if (ctx->handle->cb != NULL) {
+ hlcache_event hlevent;
+
+ hlevent.type = CONTENT_MSG_REDIRECT;
+ hlevent.data.redirect.from = event->data.redirect.from;
+ hlevent.data.redirect.to = event->data.redirect.to;
+
+ ctx->handle->cb(ctx->handle, &hlevent, ctx->handle->pw);
+ }
+ break;
+ }
+
+ return NSERROR_OK;
+}
+
/******************************************************************************
* Public API *
******************************************************************************/
+
nserror
hlcache_initialise(const struct hlcache_parameters *hlcache_parameters)
{
@@ -121,9 +525,7 @@ hlcache_initialise(const struct hlcache_parameters *hlcache_parameters)
return NSERROR_NOMEM;
}
- ret = llcache_initialise(hlcache_parameters->cb,
- hlcache_parameters->cb_ctx,
- hlcache_parameters->limit);
+ ret = llcache_initialise(&hlcache_parameters->llcache);
if (ret != NSERROR_OK) {
free(hlcache);
hlcache = NULL;
@@ -133,7 +535,7 @@ hlcache_initialise(const struct hlcache_parameters *hlcache_parameters)
hlcache->params = *hlcache_parameters;
/* Schedule the cache cleanup */
- schedule(hlcache->params.bg_clean_time / 10, hlcache_clean, NULL);
+ guit->browser->schedule(hlcache->params.bg_clean_time, hlcache_clean, NULL);
return NSERROR_OK;
}
@@ -142,7 +544,7 @@ hlcache_initialise(const struct hlcache_parameters *hlcache_parameters)
void hlcache_stop(void)
{
/* Remove the hlcache_clean schedule */
- schedule_remove(hlcache_clean, NULL);
+ guit->browser->schedule(-1, hlcache_clean, NULL);
}
/* See hlcache.h for documentation */
@@ -220,15 +622,6 @@ void hlcache_finalise(void)
}
/* See hlcache.h for documentation */
-nserror hlcache_poll(void)
-{
-
- llcache_poll();
-
- return NSERROR_OK;
-}
-
-/* See hlcache.h for documentation */
nserror hlcache_handle_retrieve(nsurl *url, uint32_t flags,
nsurl *referer, llcache_post_data *post,
hlcache_handle_callback cb, void *pw,
@@ -295,7 +688,7 @@ nserror hlcache_handle_release(hlcache_handle *handle)
RING_ITERATE_START(struct hlcache_retrieval_ctx,
hlcache->retrieval_ctx_ring,
ictx) {
- if (ictx->handle == handle &&
+ if (ictx->handle == handle &&
ictx->migrate_target == false) {
/* This is the nascent context for us,
* so abort the fetch */
@@ -347,7 +740,7 @@ nserror hlcache_handle_abort(hlcache_handle *handle)
RING_ITERATE_START(struct hlcache_retrieval_ctx,
hlcache->retrieval_ctx_ring,
ictx) {
- if (ictx->handle == handle &&
+ if (ictx->handle == handle &&
ictx->migrate_target == false) {
/* This is the nascent context for us,
* so abort the fetch */
@@ -448,416 +841,3 @@ nsurl *hlcache_handle_get_url(const hlcache_handle *handle)
return result;
}
-
-/******************************************************************************
- * High-level cache internals *
- ******************************************************************************/
-
-/**
- * Attempt to clean the cache
- */
-void hlcache_clean(void *ignored)
-{
- hlcache_entry *entry, *next;
-
- for (entry = hlcache->content_list; entry != NULL; entry = next) {
- next = entry->next;
-
- if (entry->content == NULL)
- continue;
-
- if (content__get_status(entry->content) ==
- CONTENT_STATUS_LOADING)
- continue;
-
- if (content_count_users(entry->content) != 0)
- continue;
-
- /** \todo This is over-zealous: all unused contents
- * will be immediately destroyed. Ideally, we want to
- * purge all unused contents that are using stale
- * source data, and enough fresh contents such that
- * the cache fits in the configured cache size limit.
- */
-
- /* Remove entry from cache */
- if (entry->prev == NULL)
- hlcache->content_list = entry->next;
- else
- entry->prev->next = entry->next;
-
- if (entry->next != NULL)
- entry->next->prev = entry->prev;
-
- /* Destroy content */
- content_destroy(entry->content);
-
- /* Destroy entry */
- free(entry);
- }
-
- /* Attempt to clean the llcache */
- llcache_clean();
-
- /* Re-schedule ourselves */
- schedule(hlcache->params.bg_clean_time / 10, hlcache_clean, NULL);
-}
-
-/**
- * Handler for low-level cache events
- *
- * \param handle Handle for which event is issued
- * \param event Event data
- * \param pw Pointer to client-specific data
- * \return NSERROR_OK on success, appropriate error otherwise
- */
-nserror hlcache_llcache_callback(llcache_handle *handle,
- const llcache_event *event, void *pw)
-{
- hlcache_retrieval_ctx *ctx = pw;
- lwc_string *effective_type = NULL;
- nserror error;
-
- assert(ctx->llcache == handle);
-
- switch (event->type) {
- case LLCACHE_EVENT_HAD_HEADERS:
- error = mimesniff_compute_effective_type(handle, NULL, 0,
- ctx->flags & HLCACHE_RETRIEVE_SNIFF_TYPE,
- ctx->accepted_types == CONTENT_IMAGE,
- &effective_type);
- if (error == NSERROR_OK || error == NSERROR_NOT_FOUND) {
- /* If the sniffer was successful or failed to find
- * a Content-Type header when sniffing was
- * prohibited, we must migrate the retrieval context. */
- error = hlcache_migrate_ctx(ctx, effective_type);
-
- if (effective_type != NULL)
- lwc_string_unref(effective_type);
- }
-
- /* No need to report that we need data:
- * we'll get some anyway if there is any */
- if (error == NSERROR_NEED_DATA)
- error = NSERROR_OK;
-
- return error;
-
- break;
- case LLCACHE_EVENT_HAD_DATA:
- error = mimesniff_compute_effective_type(handle,
- event->data.data.buf, event->data.data.len,
- ctx->flags & HLCACHE_RETRIEVE_SNIFF_TYPE,
- ctx->accepted_types == CONTENT_IMAGE,
- &effective_type);
- if (error != NSERROR_OK) {
- assert(0 && "MIME sniff failed with data");
- }
-
- error = hlcache_migrate_ctx(ctx, effective_type);
-
- lwc_string_unref(effective_type);
-
- return error;
-
- break;
- case LLCACHE_EVENT_DONE:
- /* DONE event before we could determine the effective MIME type.
- */
- error = mimesniff_compute_effective_type(handle,
- NULL, 0, false, false, &effective_type);
- if (error == NSERROR_OK) {
- error = hlcache_migrate_ctx(ctx, effective_type);
-
- lwc_string_unref(effective_type);
-
- return error;
- }
-
- if (ctx->handle->cb != NULL) {
- hlcache_event hlevent;
-
- hlevent.type = CONTENT_MSG_ERROR;
- hlevent.data.error = messages_get("BadType");
-
- ctx->handle->cb(ctx->handle, &hlevent, ctx->handle->pw);
- }
- break;
- case LLCACHE_EVENT_ERROR:
- if (ctx->handle->cb != NULL) {
- hlcache_event hlevent;
-
- hlevent.type = CONTENT_MSG_ERROR;
- hlevent.data.error = event->data.msg;
-
- ctx->handle->cb(ctx->handle, &hlevent, ctx->handle->pw);
- }
- break;
- case LLCACHE_EVENT_PROGRESS:
- break;
- case LLCACHE_EVENT_REDIRECT:
- if (ctx->handle->cb != NULL) {
- hlcache_event hlevent;
-
- hlevent.type = CONTENT_MSG_REDIRECT;
- hlevent.data.redirect.from = event->data.redirect.from;
- hlevent.data.redirect.to = event->data.redirect.to;
-
- ctx->handle->cb(ctx->handle, &hlevent, ctx->handle->pw);
- }
- break;
- }
-
- return NSERROR_OK;
-}
-
-/**
- * Migrate a retrieval context into its final destination content
- *
- * \param ctx Context to migrate
- * \param effective_type The effective MIME type of the content, or NULL
- * \return NSERROR_OK on success,
- * NSERROR_NEED_DATA on success where data is needed,
- * appropriate error otherwise
- */
-nserror hlcache_migrate_ctx(hlcache_retrieval_ctx *ctx,
- lwc_string *effective_type)
-{
- content_type type = CONTENT_NONE;
- nserror error = NSERROR_OK;
-
- ctx->migrate_target = true;
-
- if (effective_type != NULL &&
- hlcache_type_is_acceptable(effective_type,
- ctx->accepted_types, &type)) {
- error = hlcache_find_content(ctx, effective_type);
- if (error != NSERROR_OK && error != NSERROR_NEED_DATA) {
- if (ctx->handle->cb != NULL) {
- hlcache_event hlevent;
-
- hlevent.type = CONTENT_MSG_ERROR;
- hlevent.data.error = messages_get("MiscError");
-
- ctx->handle->cb(ctx->handle, &hlevent,
- ctx->handle->pw);
- }
-
- llcache_handle_abort(ctx->llcache);
- llcache_handle_release(ctx->llcache);
- }
- } else if (type == CONTENT_NONE &&
- (ctx->flags & HLCACHE_RETRIEVE_MAY_DOWNLOAD)) {
- /* Unknown type, and we can download, so convert */
- llcache_handle_force_stream(ctx->llcache);
-
- if (ctx->handle->cb != NULL) {
- hlcache_event hlevent;
-
- hlevent.type = CONTENT_MSG_DOWNLOAD;
- hlevent.data.download = ctx->llcache;
-
- ctx->handle->cb(ctx->handle, &hlevent,
- ctx->handle->pw);
- }
-
- /* Ensure caller knows we need data */
- error = NSERROR_NEED_DATA;
- } else {
- /* Unacceptable type: report error */
- if (ctx->handle->cb != NULL) {
- hlcache_event hlevent;
-
- hlevent.type = CONTENT_MSG_ERROR;
- hlevent.data.error = messages_get("UnacceptableType");
-
- ctx->handle->cb(ctx->handle, &hlevent,
- ctx->handle->pw);
- }
-
- llcache_handle_abort(ctx->llcache);
- llcache_handle_release(ctx->llcache);
- }
-
- ctx->migrate_target = false;
-
- /* No longer require retrieval context */
- RING_REMOVE(hlcache->retrieval_ctx_ring, ctx);
- free((char *) ctx->child.charset);
- free(ctx);
-
- return error;
-}
-
-/**
- * Determine if the specified MIME type is acceptable
- *
- * \param mime_type MIME type to consider
- * \param accepted_types Array of acceptable types, or NULL for any
- * \param computed_type Pointer to location to receive computed type of object
- * \return True if the type is acceptable, false otherwise
- */
-bool hlcache_type_is_acceptable(lwc_string *mime_type,
- content_type accepted_types, content_type *computed_type)
-{
- content_type type;
-
- type = content_factory_type_from_mime_type(mime_type);
-
- *computed_type = type;
-
- return ((accepted_types & type) != 0);
-}
-
-/**
- * Find a content for the high-level cache handle
- *
- * \param ctx High-level cache retrieval context
- * \param effective_type Effective MIME type of content
- * \return NSERROR_OK on success,
- * NSERROR_NEED_DATA on success where data is needed,
- * appropriate error otherwise
- *
- * \pre handle::state == HLCACHE_HANDLE_NEW
- * \pre Headers must have been received for associated low-level handle
- * \post Low-level handle is either released, or associated with new content
- * \post High-level handle is registered with content
- */
-nserror hlcache_find_content(hlcache_retrieval_ctx *ctx,
- lwc_string *effective_type)
-{
- hlcache_entry *entry;
- hlcache_event event;
- nserror error = NSERROR_OK;
-
- /* Search list of cached contents for a suitable one */
- for (entry = hlcache->content_list; entry != NULL; entry = entry->next) {
- hlcache_handle entry_handle = { entry, NULL, NULL };
- const llcache_handle *entry_llcache;
-
- if (entry->content == NULL)
- continue;
-
- /* Ignore contents in the error state */
- if (content_get_status(&entry_handle) == CONTENT_STATUS_ERROR)
- continue;
-
- /* Ensure that content is shareable */
- if (content_is_shareable(entry->content) == false)
- continue;
-
- /* Ensure that quirks mode is acceptable */
- if (content_matches_quirks(entry->content,
- ctx->child.quirks) == false)
- continue;
-
- /* Ensure that content uses same low-level object as
- * low-level handle */
- entry_llcache = content_get_llcache_handle(entry->content);
-
- if (llcache_handle_references_same_object(entry_llcache,
- ctx->llcache))
- break;
- }
-
- if (entry == NULL) {
- /* No existing entry, so need to create one */
- entry = malloc(sizeof(hlcache_entry));
- if (entry == NULL)
- return NSERROR_NOMEM;
-
- /* Create content using llhandle */
- entry->content = content_factory_create_content(ctx->llcache,
- ctx->child.charset, ctx->child.quirks,
- effective_type);
- if (entry->content == NULL) {
- free(entry);
- return NSERROR_NOMEM;
- }
-
- /* Insert into cache */
- entry->prev = NULL;
- entry->next = hlcache->content_list;
- if (hlcache->content_list != NULL)
- hlcache->content_list->prev = entry;
- hlcache->content_list = entry;
-
- /* Signal to caller that we created a content */
- error = NSERROR_NEED_DATA;
-
- hlcache->miss_count++;
- } else {
- /* Found a suitable content: no longer need low-level handle */
- llcache_handle_release(ctx->llcache);
- hlcache->hit_count++;
- }
-
- /* Associate handle with content */
- if (content_add_user(entry->content,
- hlcache_content_callback, ctx->handle) == false)
- return NSERROR_NOMEM;
-
- /* Associate cache entry with handle */
- ctx->handle->entry = entry;
-
- /* Catch handle up with state of content */
- if (ctx->handle->cb != NULL) {
- content_status status = content_get_status(ctx->handle);
-
- if (status == CONTENT_STATUS_LOADING) {
- event.type = CONTENT_MSG_LOADING;
- ctx->handle->cb(ctx->handle, &event, ctx->handle->pw);
- } else if (status == CONTENT_STATUS_READY) {
- event.type = CONTENT_MSG_LOADING;
- ctx->handle->cb(ctx->handle, &event, ctx->handle->pw);
-
- if (ctx->handle->cb != NULL) {
- event.type = CONTENT_MSG_READY;
- ctx->handle->cb(ctx->handle, &event,
- ctx->handle->pw);
- }
- } else if (status == CONTENT_STATUS_DONE) {
- event.type = CONTENT_MSG_LOADING;
- ctx->handle->cb(ctx->handle, &event, ctx->handle->pw);
-
- if (ctx->handle->cb != NULL) {
- event.type = CONTENT_MSG_READY;
- ctx->handle->cb(ctx->handle, &event,
- ctx->handle->pw);
- }
-
- if (ctx->handle->cb != NULL) {
- event.type = CONTENT_MSG_DONE;
- ctx->handle->cb(ctx->handle, &event,
- ctx->handle->pw);
- }
- }
- }
-
- return error;
-}
-
-/**
- * Veneer between content callback API and hlcache callback API
- *
- * \param c Content to emit message for
- * \param msg Message to emit
- * \param data Data for message
- * \param pw Pointer to private data (hlcache_handle)
- */
-void hlcache_content_callback(struct content *c, content_msg msg,
- union content_msg_data data, void *pw)
-{
- hlcache_handle *handle = pw;
- hlcache_event event;
- nserror error = NSERROR_OK;
-
- event.type = msg;
- event.data = data;
-
- if (handle->cb != NULL)
- error = handle->cb(handle, &event, handle->pw);
-
- if (error != NSERROR_OK)
- LOG(("Error in callback: %d", error));
-}
diff --git a/content/hlcache.h b/content/hlcache.h
index 41f1ed6f4..e0bf4161d 100644
--- a/content/hlcache.h
+++ b/content/hlcache.h
@@ -23,11 +23,12 @@
#ifndef NETSURF_CONTENT_HLCACHE_H_
#define NETSURF_CONTENT_HLCACHE_H_
-#include "content/content.h"
-#include "content/llcache.h"
#include "utils/errors.h"
#include "utils/nsurl.h"
+#include "content/content.h"
+#include "content/llcache.h"
+
/** High-level cache handle */
typedef struct hlcache_handle hlcache_handle;
@@ -44,18 +45,10 @@ typedef struct {
} hlcache_event;
struct hlcache_parameters {
- llcache_query_callback cb; /**< Query handler for llcache */
- void *cb_ctx; /**< Pointer to llcache query handler data */
-
/** How frequently the background cache clean process is run (ms) */
unsigned int bg_clean_time;
- /** The target upper bound for the cache size */
- size_t limit;
-
- /** The hysteresis allowed round the target size */
- size_t hysteresis;
-
+ struct llcache_parameters llcache;
};
/**
@@ -67,13 +60,13 @@ struct hlcache_parameters {
* \return NSERROR_OK on success, appropriate error otherwise.
*/
typedef nserror (*hlcache_handle_callback)(hlcache_handle *handle,
- const hlcache_event *event, void *pw);
+ const hlcache_event *event, void *pw);
/** Flags for high-level cache object retrieval */
enum hlcache_retrieve_flag {
- /* Note: low-level cache retrieval flags occupy the bottom 16 bits of
- * the flags word. High-level cache flags occupy the top 16 bits.
- * To avoid confusion, high-level flags are allocated from bit 31 down.
+ /* Note: low-level cache retrieval flags occupy the bottom 16 bits of
+ * the flags word. High-level cache flags occupy the top 16 bits.
+ * To avoid confusion, high-level flags are allocated from bit 31 down.
*/
/** It's permitted to convert this request into a download */
HLCACHE_RETRIEVE_MAY_DOWNLOAD = (1 << 31),
@@ -84,7 +77,7 @@ enum hlcache_retrieve_flag {
/**
* Initialise the high-level cache, preparing the llcache also.
*
- * \param hlcache_parameters Settings to initialise cache with
+ * \param hlcache_parameters Settings to initialise cache with
* \return NSERROR_OK on success, appropriate error otherwise.
*/
nserror hlcache_initialise(const struct hlcache_parameters *hlcache_parameters);
@@ -101,14 +94,6 @@ void hlcache_stop(void);
void hlcache_finalise(void);
/**
- * Drive the low-level cache poll loop, and attempt to clean the cache.
- * No guarantee is made about what, if any, cache cleaning will occur.
- *
- * \return NSERROR_OK
- */
-nserror hlcache_poll(void);
-
-/**
* Retrieve a high-level cache handle for an object
*
* \param url URL of the object to retrieve handle for
@@ -133,7 +118,7 @@ nserror hlcache_poll(void);
nserror hlcache_handle_retrieve(nsurl *url, uint32_t flags,
nsurl *referer, llcache_post_data *post,
hlcache_handle_callback cb, void *pw,
- hlcache_child_context *child,
+ hlcache_child_context *child,
content_type accepted_types, hlcache_handle **result);
/**
@@ -169,13 +154,13 @@ nserror hlcache_handle_replace_callback(hlcache_handle *handle,
* \param handle Cache handle to dereference
* \return Pointer to content object, or NULL if there is none
*
- * \todo This may not be correct. Ideally, the client should never need to
- * directly access a content object. It may, therefore, be better to provide a
- * bunch of veneers here that take a hlcache_handle and invoke the
+ * \todo This may not be correct. Ideally, the client should never need to
+ * directly access a content object. It may, therefore, be better to provide a
+ * bunch of veneers here that take a hlcache_handle and invoke the
* corresponding content_ API. If there's no content object associated with the
- * hlcache_handle (e.g. because the source data is still being fetched, so it
- * doesn't exist yet), then these veneers would behave as a NOP. The important
- * thing being that the client need not care about this possibility and can
+ * hlcache_handle (e.g. because the source data is still being fetched, so it
+ * doesn't exist yet), then these veneers would behave as a NOP. The important
+ * thing being that the client need not care about this possibility and can
* just call the functions with impugnity.
*/
struct content *hlcache_handle_get_content(const hlcache_handle *handle);
diff --git a/content/llcache.c b/content/llcache.c
index f2e519f49..ad4d6d1f7 100644
--- a/content/llcache.c
+++ b/content/llcache.c
@@ -17,25 +17,50 @@
*/
/** \file
- * Low-level resource cache (implementation)
+ * Low-level resource cache implementation
+ *
+ * This is the implementation of the low level cache. This cache
+ * stores source objects in memory and may use a persistant backing
+ * store to extend their lifetime.
+ *
+ * \todo fix writeout conditions and ordering.
+ *
+ * \todo support mmaped retrieve
+ *
+ * \todo instrument and (auto)tune
+ *
*/
#include <stdlib.h>
#include <string.h>
-#include <time.h>
-
#include <curl/curl.h>
-#include "content/fetch.h"
-#include "content/llcache.h"
-#include "content/urldb.h"
+#include "utils/config.h"
+
+#include "utils/corestrings.h"
#include "utils/log.h"
#include "utils/messages.h"
#include "utils/nsurl.h"
#include "utils/utils.h"
+#include "utils/time.h"
+#include "desktop/gui_factory.h"
+
+#include "content/fetch.h"
+#include "content/backing_store.h"
+#include "content/urldb.h"
/** Define to enable tracing of llcache operations. */
#undef LLCACHE_TRACE
+//#define LLCACHE_TRACE 1
+
+#ifdef LLCACHE_TRACE
+#define LLCACHE_LOG(x) LOG(x)
+#else
+#define LLCACHE_LOG(x)
+#endif
+
+#define LLCACHE_MIN_DISC_LIFETIME 3600
+#define LLCACHE_MAX_DISC_BANDWIDTH (512*1024)
/** State of a low-level cache object fetch */
typedef enum {
@@ -74,7 +99,7 @@ typedef struct llcache_object_user {
typedef struct {
uint32_t flags; /**< Fetch flags */
nsurl *referer; /**< Referring URL, or NULL if none */
- llcache_post_data *post; /**< POST data, or NULL for GET */
+ llcache_post_data *post; /**< POST data, or NULL for GET */
struct fetch *fetch; /**< Fetch handle for this object */
@@ -89,19 +114,23 @@ typedef struct {
bool outstanding_query; /**< Waiting for a query response */
} llcache_fetch_ctx;
+/** validation control */
typedef enum {
LLCACHE_VALIDATE_FRESH, /**< Only revalidate if not fresh */
LLCACHE_VALIDATE_ALWAYS, /**< Always revalidate */
LLCACHE_VALIDATE_ONCE /**< Revalidate once only */
} llcache_validate;
+/** cache control value for invalid age */
+#define INVALID_AGE -1
+
/** Cache control data */
typedef struct {
time_t req_time; /**< Time of request */
time_t res_time; /**< Time of response */
+ time_t fin_time; /**< Time of request completion */
time_t date; /**< Date: response header */
time_t expires; /**< Expires: response header */
-#define INVALID_AGE -1
int age; /**< Age: response header */
int max_age; /**< Max-Age Cache-control parameter */
llcache_validate no_cache; /**< No-Cache Cache-control parameter */
@@ -115,32 +144,49 @@ typedef struct {
char *value; /**< Header value */
} llcache_header;
+/** Current status of objects data */
+typedef enum {
+ LLCACHE_STATE_RAM = 0, /**< source data is stored in RAM only */
+ LLCACHE_STATE_MMAP, /**< source data is mmaped (implies on disc too) */
+ LLCACHE_STATE_DISC, /**< source data is stored on disc */
+} llcache_store_state;
+
/** Low-level cache object */
/** \todo Consider whether a list is a sane container */
struct llcache_object {
- llcache_object *prev; /**< Previous in list */
- llcache_object *next; /**< Next in list */
+ llcache_object *prev; /**< Previous in list */
+ llcache_object *next; /**< Next in list */
+
+ nsurl *url; /**< Post-redirect URL for object */
- nsurl *url; /**< Post-redirect URL for object */
- bool has_query; /**< URL has a query segment */
-
/** \todo We need a generic dynamic buffer object */
- uint8_t *source_data; /**< Source data for object */
- size_t source_len; /**< Byte length of source data */
- size_t source_alloc; /**< Allocated size of source buffer */
+ uint8_t *source_data; /**< Source data for object */
+ size_t source_len; /**< Byte length of source data */
+ size_t source_alloc; /**< Allocated size of source buffer */
+
+ llcache_store_state store_state; /**< where the data for the object is stored */
- llcache_object_user *users; /**< List of users */
+ llcache_object_user *users; /**< List of users */
- llcache_fetch_ctx fetch; /**< Fetch context for object */
+ llcache_fetch_ctx fetch; /**< Fetch context for object */
- llcache_cache_control cache; /**< Cache control data for object */
- llcache_object *candidate; /**< Object to use, if fetch determines
- * that it is still fresh */
- uint32_t candidate_count; /**< Count of objects this is a
- * candidate for */
+ llcache_cache_control cache; /**< Cache control data for object */
+ llcache_object *candidate; /**< Object to use, if fetch determines
+ * that it is still fresh
+ */
+ uint32_t candidate_count; /**< Count of objects this is a
+ * candidate for
+ */
- llcache_header *headers; /**< Fetch headers */
- size_t num_headers; /**< Number of fetch headers */
+ llcache_header *headers; /**< Fetch headers */
+ size_t num_headers; /**< Number of fetch headers */
+
+ /* Instrumentation. These elemnts are strictly for information
+ * to improve the cache performance and to provide performace
+ * metrics. The values are non-authorative and must not be used to
+ * determine object lifetime etc.
+ */
+ time_t last_used; /**< time the last user was removed from the object */
};
struct llcache_s {
@@ -156,19 +202,28 @@ struct llcache_s {
/** Head of the low-level uncached object list */
llcache_object *uncached_objects;
+ /** The target upper bound for the RAM cache size */
uint32_t limit;
+
+ /** The minimum lifetime to consider sending objects to
+ * backing store.
+ */
+ int minimum_lifetime;
+
+ /** The maximum bandwidth to allow the backing store to use. */
+ size_t bandwidth;
+
+ /** Whether or not our users are caught up */
+ bool all_caught_up;
};
/** low level cache state */
static struct llcache_s *llcache = NULL;
-/* Static lwc_strings */
-static lwc_string *llcache_file_lwc;
-static lwc_string *llcache_about_lwc;
-static lwc_string *llcache_resource_lwc;
-
/* forward referenced callback function */
static void llcache_fetch_callback(const fetch_msg *msg, void *p);
+/* forward referenced catch up function */
+static void llcache_users_not_caught_up(void);
/******************************************************************************
@@ -204,9 +259,7 @@ static nserror llcache_object_user_new(llcache_handle_callback cb, void *pw,
u->handle = h;
-#ifdef LLCACHE_TRACE
- LOG(("Created user %p (%p, %p, %p)", u, h, (void *) cb, pw));
-#endif
+ LLCACHE_LOG(("Created user %p (%p, %p, %p)", u, h, (void *) cb, pw));
*user = u;
@@ -223,13 +276,11 @@ static nserror llcache_object_user_new(llcache_handle_callback cb, void *pw,
*/
static nserror llcache_object_user_destroy(llcache_object_user *user)
{
-#ifdef LLCACHE_TRACE
- LOG(("Destroyed user %p", user));
-#endif
-
+ LLCACHE_LOG(("Destroyed user %p", user));
+
assert(user->next == NULL);
assert(user->prev == NULL);
-
+
if (user->handle != NULL)
free(user->handle);
@@ -245,7 +296,7 @@ static nserror llcache_object_user_destroy(llcache_object_user *user)
* \param user User to remove
* \return NSERROR_OK.
*/
-static nserror llcache_object_remove_user(llcache_object *object,
+static nserror llcache_object_remove_user(llcache_object *object,
llcache_object_user *user)
{
assert(user != NULL);
@@ -253,7 +304,7 @@ static nserror llcache_object_remove_user(llcache_object *object,
assert(object->users != NULL);
assert(user->handle == NULL || user->handle->object == object);
assert((user->prev != NULL) || (object->users == user));
-
+
if (user == object->users)
object->users = user->next;
else
@@ -261,12 +312,15 @@ static nserror llcache_object_remove_user(llcache_object *object,
if (user->next != NULL)
user->next->prev = user->prev;
-
+
user->next = user->prev = NULL;
-
-#ifdef LLCACHE_TRACE
- LOG(("Removing user %p from %p", user, object));
-#endif
+
+ /* record the time the last user was removed from the object */
+ if (object->users == NULL) {
+ object->last_used = time(NULL);
+ }
+
+ LLCACHE_LOG(("Removing user %p from %p", user, object));
return NSERROR_OK;
}
@@ -283,7 +337,7 @@ static nserror llcache_send_event_to_users(llcache_object *object,
{
nserror error = NSERROR_OK;
llcache_object_user *user, *next_user;
-
+
user = object->users;
while (user != NULL) {
user->iterator_target = true;
@@ -305,7 +359,7 @@ static nserror llcache_send_event_to_users(llcache_object *object,
user = next_user;
}
-
+
return error;
}
@@ -322,9 +376,7 @@ static nserror llcache_object_new(nsurl *url, llcache_object **result)
if (obj == NULL)
return NSERROR_NOMEM;
-#ifdef LLCACHE_TRACE
- LOG(("Created object %p (%s)", obj, nsurl_access(url)));
-#endif
+ LLCACHE_LOG(("Created object %p (%s)", obj, nsurl_access(url)));
obj->url = nsurl_ref(url);
@@ -340,7 +392,7 @@ static nserror llcache_object_new(nsurl *url, llcache_object **result)
* \param clone Pointer to location to receive clone
* \return NSERROR_OK on success, appropriate error otherwise
*/
-static nserror llcache_post_data_clone(const llcache_post_data *orig,
+static nserror llcache_post_data_clone(const llcache_post_data *orig,
llcache_post_data **clone)
{
llcache_post_data *post_clone;
@@ -383,17 +435,31 @@ static nserror llcache_post_data_clone(const llcache_post_data *orig,
* \param value Pointer to location to receive header value
* \return NSERROR_OK on success, appropriate error otherwise
*/
-static nserror llcache_fetch_split_header(const uint8_t *data, size_t len,
+static nserror llcache_fetch_split_header(const uint8_t *data, size_t len,
char **name, char **value)
{
char *n, *v;
const uint8_t *colon;
+ /* Strip leading whitespace from name */
+ while (data[0] == ' ' || data[0] == '\t' ||
+ data[0] == '\r' || data[0] == '\n') {
+ data++;
+ }
+
/* Find colon */
colon = (const uint8_t *) strchr((const char *) data, ':');
if (colon == NULL) {
/* Failed, assume a key with no value */
- n = strdup((const char *) data);
+ colon = data + strlen((const char *)data);
+
+ /* Strip trailing whitespace from name */
+ while ((colon > data) &&
+ (colon[-1] == ' ' || colon[-1] == '\t' ||
+ colon[-1] == '\r' || colon[-1] == '\n')) {
+ colon--;
+ }
+ n = strndup((const char *) data, colon - data);
if (n == NULL)
return NSERROR_NOMEM;
@@ -405,15 +471,9 @@ static nserror llcache_fetch_split_header(const uint8_t *data, size_t len,
} else {
/* Split header into name & value */
- /* Strip leading whitespace from name */
- while (data[0] == ' ' || data[0] == '\t' ||
- data[0] == '\r' || data[0] == '\n') {
- data++;
- }
-
/* Strip trailing whitespace from name */
- while (colon > data && (colon[-1] == ' ' ||
- colon[-1] == '\t' || colon[-1] == '\r' ||
+ while (colon > data && (colon[-1] == ' ' ||
+ colon[-1] == '\t' || colon[-1] == '\r' ||
colon[-1] == '\n'))
colon--;
@@ -429,12 +489,12 @@ static nserror llcache_fetch_split_header(const uint8_t *data, size_t len,
/* Skip over colon and any subsequent whitespace */
do {
colon++;
- } while (*colon == ' ' || *colon == '\t' ||
+ } while (*colon == ' ' || *colon == '\t' ||
*colon == '\r' || *colon == '\n');
/* Strip trailing whitespace from value */
- while (len > 0 && (data[len - 1] == ' ' ||
- data[len - 1] == '\t' ||
+ while (len > 0 && (data[len - 1] == ' ' ||
+ data[len - 1] == '\t' ||
data[len - 1] == '\r' ||
data[len - 1] == '\n')) {
len--;
@@ -463,11 +523,11 @@ static nserror llcache_fetch_split_header(const uint8_t *data, size_t len,
* \param value Pointer to location to receive header value
* \return NSERROR_OK on success, appropriate error otherwise
*
- * \note This function also has the side-effect of updating
+ * \note This function also has the side-effect of updating
* the cache control data for the object if an interesting
* header is encountered
*/
-static nserror llcache_fetch_parse_header(llcache_object *object,
+static nserror llcache_fetch_parse_header(llcache_object *object,
const uint8_t *data, size_t len, char **name, char **value)
{
nserror error;
@@ -503,13 +563,13 @@ static nserror llcache_fetch_parse_header(llcache_object *object,
while (*comma != '\0' && *comma != ',')
comma++;
- if (8 < comma - start && (strncasecmp(start,
- "no-cache", 8) == 0 ||
+ if (8 < comma - start && (strncasecmp(start,
+ "no-cache", 8) == 0 ||
strncasecmp(start, "no-store", 8) == 0))
/* When we get a disk cache we should
* distinguish between these two */
object->cache.no_cache = LLCACHE_VALIDATE_ALWAYS;
- else if (7 < comma - start &&
+ else if (7 < comma - start &&
strncasecmp(start, "max-age", 7) == 0) {
/* Find '=' */
while (start < comma && *start != '=')
@@ -551,7 +611,7 @@ static nserror llcache_fetch_parse_header(llcache_object *object,
#undef SKIP_ST
- return NSERROR_OK;
+ return NSERROR_OK;
}
/* Destroy headers */
@@ -585,7 +645,7 @@ static inline void llcache_invalidate_cache_control_data(llcache_object *object)
* \param len Byte length of header
* \return NSERROR_OK on success, appropriate error otherwise
*/
-static nserror llcache_fetch_process_header(llcache_object *object,
+static nserror llcache_fetch_process_header(llcache_object *object,
const uint8_t *data, size_t len)
{
nserror error;
@@ -593,14 +653,14 @@ static nserror llcache_fetch_process_header(llcache_object *object,
llcache_header *temp;
/* The headers for multiple HTTP responses may be delivered to us if
- * the fetch layer receives a 401 response for which it has
+ * the fetch layer receives a 401 response for which it has
* authentication credentials. This will result in a silent re-request
* after which we'll receive the actual response headers for the
* object we want to fetch (assuming that the credentials were correct
* of course)
*
- * Therefore, if the header is an HTTP response start marker, then we
- * must discard any headers we've read so far, reset the cache data
+ * Therefore, if the header is an HTTP response start marker, then we
+ * must discard any headers we've read so far, reset the cache data
* that we might have computed, and start again.
*/
/** \todo Properly parse the response line */
@@ -620,8 +680,15 @@ static nserror llcache_fetch_process_header(llcache_object *object,
return error;
}
+ /* deal with empty header */
+ if (name[0] == 0) {
+ free(name);
+ free(value);
+ return NSERROR_OK;
+ }
+
/* Append header data to the object's headers array */
- temp = realloc(object->headers, (object->num_headers + 1) *
+ temp = realloc(object->headers, (object->num_headers + 1) *
sizeof(llcache_header));
if (temp == NULL) {
free(name);
@@ -646,7 +713,7 @@ static nserror llcache_fetch_process_header(llcache_object *object,
* \return NSERROR_OK on success, appropriate error otherwise
*
* \pre The fetch parameters in object->fetch must be populated
- */
+ */
static nserror llcache_object_refetch(llcache_object *object)
{
const char *urlenc = NULL;
@@ -667,7 +734,7 @@ static nserror llcache_object_refetch(llcache_object *object)
return NSERROR_NOMEM;
if (object->cache.etag != NULL) {
- const size_t len = SLEN("If-None-Match: ") +
+ const size_t len = SLEN("If-None-Match: ") +
strlen(object->cache.etag) + 1;
headers[header_idx] = malloc(len);
@@ -703,13 +770,12 @@ static nserror llcache_object_refetch(llcache_object *object)
/* Reset cache control data */
llcache_invalidate_cache_control_data(object);
object->cache.req_time = time(NULL);
+ object->cache.fin_time = object->cache.req_time;
/* Reset fetch state */
object->fetch.state = LLCACHE_FETCH_INIT;
-#ifdef LLCACHE_TRACE
- LOG(("Refetching %p", object));
-#endif
+ LLCACHE_LOG(("Refetching %p", object));
/* Kick off fetch */
object->fetch.fetch = fetch_start(object->url, object->fetch.referer,
@@ -743,7 +809,7 @@ static nserror llcache_object_refetch(llcache_object *object)
* \return NSERROR_OK on success, appropriate error otherwise
*
* \pre object::url must contain the URL to fetch
- * \pre If there is a freshness validation candidate,
+ * \pre If there is a freshness validation candidate,
* object::candidate and object::cache must be filled in
* \pre There must not be a fetch in progress for \a object
*/
@@ -755,9 +821,7 @@ static nserror llcache_object_fetch(llcache_object *object, uint32_t flags,
nsurl *referer_clone = NULL;
llcache_post_data *post_clone = NULL;
-#ifdef LLCACHE_TRACE
- LOG(("Starting fetch for %p", object));
-#endif
+ LLCACHE_LOG(("Starting fetch for %p", object));
if (post != NULL) {
error = llcache_post_data_clone(post, &post_clone);
@@ -790,9 +854,7 @@ static nserror llcache_object_destroy(llcache_object *object)
{
size_t i;
-#ifdef LLCACHE_TRACE
- LOG(("Destroying object %p", object));
-#endif
+ LLCACHE_LOG(("Destroying object %p", object));
nsurl_unref(object->url);
free(object->source_data);
@@ -876,9 +938,7 @@ llcache_object_rfc2616_remaining_lifetime(const llcache_cache_control *cd)
else
freshness_lifetime = 0;
-#ifdef LLCACHE_TRACE
- LOG(("%d:%d", freshness_lifetime, current_age));
-#endif
+ /* LLCACHE_LOG(("%d:%d", freshness_lifetime, current_age)); */
if ((cd->no_cache == LLCACHE_VALIDATE_FRESH) &&
(freshness_lifetime > current_age)) {
@@ -907,17 +967,15 @@ static bool llcache_object_is_fresh(const llcache_object *object)
remaining_lifetime = llcache_object_rfc2616_remaining_lifetime(cd);
-#ifdef LLCACHE_TRACE
- LOG(("%p: (%d > 0 || %d != %d)", object,
+ LLCACHE_LOG(("%p: (%d > 0 || %d != %d)", object,
remaining_lifetime,
object->fetch.state, LLCACHE_FETCH_COMPLETE));
-#endif
/* The object is fresh if:
* - it was not forbidden from being returned from the cache
* unvalidated.
*
- * - it has remaining lifetime or still being fetched.
+ * - it has remaining lifetime or still being fetched.
*/
return ((cd->no_cache == LLCACHE_VALIDATE_FRESH) &&
((remaining_lifetime > 0) ||
@@ -959,6 +1017,7 @@ static nserror llcache_object_clone_cache_data(llcache_object *source,
destination->cache.req_time = source->cache.req_time;
destination->cache.res_time = source->cache.res_time;
+ destination->cache.fin_time = source->cache.fin_time;
if (source->cache.date != 0)
destination->cache.date = source->cache.date;
@@ -974,7 +1033,7 @@ static nserror llcache_object_clone_cache_data(llcache_object *source,
if (source->cache.no_cache != LLCACHE_VALIDATE_FRESH)
destination->cache.no_cache = source->cache.no_cache;
-
+
if (source->cache.last_modified != 0)
destination->cache.last_modified = source->cache.last_modified;
@@ -982,6 +1041,377 @@ static nserror llcache_object_clone_cache_data(llcache_object *source,
}
/**
+ * Remove a low-level cache object from a cache list
+ *
+ * \param object Object to remove
+ * \param list List to remove from
+ * \return NSERROR_OK
+ */
+static nserror
+llcache_object_remove_from_list(llcache_object *object, llcache_object **list)
+{
+ if (object == *list)
+ *list = object->next;
+ else
+ object->prev->next = object->next;
+
+ if (object->next != NULL)
+ object->next->prev = object->prev;
+
+ return NSERROR_OK;
+}
+
+/**
+ * Retrieve source data for an object from persistant store if necessary.
+ *
+ * If an objects source data has been placed in the persistant store
+ * and the in memory copy freed this will attempt to retrive the
+ * source data.
+ *
+ * @param object the object to operate on.
+ * @return apropriate error code.
+ */
+static nserror llcache_persist_retrieve(llcache_object *object)
+{
+ enum backing_store_flags flags = BACKING_STORE_NONE;
+
+ /* ensure the source data is present if necessary */
+ if ((object->source_data != NULL) ||
+ (object->store_state != LLCACHE_STATE_DISC)) {
+ /* source data does not require retriving from
+ * persistant store.
+ */
+ return NSERROR_OK;
+ }
+
+ /* Source data for the object may be in the persiatant store */
+ return guit->llcache->fetch(object->url,
+ &flags,
+ &object->source_data,
+ &object->source_len);
+}
+
+/**
+ * Generate a serialised version of an objects metadata
+ *
+ * metadata includes object headers
+ */
+static nserror
+llcache_serialise_metadata(llcache_object *object,
+ uint8_t **data_out,
+ size_t *datasize_out)
+{
+ size_t allocsize;
+ int datasize;
+ uint8_t *data;
+ char *op;
+ unsigned int hloop;
+ int use;
+
+ allocsize = 10 + 1; /* object length */
+
+ allocsize += 10 + 1; /* request time */
+
+ allocsize += 10 + 1; /* response time */
+
+ allocsize += 10 + 1; /* completion time */
+
+ allocsize += 10 + 1; /* space for number of header entries */
+
+ allocsize += nsurl_length(object->url) + 1;
+
+ for (hloop = 0 ; hloop < object->num_headers ; hloop++) {
+ allocsize += strlen(object->headers[hloop].name) + 1;
+ allocsize += strlen(object->headers[hloop].value) + 1;
+ }
+
+ data = malloc(allocsize);
+ if (data == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ op = (char *)data;
+ datasize = allocsize;
+
+ /* the url, used for checking for collisions */
+ use = snprintf(op, datasize, "%s", nsurl_access(object->url));
+ if (use < 0) {
+ goto operror;
+ }
+ use++; /* does not count the null */
+ if (use > datasize) {
+ goto overflow;
+ }
+ op += use;
+ datasize -= use;
+
+ /* object size */
+ use = snprintf(op, datasize, "%zu", object->source_len);
+ if (use < 0) {
+ goto operror;
+ }
+ use++; /* does not count the null */
+ if (use > datasize)
+ goto overflow;
+ op += use;
+ datasize -= use;
+
+ /* Time of request */
+ use = nsc_sntimet(op, datasize, &object->cache.req_time);
+ if (use == 0)
+ goto overflow;
+ use++; /* does not count the null */
+ op += use;
+ datasize -= use;
+
+ /* Time of response */
+ use = nsc_sntimet(op, datasize, &object->cache.res_time);
+ if (use == 0)
+ goto overflow;
+ use++; /* does not count the null */
+ op += use;
+ datasize -= use;
+
+ /* Time of completion */
+ use = nsc_sntimet(op, datasize, &object->cache.fin_time);
+ if (use == 0)
+ goto overflow;
+ use++; /* does not count the null */
+ op += use;
+ datasize -= use;
+
+ /* number of headers */
+ use = snprintf(op, datasize, "%zu", object->num_headers);
+ if (use < 0) {
+ goto operror;
+ }
+ use++; /* does not count the null */
+ if (use > datasize)
+ goto overflow;
+ op += use;
+ datasize -= use;
+
+ /* headers */
+ for (hloop = 0 ; hloop < object->num_headers ; hloop++) {
+ use = snprintf(op, datasize,
+ "%s:%s",
+ object->headers[hloop].name,
+ object->headers[hloop].value);
+ if (use < 0) {
+ goto operror;
+ }
+ use++; /* does not count the null */
+ if (use > datasize)
+ goto overflow;
+ op += use;
+ datasize -= use;
+ }
+
+ LLCACHE_LOG(("Filled buffer with %d spare", datasize));
+
+ *data_out = data;
+ *datasize_out = allocsize - datasize;
+
+ return NSERROR_OK;
+
+overflow:
+ /* somehow we overflowed the buffer - hth? */
+ LOG(("Overflowed metadata buffer"));
+ free(data);
+ return NSERROR_INVALID;
+
+operror:
+ /* output error */
+ LOG(("Output error"));
+ free(data);
+ return NSERROR_INVALID;
+}
+
+/**
+ * un-serialise an objects metadata.
+ */
+static nserror
+llcache_process_metadata(llcache_object *object)
+{
+ nserror res;
+ uint8_t *metadata = NULL;
+ size_t metadatalen = 0;
+ nsurl *metadataurl;
+ unsigned int line;
+ uint8_t *end;
+ char *ln;
+ int lnsize;
+ size_t num_headers;
+ size_t hloop;
+ enum backing_store_flags flags = BACKING_STORE_META;
+
+ LOG(("Retriving metadata"));
+
+ /* attempt to retrieve object metadata from the backing store */
+ res = guit->llcache->fetch(object->url,
+ &flags,
+ &metadata,
+ &metadatalen);
+ if (res != NSERROR_OK) {
+ return res;
+ }
+
+ end = metadata + metadatalen;
+
+ LOG(("Processing retrived data"));
+
+ /* metadata line 1 is the url the metadata referrs to */
+ line = 1;
+ ln = (char *)metadata;
+ lnsize = strlen(ln);
+
+ if (lnsize < 7)
+ goto format_error;
+
+ res = nsurl_create(ln, &metadataurl);
+ if (res != NSERROR_OK) {
+ free(metadata);
+ return res;
+ }
+
+ if (nsurl_compare(object->url, metadataurl, NSURL_COMPLETE) != true) {
+ /* backing store returned the wrong object for the
+ * request. This may occour if the backing store had
+ * a collision in its stoage method. We cope with this
+ * by simply skipping caching of this object.
+ */
+
+ LOG(("Got metadata for %s instead of %s",
+ nsurl_access(metadataurl),
+ nsurl_access(object->url)));
+
+ nsurl_unref(metadataurl);
+
+ free(metadata);
+
+ return NSERROR_BAD_URL;
+ }
+ nsurl_unref(metadataurl);
+
+
+ /* metadata line 2 is the objects length */
+ line = 2;
+ ln += lnsize + 1;
+ lnsize = strlen(ln);
+
+ if ((lnsize < 1) ||
+ (sscanf(ln, "%zu", &object->source_len) != 1))
+ goto format_error;
+ object->source_alloc = metadatalen;
+
+ /* metadata line 3 is the time of request */
+ line = 3;
+ ln += lnsize + 1;
+ lnsize = strlen(ln);
+
+ if (nsc_snptimet(ln, lnsize, &object->cache.req_time) != NSERROR_OK)
+ goto format_error;
+
+ /* metadata line 4 is the time of response */
+ line = 4;
+ ln += lnsize + 1;
+ lnsize = strlen(ln);
+
+ if (nsc_snptimet(ln, lnsize, &object->cache.res_time) != NSERROR_OK)
+ goto format_error;
+
+ /* metadata line 5 is the time of request completion */
+ line = 5;
+ ln += lnsize + 1;
+ lnsize = strlen(ln);
+
+ if (nsc_snptimet(ln, lnsize, &object->cache.fin_time) != NSERROR_OK)
+ goto format_error;
+
+ /* metadata line 6 is the number of headers */
+ line = 6;
+ ln += lnsize + 1;
+ lnsize = strlen(ln);
+
+ if ((lnsize < 1) ||
+ (sscanf(ln, "%zu", &num_headers) != 1))
+ goto format_error;
+
+
+ /* read headers */
+ for (hloop = 0 ; hloop < num_headers; hloop++) {
+ line++;
+ ln += lnsize + 1;
+ lnsize = strlen(ln);
+
+ res = llcache_fetch_process_header(object, (uint8_t *)ln, lnsize);
+ if (res != NSERROR_OK) {
+ free(metadata);
+ return res;
+ }
+ }
+
+ free(metadata);
+
+ /* object stored in backing store */
+ object->store_state = LLCACHE_STATE_DISC;
+
+ return NSERROR_OK;
+
+format_error:
+ LOG(("metadata error on line %d\n", line));
+ free(metadata);
+ return NSERROR_INVALID;
+
+}
+
+/**
+ * attempt to retrieve an object from persistant storage.
+ */
+static nserror
+llcache_object_fetch_persistant(llcache_object *object,
+ uint32_t flags,
+ nsurl *referer,
+ const llcache_post_data *post,
+ uint32_t redirect_count)
+{
+ nserror error;
+ nsurl *referer_clone = NULL;
+ llcache_post_data *post_clone = NULL;
+
+ object->cache.req_time = time(NULL);
+ object->cache.fin_time = object->cache.req_time;
+
+ /* retrieve and process metadata */
+ error = llcache_process_metadata(object);
+ if (error != NSERROR_OK) {
+ return error;
+ }
+
+ /* entry came out of cache - need to setup object state */
+ if (post != NULL) {
+ error = llcache_post_data_clone(post, &post_clone);
+ if (error != NSERROR_OK)
+ return error;
+ }
+
+ if (referer != NULL) {
+ referer_clone = nsurl_ref(referer);
+ }
+
+ object->fetch.flags = flags;
+ object->fetch.referer = referer_clone;
+ object->fetch.post = post_clone;
+ object->fetch.redirect_count = redirect_count;
+
+ /* fetch is "finished" */
+ object->fetch.state = LLCACHE_FETCH_COMPLETE;
+ object->fetch.fetch = NULL;
+
+ return NSERROR_OK;
+}
+
+/**
* Retrieve a potentially cached object
*
* \param url URL of object to retrieve
@@ -992,96 +1422,158 @@ static nserror llcache_object_clone_cache_data(llcache_object *source,
* \param result Pointer to location to recieve retrieved object
* \return NSERROR_OK on success, appropriate error otherwise
*/
-static nserror llcache_object_retrieve_from_cache(nsurl *url, uint32_t flags,
- nsurl *referer, const llcache_post_data *post,
- uint32_t redirect_count, llcache_object **result)
+static nserror
+llcache_object_retrieve_from_cache(nsurl *url,
+ uint32_t flags,
+ nsurl *referer,
+ const llcache_post_data *post,
+ uint32_t redirect_count,
+ llcache_object **result)
{
nserror error;
llcache_object *obj, *newest = NULL;
-#ifdef LLCACHE_TRACE
- LOG(("Searching cache for %s (%x %s %p)", url, flags, referer, post));
-#endif
+ LLCACHE_LOG(("Searching cache for %s flags:%x referer:%s post:%p",
+ nsurl_access(url), flags, referer==NULL?"":nsurl_access(referer), post));
/* Search for the most recently fetched matching object */
for (obj = llcache->cached_objects; obj != NULL; obj = obj->next) {
- if ((newest == NULL ||
- obj->cache.req_time > newest->cache.req_time) &&
- nsurl_compare(obj->url, url,
- NSURL_COMPLETE) == true) {
+ if ((newest == NULL ||
+ obj->cache.req_time > newest->cache.req_time) &&
+ nsurl_compare(obj->url, url,
+ NSURL_COMPLETE) == true) {
newest = obj;
}
}
- if (newest != NULL && llcache_object_is_fresh(newest)) {
- /* Found a suitable object, and it's still fresh, so use it */
- obj = newest;
+ /* No viable object found in cache create one and attempt to
+ * pull from persistant store.
+ */
+ if (newest == NULL) {
+ LLCACHE_LOG(("No viable object found in cache"));
-#ifdef LLCACHE_TRACE
- LOG(("Found fresh %p", obj));
-#endif
+ error = llcache_object_new(url, &obj);
+ if (error != NSERROR_OK)
+ return error;
+
+ /* attempt to retrieve object from persistant store */
+ error = llcache_object_fetch_persistant(obj, flags, referer, post, redirect_count);
+ if (error == NSERROR_OK) {
+ LLCACHE_LOG(("retrived object from persistant store"));
+
+ /* set object from persistant store as newest */
+ newest = obj;
+
+ /* Add new object to cached object list */
+ llcache_object_add_to_list(obj, &llcache->cached_objects);
+
+ }
+ /* else no object found and unretrivable from cache,
+ * fall through to start fetch
+ */
+ }
+
+ if ((newest != NULL) && (llcache_object_is_fresh(newest))) {
+ /* Found a suitable object, and it's still fresh */
+ LLCACHE_LOG(("Found fresh %p", newest));
/* The client needs to catch up with the object's state.
* This will occur the next time that llcache_poll is called.
*/
- } else if (newest != NULL) {
- /* Found a candidate object but it needs freshness validation */
- /* Create a new object */
- error = llcache_object_new(url, &obj);
- if (error != NSERROR_OK)
- return error;
+ /* ensure the source data is present */
+ error = llcache_persist_retrieve(newest);
+ if (error == NSERROR_OK) {
+ /* source data was sucessfully retrived from
+ * persistant store
+ */
+ *result = newest;
-#ifdef LLCACHE_TRACE
- LOG(("Found candidate %p (%p)", obj, newest));
-#endif
+ return NSERROR_OK;
+ }
- /* Clone candidate's cache data */
- error = llcache_object_clone_cache_data(newest, obj, true);
- if (error != NSERROR_OK) {
- llcache_object_destroy(obj);
- return error;
- }
+ /* retrival of source data from persistant store
+ * failed, destroy cache object and fall though to
+ * cache miss to re-retch
+ */
+ LLCACHE_LOG(("Persistant retrival failed for %p", newest));
- /* Record candidate, so we can fall back if it is still fresh */
- newest->candidate_count++;
- obj->candidate = newest;
+ llcache_object_remove_from_list(newest, &llcache->cached_objects);
+ llcache_object_destroy(newest);
- /* Attempt to kick-off fetch */
- error = llcache_object_fetch(obj, flags, referer, post,
- redirect_count);
+ error = llcache_object_new(url, &obj);
if (error != NSERROR_OK) {
- newest->candidate_count--;
- llcache_object_destroy(obj);
return error;
}
+ } else if (newest != NULL) {
+ /* Found a candidate object but it needs freshness validation */
- /* Add new object to cache */
- llcache_object_add_to_list(obj, &llcache->cached_objects);
- } else {
- /* No object found; create a new one */
- /* Create new object */
- error = llcache_object_new(url, &obj);
- if (error != NSERROR_OK)
- return error;
+ /* ensure the source data is present */
+ error = llcache_persist_retrieve(newest);
+ if (error == NSERROR_OK) {
-#ifdef LLCACHE_TRACE
- LOG(("Not found %p", obj));
-#endif
+ /* Create a new object */
+ error = llcache_object_new(url, &obj);
+ if (error != NSERROR_OK)
+ return error;
- /* Attempt to kick-off fetch */
- error = llcache_object_fetch(obj, flags, referer, post,
- redirect_count);
+ LLCACHE_LOG(("Found candidate %p (%p)", obj, newest));
+
+ /* Clone candidate's cache data */
+ error = llcache_object_clone_cache_data(newest, obj, true);
+ if (error != NSERROR_OK) {
+ llcache_object_destroy(obj);
+ return error;
+ }
+
+ /* Record candidate, so we can fall back if it is still fresh */
+ newest->candidate_count++;
+ obj->candidate = newest;
+
+ /* Attempt to kick-off fetch */
+ error = llcache_object_fetch(obj, flags, referer, post,
+ redirect_count);
+ if (error != NSERROR_OK) {
+ newest->candidate_count--;
+ llcache_object_destroy(obj);
+ return error;
+ }
+
+ /* Add new object to cache */
+ llcache_object_add_to_list(obj, &llcache->cached_objects);
+
+ *result = obj;
+
+ return NSERROR_OK;
+ }
+
+ LLCACHE_LOG(("Persistant retrival failed for %p", newest));
+
+ /* retrival of source data from persistant store
+ * failed, destroy cache object and fall though to
+ * cache miss to re-retch
+ */
+ llcache_object_remove_from_list(newest,
+ &llcache->cached_objects);
+ llcache_object_destroy(newest);
+
+ error = llcache_object_new(url, &obj);
if (error != NSERROR_OK) {
- llcache_object_destroy(obj);
return error;
}
+ }
- /* Add new object to cache */
- llcache_object_add_to_list(obj, &llcache->cached_objects);
+ /* Attempt to kick-off fetch */
+ error = llcache_object_fetch(obj, flags, referer, post, redirect_count);
+ if (error != NSERROR_OK) {
+ llcache_object_destroy(obj);
+ return error;
}
+ /* Add new object to cache */
+ llcache_object_add_to_list(obj, &llcache->cached_objects);
+
*result = obj;
return NSERROR_OK;
@@ -1104,33 +1596,46 @@ static nserror llcache_object_retrieve(nsurl *url, uint32_t flags,
{
nserror error;
llcache_object *obj;
- bool has_query;
nsurl *defragmented_url;
+ bool uncachable = false;
-#ifdef LLCACHE_TRACE
- LOG(("Retrieve %s (%x, %s, %p)", url, flags, referer, post));
-#endif
-
- /**
- * Caching Rules:
- *
- * 1) Forced fetches are never cached
- * 2) POST requests are never cached
- */
+ LLCACHE_LOG(("Retrieve %s (%x, %s, %p)", nsurl_access(url), flags,
+ referer==NULL?"":nsurl_access(referer), post));
- /* Look for a query segment */
- has_query = nsurl_has_component(url, NSURL_QUERY);
/* Get rid of any url fragment */
- if (nsurl_has_component(url, NSURL_FRAGMENT)) {
- error = nsurl_defragment(url, &defragmented_url);
- if (error != NSERROR_OK)
- return error;
+ error = nsurl_defragment(url, &defragmented_url);
+ if (error != NSERROR_OK)
+ return error;
+
+ /* determine if content is cachable */
+ if ((flags & LLCACHE_RETRIEVE_FORCE_FETCH) != 0) {
+ /* Forced fetches are never cached */
+ uncachable = true;
+ } else if (post != NULL) {
+ /* POST requests are never cached */
+ uncachable = true;
} else {
- defragmented_url = nsurl_ref(url);
+ /* only http and https schemes are cached */
+ lwc_string *scheme;
+ bool match;
+
+ scheme = nsurl_get_component(defragmented_url, NSURL_SCHEME);
+
+ if (lwc_string_caseless_isequal(scheme, corestring_lwc_http,
+ &match) == lwc_error_ok &&
+ (match == false)) {
+ if (lwc_string_caseless_isequal(scheme, corestring_lwc_https,
+ &match) == lwc_error_ok &&
+ (match == false)) {
+ uncachable = true;
+ }
+ }
+ lwc_string_unref(scheme);
}
- if (flags & LLCACHE_RETRIEVE_FORCE_FETCH || post != NULL) {
+
+ if (uncachable) {
/* Create new object */
error = llcache_object_new(defragmented_url, &obj);
if (error != NSERROR_OK) {
@@ -1139,7 +1644,7 @@ static nserror llcache_object_retrieve(nsurl *url, uint32_t flags,
}
/* Attempt to kick-off fetch */
- error = llcache_object_fetch(obj, flags, referer, post,
+ error = llcache_object_fetch(obj, flags, referer, post,
redirect_count);
if (error != NSERROR_OK) {
llcache_object_destroy(obj);
@@ -1159,17 +1664,13 @@ static nserror llcache_object_retrieve(nsurl *url, uint32_t flags,
/* Returned object is already in the cached list */
}
-
- obj->has_query = has_query;
-#ifdef LLCACHE_TRACE
- LOG(("Retrieved %p", obj));
-#endif
-
+ LLCACHE_LOG(("Retrieved %p", obj));
+
*result = obj;
-
+
nsurl_unref(defragmented_url);
-
+
return NSERROR_OK;
}
@@ -1196,9 +1697,7 @@ static nserror llcache_object_add_user(llcache_object *object,
object->users->prev = user;
object->users = user;
-#ifdef LLCACHE_TRACE
- LOG(("Adding user %p to %p", user, object));
-#endif
+ LLCACHE_LOG(("Adding user %p to %p", user, object));
return NSERROR_OK;
}
@@ -1229,13 +1728,13 @@ static nserror llcache_fetch_redirect(llcache_object *object, const char *target
/* Abort fetch for this object */
fetch_abort(object->fetch.fetch);
object->fetch.fetch = NULL;
-
+
/* Invalidate the cache control data */
llcache_invalidate_cache_control_data(object);
/* And mark it complete */
object->fetch.state = LLCACHE_FETCH_COMPLETE;
-
+
/* Forcibly stop redirecting if we've followed too many redirects */
#define REDIRECT_LIMIT 10
if (object->fetch.redirect_count > REDIRECT_LIMIT) {
@@ -1243,7 +1742,7 @@ static nserror llcache_fetch_redirect(llcache_object *object, const char *target
event.type = LLCACHE_EVENT_ERROR;
event.data.msg = messages_get("BadRedirect");
-
+
return llcache_send_event_to_users(object, &event);
}
#undef REDIRECT_LIMIT
@@ -1272,16 +1771,16 @@ static nserror llcache_fetch_redirect(llcache_object *object, const char *target
scheme = nsurl_get_component(url, NSURL_SCHEME);
/* resource: and about: are allowed to redirect anywhere */
- if ((lwc_string_isequal(object_scheme, llcache_resource_lwc,
+ if ((lwc_string_isequal(object_scheme, corestring_lwc_resource,
&match) == lwc_error_ok && match == false) &&
- (lwc_string_isequal(object_scheme, llcache_about_lwc,
+ (lwc_string_isequal(object_scheme, corestring_lwc_about,
&match) == lwc_error_ok && match == false)) {
/* file, about and resource are not valid redirect targets */
- if ((lwc_string_isequal(object_scheme, llcache_file_lwc,
+ if ((lwc_string_isequal(object_scheme, corestring_lwc_file,
&match) == lwc_error_ok && match == true) ||
- (lwc_string_isequal(object_scheme, llcache_about_lwc,
+ (lwc_string_isequal(object_scheme, corestring_lwc_about,
&match) == lwc_error_ok && match == true) ||
- (lwc_string_isequal(object_scheme, llcache_resource_lwc,
+ (lwc_string_isequal(object_scheme, corestring_lwc_resource,
&match) == lwc_error_ok && match == true)) {
lwc_string_unref(object_scheme);
lwc_string_unref(scheme);
@@ -1310,7 +1809,7 @@ static nserror llcache_fetch_redirect(llcache_object *object, const char *target
/* Attempt to fetch target URL */
error = llcache_object_retrieve(url, object->fetch.flags,
- object->fetch.referer, post,
+ object->fetch.referer, post,
object->fetch.redirect_count + 1, &dest);
/* No longer require url */
@@ -1330,7 +1829,7 @@ static nserror llcache_fetch_redirect(llcache_object *object, const char *target
/* Dest is now our object */
*replacement = dest;
- return NSERROR_OK;
+ return NSERROR_OK;
}
/**
@@ -1377,14 +1876,14 @@ static nserror llcache_fetch_notmodified(llcache_object *object,
object->candidate->candidate_count--;
/* Clone our cache control data into the candidate */
- llcache_object_clone_cache_data(object, object->candidate,
+ llcache_object_clone_cache_data(object, object->candidate,
false);
/* Bring candidate's cache data up to date */
llcache_object_cache_update(object->candidate);
/* Revert no-cache to normal, if required */
- if (object->candidate->cache.no_cache ==
+ if (object->candidate->cache.no_cache ==
LLCACHE_VALIDATE_ONCE) {
- object->candidate->cache.no_cache =
+ object->candidate->cache.no_cache =
LLCACHE_VALIDATE_FRESH;
}
@@ -1419,9 +1918,43 @@ static nserror llcache_fetch_notmodified(llcache_object *object,
* \param len Byte length of data
* \return NSERROR_OK on success, appropriate error otherwise.
*/
-static nserror llcache_fetch_process_data(llcache_object *object, const uint8_t *data,
- size_t len)
+static nserror
+llcache_fetch_process_data(llcache_object *object,
+ const uint8_t *data,
+ size_t len)
{
+ if (object->fetch.state != LLCACHE_FETCH_DATA) {
+ /* On entry into this state, check if we need to
+ * invalidate the cache control data. We are guaranteed
+ * to have received all response headers.
+ *
+ * There are two cases in which we want to suppress
+ * cacheing of an object:
+ *
+ * 1) The HTTP response code is not 200 or 203
+ * 2) The request URI had a query string and the
+ * response headers did not provide an explicit
+ * object expiration time.
+ */
+ long http_code = fetch_http_code(object->fetch.fetch);
+
+ if ((http_code != 200 && http_code != 203) ||
+ (nsurl_has_component(object->url, NSURL_QUERY) &&
+ (object->cache.max_age == INVALID_AGE &&
+ object->cache.expires == 0))) {
+ /* Invalidate cache control data */
+ llcache_invalidate_cache_control_data(object);
+ }
+
+ /* Release candidate, if any */
+ if (object->candidate != NULL) {
+ object->candidate->candidate_count--;
+ object->candidate = NULL;
+ }
+
+ object->fetch.state = LLCACHE_FETCH_DATA;
+ }
+
/* Resize source buffer if it's too small */
if (object->source_len + len >= object->source_alloc) {
const size_t new_len = object->source_len + len + 64 * 1024;
@@ -1468,7 +2001,7 @@ static nserror llcache_query_handle_response(bool proceed, void *cbpw)
event.type = LLCACHE_EVENT_ERROR;
/** \todo More appropriate error message */
event.data.msg = messages_get("FetchFailed");
-
+
return llcache_send_event_to_users(object, &event);
}
@@ -1515,7 +2048,7 @@ static nserror llcache_fetch_auth(llcache_object *object, const char *realm)
object->fetch.outstanding_query = true;
- error = llcache->query_cb(&query, llcache->query_cb_pw,
+ error = llcache->query_cb(&query, llcache->query_cb_pw,
llcache_query_handle_response, object);
} else {
llcache_event event;
@@ -1527,7 +2060,7 @@ static nserror llcache_fetch_auth(llcache_object *object, const char *realm)
event.type = LLCACHE_EVENT_ERROR;
/** \todo More appropriate error message */
event.data.msg = messages_get("FetchFailed");
-
+
error = llcache_send_event_to_users(object, &event);
}
} else {
@@ -1582,7 +2115,7 @@ static nserror llcache_fetch_cert_error(llcache_object *object,
event.type = LLCACHE_EVENT_ERROR;
/** \todo More appropriate error message */
event.data.msg = messages_get("FetchFailed");
-
+
error = llcache_send_event_to_users(object, &event);
}
@@ -1616,7 +2149,7 @@ static nserror llcache_fetch_ssl_error(llcache_object *object)
event.type = LLCACHE_EVENT_ERROR;
/** \todo More appropriate error message */
event.data.msg = messages_get("FetchFailed");
-
+
error = llcache_send_event_to_users(object, &event);
} else {
/* Flag that we've tried to downgrade, so that if the
@@ -1629,6 +2162,150 @@ static nserror llcache_fetch_ssl_error(llcache_object *object)
}
/**
+ * construct a sorted list of objects available for writeout operation
+ *
+ * The list contains fresh cacheable objects held in RAM with no
+ * pending fetches. Any objects with a remaining lifetime less than
+ * the configured minimum lifetime are simply not considered, they will
+ * become stale before pushing to backing store is worth the cost.
+ *
+ * \todo calculate useful cost metrics to improve sorting.
+ *
+ */
+static nserror
+build_candidate_list(struct llcache_object ***lst_out, int *lst_len_out)
+{
+ llcache_object *object, *next;
+ struct llcache_object **lst;
+ int lst_len = 0;
+ int remaining_lifetime;
+
+#define MAX_PERSIST_PER_RUN 512
+
+ lst = calloc(MAX_PERSIST_PER_RUN, sizeof(struct llcache_object *));
+ if (lst == NULL)
+ return NSERROR_NOMEM;
+
+ for (object = llcache->cached_objects; object != NULL; object = next) {
+ next = object->next;
+
+ remaining_lifetime = llcache_object_rfc2616_remaining_lifetime(&object->cache);
+
+ /* cacehable objects with no pending fetches, not
+ * already on disc and with sufficient lifetime to
+ * make disc cache worthwile
+ */
+ if ((object->candidate_count == 0) &&
+ (object->fetch.fetch == NULL) &&
+ (object->fetch.outstanding_query == false) &&
+ (object->store_state == LLCACHE_STATE_RAM) &&
+ (remaining_lifetime > llcache->minimum_lifetime)) {
+ lst[lst_len] = object;
+ lst_len++;
+ if (lst_len == MAX_PERSIST_PER_RUN)
+ break;
+ }
+ }
+
+ if (lst_len == 0) {
+ free(lst);
+ return NSERROR_NOT_FOUND;
+ }
+
+ /** \todo sort list here */
+
+ *lst_len_out = lst_len;
+ *lst_out = lst;
+
+#undef MAX_PERSIST_PER_RUN
+
+ return NSERROR_OK;
+}
+
+static nserror
+write_backing_store(struct llcache_object *object, size_t *written_out)
+{
+ nserror ret;
+ uint8_t *metadata;
+ size_t metadatasize;
+
+ /* put object data in backing store */
+ ret = guit->llcache->store(object->url,
+ BACKING_STORE_NONE,
+ object->source_data,
+ object->source_len);
+ if (ret != NSERROR_OK) {
+ /* unable to put source data in backing store */
+ return ret;
+ }
+
+ ret = llcache_serialise_metadata(object, &metadata, &metadatasize);
+ if (ret != NSERROR_OK) {
+ /* There has been a metadata serialisation error. Ensure the
+ * already written data object is invalidated.
+ */
+ guit->llcache->invalidate(object->url);
+ return ret;
+ }
+
+ ret = guit->llcache->store(object->url,
+ BACKING_STORE_META,
+ metadata,
+ metadatasize);
+ free(metadata);
+ if (ret != NSERROR_OK) {
+ /* There has been an error putting the metadata in the
+ * backing store. Ensure the data object is invalidated.
+ */
+ guit->llcache->invalidate(object->url);
+ return ret;
+ }
+ object->store_state = LLCACHE_STATE_DISC;
+
+ *written_out = object->source_len + metadatasize;
+
+ return NSERROR_OK;
+}
+
+/**
+ * possibly write objects data to backing store.
+ */
+static void llcache_persist(void *p)
+{
+ nserror ret;
+ size_t size_written;
+ size_t total_written = 0;
+ struct llcache_object **lst;
+ int lst_count;
+ int idx;
+
+ ret = build_candidate_list(&lst, &lst_count);
+ if (ret == NSERROR_OK) {
+ /* obtained a candidate list, make each object
+ * persistant in turn
+ */
+ for (idx = 0; idx < lst_count; idx++) {
+ ret = write_backing_store(lst[idx], &size_written);
+ if (ret != NSERROR_OK) {
+ break;
+ }
+ total_written += size_written;
+
+ if (total_written > llcache->bandwidth) {
+ /* The bandwidth limit has been reached.
+ * Writeout scheduled for the remaining objects
+ */
+ guit->browser->schedule(1000, llcache_persist, NULL);
+ break;
+ }
+ }
+
+ free(lst);
+ }
+}
+
+
+/**
* Handler for fetch events
*
* \param msg Fetch event
@@ -1640,17 +2317,15 @@ static void llcache_fetch_callback(const fetch_msg *msg, void *p)
llcache_object *object = p;
llcache_event event;
-#ifdef LLCACHE_TRACE
- LOG(("Fetch event %d for %p", msg->type, object));
-#endif
+ LLCACHE_LOG(("Fetch event %d for %p", msg->type, object));
switch (msg->type) {
case FETCH_HEADER:
/* Received a fetch header */
object->fetch.state = LLCACHE_FETCH_HEADERS;
- error = llcache_fetch_process_header(object,
- msg->data.header_or_data.buf,
+ error = llcache_fetch_process_header(object,
+ msg->data.header_or_data.buf,
msg->data.header_or_data.len);
break;
@@ -1664,7 +2339,7 @@ static void llcache_fetch_callback(const fetch_msg *msg, void *p)
object->candidate = NULL;
}
- error = llcache_fetch_redirect(object,
+ error = llcache_fetch_redirect(object,
msg->data.redirect, &object);
break;
case FETCH_NOTMODIFIED:
@@ -1675,39 +2350,7 @@ static void llcache_fetch_callback(const fetch_msg *msg, void *p)
/* Normal 2xx state machine */
case FETCH_DATA:
/* Received some data */
- if (object->fetch.state != LLCACHE_FETCH_DATA) {
- /* On entry into this state, check if we need to
- * invalidate the cache control data. We are guaranteed
- * to have received all response headers.
- *
- * There are two cases in which we want to suppress
- * cacheing of an object:
- *
- * 1) The HTTP response code is not 200 or 203
- * 2) The request URI had a query string and the
- * response headers did not provide an explicit
- * object expiration time.
- */
- long http_code = fetch_http_code(object->fetch.fetch);
-
- if ((http_code != 200 && http_code != 203) ||
- (object->has_query &&
- (object->cache.max_age == INVALID_AGE &&
- object->cache.expires == 0))) {
- /* Invalidate cache control data */
- llcache_invalidate_cache_control_data(object);
- }
-
- /* Release candidate, if any */
- if (object->candidate != NULL) {
- object->candidate->candidate_count--;
- object->candidate = NULL;
- }
- }
-
- object->fetch.state = LLCACHE_FETCH_DATA;
-
- error = llcache_fetch_process_data(object,
+ error = llcache_fetch_process_data(object,
msg->data.header_or_data.buf,
msg->data.header_or_data.len);
break;
@@ -1720,7 +2363,7 @@ static void llcache_fetch_callback(const fetch_msg *msg, void *p)
object->fetch.fetch = NULL;
/* Shrink source buffer to required size */
- temp = realloc(object->source_data,
+ temp = realloc(object->source_data,
object->source_len);
/* If source_len is 0, then temp may be NULL */
if (temp != NULL || object->source_len == 0) {
@@ -1729,6 +2372,11 @@ static void llcache_fetch_callback(const fetch_msg *msg, void *p)
}
llcache_object_cache_update(object);
+
+ /* record when the fetch finished */
+ object->cache.fin_time = time(NULL);
+
+ guit->browser->schedule(5000, llcache_persist, NULL);
}
break;
@@ -1752,9 +2400,9 @@ static void llcache_fetch_callback(const fetch_msg *msg, void *p)
event.type = LLCACHE_EVENT_ERROR;
event.data.msg = msg->data.error;
-
+
error = llcache_send_event_to_users(object, &event);
-
+
break;
case FETCH_PROGRESS:
/* Progress update */
@@ -1762,7 +2410,7 @@ static void llcache_fetch_callback(const fetch_msg *msg, void *p)
event.data.msg = msg->data.progress;
error = llcache_send_event_to_users(object, &event);
-
+
break;
/* Events requiring action */
@@ -1786,8 +2434,8 @@ static void llcache_fetch_callback(const fetch_msg *msg, void *p)
object->candidate = NULL;
}
- error = llcache_fetch_cert_error(object,
- msg->data.cert_err.certs,
+ error = llcache_fetch_cert_error(object,
+ msg->data.cert_err.certs,
msg->data.cert_err.num_certs);
break;
case FETCH_SSL_ERR:
@@ -1805,6 +2453,14 @@ static void llcache_fetch_callback(const fetch_msg *msg, void *p)
/* Deal with any errors reported by event handlers */
if (error != NSERROR_OK) {
+ if (error == NSERROR_NOMEM) {
+ /* attempt to purge the cache to free some
+ * memory. will not help this fetch, but may
+ * allow the UI to report errors etc.
+ */
+ llcache_clean(true);
+ }
+
if (object->fetch.fetch != NULL) {
fetch_abort(object->fetch.fetch);
object->fetch.fetch = NULL;
@@ -1814,8 +2470,10 @@ static void llcache_fetch_callback(const fetch_msg *msg, void *p)
object->fetch.state = LLCACHE_FETCH_COMPLETE;
}
- return;
}
+
+ /* There may be users which are not caught up so schedule ourselves */
+ llcache_users_not_caught_up();
}
/**
@@ -1838,26 +2496,6 @@ static llcache_object_user *llcache_object_find_user(const llcache_handle *handl
return user;
}
-/**
- * Remove a low-level cache object from a cache list
- *
- * \param object Object to remove
- * \param list List to remove from
- * \return NSERROR_OK
- */
-static nserror llcache_object_remove_from_list(llcache_object *object,
- llcache_object **list)
-{
- if (object == *list)
- *list = object->next;
- else
- object->prev->next = object->next;
-
- if (object->next != NULL)
- object->next->prev = object->prev;
-
- return NSERROR_OK;
-}
/**
* Determine if a low-level cache object resides in a given list
@@ -1896,7 +2534,7 @@ static nserror llcache_object_notify_users(llcache_object *object)
#endif
/**
- * State transitions and event emission for users.
+ * State transitions and event emission for users.
* Rows: user state. Cols: object state.
*
* User\Obj INIT HEADERS DATA COMPLETE
@@ -1928,8 +2566,8 @@ static nserror llcache_object_notify_users(llcache_object *object)
user->iterator_target = true;
/* A note on the computation of next_user:
- *
- * Within this loop, we may make a number of calls to
+ *
+ * Within this loop, we may make a number of calls to
* client code. Our contract with clients is that they
* can do whatever they like from within their callback
* handlers. This is so that we limit the pain of
@@ -1940,7 +2578,7 @@ static nserror llcache_object_notify_users(llcache_object *object)
* user list. In the common case, the user they attempt
* to remove is the current iteration target, and we
* already protect against that causing problems here.
- * However, no such protection exists if the client
+ * However, no such protection exists if the client
* attempts to remove other users from this object's
* user list.
*
@@ -1961,13 +2599,13 @@ static nserror llcache_object_notify_users(llcache_object *object)
emitted_notify = true;
}
- LOG(("User %p state: %d Object state: %d",
+ LOG(("User %p state: %d Object state: %d",
user, handle->state, objstate));
}
#endif
/* User: INIT, Obj: HEADERS, DATA, COMPLETE => User->HEADERS */
- if (handle->state == LLCACHE_FETCH_INIT &&
+ if (handle->state == LLCACHE_FETCH_INIT &&
objstate > LLCACHE_FETCH_INIT) {
handle->state = LLCACHE_FETCH_HEADERS;
}
@@ -1995,10 +2633,11 @@ static nserror llcache_object_notify_users(llcache_object *object)
/* User requested replay */
handle->state = LLCACHE_FETCH_HEADERS;
- /* Continue with the next user -- we'll
+ /* Continue with the next user -- we'll
* reemit the event next time round */
user->iterator_target = false;
next_user = user->next;
+ llcache_users_not_caught_up();
continue;
} else if (error != NSERROR_OK) {
user->iterator_target = false;
@@ -2014,15 +2653,15 @@ static nserror llcache_object_notify_users(llcache_object *object)
/* Construct HAD_DATA event */
event.type = LLCACHE_EVENT_HAD_DATA;
- event.data.data.buf =
+ event.data.data.buf =
object->source_data + handle->bytes;
- event.data.data.len =
+ event.data.data.len =
object->source_len - handle->bytes;
/* Update record of last byte emitted */
- if (object->fetch.flags &
+ if (object->fetch.flags &
LLCACHE_RETRIEVE_STREAM_DATA) {
- /* Streaming, so reset to zero to
+ /* Streaming, so reset to zero to
* minimise amount of cached source data.
* Additionally, we don't support replay
* when streaming. */
@@ -2048,10 +2687,11 @@ static nserror llcache_object_notify_users(llcache_object *object)
/* User requested replay */
handle->bytes = orig_handle_read;
- /* Continue with the next user -- we'll
+ /* Continue with the next user -- we'll
* reemit the data next time round */
user->iterator_target = false;
next_user = user->next;
+ llcache_users_not_caught_up();
continue;
} else if (error != NSERROR_OK) {
user->iterator_target = false;
@@ -2081,10 +2721,11 @@ static nserror llcache_object_notify_users(llcache_object *object)
/* User requested replay */
handle->state = LLCACHE_FETCH_DATA;
- /* Continue with the next user -- we'll
+ /* Continue with the next user -- we'll
* reemit the event next time round */
user->iterator_target = false;
next_user = user->next;
+ llcache_users_not_caught_up();
continue;
} else if (error != NSERROR_OK) {
user->iterator_target = false;
@@ -2115,42 +2756,40 @@ static nserror llcache_object_notify_users(llcache_object *object)
* \param snapshot Pointer to receive snapshot of \a object
* \return NSERROR_OK on success, appropriate error otherwise
*/
-static nserror llcache_object_snapshot(llcache_object *object,
- llcache_object **snapshot)
+static nserror
+llcache_object_snapshot(llcache_object *object, llcache_object **snapshot)
{
llcache_object *newobj;
nserror error;
-
+
error = llcache_object_new(object->url, &newobj);
-
+
if (error != NSERROR_OK)
return error;
-
- newobj->has_query = object->has_query;
newobj->source_alloc = newobj->source_len = object->source_len;
-
+
if (object->source_len > 0) {
newobj->source_data = malloc(newobj->source_alloc);
if (newobj->source_data == NULL) {
llcache_object_destroy(newobj);
return NSERROR_NOMEM;
}
- memcpy(newobj->source_data, object->source_data,
+ memcpy(newobj->source_data, object->source_data,
newobj->source_len);
}
-
+
if (object->num_headers > 0) {
- newobj->headers = calloc(sizeof(llcache_header),
+ newobj->headers = calloc(sizeof(llcache_header),
object->num_headers);
if (newobj->headers == NULL) {
llcache_object_destroy(newobj);
return NSERROR_NOMEM;
}
while (newobj->num_headers < object->num_headers) {
- llcache_header *nh =
+ llcache_header *nh =
&(newobj->headers[newobj->num_headers]);
- llcache_header *oh =
+ llcache_header *oh =
&(object->headers[newobj->num_headers]);
newobj->num_headers += 1;
nh->name = strdup(oh->name);
@@ -2161,62 +2800,97 @@ static nserror llcache_object_snapshot(llcache_object *object,
}
}
}
-
+
newobj->fetch.state = LLCACHE_FETCH_COMPLETE;
-
+
*snapshot = newobj;
-
+
return NSERROR_OK;
}
+/**
+ * total ram usage of object
+ */
+static inline uint32_t
+total_object_size(llcache_object *object)
+{
+ uint32_t tot;
+ size_t hdrc;
+
+ tot = sizeof(*object);
+ tot += nsurl_length(object->url);
+
+ if (object->source_data != NULL) {
+ tot += object->source_len;
+ }
+
+ tot += sizeof(llcache_header) * object->num_headers;
+
+ for (hdrc = 0; hdrc < object->num_headers; hdrc++) {
+ if (object->headers[hdrc].name != NULL) {
+ tot += strlen(object->headers[hdrc].name);
+ }
+ if (object->headers[hdrc].value != NULL) {
+ tot += strlen(object->headers[hdrc].value);
+ }
+ }
+
+ return tot;
+}
/******************************************************************************
* Public API *
******************************************************************************/
-/**
+/*
* Attempt to clean the cache
+ *
+ * The memory cache cleaning discards objects in order of increasing value.
+ *
+ * Exported interface documented in llcache.h
*/
-/* Exported interface documented in llcache.h */
-void llcache_clean(void)
+void llcache_clean(bool purge)
{
llcache_object *object, *next;
uint32_t llcache_size = 0;
int remaining_lifetime;
+ uint32_t limit;
-#ifdef LLCACHE_TRACE
- LOG(("Attempting cache clean"));
-#endif
+ LLCACHE_LOG(("Attempting cache clean"));
- /* Candidates for cleaning are (in order of priority):
- *
- * 1) Uncacheable objects with no users
- * 2) Stale cacheable objects with no users or pending fetches
- * 3) Fresh cacheable objects with no users or pending fetches
- */
+ /* If the cache is being purged set the size limit to zero. */
+ if (purge) {
+ limit = 0;
+ } else {
+ limit = llcache->limit;
+ }
- /* 1) Uncacheable objects with no users or fetches */
- for (object = llcache->uncached_objects; object != NULL; object = next) {
+ /* Uncacheable objects with no users or fetches */
+ for (object = llcache->uncached_objects;
+ object != NULL;
+ object = next) {
next = object->next;
/* The candidate count of uncacheable objects is always 0 */
- if ((object->users == NULL) &&
+ if ((object->users == NULL) &&
(object->candidate_count == 0) &&
(object->fetch.fetch == NULL) &&
(object->fetch.outstanding_query == false)) {
-#ifdef LLCACHE_TRACE
- LOG(("Found victim %p", object));
-#endif
- llcache_object_remove_from_list(object,
+ LLCACHE_LOG(("Discarding uncachable object with no users (%p) %s", object, nsurl_access(object->url)));
+
+ llcache_object_remove_from_list(object,
&llcache->uncached_objects);
llcache_object_destroy(object);
} else {
- llcache_size += object->source_len + sizeof(*object);
+ llcache_size += total_object_size(object);
}
}
- /* 2) Stale cacheable objects with no users or pending fetches */
- for (object = llcache->cached_objects; object != NULL; object = next) {
+
+ /* Stale cacheable objects with no users or pending fetches */
+ for (object = llcache->cached_objects;
+ object != NULL;
+ object = next) {
next = object->next;
remaining_lifetime = llcache_object_rfc2616_remaining_lifetime(&object->cache);
@@ -2224,85 +2898,139 @@ void llcache_clean(void)
if ((object->users == NULL) &&
(object->candidate_count == 0) &&
(object->fetch.fetch == NULL) &&
- (object->fetch.outstanding_query == false)) {
+ (object->fetch.outstanding_query == false) &&
+ (remaining_lifetime <= 0)) {
+ /* object is stale */
+ LLCACHE_LOG(("discarding stale cacheable object with no users or pending fetches (%p) %s", object, nsurl_access(object->url)));
- if (remaining_lifetime > 0) {
- /* object is fresh */
- llcache_size += object->source_len + sizeof(*object);
- } else {
- /* object is not fresh */
-#ifdef LLCACHE_TRACE
- LOG(("Found stale cacheable object (%p) with no users or pending fetches", object));
-#endif
llcache_object_remove_from_list(object,
&llcache->cached_objects);
+
+ if (object->store_state == LLCACHE_STATE_DISC) {
+ guit->llcache->invalidate(object->url);
+ }
+
llcache_object_destroy(object);
- }
+
} else {
- llcache_size += object->source_len + sizeof(*object);
+ /* object has users so account for the storage */
+ llcache_size += total_object_size(object);
}
}
- /* 3) Fresh cacheable objects with no users or pending
- * fetches, only if the cache exceeds the configured size.
+ /* if the cache limit is exceeded try to make some objects
+ * persistant so their RAM can be reclaimed in the next
+ * step
*/
- if (llcache->limit < llcache_size) {
- for (object = llcache->cached_objects; object != NULL;
- object = next) {
- next = object->next;
-
- if ((object->users == NULL) &&
- (object->candidate_count == 0) &&
- (object->fetch.fetch == NULL) &&
- (object->fetch.outstanding_query == false)) {
-#ifdef LLCACHE_TRACE
- LOG(("Found victim %p", object));
-#endif
- llcache_size -=
- object->source_len + sizeof(*object);
+ if (limit < llcache_size) {
+ llcache_persist(NULL);
+ }
- llcache_object_remove_from_list(object,
+ /* Source data of fresh cacheable objects with no users, no
+ * pending fetches and pushed to persistant store while the
+ * cache exceeds the configured size.
+ */
+ for (object = llcache->cached_objects;
+ ((limit < llcache_size) && (object != NULL));
+ object = next) {
+ next = object->next;
+ if ((object->users == NULL) &&
+ (object->candidate_count == 0) &&
+ (object->fetch.fetch == NULL) &&
+ (object->fetch.outstanding_query == false) &&
+ (object->store_state == LLCACHE_STATE_DISC)) {
+ free(object->source_data);
+ object->source_data = NULL;
+
+ llcache_size -= object->source_len;
+
+ LLCACHE_LOG(("Freeing source data for %p len:%d",
+ object,
+ object->source_len));
+ }
+ }
+
+ /* Fresh cacheable objects with no users, no pending fetches
+ * and pushed to persistant store while the cache exceeds
+ * the configured size. Efectively just the object metadata.
+ */
+ for (object = llcache->cached_objects;
+ ((limit < llcache_size) && (object != NULL));
+ object = next) {
+ next = object->next;
+ if ((object->users == NULL) &&
+ (object->candidate_count == 0) &&
+ (object->fetch.fetch == NULL) &&
+ (object->fetch.outstanding_query == false) &&
+ (object->store_state == LLCACHE_STATE_DISC) &&
+ (object->source_data == NULL)) {
+ LLCACHE_LOG(("discarding backed object len:%d age:%d (%p) %s",
+ object->source_len,
+ time(NULL) - object->last_used,
+ object,
+ nsurl_access(object->url)));
+
+ llcache_size -= total_object_size(object);
+
+ llcache_object_remove_from_list(object,
&llcache->cached_objects);
- llcache_object_destroy(object);
- }
+ llcache_object_destroy(object);
+
}
}
-#ifdef LLCACHE_TRACE
- LOG(("Size: %u", llcache_size));
-#endif
+ /* Fresh cacheable objects with no users or pending fetches
+ * while the cache exceeds the configured size. These are the
+ * most valuble objects as replacing them is a full network
+ * fetch
+ */
+ for (object = llcache->cached_objects;
+ ((limit < llcache_size) && (object != NULL));
+ object = next) {
+ next = object->next;
+
+ if ((object->users == NULL) &&
+ (object->candidate_count == 0) &&
+ (object->fetch.fetch == NULL) &&
+ (object->fetch.outstanding_query == false) &&
+ (object->store_state == LLCACHE_STATE_RAM)) {
+ LLCACHE_LOG(("discarding fresh object len:%d age:%d (%p) %s",
+ object->source_len,
+ time(NULL) - object->last_used,
+ object,
+ nsurl_access(object->url)));
+
+ llcache_size -= object->source_len + sizeof(*object);
+
+ llcache_object_remove_from_list(object,
+ &llcache->cached_objects);
+ llcache_object_destroy(object);
+ }
+ }
+ LLCACHE_LOG(("Size: %u", llcache_size));
}
/* See llcache.h for documentation */
-nserror
-llcache_initialise(llcache_query_callback cb, void *pw, uint32_t llcache_limit)
+nserror
+llcache_initialise(const struct llcache_parameters *prm)
{
llcache = calloc(1, sizeof(struct llcache_s));
if (llcache == NULL) {
return NSERROR_NOMEM;
}
- llcache->query_cb = cb;
- llcache->query_cb_pw = pw;
- llcache->limit = llcache_limit;
+ llcache->query_cb = prm->cb;
+ llcache->query_cb_pw = prm->cb_ctx;
+ llcache->limit = prm->limit;
+ llcache->minimum_lifetime = prm->minimum_lifetime;
+ llcache->bandwidth = prm->bandwidth;
+ llcache->all_caught_up = true;
- /* Create static scheme strings */
- if (lwc_intern_string("file", SLEN("file"),
- &llcache_file_lwc) != lwc_error_ok)
- return NSERROR_NOMEM;
-
- if (lwc_intern_string("about", SLEN("about"),
- &llcache_about_lwc) != lwc_error_ok)
- return NSERROR_NOMEM;
-
- if (lwc_intern_string("resource", SLEN("resource"),
- &llcache_resource_lwc) != lwc_error_ok)
- return NSERROR_NOMEM;
+ LOG(("llcache initialising with a limit of %d bytes", llcache->limit));
- LOG(("llcache initialised with a limit of %d bytes", llcache_limit));
-
- return NSERROR_OK;
+ /* backing store initialisation */
+ return guit->llcache->initialise(&prm->store);
}
/* See llcache.h for documentation */
@@ -2347,29 +3075,35 @@ void llcache_finalise(void)
}
/* Fetch system has already been destroyed */
- object->fetch.fetch = NULL;
+ object->fetch.fetch = NULL;
llcache_object_destroy(object);
}
- /* Unref static scheme lwc strings */
- lwc_string_unref(llcache_file_lwc);
- lwc_string_unref(llcache_about_lwc);
- lwc_string_unref(llcache_resource_lwc);
+ /* backing store finalisation */
+ guit->llcache->finalise();
free(llcache);
llcache = NULL;
}
-/* See llcache.h for documentation */
-nserror llcache_poll(void)
+/**
+ * Catch up the cache users with state changes from fetchers.
+ *
+ * \param ignored We ignore this because all our state comes from llcache.
+ */
+static void llcache_catch_up_all_users(void *ignored)
{
llcache_object *object;
-
- fetch_poll();
-
+
+ /* Assume after this we'll be all caught up. If any user of a handle
+ * defers then we'll end up set not caught up and we'll
+ * reschedule at that point via llcache_users_not_caught_up()
+ */
+ llcache->all_caught_up = true;
+
/* Catch new users up with state of objects */
- for (object = llcache->cached_objects; object != NULL;
+ for (object = llcache->cached_objects; object != NULL;
object = object->next) {
llcache_object_notify_users(object);
}
@@ -2378,10 +3112,21 @@ nserror llcache_poll(void)
object = object->next) {
llcache_object_notify_users(object);
}
+}
- return NSERROR_OK;
+/**
+ * Ask for ::llcache_catch_up_all_users to be scheduled ASAP to pump the
+ * user state machines.
+ */
+static void llcache_users_not_caught_up()
+{
+ if (llcache->all_caught_up) {
+ llcache->all_caught_up = false;
+ guit->browser->schedule(0, llcache_catch_up_all_users, NULL);
+ }
}
+
/* See llcache.h for documentation */
nserror llcache_handle_retrieve(nsurl *url, uint32_t flags,
nsurl *referer, const llcache_post_data *post,
@@ -2414,6 +3159,9 @@ nserror llcache_handle_retrieve(nsurl *url, uint32_t flags,
*result = user->handle;
+ /* Users exist which are now not caught up! */
+ llcache_users_not_caught_up();
+
return NSERROR_OK;
}
@@ -2437,7 +3185,7 @@ nserror llcache_handle_release(llcache_handle *handle)
assert(user != NULL);
if (user->iterator_target) {
- /* Can't remove / delete user object if it's
+ /* Can't remove / delete user object if it's
* the target of an iterator */
user->queued_for_delete = true;
} else {
@@ -2447,8 +3195,8 @@ nserror llcache_handle_release(llcache_handle *handle)
error = llcache_object_user_destroy(user);
}
}
-
- return error;
+
+ return error;
}
/* See llcache.h for documentation */
@@ -2456,14 +3204,14 @@ nserror llcache_handle_clone(llcache_handle *handle, llcache_handle **result)
{
nserror error;
llcache_object_user *newuser;
-
+
error = llcache_object_user_new(handle->cb, handle->pw, &newuser);
if (error == NSERROR_OK) {
llcache_object_add_user(handle->object, newuser);
newuser->handle->state = handle->state;
*result = newuser->handle;
}
-
+
return error;
}
@@ -2474,13 +3222,13 @@ nserror llcache_handle_abort(llcache_handle *handle)
llcache_object *object = handle->object, *newobject;
nserror error = NSERROR_OK;
bool all_alone = true;
-
+
/* Determine if we are the only user */
if (user->prev != NULL)
all_alone = false;
if (user->next != NULL)
all_alone = false;
-
+
if (all_alone == false) {
/* We must snapshot this object */
error = llcache_object_snapshot(object, &newobject);
@@ -2490,7 +3238,7 @@ nserror llcache_handle_abort(llcache_handle *handle)
/* Move across to the new object */
if (user->iterator_target) {
/* User is current iterator target, clone it */
- llcache_object_user *newuser =
+ llcache_object_user *newuser =
calloc(1, sizeof(llcache_object_user));
if (newuser == NULL) {
llcache_object_destroy(newobject);
@@ -2509,9 +3257,9 @@ nserror llcache_handle_abort(llcache_handle *handle)
llcache_object_remove_user(object, user);
llcache_object_add_user(newobject, user);
}
-
+
/* Add new object to uncached list */
- llcache_object_add_to_list(newobject,
+ llcache_object_add_to_list(newobject,
&llcache->uncached_objects);
} else {
/* We're the only user, so abort any fetch in progress */
@@ -2519,13 +3267,13 @@ nserror llcache_handle_abort(llcache_handle *handle)
fetch_abort(object->fetch.fetch);
object->fetch.fetch = NULL;
}
-
+
object->fetch.state = LLCACHE_FETCH_COMPLETE;
-
+
/* Invalidate cache control data */
llcache_invalidate_cache_control_data(object);
}
-
+
return error;
}
@@ -2541,7 +3289,7 @@ nserror llcache_handle_force_stream(llcache_handle *handle)
/* Forcibly uncache this object */
if (llcache_object_in_list(object, llcache->cached_objects)) {
- llcache_object_remove_from_list(object,
+ llcache_object_remove_from_list(object,
&llcache->cached_objects);
llcache_object_add_to_list(object, &llcache->uncached_objects);
}
@@ -2554,8 +3302,8 @@ nserror llcache_handle_force_stream(llcache_handle *handle)
/* See llcache.h for documentation */
nserror llcache_handle_invalidate_cache_data(llcache_handle *handle)
{
- if (handle->object != NULL && handle->object->fetch.fetch == NULL &&
- handle->object->cache.no_cache ==
+ if (handle->object != NULL && handle->object->fetch.fetch == NULL &&
+ handle->object->cache.no_cache ==
LLCACHE_VALIDATE_FRESH) {
handle->object->cache.no_cache = LLCACHE_VALIDATE_ONCE;
}
@@ -2579,7 +3327,7 @@ const uint8_t *llcache_handle_get_source_data(const llcache_handle *handle,
}
/* See llcache.h for documentation */
-const char *llcache_handle_get_header(const llcache_handle *handle,
+const char *llcache_handle_get_header(const llcache_handle *handle,
const char *key)
{
const llcache_object *object = handle->object;
@@ -2598,9 +3346,8 @@ const char *llcache_handle_get_header(const llcache_handle *handle,
}
/* See llcache.h for documentation */
-bool llcache_handle_references_same_object(const llcache_handle *a,
+bool llcache_handle_references_same_object(const llcache_handle *a,
const llcache_handle *b)
{
return a->object == b->object;
}
-
diff --git a/content/llcache.h b/content/llcache.h
index 3d8232cae..d4ed5f095 100644
--- a/content/llcache.h
+++ b/content/llcache.h
@@ -76,7 +76,7 @@ typedef struct {
} data; /**< Event data */
} llcache_event;
-/**
+/**
* Client callback for low-level cache events
*
* \param handle Handle for which event is issued
@@ -84,18 +84,18 @@ typedef struct {
* \param pw Pointer to client-specific data
* \return NSERROR_OK on success, appropriate error otherwise.
*/
-typedef nserror (*llcache_handle_callback)(llcache_handle *handle,
+typedef nserror (*llcache_handle_callback)(llcache_handle *handle,
const llcache_event *event, void *pw);
/** Flags for low-level cache object retrieval */
enum llcache_retrieve_flag {
/* Note: We're permitted a maximum of 16 flags which must reside in the
- * bottom 16 bits of the flags word. See hlcache.h for further details.
+ * bottom 16 bits of the flags word. See hlcache.h for further details.
*/
/** Force a new fetch */
- LLCACHE_RETRIEVE_FORCE_FETCH = (1 << 0),
+ LLCACHE_RETRIEVE_FORCE_FETCH = (1 << 0),
/** Requested URL was verified */
- LLCACHE_RETRIEVE_VERIFIABLE = (1 << 1),
+ LLCACHE_RETRIEVE_VERIFIABLE = (1 << 1),
/**< No error pages */
LLCACHE_RETRIEVE_NO_ERROR_PAGES = (1 << 2),
/**< Stream data (implies that object is not cacheable) */
@@ -149,21 +149,89 @@ typedef nserror (*llcache_query_response)(bool proceed, void *cbpw);
* \param cbpw Opaque value to pass into \a cb
* \return NSERROR_OK on success, appropriate error otherwise
*
- * \note This callback should return immediately. Once a suitable answer to
- * the query has been obtained, the provided response callback should be
+ * \note This callback should return immediately. Once a suitable answer to
+ * the query has been obtained, the provided response callback should be
* called. This is intended to be an entirely asynchronous process.
*/
typedef nserror (*llcache_query_callback)(const llcache_query *query, void *pw,
llcache_query_response cb, void *cbpw);
/**
+ * Parameters to configure the low level cache backing store.
+ */
+struct llcache_store_parameters {
+ const char *path; /**< The path to the backing store */
+
+ size_t limit; /**< The backing store upper bound target size */
+ size_t hysteresis; /**< The hysteresis around the target size */
+
+ /** log2 of the default maximum number of entries the cache
+ * can track.
+ *
+ * If unset this defaults to 16 (65536 entries) The cache
+ * control file takes precedence so cache data remains
+ * portable between builds with differing defaults.
+ */
+ unsigned int entry_size;
+
+ /** log2 of the default number of entries in the mapping between
+ * the url and cache entries.
+ *
+ * @note This is exposing an internal implementation detail of
+ * the filesystem based default backing store implementation.
+ * However it is likely any backing store implementation will
+ * need some way to map url to cache entries so it is a
+ * generally useful configuration value.
+ *
+ * Too small a value will cause unecessary collisions and
+ * cache misses and larger values cause proportionaly larger
+ * amounts of memory to be used.
+ *
+ * The "birthday paradox" means that the hash will experience
+ * a collision in every 2^(address_size/2) urls the cache
+ * stores.
+ *
+ * A value of 20 means one object stored in every 1024 will
+ * cause a collion and a cache miss while using two megabytes
+ * of storage.
+ *
+ * If unset this defaults to 20 (1048576 entries using two
+ * megabytes) The cache control file takes precedence so cache
+ * data remains portable between builds with differing
+ * defaults.
+ */
+ unsigned int address_size;
+};
+
+/**
+ * Parameters to configure the low level cache.
+ */
+struct llcache_parameters {
+ llcache_query_callback cb; /**< Query handler for llcache */
+ void *cb_ctx; /**< Pointer to llcache query handler data */
+
+ size_t limit; /**< The target upper bound for the RAM cache size */
+ size_t hysteresis; /**< The hysteresis around the target size */
+
+ int minimum_lifetime; /**< The minimum lifetime to consider
+ * sending objects to backing store.
+ */
+
+ size_t bandwidth; /**< The maximum bandwidth to allow the
+ * backing store to use.
+ */
+
+ struct llcache_store_parameters store;
+};
+
+/**
* Initialise the low-level cache
*
* \param cb Query handler
* \param pw Pointer to query handler data
* \return NSERROR_OK on success, appropriate error otherwise.
*/
-nserror llcache_initialise(llcache_query_callback cb, void *pw, uint32_t llcache_limit);
+nserror llcache_initialise(const struct llcache_parameters *parameters);
/**
* Finalise the low-level cache
@@ -171,18 +239,15 @@ nserror llcache_initialise(llcache_query_callback cb, void *pw, uint32_t llcache
void llcache_finalise(void);
/**
- * Cause the low-level cache to emit any pending notifications.
+ * Cause the low-level cache to attempt to perform cleanup.
*
- * \return NSERROR_OK on success, appropriate error otherwise.
- */
-nserror llcache_poll(void);
-
-/**
- * Cause the low-level cache to attempt to perform cleanup. No
- * guarantees are made as to whether or not cleanups will take
+ * No guarantees are made as to whether or not cleanups will take
* place and what, if any, space savings will be made.
+ *
+ * \param purge Any objects held in the cache that are safely removable will
+ * be freed regardless of the configured size limits.
*/
-void llcache_clean(void);
+void llcache_clean(bool purge);
/**
* Retrieve a handle for a low-level cache object
@@ -280,12 +345,12 @@ const uint8_t *llcache_handle_get_source_data(const llcache_handle *handle,
* \return Header value, or NULL if header does not exist
*
* \todo Make the key an enumeration, to avoid needless string comparisons
- * \todo Forcing the client to parse the header value seems wrong.
- * Better would be to return the actual value part and an array of
+ * \todo Forcing the client to parse the header value seems wrong.
+ * Better would be to return the actual value part and an array of
* key-value pairs for any additional parameters.
* \todo Deal with multiple headers of the same key (e.g. Set-Cookie)
*/
-const char *llcache_handle_get_header(const llcache_handle *handle,
+const char *llcache_handle_get_header(const llcache_handle *handle,
const char *key);
/**
@@ -295,7 +360,7 @@ const char *llcache_handle_get_header(const llcache_handle *handle,
* \param b Second handle
* \return True if handles reference the same object, false otherwise
*/
-bool llcache_handle_references_same_object(const llcache_handle *a,
+bool llcache_handle_references_same_object(const llcache_handle *a,
const llcache_handle *b);
#endif
diff --git a/content/mimesniff.c b/content/mimesniff.c
index 5b2c14fb5..e8ebf8770 100644
--- a/content/mimesniff.c
+++ b/content/mimesniff.c
@@ -155,7 +155,7 @@ static bool mimesniff__has_binary_octets(const uint8_t *data, size_t len)
static nserror mimesniff__match_mp4(const uint8_t *data, size_t len,
lwc_string **effective_type)
{
- size_t box_size, i;
+ uint32_t box_size, i;
/* ISO/IEC 14496-12:2008 $4.3 says (effectively):
*
@@ -204,7 +204,9 @@ static nserror mimesniff__match_mp4(const uint8_t *data, size_t len,
/* Search each compatible brand in the box for "mp4" */
for (i = 16; i <= box_size - 4; i += 4) {
- if (data[i] == 'm' && data[i+1] == 'p' && data[i+2] == '4') {
+ if (data[i] == 'm' &&
+ data[i+1] == 'p' &&
+ data[i+2] == '4') {
*effective_type = lwc_string_ref(video_mp4);
return NSERROR_OK;
}
diff --git a/content/no_backing_store.c b/content/no_backing_store.c
new file mode 100644
index 000000000..192101522
--- /dev/null
+++ b/content/no_backing_store.c
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * Low-level resource cache null persistant storage implementation.
+ */
+
+#include "utils/nsurl.h"
+
+#include "content/backing_store.h"
+
+
+/* default to disabled backing store */
+static nserror initialise(const struct llcache_store_parameters *parameters)
+{
+ return NSERROR_OK;
+}
+
+static nserror finalise(void)
+{
+ return NSERROR_OK;
+}
+
+static nserror store(nsurl *url,
+ enum backing_store_flags flags,
+ const uint8_t *data,
+ const size_t datalen)
+{
+ return NSERROR_SAVE_FAILED;
+}
+
+static nserror fetch(nsurl *url,
+ enum backing_store_flags *flags,
+ uint8_t **data_out,
+ size_t *datalen_out)
+{
+ return NSERROR_NOT_FOUND;
+}
+
+static nserror invalidate(nsurl *url)
+{
+ return NSERROR_NOT_FOUND;
+}
+
+static struct gui_llcache_table llcache_table = {
+ .initialise = initialise,
+ .finalise = finalise,
+ .store = store,
+ .fetch = fetch,
+ .invalidate = invalidate,
+};
+
+struct gui_llcache_table *null_llcache_table = &llcache_table;
diff --git a/content/urldb.c b/content/urldb.c
index f55a1c291..c74dae36d 100644
--- a/content/urldb.c
+++ b/content/urldb.c
@@ -104,7 +104,6 @@
#include "utils/nsoption.h"
#include "utils/log.h"
#include "utils/corestrings.h"
-#include "utils/filename.h"
#include "utils/url.h"
#include "utils/utils.h"
#include "utils/bloom.h"
@@ -1806,14 +1805,9 @@ struct path_data *urldb_add_path(lwc_string *scheme, unsigned int port,
free(path_query);
if (d && !d->url) {
- /* Insert URL */
- if (nsurl_has_component(url, NSURL_FRAGMENT)) {
- nserror err = nsurl_defragment(url, &d->url);
- if (err != NSERROR_OK)
- return NULL;
- } else {
- d->url = nsurl_ref(url);
- }
+ /* Insert defragmented URL */
+ if (nsurl_defragment(url, &d->url) != NSERROR_OK)
+ return NULL;
}
return d;
@@ -2728,12 +2722,8 @@ bool urldb_set_cookie(const char *header, nsurl *url, nsurl *referer)
assert(url && header);
/* Get defragmented URL, as 'urlt' */
- if (nsurl_has_component(url, NSURL_FRAGMENT)) {
- if (nsurl_defragment(url, &urlt) != NSERROR_OK)
- return NULL;
- } else {
- urlt = nsurl_ref(url);
- }
+ if (nsurl_defragment(url, &urlt) != NSERROR_OK)
+ return NULL;
scheme = nsurl_get_component(url, NSURL_SCHEME);
if (scheme == NULL) {
diff --git a/content/urldb.h b/content/urldb.h
index 6a2946515..d60043089 100644
--- a/content/urldb.h
+++ b/content/urldb.h
@@ -25,9 +25,8 @@
#include <stdbool.h>
#include <time.h>
-#include "content/content.h"
-#include "content/content_type.h"
#include "utils/nsurl.h"
+#include "content/content_type.h"
typedef enum {
COOKIE_NETSCAPE = 0,
diff --git a/css/css.c b/css/css.c
index f8aa71a03..9dc6e8cba 100644
--- a/css/css.c
+++ b/css/css.c
@@ -17,22 +17,22 @@
*/
#include <assert.h>
-
#include <libwapcaplet/libwapcaplet.h>
#include <dom/dom.h>
#include "content/content_protected.h"
#include "content/fetch.h"
#include "content/hlcache.h"
-#include "css/css.h"
-#include "css/internal.h"
-#include "desktop/gui.h"
-#include "render/html.h"
+#include "desktop/system_colour.h"
+#include "utils/corestrings.h"
#include "utils/utils.h"
#include "utils/http.h"
#include "utils/log.h"
#include "utils/messages.h"
+#include "css/css.h"
+#include "css/internal.h"
+
/* Define to trace import fetches */
#undef NSCSS_IMPORT_TRACE
@@ -111,7 +111,6 @@ static css_error nscss_register_import(struct content_css_data *c,
const hlcache_handle *import);
-static lwc_string *css_charset;
static css_stylesheet *blank_import;
@@ -146,7 +145,7 @@ nserror nscss_create(const content_handler *handler,
}
/* Find charset specified on HTTP layer, if any */
- error = http_parameter_list_find_item(params, css_charset,
+ error = http_parameter_list_find_item(params, corestring_lwc_charset,
&charset_value);
if (error != NSERROR_OK || lwc_string_length(charset_value) == 0) {
/* No charset specified, use fallback, if any */
@@ -221,7 +220,7 @@ static nserror nscss_create_css_data(struct content_css_data *c,
params.resolve_pw = NULL;
params.import = nscss_handle_import;
params.import_pw = c;
- params.color = gui_system_colour;
+ params.color = ns_system_colour;
params.color_pw = NULL;
params.font = NULL;
params.font_pw = NULL;
@@ -576,14 +575,14 @@ css_error nscss_handle_import(void *pw, css_stylesheet *parent,
/* Create content */
c->imports[c->import_count].media = media;
- /* TODO: Why aren't we getting a relative url part, to join? */
+ /** \todo Why aren't we getting a relative url part, to join? */
nerror = nsurl_create(lwc_string_data(url), &ns_url);
if (nerror != NSERROR_OK) {
free(ctx);
return CSS_NOMEM;
}
- /* TODO: Constructing nsurl for referer here is silly, avoid */
+ /** \todo Constructing nsurl for referer here is silly, avoid */
nerror = nsurl_create(referer, &ns_ref);
if (nerror != NSERROR_OK) {
nsurl_unref(ns_url);
@@ -655,19 +654,8 @@ nserror nscss_import(hlcache_handle *handle,
/* Already released handle */
break;
- case CONTENT_MSG_LOADING:
- case CONTENT_MSG_READY:
- case CONTENT_MSG_STATUS:
- case CONTENT_MSG_REDIRECT:
- /* messages content handler will legitamately recive
- * but does not need to handle
- */
- break;
-
default:
- /* all other messages are unexpected and fatal */
- LOG(("Unhandled message type %d", event->type));
- assert(0);
+ break;
}
/* Preserve out-of-memory. Anything else is OK */
@@ -778,7 +766,7 @@ css_error nscss_register_import(struct content_css_data *c,
params.resolve_pw = NULL;
params.import = NULL;
params.import_pw = NULL;
- params.color = gui_system_colour;
+ params.color = ns_system_colour;
params.color_pw = NULL;
params.font = NULL;
params.font_pw = NULL;
@@ -811,11 +799,6 @@ css_error nscss_register_import(struct content_css_data *c,
*/
static void nscss_fini(void)
{
- if (css_charset != NULL) {
- lwc_string_unref(css_charset);
- css_charset = NULL;
- }
-
if (blank_import != NULL) {
css_stylesheet_destroy(blank_import);
blank_import = NULL;
@@ -839,15 +822,8 @@ static const content_handler css_content_handler = {
*/
nserror nscss_init(void)
{
- lwc_error lerror;
nserror error;
- lerror = lwc_intern_string("charset", SLEN("charset"), &css_charset);
- if (lerror != lwc_error_ok) {
- error = NSERROR_NOMEM;
- goto error;
- }
-
error = content_factory_register_handler("text/css",
&css_content_handler);
if (error != NSERROR_OK)
diff --git a/css/dump.c b/css/dump.c
index fa34284e0..d3ebc9481 100644
--- a/css/dump.c
+++ b/css/dump.c
@@ -1294,19 +1294,38 @@ void nscss_dump_computed_style(FILE *stream, const css_computed_style *style)
}
/* overflow */
- val = css_computed_overflow(style);
+ val = css_computed_overflow_x(style);
switch (val) {
case CSS_OVERFLOW_VISIBLE:
- fprintf(stream, "overflow: visible ");
+ fprintf(stream, "overflow-x: visible ");
break;
case CSS_OVERFLOW_HIDDEN:
- fprintf(stream, "overflow: hidden ");
+ fprintf(stream, "overflow-x: hidden ");
break;
case CSS_OVERFLOW_SCROLL:
- fprintf(stream, "overflow: scroll ");
+ fprintf(stream, "overflow-x: scroll ");
break;
case CSS_OVERFLOW_AUTO:
- fprintf(stream, "overflow: auto ");
+ fprintf(stream, "overflow-x auto ");
+ break;
+ default:
+ break;
+ }
+
+ /* overflow */
+ val = css_computed_overflow_y(style);
+ switch (val) {
+ case CSS_OVERFLOW_VISIBLE:
+ fprintf(stream, "overflow-y: visible ");
+ break;
+ case CSS_OVERFLOW_HIDDEN:
+ fprintf(stream, "overflow-y: hidden ");
+ break;
+ case CSS_OVERFLOW_SCROLL:
+ fprintf(stream, "overflow-y: scroll ");
+ break;
+ case CSS_OVERFLOW_AUTO:
+ fprintf(stream, "overflow-y: auto ");
break;
default:
break;
diff --git a/css/select.c b/css/select.c
index ee0e7dacd..72f72d9b8 100644
--- a/css/select.c
+++ b/css/select.c
@@ -23,16 +23,16 @@
#include "content/content_protected.h"
#include "content/urldb.h"
-#include "css/internal.h"
-#include "css/select.h"
-#include "css/utils.h"
-#include "desktop/gui.h"
+#include "desktop/system_colour.h"
#include "utils/nsoption.h"
#include "utils/corestrings.h"
#include "utils/log.h"
-#include "utils/url.h"
#include "utils/utils.h"
+#include "css/internal.h"
+#include "css/select.h"
+#include "css/utils.h"
+
#undef PRINT_NODE_BLOOM_DETAILS
static css_error node_name(void *pw, void *node, css_qname *qname);
@@ -185,7 +185,7 @@ css_stylesheet *nscss_create_inline_style(const uint8_t *data, size_t len,
params.resolve_pw = NULL;
params.import = NULL;
params.import_pw = NULL;
- params.color = gui_system_colour;
+ params.color = ns_system_colour;
params.color_pw = NULL;
params.font = NULL;
params.font_pw = NULL;
@@ -219,11 +219,9 @@ static void nscss_dom_user_data_handler(dom_node_operation operation,
struct dom_node *dst)
{
css_error error;
- bool match;
- if (lwc_string_isequal(corestring_dom___ns_key_libcss_node_data,
- key, &match) != lwc_error_ok || match == false ||
- data == NULL) {
+ if (dom_string_isequal(corestring_dom___ns_key_libcss_node_data,
+ key) == false || data == NULL) {
return;
}
diff --git a/desktop/Makefile b/desktop/Makefile
index f7020074e..218f60e67 100644
--- a/desktop/Makefile
+++ b/desktop/Makefile
@@ -8,12 +8,12 @@ S_DESKTOP := cookie_manager.c knockout.c hotlist.c mouse.c \
S_DESKTOP := $(addprefix desktop/,$(S_DESKTOP))
# version.c needs the testament
-desktop/version.c: testament utils/testament.h
+desktop/version.c: testament $(OBJROOT)/testament.h
# S_BROWSER are sources related to full browsers but are common
# between RISC OS, GTK, BeOS and AmigaOS builds
-S_BROWSER := browser.c download.c frames.c local_history.c netsurf.c \
- save_complete.c save_text.c selection.c textinput.c
+S_BROWSER := browser.c browser_history.c download.c frames.c netsurf.c \
+ save_complete.c save_text.c selection.c textinput.c gui_factory.c
S_BROWSER := $(addprefix desktop/,$(S_BROWSER))
diff --git a/desktop/browser.c b/desktop/browser.c
index d159a5599..1fa9de648 100644
--- a/desktop/browser.c
+++ b/desktop/browser.c
@@ -41,15 +41,14 @@
#include "content/fetch.h"
#include "content/hlcache.h"
#include "content/urldb.h"
-#include "desktop/401login.h"
+#include "desktop/browser_history.h"
#include "desktop/browser_private.h"
#include "desktop/download.h"
#include "desktop/frames.h"
#include "desktop/global_history.h"
-#include "desktop/gui.h"
+#include "desktop/gui_factory.h"
#include "desktop/hotlist.h"
#include "desktop/knockout.h"
-#include "desktop/local_history.h"
#include "utils/nsoption.h"
#include "desktop/scrollbar.h"
#include "desktop/selection.h"
@@ -60,22 +59,18 @@
#include "render/form.h"
#include "render/html.h"
#include "render/box.h"
+#include "utils/corestrings.h"
#include "utils/log.h"
#include "utils/messages.h"
#include "utils/nsurl.h"
-#include "utils/schedule.h"
-#include "utils/url.h"
#include "utils/utils.h"
#include "utils/utf8.h"
-/** one or more windows require a reformat */
-bool browser_reformat_pending;
/** maximum frame depth */
#define FRAME_DEPTH 8
-
/**
* Get position of scrollbar widget within browser window.
*
@@ -295,12 +290,12 @@ bool browser_window_redraw_ready(struct browser_window *bw)
return true;
}
-/* exported interface, documented in browser.h */
+/* exported interface, documented in browser_private.h */
void browser_window_update_extent(struct browser_window *bw)
{
if (bw->window != NULL)
/* Front end window */
- gui_window_update_extent(bw->window);
+ guit->window->update_extent(bw->window);
else
/* Core-managed browser window */
browser_window_handle_scrollbars(bw);
@@ -391,7 +386,7 @@ void browser_window_set_drag_type(struct browser_window *bw,
break;
}
- gui_window_drag_start(top_bw->window, gtype, rect);
+ guit->window->drag_start(top_bw->window, gtype, rect);
}
}
@@ -484,7 +479,7 @@ void browser_window_scroll_visible(struct browser_window *bw,
if (bw->window != NULL) {
/* Front end window */
- gui_window_scroll_visible(bw->window,
+ guit->window->scroll_visible(bw->window,
rect->x0, rect->y0, rect->x1, rect->y1);
} else {
/* Core managed browser window */
@@ -499,7 +494,7 @@ void browser_window_scroll_visible(struct browser_window *bw,
void browser_window_set_scroll(struct browser_window *bw, int x, int y)
{
if (bw->window != NULL) {
- gui_window_set_scroll(bw->window, x, y);
+ guit->window->set_scroll(bw->window, x, y);
} else {
if (bw->scroll_x != NULL)
scrollbar_set(bw->scroll_x, x, false);
@@ -661,11 +656,21 @@ bool browser_window_drop_file_at_point(struct browser_window *bw,
return false;
}
+void browser_window_set_gadget_filename(struct browser_window *bw,
+ struct form_control *gadget, const char *fn)
+{
+ html_set_file_gadget_filename(bw->current_content,
+ gadget, fn);
+}
+
/* exported interface, documented in browser.h */
-void browser_window_debug_dump(struct browser_window *bw, FILE *f)
+nserror browser_window_debug_dump(struct browser_window *bw, FILE *f, enum content_debug op)
{
- if (bw->current_content != NULL)
- content_debug_dump(bw->current_content, f);
+ if (bw->current_content == NULL) {
+ return NSERROR_OK;
+ }
+
+ return content_debug_dump(bw->current_content, f, op);
}
/** slow script handler
@@ -683,64 +688,81 @@ static bool slow_script(void *ctx)
}
/* exported interface, documented in desktop/browser.h */
-
-nserror
-browser_window_create(enum browser_window_nav_flags flags,
- nsurl *url,
- nsurl *referrer,
- struct browser_window *clone,
- struct browser_window **ret_bw)
+nserror browser_window_create(enum browser_window_create_flags flags,
+ nsurl *url, nsurl *referrer,
+ struct browser_window *existing,
+ struct browser_window **bw)
{
- struct browser_window *bw;
- struct browser_window *top;
+ gui_window_create_flags gw_flags = GW_CREATE_NONE;
+ struct browser_window *ret;
- /* caller must provide window to clone or be adding to history */
- assert(clone ||
- ((flags & BROWSER_WINDOW_HISTORY) != 0));
+ /* Check parameters */
+ if (flags & BW_CREATE_CLONE) {
+ if (existing == NULL) {
+ assert(0 && "Failed: No existing window provided.");
+ return NSERROR_BAD_PARAMETER;
+ }
+ }
+ if (!(flags & BW_CREATE_HISTORY)) {
+ if (!(flags & BW_CREATE_CLONE) || existing == NULL) {
+ assert(0 && "Failed: Must have existing for history.");
+ return NSERROR_BAD_PARAMETER;
+ }
+ }
- if ((bw = calloc(1, sizeof(struct browser_window))) == NULL) {
+ if ((ret = calloc(1, sizeof(struct browser_window))) == NULL) {
warn_user("NoMemory", 0);
return NSERROR_NOMEM;
}
/* new javascript context for window */
- bw->jsctx = js_newcontext(nsoption_int(script_timeout),
+ ret->jsctx = js_newcontext(nsoption_int(script_timeout),
slow_script,
NULL);
/* Initialise common parts */
- browser_window_initialise_common(bw, clone);
+ browser_window_initialise_common(flags, ret, existing);
/* window characteristics */
- bw->browser_window_type = BROWSER_WINDOW_NORMAL;
- bw->scrolling = SCROLLING_YES;
- bw->border = true;
- bw->no_resize = true;
- bw->last_action = wallclock();
- bw->focus = bw;
-
- /* gui window */
- /* from the front end's pov, it clones the top level browser window,
- * so find that. */
- top = browser_window_get_root(clone);
-
- bw->window = gui_create_browser_window(bw,
- top,
- ((flags & BROWSER_WINDOW_TAB) != 0));
-
- if (bw->window == NULL) {
- browser_window_destroy(bw);
+ ret->browser_window_type = BROWSER_WINDOW_NORMAL;
+ ret->scrolling = SCROLLING_YES;
+ ret->border = true;
+ ret->no_resize = true;
+ ret->last_action = wallclock();
+ ret->focus = ret;
+
+ /* The existing gui_window is on the top-level existing
+ * browser_window. */
+ existing = browser_window_get_root(existing);
+
+ /* Set up gui_window creation flags */
+ if (flags & BW_CREATE_TAB)
+ gw_flags |= GW_CREATE_TAB;
+ if (flags & BW_CREATE_CLONE)
+ gw_flags |= GW_CREATE_CLONE;
+
+ ret->window = guit->window->create(ret,
+ (existing != NULL) ? existing->window : NULL,
+ gw_flags);
+
+ if (ret->window == NULL) {
+ browser_window_destroy(ret);
return NSERROR_BAD_PARAMETER;
}
if (url != NULL) {
- flags |= BROWSER_WINDOW_VERIFIABLE;
- browser_window_navigate(bw, url, referrer, flags, NULL, NULL, NULL);
+ enum browser_window_nav_flags nav_flags = BW_NAVIGATE_NONE;
+ if (flags & BW_CREATE_UNVERIFIABLE)
+ nav_flags |= BW_NAVIGATE_UNVERIFIABLE;
+ if (flags & BW_CREATE_HISTORY)
+ nav_flags |= BW_NAVIGATE_HISTORY;
+ browser_window_navigate(ret, url, referrer, nav_flags, NULL,
+ NULL, NULL);
}
- if (ret_bw != NULL) {
- *ret_bw = bw;
+ if (bw != NULL) {
+ *bw = ret;
}
return NSERROR_OK;
@@ -750,25 +772,39 @@ browser_window_create(enum browser_window_nav_flags flags,
/**
* Initialise common parts of a browser window
*
- * \param bw The window to initialise
- * \param clone The window to clone, or NULL if none
+ * \param flags Flags to control operation
+ * \param bw The window to initialise
+ * \param existing The existing window if cloning, else NULL
*/
-void browser_window_initialise_common(struct browser_window *bw,
- struct browser_window *clone)
+nserror browser_window_initialise_common(enum browser_window_create_flags flags,
+ struct browser_window *bw, struct browser_window *existing)
{
+ nserror err;
assert(bw);
- if (!clone)
- bw->history = history_create();
- else
- bw->history = history_clone(clone->history);
+ if (flags & BW_CREATE_CLONE) {
+ assert(existing != NULL);
+
+ /* clone history */
+ err = browser_window_history_clone(existing, bw);
+
+ /* copy the scale */
+ bw->scale = existing->scale;
+ } else {
+ /* create history */
+ err = browser_window_history_create(bw);
+
+ /* default scale */
+ bw->scale = (float) nsoption_int(scale) / 100.0;
+ }
+
+ if (err != NSERROR_OK)
+ return err;
/* window characteristics */
bw->refresh_interval = -1;
- bw->reformat_pending = false;
bw->drag_type = DRAGGING_NONE;
- bw->scale = (float) nsoption_int(scale) / 100.0;
bw->scroll_x = NULL;
bw->scroll_y = NULL;
@@ -780,6 +816,8 @@ void browser_window_initialise_common(struct browser_window *bw,
bw->status_text_len = 0;
bw->status_match = 0;
bw->status_miss = 0;
+
+ return NSERROR_OK;
}
/**
@@ -808,7 +846,7 @@ browser_window_download(struct browser_window *bw,
NULL, NULL, &l);
if (error == NSERROR_NO_FETCH_HANDLER) {
/* no internal handler for this type, call out to frontend */
- gui_launch_url(nsurl_access(url));
+ error = guit->browser->launch_url(url);
} else if (error != NSERROR_OK) {
LOG(("Failed to fetch download: %d", error));
} else {
@@ -861,7 +899,7 @@ static void browser_window_start_throbber(struct browser_window *bw)
while (bw->parent)
bw = bw->parent;
- gui_window_start_throbber(bw->window);
+ guit->window->start_throbber(bw->window);
}
@@ -878,8 +916,9 @@ static void browser_window_stop_throbber(struct browser_window *bw)
while (bw->parent)
bw = bw->parent;
- if (!browser_window_check_throbber(bw))
- gui_window_stop_throbber(bw->window);
+ if (!browser_window_check_throbber(bw)) {
+ guit->window->stop_throbber(bw->window);
+ }
}
@@ -912,7 +951,7 @@ static nserror browser_window_favicon_callback(hlcache_handle *c,
/* content_get_bitmap on the hlcache_handle should give
* us the favicon bitmap at this point
*/
- gui_window_set_icon(bw->window, c);
+ guit->window->set_icon(bw->window, c);
break;
case CONTENT_MSG_ERROR:
@@ -960,7 +999,6 @@ static nserror browser_window_favicon_callback(hlcache_handle *c,
static void browser_window_update_favicon(hlcache_handle *c,
struct browser_window *bw, struct content_rfc5988_link *link)
{
- lwc_string *icon_str;
nsurl *nsref = NULL;
nsurl *nsurl;
nserror error;
@@ -979,25 +1017,20 @@ static void browser_window_update_favicon(hlcache_handle *c,
bw->failed_favicon = false;
if (link == NULL) {
- /* look for favicon metadata link */
- if (lwc_intern_string("icon", SLEN("icon"),
- &icon_str) == lwc_error_ok) {
- link = content_find_rfc5988_link(c, icon_str);
- lwc_string_unref(icon_str);
- }
+ /* Look for "icon" */
+ link = content_find_rfc5988_link(c, corestring_lwc_icon);
}
if (link == NULL) {
- if (lwc_intern_string("shortcut icon", SLEN("shortcut icon"),
- &icon_str) == lwc_error_ok) {
- link = content_find_rfc5988_link(c, icon_str);
- lwc_string_unref(icon_str);
- }
+ /* Look for "shortcut icon" */
+ link = content_find_rfc5988_link(c,
+ corestring_lwc_shortcut_icon);
}
if (link == NULL) {
lwc_string *scheme;
bool speculative_default = false;
+ bool match;
nsurl = hlcache_handle_get_url(c);
@@ -1005,12 +1038,10 @@ static void browser_window_update_favicon(hlcache_handle *c,
/* If the document was fetched over http(s), then speculate
* that there's a favicon living at /favicon.ico */
- if ((lwc_string_length(scheme) == SLEN("HTTP") &&
- strcasecmp(lwc_string_data(scheme),
- "http") == 0) ||
- (lwc_string_length(scheme) == SLEN("HTTPS") &&
- strcasecmp(lwc_string_data(scheme),
- "https") == 0)) {
+ if ((lwc_string_caseless_isequal(scheme, corestring_lwc_http,
+ &match) == lwc_error_ok && match) ||
+ (lwc_string_caseless_isequal(scheme, corestring_lwc_https,
+ &match) == lwc_error_ok && match)) {
speculative_default = true;
}
@@ -1089,7 +1120,7 @@ static void browser_window_refresh(void *p)
nsurl *url;
nsurl *refresh;
hlcache_handle *parent = NULL;
- enum browser_window_nav_flags flags = BROWSER_WINDOW_NONE;
+ enum browser_window_nav_flags flags = BW_NAVIGATE_UNVERIFIABLE;
assert(bw->current_content != NULL &&
(content_get_status(bw->current_content) ==
@@ -1108,7 +1139,7 @@ static void browser_window_refresh(void *p)
url = hlcache_handle_get_url(bw->current_content);
if ((url == NULL) || (nsurl_compare(url, refresh, NSURL_COMPLETE))) {
- flags |= BROWSER_WINDOW_HISTORY;
+ flags |= BW_NAVIGATE_HISTORY;
}
/* Treat an (almost) immediate refresh in a top-level browser window as
@@ -1119,7 +1150,7 @@ static void browser_window_refresh(void *p)
* all.
*/
if (bw->refresh_interval <= 100 && bw->parent == NULL) {
- flags |= BROWSER_WINDOW_VERIFIABLE;
+ flags &= ~BW_NAVIGATE_UNVERIFIABLE;
} else {
parent = bw->current_content;
}
@@ -1162,7 +1193,7 @@ static void browser_window_convert_to_download(struct browser_window *bw,
/**
- * Callback for fetchcache() for browser window fetches.
+ * Callback handler for content event messages.
*/
static nserror browser_window_callback(hlcache_handle *c,
@@ -1177,9 +1208,7 @@ static nserror browser_window_callback(hlcache_handle *c,
browser_window_convert_to_download(bw, event->data.download);
if (bw->current_content != NULL) {
- browser_window_refresh_url_bar(bw,
- hlcache_handle_get_url(bw->current_content),
- bw->frag_id);
+ browser_window_refresh_url_bar(bw);
}
break;
@@ -1227,11 +1256,9 @@ static nserror browser_window_callback(hlcache_handle *c,
browser_window_remove_caret(bw, false);
if (bw->window != NULL) {
- gui_window_new_content(bw->window);
+ guit->window->new_content(bw->window);
- browser_window_refresh_url_bar(bw,
- hlcache_handle_get_url(bw->current_content),
- bw->frag_id);
+ browser_window_refresh_url_bar(bw);
}
/* new content; set scroll_to_top */
@@ -1272,7 +1299,7 @@ static nserror browser_window_callback(hlcache_handle *c,
* after, we only leak the thumbnails when urldb does
* not add the URL.
*/
- history_add(bw->history, c, bw->frag_id);
+ browser_window_history_add(bw, c, bw->frag_id);
}
/* frames */
@@ -1302,12 +1329,13 @@ static nserror browser_window_callback(hlcache_handle *c,
browser_window_stop_throbber(bw);
browser_window_update_favicon(c, bw, NULL);
- history_update(bw->history, c);
+ browser_window_history_update(bw, c);
hotlist_update_url(hlcache_handle_get_url(c));
- if (bw->refresh_interval != -1)
- schedule(bw->refresh_interval,
+ if (bw->refresh_interval != -1) {
+ guit->browser->schedule(bw->refresh_interval * 10,
browser_window_refresh, bw);
+ }
break;
case CONTENT_MSG_ERRORCODE:
@@ -1398,34 +1426,17 @@ static nserror browser_window_callback(hlcache_handle *c,
case CONTENT_MSG_LINK: /* content has an rfc5988 link element */
{
- lwc_string *icon_str;
- lwc_string *shortcut_icon_str;
- bool icon_match = false;
- bool shortcut_icon_match = false;
-
- if (lwc_intern_string("icon", SLEN("icon"),
- &icon_str) == lwc_error_ok) {
- if (lwc_string_caseless_isequal(
- event->data.rfc5988_link->rel,
- icon_str,
- &icon_match) != lwc_error_ok) {
- icon_match = false;
- }
- lwc_string_unref(icon_str);
- }
-
- if (lwc_intern_string("shortcut icon", SLEN("shortcut icon"),
- &shortcut_icon_str) == lwc_error_ok) {
- if (lwc_string_caseless_isequal(
- event->data.rfc5988_link->rel,
- shortcut_icon_str,
- &shortcut_icon_match) != lwc_error_ok) {
- shortcut_icon_match = false;
- }
- lwc_string_unref(shortcut_icon_str);
- }
-
- if (icon_match || shortcut_icon_match) {
+ bool match;
+
+ /* Handle "icon" and "shortcut icon" */
+ if ((lwc_string_caseless_isequal(
+ event->data.rfc5988_link->rel,
+ corestring_lwc_icon,
+ &match) == lwc_error_ok && match) ||
+ (lwc_string_caseless_isequal(
+ event->data.rfc5988_link->rel,
+ corestring_lwc_shortcut_icon,
+ &match) == lwc_error_ok && match)) {
/* it's a favicon perhaps start a fetch for it */
browser_window_update_favicon(c, bw,
event->data.rfc5988_link);
@@ -1478,20 +1489,23 @@ static nserror browser_window_callback(hlcache_handle *c,
switch(event->data.dragsave.type) {
case CONTENT_SAVE_ORIG:
- gui_drag_save_object(GUI_SAVE_OBJECT_ORIG, save,
- root->window);
+ guit->window->drag_save_object(root->window, save,
+ GUI_SAVE_OBJECT_ORIG);
break;
+
case CONTENT_SAVE_NATIVE:
- gui_drag_save_object(GUI_SAVE_OBJECT_NATIVE, save,
- root->window);
+ guit->window->drag_save_object(root->window, save,
+ GUI_SAVE_OBJECT_NATIVE);
break;
+
case CONTENT_SAVE_COMPLETE:
- gui_drag_save_object(GUI_SAVE_COMPLETE, save,
- root->window);
+ guit->window->drag_save_object(root->window, save,
+ GUI_SAVE_COMPLETE);
break;
+
case CONTENT_SAVE_SOURCE:
- gui_drag_save_object(GUI_SAVE_SOURCE, save,
- root->window);
+ guit->window->drag_save_object(root->window, save,
+ GUI_SAVE_SOURCE);
break;
}
}
@@ -1501,7 +1515,7 @@ static nserror browser_window_callback(hlcache_handle *c,
{
/* Content wants a link to be saved */
struct browser_window *root = browser_window_get_root(bw);
- gui_window_save_link(root->window,
+ guit->window->save_link(root->window,
event->data.savelink.url,
event->data.savelink.title);
}
@@ -1555,8 +1569,16 @@ static nserror browser_window_callback(hlcache_handle *c,
event->data.selection.read_only);
break;
+ case CONTENT_MSG_GADGETCLICK:
+ if (event->data.gadget_click.gadget->type == GADGET_FILE) {
+ guit->window->file_gadget_open(bw->window, c,
+ event->data.gadget_click.gadget);
+ }
+
+ break;
+
default:
- assert(0);
+ break;
}
return NSERROR_OK;
@@ -1604,10 +1626,17 @@ void browser_window_destroy_internal(struct browser_window *bw)
LOG(("Destroying window"));
- if (bw->children != NULL || bw->iframes != NULL)
+ if (bw->children != NULL || bw->iframes != NULL) {
browser_window_destroy_children(bw);
+ }
- schedule_remove(browser_window_refresh, bw);
+ /* clear any pending callbacks */
+ guit->browser->schedule(-1, browser_window_refresh, bw);
+ /* The ugly cast here is so the reformat function can be
+ * passed a gui window pointer in its API rather than void*
+ */
+ LOG(("Clearing schedule %p(%p)", guit->window->reformat, bw->window));
+ guit->browser->schedule(-1, (void(*)(void*))guit->window->reformat, bw->window);
/* If this brower window is not the root window, and has focus, unset
* the root browser window's focus pointer. */
@@ -1629,7 +1658,7 @@ void browser_window_destroy_internal(struct browser_window *bw)
if (bw->window) {
/* Only the root window has a GUI window */
- gui_window_destroy(bw->window);
+ guit->window->destroy(bw->window);
}
if (bw->loading_content != NULL) {
@@ -1679,7 +1708,7 @@ void browser_window_destroy_internal(struct browser_window *bw)
if (bw->frag_id != NULL)
lwc_string_unref(bw->frag_id);
- history_destroy(bw->history);
+ browser_window_history_destroy(bw);
free(bw->name);
free(bw->status_text);
@@ -1705,6 +1734,70 @@ void browser_window_destroy(struct browser_window *bw)
}
+/**
+ * Update URL bar for a given browser window to given URL
+ *
+ * \param bw Browser window to update URL bar for.
+ * \param url URL for content displayed by bw including any fragment.
+ */
+
+static inline void browser_window_refresh_url_bar_internal(
+ struct browser_window *bw, nsurl *url)
+{
+ assert(bw);
+ assert(url);
+
+ if (bw->parent != NULL) {
+ /* Not root window; don't set a URL in GUI URL bar */
+ return;
+ }
+
+ guit->window->set_url(bw->window, nsurl_access(url));
+}
+
+
+/**
+ * Update URL bar for a given browser window to bw's content's URL
+ *
+ * \param bw Browser window to update URL bar for.
+ */
+
+void browser_window_refresh_url_bar(struct browser_window *bw)
+{
+ assert(bw);
+
+ if (bw->parent != NULL) {
+ /* Not root window; don't set a URL in GUI URL bar */
+ return;
+ }
+
+ if (bw->current_content == NULL) {
+ /* TODO: set "about:blank"? */
+ return;
+ }
+
+ if (bw->frag_id == NULL) {
+ browser_window_refresh_url_bar_internal(bw,
+ hlcache_handle_get_url(bw->current_content));
+ } else {
+ nsurl *display_url;
+ nserror error;
+
+ /* Combine URL and Fragment */
+ error = nsurl_refragment(
+ hlcache_handle_get_url(bw->current_content),
+ bw->frag_id, &display_url);
+ if (error != NSERROR_OK) {
+ warn_user("NoMemory", 0);
+ return;
+ }
+
+ browser_window_refresh_url_bar_internal(bw, display_url);
+ nsurl_unref(display_url);
+ }
+}
+
+
/* exported interface documented in desktop/browser.h */
nserror browser_window_navigate(struct browser_window *bw,
nsurl *url,
@@ -1738,7 +1831,7 @@ nserror browser_window_navigate(struct browser_window *bw,
}
/* Set up retrieval parameters */
- if ((flags & BROWSER_WINDOW_VERIFIABLE) != 0) {
+ if (!(flags & BW_NAVIGATE_UNVERIFIABLE)) {
fetch_flags |= LLCACHE_RETRIEVE_VERIFIABLE;
}
@@ -1762,7 +1855,7 @@ nserror browser_window_navigate(struct browser_window *bw,
}
/* Get download out of the way */
- if ((flags & BROWSER_WINDOW_DOWNLOAD) != 0) {
+ if ((flags & BW_NAVIGATE_DOWNLOAD) != 0) {
error = browser_window_download(bw,
url,
referrer,
@@ -1807,18 +1900,15 @@ nserror browser_window_navigate(struct browser_window *bw,
nsurl_unref(referrer);
}
- if ((flags & BROWSER_WINDOW_HISTORY) != 0) {
- history_add(bw->history,
+ if ((flags & BW_NAVIGATE_HISTORY) != 0) {
+ browser_window_history_add(bw,
bw->current_content, bw->frag_id);
}
browser_window_update(bw, false);
if (bw->current_content != NULL) {
- browser_window_refresh_url_bar(bw,
- hlcache_handle_get_url(
- bw->current_content),
- bw->frag_id);
+ browser_window_refresh_url_bar(bw);
}
return NSERROR_OK;
}
@@ -1831,10 +1921,10 @@ nserror browser_window_navigate(struct browser_window *bw,
LOG(("Loading '%s'", nsurl_access(url)));
browser_window_set_status(bw, messages_get("Loading"));
- bw->history_add = (flags & BROWSER_WINDOW_HISTORY);
+ bw->history_add = (flags & BW_NAVIGATE_HISTORY);
/* Verifiable fetches may trigger a download */
- if ((flags & BROWSER_WINDOW_VERIFIABLE) != 0) {
+ if (!(flags & BW_NAVIGATE_UNVERIFIABLE)) {
fetch_flags |= HLCACHE_RETRIEVE_MAY_DOWNLOAD;
}
@@ -1850,12 +1940,12 @@ nserror browser_window_navigate(struct browser_window *bw,
case NSERROR_OK:
bw->loading_content = c;
browser_window_start_throbber(bw);
- browser_window_refresh_url_bar(bw, url, NULL);
+ browser_window_refresh_url_bar_internal(bw, url);
break;
case NSERROR_NO_FETCH_HANDLER: /* no handler for this type */
/** @todo does this always try and download even unverifiable content? */
- gui_launch_url(nsurl_access(url));
+ error = guit->browser->launch_url(url);
break;
default: /* report error to user */
@@ -1878,6 +1968,85 @@ nserror browser_window_navigate(struct browser_window *bw,
}
+/* Exported interface, documented in browser.h */
+nsurl* browser_window_get_url(struct browser_window *bw)
+{
+ assert(bw != NULL);
+
+ if (bw->current_content != NULL) {
+ return hlcache_handle_get_url(bw->current_content);
+
+ } else if (bw->loading_content != NULL) {
+ /* TODO: should we return this? */
+ return hlcache_handle_get_url(bw->loading_content);
+ }
+
+ return corestring_nsurl_about_blank;
+}
+
+/* Exported interface, documented in browser.h */
+const char* browser_window_get_title(struct browser_window *bw)
+{
+ assert(bw != NULL);
+
+ if (bw->current_content != NULL) {
+ return content_get_title(bw->current_content);
+ }
+
+ return NULL;
+}
+
+/* Exported interface, documented in browser.h */
+struct history * browser_window_get_history(struct browser_window *bw)
+{
+ assert(bw != NULL);
+
+ return bw->history;
+}
+
+
+/* Exported interface, documented in browser.h */
+bool browser_window_has_content(struct browser_window *bw)
+{
+ assert(bw != NULL);
+
+ if (bw->current_content == NULL) {
+ return false;
+ }
+
+ return true;
+}
+
+/* Exported interface, documented in browser.h */
+struct hlcache_handle *browser_window_get_content(struct browser_window *bw)
+{
+ return bw->current_content;
+}
+
+/* Exported interface, documented in browser.h */
+nserror browser_window_get_extents(struct browser_window *bw, bool scaled,
+ int *width, int *height)
+{
+ assert(bw != NULL);
+
+ if (bw->current_content == NULL) {
+ *width = 0;
+ *height = 0;
+ return NSERROR_BAD_CONTENT;
+ }
+
+ *width = content_get_width(bw->current_content);
+ *height = content_get_height(bw->current_content);
+
+ if (scaled) {
+ *width *= bw->scale;
+ *height *= bw->scale;
+ }
+
+ return NSERROR_OK;
+}
+
+
/*
* Get the dimensions of the area a browser window occupies
*
@@ -1898,7 +2067,7 @@ void browser_window_get_dimensions(struct browser_window *bw,
*height = bw->height;
} else {
/* Front end window */
- gui_window_get_dimensions(bw->window, width, height, scaled);
+ guit->window->get_dimensions(bw->window, width, height, scaled);
}
}
@@ -1945,7 +2114,7 @@ void browser_window_update(struct browser_window *bw, bool scroll_to_top)
case BROWSER_WINDOW_NORMAL:
/* Root browser window, constituting a front end window/tab */
- gui_window_set_title(bw->window,
+ guit->window->set_title(bw->window,
content_get_title(bw->current_content));
browser_window_update_extent(bw);
@@ -1960,7 +2129,7 @@ void browser_window_update(struct browser_window *bw, bool scroll_to_top)
browser_window_set_scroll(bw, x, y);
}
- gui_window_redraw_window(bw->window);
+ guit->window->redraw(bw->window);
break;
@@ -2026,7 +2195,7 @@ void browser_window_update_box(struct browser_window *bw, struct rect *rect)
if (bw->window != NULL) {
/* Front end window */
- gui_window_update_box(bw->window, rect);
+ guit->window->update(bw->window, rect);
} else {
/* Core managed browser window */
browser_window_get_position(bw, true, &pos_x, &pos_y);
@@ -2038,7 +2207,7 @@ void browser_window_update_box(struct browser_window *bw, struct rect *rect)
rect->x1 += pos_x / bw->scale;
rect->y1 += pos_y / bw->scale;
- gui_window_update_box(top->window, rect);
+ guit->window->update(top->window, rect);
}
}
@@ -2068,7 +2237,7 @@ void browser_window_stop(struct browser_window *bw)
assert(error == NSERROR_OK);
}
- schedule_remove(browser_window_refresh, bw);
+ guit->browser->schedule(-1, browser_window_refresh, bw);
if (bw->children) {
children = bw->rows * bw->cols;
@@ -2082,9 +2251,7 @@ void browser_window_stop(struct browser_window *bw)
}
if (bw->current_content != NULL) {
- browser_window_refresh_url_bar(bw,
- hlcache_handle_get_url(bw->current_content),
- bw->frag_id);
+ browser_window_refresh_url_bar(bw);
}
browser_window_stop_throbber(bw);
@@ -2136,7 +2303,7 @@ void browser_window_reload(struct browser_window *bw, bool all)
browser_window_navigate(bw,
hlcache_handle_get_url(bw->current_content),
NULL,
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_NONE,
NULL,
NULL,
NULL);
@@ -2179,7 +2346,7 @@ void browser_window_set_status(struct browser_window *bw, const char *text)
}
bw->status_miss++;
- gui_window_set_status(bw->window, bw->status_text);
+ guit->window->set_status(bw->window, bw->status_text);
}
@@ -2221,9 +2388,19 @@ void browser_window_set_pointer(struct browser_window *bw,
gui_shape = (gui_pointer_shape)shape;
}
- gui_window_set_pointer(root->window, gui_shape);
+ guit->window->set_pointer(root->window, gui_shape);
}
+/* exported function documented in desktop/browser.h */
+nserror browser_window_schedule_reformat(struct browser_window *bw)
+{
+ /* The ugly cast here is so the reformat function can be
+ * passed a gui window pointer in its API rather than void*
+ */
+ LOG(("Scheduleing %p(%p)", guit->window->reformat, bw->window));
+ guit->browser->schedule(0, (void(*)(void*))guit->window->reformat, bw->window);
+ return NSERROR_OK;
+}
/**
* Reformat a browser window contents to a new width or height.
@@ -2275,8 +2452,7 @@ static void browser_window_set_scale_internal(struct browser_window *bw,
if (content_can_reformat(c) == false) {
browser_window_update(bw, false);
} else {
- bw->reformat_pending = true;
- browser_reformat_pending = true;
+ browser_window_schedule_reformat(bw);
}
}
@@ -2287,14 +2463,7 @@ static void browser_window_set_scale_internal(struct browser_window *bw,
}
-/**
- * Sets the scale of a browser window
- *
- * \param bw The browser window to scale
- * \param scale The new scale
- * \param all Scale all windows in the tree (ie work up aswell as down)
- */
-
+/* exported interface documented in desktop/browser.h */
void browser_window_set_scale(struct browser_window *bw, float scale, bool all)
{
while (bw->parent && all)
@@ -2309,59 +2478,13 @@ void browser_window_set_scale(struct browser_window *bw, float scale, bool all)
}
-/**
- * Gets the scale of a browser window
- *
- * \param bw The browser window to scale
- * \return
- */
-
+/* exported interface documented in desktop/browser.h */
float browser_window_get_scale(struct browser_window *bw)
{
return bw->scale;
}
-/**
- * Update URL bar for a given browser window to given URL
- *
- * \param bw Browser window to update URL bar for.
- * \param url URL for content displayed by bw, excluding any fragment.
- * \param frag Additional fragment. May be NULL if none.
- */
-
-void browser_window_refresh_url_bar(struct browser_window *bw, nsurl *url,
- lwc_string *frag)
-{
- assert(bw);
- assert(url);
-
- if (bw->parent != NULL) {
- /* Not root window; don't set a URL in GUI URL bar */
- return;
- }
-
- if (frag == NULL) {
- /* With no fragment, we may as well pass url straight through
- * saving a malloc, copy, free cycle.
- */
- gui_window_set_url(bw->window, nsurl_access(url));
- } else {
- nsurl *display_url;
- nserror error;
-
- error = nsurl_refragment(url, frag, &display_url);
- if (error != NSERROR_OK) {
- warn_user("NoMemory", 0);
- return;
- }
-
- gui_window_set_url(bw->window, nsurl_access(display_url));
- nsurl_unref(display_url);
- }
-}
-
-
static void browser_window_find_target_internal(struct browser_window *bw,
const char *target, int depth, struct browser_window *page,
int *rdepth, struct browser_window **bw_target)
@@ -2462,8 +2585,9 @@ struct browser_window *browser_window_find_target(struct browser_window *bw,
* OR
* - button_2 opens in new tab and the link target is "_blank"
*/
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_TAB,
+ error = browser_window_create(BW_CREATE_TAB |
+ BW_CREATE_HISTORY |
+ BW_CREATE_CLONE,
NULL,
NULL,
bw,
@@ -2489,7 +2613,8 @@ struct browser_window *browser_window_find_target(struct browser_window *bw,
* - button_2 doesn't open in new tabs and the link target is
* "_blank"
*/
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE,
+ error = browser_window_create(BW_CREATE_HISTORY |
+ BW_CREATE_CLONE,
NULL,
NULL,
bw,
@@ -2528,7 +2653,7 @@ struct browser_window *browser_window_find_target(struct browser_window *bw,
if (!nsoption_bool(target_blank))
return bw;
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE,
+ error = browser_window_create(BW_CREATE_CLONE | BW_CREATE_HISTORY,
NULL,
NULL,
bw,
@@ -2879,14 +3004,14 @@ void browser_window_mouse_click(struct browser_window *bw,
break;
default:
if (mouse & BROWSER_MOUSE_MOD_2) {
- if (mouse & BROWSER_MOUSE_DRAG_2)
- gui_drag_save_object(GUI_SAVE_OBJECT_NATIVE, c,
- bw->window);
- else if (mouse & BROWSER_MOUSE_DRAG_1)
- gui_drag_save_object(GUI_SAVE_OBJECT_ORIG, c,
- bw->window);
- }
- else if (mouse & (BROWSER_MOUSE_DRAG_1 |
+ if (mouse & BROWSER_MOUSE_DRAG_2) {
+ guit->window->drag_save_object(bw->window, c,
+ GUI_SAVE_OBJECT_NATIVE);
+ } else if (mouse & BROWSER_MOUSE_DRAG_1) {
+ guit->window->drag_save_object(bw->window, c,
+ GUI_SAVE_OBJECT_ORIG);
+ }
+ } else if (mouse & (BROWSER_MOUSE_DRAG_1 |
BROWSER_MOUSE_DRAG_2)) {
browser_window_page_drag_start(bw, x, y);
browser_window_set_pointer(bw, BROWSER_POINTER_MOVE);
@@ -2932,10 +3057,10 @@ void browser_window_page_drag_start(struct browser_window *bw, int x, int y)
if (bw->window != NULL) {
/* Front end window */
- gui_window_get_scroll(bw->window, &bw->drag_start_scroll_x,
+ guit->window->get_scroll(bw->window, &bw->drag_start_scroll_x,
&bw->drag_start_scroll_y);
- gui_window_scroll_start(bw->window);
+ guit->window->scroll_start(bw->window);
} else {
/* Core managed browser window */
bw->drag_start_scroll_x = scrollbar_get_offset(bw->scroll_x);
@@ -2953,7 +3078,8 @@ void browser_window_page_drag_start(struct browser_window *bw, int x, int y)
bool browser_window_back_available(struct browser_window *bw)
{
- return (bw && bw->history && history_back_available(bw->history));
+ return (bw && bw->history &&
+ browser_window_history_back_available(bw));
}
@@ -2966,7 +3092,8 @@ bool browser_window_back_available(struct browser_window *bw)
bool browser_window_forward_available(struct browser_window *bw)
{
- return (bw && bw->history && history_forward_available(bw->history));
+ return (bw && bw->history &&
+ browser_window_history_forward_available(bw));
}
diff --git a/desktop/browser.h b/desktop/browser.h
index ee55e72c4..c7d8b7e79 100644
--- a/desktop/browser.h
+++ b/desktop/browser.h
@@ -25,12 +25,13 @@
#define _NETSURF_DESKTOP_BROWSER_H_
#include <stdbool.h>
+#include <stdio.h>
-#include "content/content.h"
+#include "utils/types.h"
+#include "utils/errors.h"
+#include "desktop/plot_style.h"
#include "desktop/frame_types.h"
-#include "desktop/gui.h"
#include "desktop/mouse.h"
-#include "utils/types.h"
struct browser_window;
@@ -39,7 +40,9 @@ struct gui_window;
struct history;
struct selection;
struct fetch_multipart_data;
-
+struct form_control;
+struct nsurl;
+enum content_debug;
typedef enum {
DRAGGING_NONE,
@@ -59,39 +62,69 @@ typedef enum {
BW_EDITOR_CAN_PASTE = (1 << 2) /**< Can paste, input */
} browser_editor_flags;
-extern bool browser_reformat_pending;
+/** flags to browser_window_create */
+enum browser_window_create_flags {
+ /** No flags set */
+ BW_CREATE_NONE = 0,
-/** flags to browser window go */
+ /** this will form a new history node (don't set for back/reload/etc) */
+ BW_CREATE_HISTORY = (1 << 0),
+
+ /** New gui_window to be tab in same window as "existing" gui_window */
+ BW_CREATE_TAB = (1 << 1),
+
+ /** New gui_window to be clone of "existing" gui_window */
+ BW_CREATE_CLONE = (1 << 2),
+
+ /** Window not opened by user interaction (e.g. JS popup)
+ *
+ * rfc2965:
+ * A transaction is verifiable if the user, or a
+ * user-designated agent, has the option to review
+ * the request-URI prior to its use in the transaction.
+ * A transaction is unverifiable if the user does not
+ * have that option.
+ */
+ BW_CREATE_UNVERIFIABLE = (1 << 3),
+};
+
+/** flags to browser_window_navigate */
enum browser_window_nav_flags {
- BROWSER_WINDOW_NONE = 0,
+ /** No flags set */
+ BW_NAVIGATE_NONE = 0,
+
/** this will form a new history node (don't set for back/reload/etc) */
- BROWSER_WINDOW_HISTORY = 1,
+ BW_NAVIGATE_HISTORY = (1 << 0),
+
/** download rather than render the uri */
- BROWSER_WINDOW_DOWNLOAD = 2,
- /** this transaction is verifiable */
- BROWSER_WINDOW_VERIFIABLE = 4,
- /** open a new tab rather than a new window */
- BROWSER_WINDOW_TAB = 8,
+ BW_NAVIGATE_DOWNLOAD = (1 << 1),
+
+ /** Transation not caused by user interaction (e.g. JS-caused)
+ *
+ * rfc2965:
+ * A transaction is verifiable if the user, or a
+ * user-designated agent, has the option to review
+ * the request-URI prior to its use in the transaction.
+ * A transaction is unverifiable if the user does not
+ * have that option.
+ */
+ BW_NAVIGATE_UNVERIFIABLE = (1 << 2)
};
-void browser_window_initialise_common(struct browser_window *bw,
- struct browser_window *clone);
-
/**
* Create and open a new root browser window with the given page.
*
- * \param flags Flags to control operation
- * \param url URL to start fetching in the new window or NULL for blank
- * \param referer The referring uri or NULL if none
- * \param clone The browser window to clone
- * \param bw pointer to created browser window or untouched on error.
- * \return error code
+ * \param flags Flags to control operation
+ * \param url URL to fetch in the new window or NULL for blank
+ * \param referer The referring uri or NULL if none
+ * \param existing The an existing bw or NULL, required for some flags.
+ * \param bw Updated to created browser window or untouched on error.
+ * \return NSERROR_OK, or appropriate error otherwise.
*/
-nserror browser_window_create(enum browser_window_nav_flags flags,
- nsurl *url,
- nsurl *referrer,
- struct browser_window *clone,
- struct browser_window **bw);
+nserror browser_window_create(enum browser_window_create_flags flags,
+ struct nsurl *url, struct nsurl *referrer,
+ struct browser_window *existing,
+ struct browser_window **bw);
/**
* Start fetching a page in a browser window.
@@ -111,12 +144,64 @@ nserror browser_window_create(enum browser_window_nav_flags flags,
*
*/
nserror browser_window_navigate(struct browser_window *bw,
- nsurl *url,
- nsurl *referrer,
+ struct nsurl *url,
+ struct nsurl *referrer,
enum browser_window_nav_flags flags,
char *post_urlenc,
struct fetch_multipart_data *post_multipart,
- hlcache_handle *parent);
+ struct hlcache_handle *parent);
+
+/**
+ * Get a browser window's URL.
+ *
+ * \param bw browser window
+ * \return pointer to nsurl. Doesn't create a ref for caller.
+ *
+ * Note: guaranteed to return a valid nsurl ptr, never returns NULL.
+ */
+struct nsurl* browser_window_get_url(struct browser_window *bw);
+
+/**
+ * Get the title of a browser_window.
+ *
+ * \param bw The browser window.
+ */
+const char* browser_window_get_title(struct browser_window *bw);
+
+/**
+ * Get a browser window's history object.
+ *
+ * \param bw browser window
+ * \return pointer browser window's history object
+ *
+ * Clients need history object to make use of the history_* functions.
+ */
+struct history * browser_window_get_history(struct browser_window *bw);
+
+/**
+ * Get a browser window's content extents.
+ *
+ * \param bw browser window
+ * \param scaled whether to apply current browser window scale
+ * \param width updated to content width extent in px
+ * \param width updated to content height extent in px
+ * \return NSERROR_OK, or appropriate error otherwise.
+ */
+nserror browser_window_get_extents(struct browser_window *bw, bool scaled,
+ int *width, int *height);
+
+/**
+ * Find out if a browser window is currently showing a content.
+ *
+ * \param bw browser window
+ * \return true iff browser window is showing a content, else false.
+ */
+bool browser_window_has_content(struct browser_window *bw);
+
+/**
+ * Get a cache handle for the content within a browser window.
+ */
+struct hlcache_handle *browser_window_get_content(struct browser_window *bw);
void browser_window_get_dimensions(struct browser_window *bw,
int *width, int *height, bool scaled);
@@ -129,7 +214,24 @@ void browser_window_reload(struct browser_window *bw, bool all);
void browser_window_destroy(struct browser_window *bw);
void browser_window_reformat(struct browser_window *bw, bool background,
int width, int height);
+
+
+/**
+ * Sets the scale of a browser window.
+ *
+ * \param bw The browser window to scale.
+ * \param scale The new scale.
+ * \param all Scale all windows in the tree (ie work up aswell as down)
+ */
void browser_window_set_scale(struct browser_window *bw, float scale, bool all);
+
+
+/**
+ * Gets the scale of a browser window
+ *
+ * \param bw The browser window to get the scale of.
+ * \return The scale of teh window.
+ */
float browser_window_get_scale(struct browser_window *bw);
/**
@@ -173,8 +275,10 @@ bool browser_window_scroll_at_point(struct browser_window *bw,
bool browser_window_drop_file_at_point(struct browser_window *bw,
int x, int y, char *file);
-void browser_window_refresh_url_bar(struct browser_window *bw, nsurl *url,
- lwc_string *frag);
+void browser_window_set_gadget_filename(struct browser_window *bw,
+ struct form_control *gadget, const char *fn);
+
+void browser_window_refresh_url_bar(struct browser_window *bw);
void browser_window_mouse_click(struct browser_window *bw,
browser_mouse_state mouse, int x, int y);
@@ -184,6 +288,21 @@ struct browser_window *browser_window_find_target(
struct browser_window *bw, const char *target,
browser_mouse_state mouse);
+/**
+ * Cause the frontends reformat entry to be called in safe context.
+ *
+ * The browser_window_reformat call cannot safely be called from some
+ * contexts, this call allows for the reformat to happen from a safe
+ * top level context.
+ *
+ * The callback is frontend provided as the context information (size
+ * etc.) about the windowing toolkit is only available to the
+ * frontend.
+ */
+nserror browser_window_schedule_reformat(struct browser_window *bw);
+
+
+
void browser_select_menu_callback(void *client_data,
int x, int y, int width, int height);
@@ -240,15 +359,7 @@ bool browser_window_redraw(struct browser_window *bw, int x, int y,
*/
bool browser_window_redraw_ready(struct browser_window *bw);
-/*
- * Update the extent of the inside of a browser window to that of the current
- * content
- *
- * \param bw browser_window to update the extent of
- */
-void browser_window_update_extent(struct browser_window *bw);
-
-/*
+/**
* Get the position of the current browser window with respect to the root or
* parent browser window
*
@@ -260,7 +371,7 @@ void browser_window_update_extent(struct browser_window *bw);
void browser_window_get_position(struct browser_window *bw, bool root,
int *pos_x, int *pos_y);
-/*
+/**
* Set the position of the current browser window with respect to the parent
* browser window
*
@@ -270,7 +381,7 @@ void browser_window_get_position(struct browser_window *bw, bool root,
*/
void browser_window_set_position(struct browser_window *bw, int x, int y);
-/*
+/**
* Scroll the browser window to display the passed area
*
* \param bw browser window to scroll
@@ -291,7 +402,7 @@ void browser_window_scroll_visible(struct browser_window *bw,
*/
void browser_window_set_scroll(struct browser_window *bw, int x, int y);
-/*
+/**
* Set drag type for a browser window, and inform front end
*
* \param bw browser window to set the type of the current drag for
@@ -301,7 +412,7 @@ void browser_window_set_scroll(struct browser_window *bw, int x, int y);
void browser_window_set_drag_type(struct browser_window *bw,
browser_drag_type type, const struct rect *rect);
-/*
+/**
* Get type of any current drag for a browser window
*
* \param bw browser window to set the type of the current drag for
@@ -309,7 +420,7 @@ void browser_window_set_drag_type(struct browser_window *bw,
*/
browser_drag_type browser_window_get_drag_type(struct browser_window *bw);
-/*
+/**
* Get the root level browser window
*
* \param bw browser window to set the type of the current drag for
@@ -342,7 +453,7 @@ char * browser_window_get_selection(struct browser_window *bw);
* \param bw The browser window
* \param f The file to dump to
*/
-void browser_window_debug_dump(struct browser_window *bw, FILE *f);
+nserror browser_window_debug_dump(struct browser_window *bw, FILE *f, enum content_debug op);
/* In platform specific theme_install.c. */
#ifdef WITH_THEME_INSTALL
diff --git a/desktop/local_history.c b/desktop/browser_history.c
index d4ecfd3bb..8c21eed8e 100644
--- a/desktop/local_history.c
+++ b/desktop/browser_history.c
@@ -26,13 +26,13 @@
#include <stdlib.h>
#include <string.h>
#include <time.h>
+
#include "content/content.h"
#include "content/hlcache.h"
#include "content/urldb.h"
#include "css/css.h"
-#include "desktop/browser.h"
-#include "desktop/gui.h"
-#include "desktop/local_history.h"
+#include "desktop/browser_history.h"
+#include "desktop/browser_private.h"
#include "desktop/plotters.h"
#include "desktop/thumbnail.h"
#include "image/bitmap.h"
@@ -80,75 +80,6 @@ struct history {
int height;
};
-static struct history_entry *history_clone_entry(struct history *history,
- struct history_entry *entry);
-static void history_free_entry(struct history_entry *entry);
-static void history_layout(struct history *history);
-static int history_layout_subtree(struct history *history,
- struct history_entry *entry, int x, int y, bool shuffle);
-static bool history_redraw_entry(struct history *history,
- struct history_entry *entry,
- int x0, int y0, int x1, int y1,
- int x, int y, bool clip, const struct redraw_context *ctx);
-static struct history_entry *history_find_position(struct history_entry *entry,
- int x, int y);
-static bool history_enumerate_entry(const struct history *history,
- const struct history_entry *entry, history_enumerate_cb cb, void *ud);
-
-
-/**
- * Create a new history tree for a window.
- *
- * \return pointer to an opaque history structure, 0 on failure.
- */
-
-struct history *history_create(void)
-{
- struct history *history;
-
- history = calloc(1, sizeof *history);
- if (!history) {
- warn_user("NoMemory", 0);
- return 0;
- }
- history->width = RIGHT_MARGIN / 2;
- history->height = BOTTOM_MARGIN / 2;
- return history;
-}
-
-
-/**
- * Clone a history tree
- *
- * \param history opaque history structure, as returned by history_create()
- *
- * \return pointer to an opaque history structure, 0 on failure.
- */
-
-struct history *history_clone(struct history *history)
-{
- struct history *new_history;
-
- if (!history->start)
- return history_create();
-
- new_history = malloc(sizeof *history);
- if (!new_history)
- return 0;
- memcpy(new_history, history, sizeof *history);
-
- new_history->start = history_clone_entry(new_history,
- new_history->start);
- if (!history->start) {
- LOG(("Insufficient memory to clone history"));
- warn_user("NoMemory", 0);
- history_destroy(new_history);
- return 0;
- }
-
- return new_history;
-}
-
/**
* Clone a history entry
@@ -159,7 +90,8 @@ struct history *history_clone(struct history *history)
* \return a cloned history entry, or 0 on error
*/
-struct history_entry *history_clone_entry(struct history *history,
+static struct history_entry *browser_window_history__clone_entry(
+ struct history *history,
struct history_entry *entry)
{
struct history_entry *child;
@@ -197,7 +129,7 @@ struct history_entry *history_clone_entry(struct history *history,
/* recurse for all children */
for (child = new_entry->forward; child; child = child->next) {
- new_child = history_clone_entry(history, child);
+ new_child = browser_window_history__clone_entry(history, child);
if (new_child) {
new_child->back = new_entry;
} else {
@@ -223,26 +155,360 @@ struct history_entry *history_clone_entry(struct history *history,
/**
+ * Free an entry in the tree recursively.
+ */
+
+static void browser_window_history__free_entry(struct history_entry *entry)
+{
+ if (!entry)
+ return;
+ browser_window_history__free_entry(entry->forward);
+ browser_window_history__free_entry(entry->next);
+ nsurl_unref(entry->page.url);
+ if (entry->page.frag_id)
+ lwc_string_unref(entry->page.frag_id);
+ free(entry->page.title);
+ free(entry);
+}
+
+
+/**
+ * Recursively position a subtree.
+ *
+ * \param history history being laid out
+ * \param entry subtree to position
+ * \param x x position for entry
+ * \param y smallest available y
+ * \param shuffle shuffle layout
+ * \return greatest y used by subtree
+ */
+
+static int browser_window_history__layout_subtree(struct history *history,
+ struct history_entry *entry, int x, int y, bool shuffle)
+{
+ struct history_entry *child;
+ int y1 = y;
+
+ if (history->width < x + WIDTH)
+ history->width = x + WIDTH;
+
+ if (!entry->forward) {
+ entry->x = x;
+ entry->y = y;
+ if (shuffle) {
+ entry->x = rand() % 600;
+ entry->y = rand() % 400;
+ }
+ return y + HEIGHT;
+ }
+
+ /* layout child subtrees below each other */
+ for (child = entry->forward; child; child = child->next) {
+ y1 = browser_window_history__layout_subtree(history, child,
+ x + WIDTH + RIGHT_MARGIN, y1, shuffle);
+ if (child->next)
+ y1 += BOTTOM_MARGIN;
+ }
+
+ /* place ourselves in the middle */
+ entry->x = x;
+ entry->y = (y + y1) / 2 - HEIGHT / 2;
+ if (shuffle) {
+ entry->x = rand() % 600;
+ entry->y = rand() % 400;
+ }
+
+ return y1;
+}
+
+
+/**
+ * Compute node positions.
+ *
+ * \param history history to layout
+ *
+ * Each node's x and y are filled in.
+ */
+
+static void browser_window_history__layout(struct history *history)
+{
+ time_t t = time(0);
+ struct tm *tp = localtime(&t);
+ bool shuffle = tp->tm_mon == 3 && tp->tm_mday == 1;
+
+ if (!history)
+ return;
+
+ history->width = 0;
+ if (history->start)
+ history->height = browser_window_history__layout_subtree(
+ history, history->start,
+ RIGHT_MARGIN / 2, BOTTOM_MARGIN / 2,
+ shuffle);
+ else
+ history->height = 0;
+ if (shuffle) {
+ history->width = 600 + WIDTH;
+ history->height = 400 + HEIGHT;
+ }
+ history->width += RIGHT_MARGIN / 2;
+ history->height += BOTTOM_MARGIN / 2;
+}
+
+/**
+ * Recursively redraw a history_entry.
+ *
+ * \param history history containing the entry
+ * \param history_entry entry to render
+ * \param ctx current redraw context
+ */
+
+static bool browser_window_history__redraw_entry(struct history *history,
+ struct history_entry *entry,
+ int x0, int y0, int x1, int y1,
+ int x, int y, bool clip,
+ const struct redraw_context *ctx)
+{
+ const struct plotter_table *plot = ctx->plot;
+ size_t char_offset;
+ int actual_x;
+ struct history_entry *child;
+ colour c = entry == history->current ?
+ HISTORY_COLOUR_SELECTED : HISTORY_COLOUR_FOREGROUND;
+ int tailsize = 5;
+ int xoffset = x - x0;
+ int yoffset = y - y0;
+ plot_style_t pstyle_history_rect = {
+ .stroke_type = PLOT_OP_TYPE_SOLID,
+ .stroke_colour = c,
+ .stroke_width = entry == history->current ? 3 : 1,
+ };
+ plot_font_style_t fstyle = *plot_style_font;
+
+ if (clip) {
+ struct rect rect;
+ rect.x0 = x0 + xoffset;
+ rect.y0 = y0 + yoffset;
+ rect.x1 = x1 + xoffset;
+ rect.y1 = y1 + yoffset;
+ if(!plot->clip(&rect))
+ return false;
+ }
+
+ if (!plot->bitmap(entry->x + xoffset, entry->y + yoffset, WIDTH, HEIGHT,
+ entry->bitmap, 0xffffff, 0))
+ return false;
+ if (!plot->rectangle(entry->x - 1 + xoffset,
+ entry->y - 1 + yoffset,
+ entry->x + xoffset + WIDTH,
+ entry->y + yoffset + HEIGHT,
+ &pstyle_history_rect))
+ return false;
+
+ if (!nsfont.font_position_in_string(plot_style_font, entry->page.title,
+ strlen(entry->page.title), WIDTH,
+ &char_offset, &actual_x))
+ return false;
+
+ fstyle.background = HISTORY_COLOUR_BACKGROUND;
+ fstyle.foreground = c;
+ fstyle.weight = entry == history->current ? 900 : 400;
+
+ if (!plot->text(entry->x + xoffset, entry->y + HEIGHT + 12 + yoffset,
+ entry->page.title, char_offset, &fstyle))
+ return false;
+
+ for (child = entry->forward; child; child = child->next) {
+ if (!plot->line(entry->x + WIDTH + xoffset,
+ entry->y + HEIGHT / 2 + yoffset,
+ entry->x + WIDTH + tailsize + xoffset,
+ entry->y + HEIGHT / 2 + yoffset,
+ plot_style_stroke_history))
+ return false;
+ if (!plot->line(entry->x + WIDTH + tailsize + xoffset,
+ entry->y + HEIGHT / 2 + yoffset,
+ child->x - tailsize +xoffset,
+ child->y + HEIGHT / 2 + yoffset,
+ plot_style_stroke_history))
+ return false;
+ if (!plot->line(child->x - tailsize + xoffset,
+ child->y + HEIGHT / 2 + yoffset,
+ child->x + xoffset, child->y +
+ HEIGHT / 2 + yoffset,
+ plot_style_stroke_history))
+ return false;
+ if (!browser_window_history__redraw_entry(history, child,
+ x0, y0, x1, y1, x, y, clip, ctx))
+ return false;
+ }
+
+ return true;
+}
+
+
+/**
+ * Find the history entry at a position.
+ *
+ * \param entry entry to search from
+ * \param x coordinate
+ * \param y coordinate
+ * \return an entry if found, 0 if none
+ */
+
+static struct history_entry *browser_window_history__find_position(
+ struct history_entry *entry, int x, int y)
+{
+ struct history_entry *child;
+ struct history_entry *found;
+
+ if (!entry)
+ return 0;
+
+ if (entry->x <= x && x <= entry->x + WIDTH &&
+ entry->y <= y && y <= entry->y + HEIGHT)
+ return entry;
+
+ for (child = entry->forward; child; child = child->next) {
+ found = browser_window_history__find_position(child, x, y);
+ if (found)
+ return found;
+ }
+
+ return 0;
+}
+
+/**
+ * Enumerate subentries in history
+ * See also history_enumerate()
+ *
+ * \param bw The browser window to enumerate history of
+ * \param entry entry to start enumeration at
+ * \param cb callback function
+ * \param ud context pointer passed to cb
+ * \return true to continue enumeration, false to cancel
+ */
+static bool browser_window_history__enumerate_entry(
+ const struct browser_window *bw,
+ const struct history_entry *entry,
+ browser_window_history_enumerate_cb cb,
+ void *ud)
+{
+ const struct history_entry *child;
+
+ if (!cb(bw, entry->x, entry->y,
+ entry->x + WIDTH, entry->y + HEIGHT,
+ entry, ud))
+ return false;
+
+ for (child = entry->forward; child; child = child->next) {
+ if (!browser_window_history__enumerate_entry(bw, child,
+ cb, ud))
+ return false;
+ }
+
+ return true;
+}
+
+
+/* -------------------------------------------------------------------------- */
+
+
+/**
+ * Create a new history tree for a browser window window.
+ *
+ * \param bw browser window to create history for.
+ *
+ * \return NSERROR_OK or appropriate error otherwise
+ */
+
+nserror browser_window_history_create(struct browser_window *bw)
+{
+ struct history *history;
+
+ bw->history = NULL;
+
+ history = calloc(1, sizeof *history);
+ if (!history) {
+ warn_user("NoMemory", 0);
+ return NSERROR_NOMEM;
+ }
+ history->width = RIGHT_MARGIN / 2;
+ history->height = BOTTOM_MARGIN / 2;
+
+ bw->history = history;
+ return NSERROR_OK;
+}
+
+
+/**
+ * Clone a bw's history tree for new bw
+ *
+ * \param existing browser window with history to clone.
+ * \param clone browser window to make cloned history for.
+ *
+ * \return NSERROR_OK or appropriate error otherwise
+ */
+
+nserror browser_window_history_clone(const struct browser_window *existing,
+ struct browser_window *clone)
+{
+ struct history *new_history;
+
+ clone->history = NULL;
+
+ if (existing == NULL || existing->history == NULL ||
+ existing->history->start == NULL)
+ /* Nothing to clone, create new history for clone window */
+ return browser_window_history_create(clone);
+
+ /* Make cloned history */
+ new_history = malloc(sizeof *new_history);
+ if (!new_history)
+ return NSERROR_NOMEM;
+
+ clone->history = new_history;
+ memcpy(new_history, existing->history, sizeof *new_history);
+
+ new_history->start = browser_window_history__clone_entry(new_history,
+ new_history->start);
+ if (!new_history->start) {
+ LOG(("Insufficient memory to clone history"));
+ warn_user("NoMemory", 0);
+ browser_window_history_destroy(clone);
+ clone->history = NULL;
+ return NSERROR_NOMEM;
+ }
+
+ return NSERROR_OK;
+}
+
+
+/**
* Insert a url into the history tree.
*
- * \param history opaque history structure, as returned by history_create()
+ * \param bw browser window with history object
* \param content content to add to history
* \param frag_id fragment identifier, or NULL.
*
* The page is added after the current entry and becomes current.
*/
-void history_add(struct history *history, hlcache_handle *content,
- lwc_string *frag_id)
+
+void browser_window_history_add(struct browser_window *bw,
+ struct hlcache_handle *content, lwc_string *frag_id)
{
+ struct history *history;
struct history_entry *entry;
nsurl *nsurl = hlcache_handle_get_url(content);
char *title;
struct bitmap *bitmap;
- assert(history);
+ assert(bw);
+ assert(bw->history);
assert(content);
+ history = bw->history;
+
/* allocate space */
entry = malloc(sizeof *entry);
if (entry == NULL)
@@ -297,7 +563,7 @@ void history_add(struct history *history, hlcache_handle *content,
}
entry->bitmap = bitmap;
- history_layout(history);
+ browser_window_history__layout(history);
}
@@ -308,10 +574,16 @@ void history_add(struct history *history, hlcache_handle *content,
* \param content content for current entry
*/
-void history_update(struct history *history, hlcache_handle *content)
+void browser_window_history_update(struct browser_window *bw,
+ struct hlcache_handle *content)
{
+ struct history *history;
char *title;
+ assert(bw != NULL);
+
+ history = bw->history;
+
if (!history || !history->current || !history->current->bitmap)
return;
@@ -338,30 +610,17 @@ void history_update(struct history *history, hlcache_handle *content)
* \param history opaque history structure, as returned by history_create()
*/
-void history_destroy(struct history *history)
+void browser_window_history_destroy(struct browser_window *bw)
{
- if (!history)
+ assert(bw != NULL);
+
+ if (bw->history == NULL)
return;
- history_free_entry(history->start);
- free(history);
-}
+ browser_window_history__free_entry(bw->history->start);
+ free(bw->history);
-/**
- * Free an entry in the tree recursively.
- */
-
-void history_free_entry(struct history_entry *entry)
-{
- if (!entry)
- return;
- history_free_entry(entry->forward);
- history_free_entry(entry->next);
- nsurl_unref(entry->page.url);
- if (entry->page.frag_id)
- lwc_string_unref(entry->page.frag_id);
- free(entry->page.title);
- free(entry);
+ bw->history = NULL;
}
@@ -370,13 +629,15 @@ void history_free_entry(struct history_entry *entry)
*
* \param bw browser window
* \param history history of the window
+ * \param new_window whether to open in new window
*/
-void history_back(struct browser_window *bw, struct history *history)
+void browser_window_history_back(struct browser_window *bw, bool new_window)
{
- if (!history || !history->current || !history->current->back)
+ if (!bw || !bw->history || !bw->history->current ||
+ !bw->history->current->back)
return;
- history_go(bw, history, history->current->back, false);
+ browser_window_history_go(bw, bw->history->current->back, new_window);
}
@@ -385,13 +646,16 @@ void history_back(struct browser_window *bw, struct history *history)
*
* \param bw browser window
* \param history history of the window
+ * \param new_window whether to open in new window
*/
-void history_forward(struct browser_window *bw, struct history *history)
+void browser_window_history_forward(struct browser_window *bw, bool new_window)
{
- if (!history || !history->current || !history->current->forward_pref)
+ if (!bw || !bw->history || !bw->history->current ||
+ !bw->history->current->forward_pref)
return;
- history_go(bw, history, history->current->forward_pref, false);
+ browser_window_history_go(bw, bw->history->current->forward_pref,
+ new_window);
}
@@ -402,9 +666,10 @@ void history_forward(struct browser_window *bw, struct history *history)
* \return true if the history can go back, false otherwise
*/
-bool history_back_available(struct history *history)
+bool browser_window_history_back_available(struct browser_window *bw)
{
- return (history && history->current && history->current->back);
+ return (bw && bw->history && bw->history->current &&
+ bw->history->current->back);
}
@@ -415,25 +680,24 @@ bool history_back_available(struct history *history)
* \return true if the history can go forwards, false otherwise
*/
-bool history_forward_available(struct history *history)
+bool browser_window_history_forward_available(struct browser_window *bw)
{
- return (history && history->current && history->current->forward_pref);
+ return (bw && bw->history && bw->history->current &&
+ bw->history->current->forward_pref);
}
/* Documented in local_history.h */
-void history_go(struct browser_window *bw,
- struct history *history,
- struct history_entry *entry,
- bool new_window)
+void browser_window_history_go(struct browser_window *bw,
+ struct history_entry *entry, bool new_window)
{
+ struct history *history;
nsurl *url;
struct history_entry *current;
nserror error;
-// LOG(("%p %p %p", bw, history, entry));
-// LOG(("%s %s %s",
-// entry->page.url, entry->page.title, entry->page.frag_id));
+ assert(bw != NULL);
+ history = bw->history;
if (entry->page.frag_id) {
error = nsurl_refragment(entry->page.url,
@@ -451,16 +715,17 @@ void history_go(struct browser_window *bw,
current = history->current;
history->current = entry;
- browser_window_create(BROWSER_WINDOW_VERIFIABLE,
- url,
- NULL,
- bw,
- NULL);
+ error = browser_window_create(BW_CREATE_CLONE,
+ url, NULL, bw, NULL);
history->current = current;
+ if (error != NSERROR_OK) {
+ nsurl_unref(url);
+ return;
+ }
} else {
history->current = entry;
browser_window_navigate(bw, url, NULL,
- BROWSER_WINDOW_VERIFIABLE, NULL, NULL, NULL);
+ BW_NAVIGATE_NONE, NULL, NULL, NULL);
}
nsurl_unref(url);
@@ -468,89 +733,6 @@ void history_go(struct browser_window *bw,
/**
- * Compute node positions.
- *
- * \param history history to layout
- *
- * Each node's x and y are filled in.
- */
-
-void history_layout(struct history *history)
-{
- time_t t = time(0);
- struct tm *tp = localtime(&t);
- bool shuffle = tp->tm_mon == 3 && tp->tm_mday == 1;
-
- if (!history)
- return;
-
- history->width = 0;
- if (history->start)
- history->height = history_layout_subtree(history,
- history->start, RIGHT_MARGIN / 2, BOTTOM_MARGIN / 2,
- shuffle);
- else
- history->height = 0;
- if (shuffle) {
- history->width = 600 + WIDTH;
- history->height = 400 + HEIGHT;
- }
- history->width += RIGHT_MARGIN / 2;
- history->height += BOTTOM_MARGIN / 2;
-}
-
-
-/**
- * Recursively position a subtree.
- *
- * \param history history being laid out
- * \param entry subtree to position
- * \param x x position for entry
- * \param y smallest available y
- * \param shuffle shuffle layout
- * \return greatest y used by subtree
- */
-
-int history_layout_subtree(struct history *history,
- struct history_entry *entry, int x, int y, bool shuffle)
-{
- struct history_entry *child;
- int y1 = y;
-
- if (history->width < x + WIDTH)
- history->width = x + WIDTH;
-
- if (!entry->forward) {
- entry->x = x;
- entry->y = y;
- if (shuffle) {
- entry->x = rand() % 600;
- entry->y = rand() % 400;
- }
- return y + HEIGHT;
- }
-
- /* layout child subtrees below each other */
- for (child = entry->forward; child; child = child->next) {
- y1 = history_layout_subtree(history, child,
- x + WIDTH + RIGHT_MARGIN, y1, shuffle);
- if (child->next)
- y1 += BOTTOM_MARGIN;
- }
-
- /* place ourselves in the middle */
- entry->x = x;
- entry->y = (y + y1) / 2 - HEIGHT / 2;
- if (shuffle) {
- entry->x = rand() % 600;
- entry->y = rand() % 400;
- }
-
- return y1;
-}
-
-
-/**
* Get the dimensions of a history.
*
* \param history history to measure
@@ -558,10 +740,14 @@ int history_layout_subtree(struct history *history,
* \param height updated to height
*/
-void history_size(struct history *history, int *width, int *height)
+void browser_window_history_size(struct browser_window *bw,
+ int *width, int *height)
{
- *width = history->width;
- *height = history->height;
+ assert(bw != NULL);
+ assert(bw->history != NULL);
+
+ *width = bw->history->width;
+ *height = bw->history->height;
}
@@ -572,12 +758,18 @@ void history_size(struct history *history, int *width, int *height)
* \param ctx current redraw context
*/
-bool history_redraw(struct history *history, const struct redraw_context *ctx)
+bool browser_window_history_redraw(struct browser_window *bw,
+ const struct redraw_context *ctx)
{
+ struct history *history;
+
+ assert(bw != NULL);
+ history = bw->history;
+
if (!history->start)
return true;
- return history_redraw_entry(history, history->start, 0, 0, 0, 0, 0, 0,
- false, ctx);
+ return browser_window_history__redraw_entry(history, history->start,
+ 0, 0, 0, 0, 0, 0, false, ctx);
}
/**
@@ -593,127 +785,48 @@ bool history_redraw(struct history *history, const struct redraw_context *ctx)
* \param ctx current redraw context
*/
-bool history_redraw_rectangle(struct history *history,
+bool browser_window_history_redraw_rectangle(struct browser_window *bw,
int x0, int y0, int x1, int y1,
int x, int y, const struct redraw_context *ctx)
{
+ struct history *history;
+
+ assert(bw != NULL);
+ history = bw->history;
+
if (!history->start)
return true;
- return history_redraw_entry(history, history->start,
+ return browser_window_history__redraw_entry(history, history->start,
x0, y0, x1, y1, x, y, true, ctx);
}
-/**
- * Recursively redraw a history_entry.
- *
- * \param history history containing the entry
- * \param history_entry entry to render
- * \param ctx current redraw context
- */
-
-bool history_redraw_entry(struct history *history,
- struct history_entry *entry,
- int x0, int y0, int x1, int y1,
- int x, int y, bool clip, const struct redraw_context *ctx)
-{
- const struct plotter_table *plot = ctx->plot;
- size_t char_offset;
- int actual_x;
- struct history_entry *child;
- colour c = entry == history->current ? HISTORY_COLOUR_SELECTED : HISTORY_COLOUR_FOREGROUND;
- int tailsize = 5;
- int xoffset = x - x0;
- int yoffset = y - y0;
- plot_style_t pstyle_history_rect = {
- .stroke_type = PLOT_OP_TYPE_SOLID,
- .stroke_colour = c,
- .stroke_width = entry == history->current ? 3 : 1,
- };
- plot_font_style_t fstyle = *plot_style_font;
-
- if (clip) {
- struct rect rect;
- rect.x0 = x0 + xoffset;
- rect.y0 = y0 + yoffset;
- rect.x1 = x1 + xoffset;
- rect.y1 = y1 + yoffset;
- if(!plot->clip(&rect))
- return false;
- }
-
- if (!plot->bitmap(entry->x + xoffset, entry->y + yoffset, WIDTH, HEIGHT,
- entry->bitmap, 0xffffff, 0))
- return false;
- if (!plot->rectangle(entry->x - 1 + xoffset,
- entry->y - 1 + yoffset,
- entry->x + xoffset + WIDTH,
- entry->y + yoffset + HEIGHT,
- &pstyle_history_rect))
- return false;
-
- if (!nsfont.font_position_in_string(plot_style_font, entry->page.title,
- strlen(entry->page.title), WIDTH,
- &char_offset, &actual_x))
- return false;
-
- fstyle.background = HISTORY_COLOUR_BACKGROUND;
- fstyle.foreground = c;
- fstyle.weight = entry == history->current ? 900 : 400;
-
- if (!plot->text(entry->x + xoffset, entry->y + HEIGHT + 12 + yoffset,
- entry->page.title, char_offset, &fstyle))
- return false;
-
- for (child = entry->forward; child; child = child->next) {
- if (!plot->line(entry->x + WIDTH + xoffset,
- entry->y + HEIGHT / 2 + yoffset,
- entry->x + WIDTH + tailsize + xoffset,
- entry->y + HEIGHT / 2 + yoffset,
- plot_style_stroke_history))
- return false;
- if (!plot->line(entry->x + WIDTH + tailsize + xoffset,
- entry->y + HEIGHT / 2 + yoffset,
- child->x - tailsize +xoffset,
- child->y + HEIGHT / 2 + yoffset,
- plot_style_stroke_history))
- return false;
- if (!plot->line(child->x - tailsize + xoffset,
- child->y + HEIGHT / 2 + yoffset,
- child->x + xoffset, child->y + HEIGHT / 2 + yoffset,
- plot_style_stroke_history))
- return false;
- if (!history_redraw_entry(history, child, x0, y0, x1, y1, x, y,
- clip, ctx))
- return false;
- }
-
- return true;
-}
-
/**
* Handle a mouse click in a history.
*
* \param bw browser window containing history
- * \param history history that was clicked in
* \param x click coordinate
* \param y click coordinate
* \param new_window open a new window instead of using bw
* \return true if action was taken, false if click was not on an entry
*/
-bool history_click(struct browser_window *bw, struct history *history,
+bool browser_window_history_click(struct browser_window *bw,
int x, int y, bool new_window)
{
struct history_entry *entry;
+ struct history *history;
- entry = history_find_position(history->start, x, y);
+ assert(bw != NULL);
+ history = bw->history;
+
+ entry = browser_window_history__find_position(history->start, x, y);
if (!entry)
return false;
if (entry == history->current)
return false;
- history_go(bw, history, entry, new_window);
+ browser_window_history_go(bw, entry, new_window);
return true;
}
@@ -728,126 +841,82 @@ bool history_click(struct browser_window *bw, struct history *history,
* \return URL, or 0 if no entry at (x, y)
*/
-const char *history_position_url(struct history *history, int x, int y)
+const char *browser_window_history_position_url(struct browser_window *bw,
+ int x, int y)
{
struct history_entry *entry;
+ struct history *history;
+
+ assert(bw != NULL);
+ history = bw->history;
- entry = history_find_position(history->start, x, y);
+ entry = browser_window_history__find_position(history->start, x, y);
if (!entry)
return 0;
return nsurl_access(entry->page.url);
}
-
-/**
- * Find the history entry at a position.
- *
- * \param entry entry to search from
- * \param x coordinate
- * \param y coordinate
- * \return an entry if found, 0 if none
- */
-
-struct history_entry *history_find_position(struct history_entry *entry,
- int x, int y)
+/* Documented in local_history.h */
+void browser_window_history_enumerate_forward(const struct browser_window *bw,
+ browser_window_history_enumerate_cb cb, void *user_data)
{
- struct history_entry *child;
- struct history_entry *found;
-
- if (!entry)
- return 0;
-
- if (entry->x <= x && x <= entry->x + WIDTH &&
- entry->y <= y && y <= entry->y + HEIGHT)
- return entry;
+ struct history_entry *e;
- for (child = entry->forward; child; child = child->next) {
- found = history_find_position(child, x, y);
- if (found)
- return found;
- }
-
- return 0;
-}
+ if (bw == NULL || bw->history == NULL || bw->history->current == NULL)
+ return;
-/* Documented in local_history.h */
-void history_enumerate_forward(struct history *history,
- history_enumerate_cb cb, void *user_data)
-{
- struct history_entry *entry;
-
- if (history == NULL || history->current == NULL) return;
-
- for (entry = history->current->forward_pref; entry != NULL; entry = entry->forward_pref) {
- if (!cb(history, entry->x, entry->y, entry->x + WIDTH,
- entry->y + HEIGHT, entry, user_data))
+ e = bw->history->current->forward_pref;
+ for (; e != NULL; e = e->forward_pref) {
+ if (!cb(bw, e->x, e->y, e->x + WIDTH, e->y + HEIGHT,
+ e, user_data))
break;
}
}
/* Documented in local_history.h */
-void history_enumerate_back(struct history *history,
- history_enumerate_cb cb, void *user_data)
+void browser_window_history_enumerate_back(const struct browser_window *bw,
+ browser_window_history_enumerate_cb cb, void *user_data)
{
- struct history_entry *entry;
-
- if (history == NULL || history->current == NULL) return;
-
- for (entry = history->current->back; entry != NULL; entry = entry->back) {
- if (!cb(history, entry->x, entry->y, entry->x + WIDTH,
- entry->y + HEIGHT, entry, user_data))
+ struct history_entry *e;
+
+ if (bw == NULL || bw->history == NULL || bw->history->current == NULL)
+ return;
+
+ for (e = bw->history->current->back; e != NULL; e = e->back) {
+ if (!cb(bw, e->x, e->y, e->x + WIDTH, e->y + HEIGHT,
+ e, user_data))
break;
}
}
/* Documented in local_history.h */
-void history_enumerate(const struct history *history, history_enumerate_cb cb,
- void *user_data)
+void browser_window_history_enumerate(const struct browser_window *bw,
+ browser_window_history_enumerate_cb cb, void *user_data)
{
- history_enumerate_entry(history, history->start, cb, user_data);
-}
-
-/**
- * Enumerate subentries in history
- * See also history_enumerate()
- *
- * \param history history to enumerate
- * \param entry entry to start enumeration at
- * \param cb callback function
- * \param ud context pointer passed to cb
- * \return true to continue enumeration, false to cancel
- */
-static bool history_enumerate_entry(const struct history *history,
- const struct history_entry *entry, history_enumerate_cb cb, void *ud)
-{
- const struct history_entry *child;
-
- if (!cb(history, entry->x, entry->y, entry->x + WIDTH, entry->y + HEIGHT,
- entry, ud)) return false;
-
- for (child = entry->forward; child; child = child->next) {
- if (!history_enumerate_entry(history, child, cb, ud))
- return false;
- }
-
- return true;
+ if (bw == NULL || bw->history == NULL)
+ return;
+ browser_window_history__enumerate_entry(bw,
+ bw->history->start, cb, user_data);
}
/* Documented in local_history.h */
-const char *history_entry_get_url(const struct history_entry *entry)
+const char *browser_window_history_entry_get_url(
+ const struct history_entry *entry)
{
return nsurl_access(entry->page.url);
}
/* Documented in local_history.h */
-const char *history_entry_get_fragment_id(const struct history_entry *entry)
+const char *browser_window_history_entry_get_fragment_id(
+ const struct history_entry *entry)
{
return (entry->page.frag_id) ? lwc_string_data(entry->page.frag_id) : 0;
}
/* Documented in local_history.h */
-const char *history_entry_get_title(const struct history_entry *entry)
+const char *browser_window_history_entry_get_title(
+ const struct history_entry *entry)
{
return entry->page.title;
}
diff --git a/desktop/browser_history.h b/desktop/browser_history.h
new file mode 100644
index 000000000..f3e524baf
--- /dev/null
+++ b/desktop/browser_history.h
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2006 James Bursa <bursa@users.sourceforge.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * Browser history tree (interface).
+ */
+
+#ifndef _NETSURF_DESKTOP_BROWSER_HISTORY_H_
+#define _NETSURF_DESKTOP_BROWSER_HISTORY_H_
+
+#include <stdbool.h>
+#include <libwapcaplet/libwapcaplet.h>
+
+#include "utils/errors.h"
+
+struct hlcache_handle;
+struct browser_window;
+struct history_entry;
+struct redraw_context;
+
+nserror browser_window_history_create(struct browser_window *bw);
+nserror browser_window_history_clone(const struct browser_window *existing,
+ struct browser_window *clone);
+void browser_window_history_add(struct browser_window *bw,
+ struct hlcache_handle *content, lwc_string *frag_id);
+void browser_window_history_update(struct browser_window *bw,
+ struct hlcache_handle *content);
+void browser_window_history_destroy(struct browser_window *bw);
+void browser_window_history_back(struct browser_window *bw, bool new_window);
+void browser_window_history_forward(struct browser_window *bw, bool new_window);
+bool browser_window_history_back_available(struct browser_window *bw);
+bool browser_window_history_forward_available(struct browser_window *bw);
+void browser_window_history_size(struct browser_window *bw,
+ int *width, int *height);
+bool browser_window_history_redraw(struct browser_window *bw,
+ const struct redraw_context *ctx);
+bool browser_window_history_redraw_rectangle(struct browser_window *bw,
+ int x0, int y0, int x1, int y1, int x, int y,
+ const struct redraw_context *ctx);
+bool browser_window_history_click(struct browser_window *bw,
+ int x, int y, bool new_window);
+const char *browser_window_history_position_url(struct browser_window *bw,
+ int x, int y);
+
+/**
+ * Callback function type for history enumeration
+ *
+ * \param bw The browser window with history being enumerated
+ * \param x0, y0, x1, y1 Coordinates of entry in history tree view
+ * \param entry Current history entry
+ * \return true to continue enumeration, false to cancel enumeration
+ */
+typedef bool (*browser_window_history_enumerate_cb)(
+ const struct browser_window *bw,
+ int x0, int y0, int x1, int y1,
+ const struct history_entry *entry, void *user_data);
+
+/**
+ * Enumerate all entries in the history.
+ * Do not change the history while it is being enumerated.
+ *
+ * \param bw The browser window to enumerate history of
+ * \param cb callback function
+ * \param user_data context pointer passed to cb
+ */
+void browser_window_history_enumerate(const struct browser_window *bw,
+ browser_window_history_enumerate_cb cb, void *user_data);
+
+/**
+ * Enumerate all entries that will be reached by the 'forward' button
+ *
+ * \param bw The browser window to enumerate history of
+ * \param cb The callback function
+ * \param user_data Data passed to the callback
+ */
+void browser_window_history_enumerate_forward(const struct browser_window *bw,
+ browser_window_history_enumerate_cb cb, void *user_data);
+
+/**
+ * Enumerate all entries that will be reached by the 'back' button
+ *
+ * \param bw The browser window to enumerate history of
+ * \param cb The callback function
+ * \param user_data Data passed to the callback
+ */
+void browser_window_history_enumerate_back(const struct browser_window *bw,
+ browser_window_history_enumerate_cb cb, void *user_data);
+
+/**
+ * Returns the URL to a history entry
+ *
+ * \param entry the history entry to retrieve the URL from
+ * \return the URL
+ */
+const char *browser_window_history_entry_get_url(
+ const struct history_entry *entry);
+
+/**
+ * Returns the URL to a history entry
+ *
+ * \param entry the history entry to retrieve the fragment id from
+ * \return the fragment id
+ */
+const char *browser_window_history_entry_get_fragment_id(
+ const struct history_entry *entry);
+
+/**
+ * Returns the title of a history entry
+ *
+ * \param entry the history entry to retrieve the title from
+ * \return the title
+ */
+const char *browser_window_history_entry_get_title(
+ const struct history_entry *entry);
+
+/**
+ * Navigate to specified history entry, optionally in new window
+ *
+ * \param bw browser window
+ * \param entry entry to open
+ * \param new_window open entry in new window
+ */
+void browser_window_history_go(struct browser_window *bw,
+ struct history_entry *entry, bool new_window);
+
+#endif
diff --git a/desktop/browser_private.h b/desktop/browser_private.h
index 4412f4bf4..d2c48d704 100644
--- a/desktop/browser_private.h
+++ b/desktop/browser_private.h
@@ -25,6 +25,7 @@
#define _NETSURF_DESKTOP_BROWSER_PRIVATE_H_
#include <stdbool.h>
+#include <libwapcaplet/libwapcaplet.h>
#include "desktop/browser.h"
@@ -87,9 +88,6 @@ struct browser_window {
/** Refresh interval (-1 if undefined) */
int refresh_interval;
- /** Window has been resized, and content needs reformatting. */
- bool reformat_pending;
-
/** Window dimensions */
int x;
int y;
@@ -163,4 +161,17 @@ struct browser_window {
int status_miss; /**< Number of times status was really updated. */
};
+
+
+nserror browser_window_initialise_common(enum browser_window_create_flags flags,
+ struct browser_window *bw, struct browser_window *existing);
+
+/**
+ * Update the extent of the inside of a browser window to that of the current
+ * content
+ *
+ * \param bw browser_window to update the extent of
+ */
+void browser_window_update_extent(struct browser_window *bw);
+
#endif
diff --git a/desktop/cookie_manager.c b/desktop/cookie_manager.c
index 13c6ac93b..c0ca16128 100644
--- a/desktop/cookie_manager.c
+++ b/desktop/cookie_manager.c
@@ -22,13 +22,15 @@
#include <stdlib.h>
+#include <string.h>
-#include "content/urldb.h"
-#include "desktop/cookie_manager.h"
-#include "desktop/treeview.h"
#include "utils/messages.h"
#include "utils/utils.h"
#include "utils/log.h"
+#include "content/urldb.h"
+
+#include "desktop/cookie_manager.h"
+#include "desktop/treeview.h"
enum cookie_manager_field {
COOKIE_M_NAME,
@@ -836,7 +838,7 @@ void cookie_manager_redraw(int x, int y, struct rect *clip,
/* Exported interface, documented in cookie_manager.h */
-void cookie_manager_mouse_action(browser_mouse_state mouse, int x, int y)
+void cookie_manager_mouse_action(enum browser_mouse_state mouse, int x, int y)
{
treeview_mouse_action(cm_ctx.tree, mouse, x, y);
}
diff --git a/desktop/cookie_manager.h b/desktop/cookie_manager.h
index aa61a3e65..3565caf63 100644
--- a/desktop/cookie_manager.h
+++ b/desktop/cookie_manager.h
@@ -26,12 +26,12 @@
#include <stdbool.h>
#include <stdint.h>
-#include "desktop/browser.h"
#include "desktop/core_window.h"
#include "desktop/textinput.h"
#include "utils/errors.h"
struct cookie_data;
+enum browser_mouse_state;
/**
* Initialise the cookie manager.
@@ -92,7 +92,7 @@ void cookie_manager_redraw(int x, int y, struct rect *clip,
* \param x X coordinate
* \param y Y coordinate
*/
-void cookie_manager_mouse_action(browser_mouse_state mouse, int x, int y);
+void cookie_manager_mouse_action(enum browser_mouse_state mouse, int x, int y);
/**
* Key press handling.
diff --git a/desktop/download.c b/desktop/download.c
index b775eb18e..0f3fcb6f5 100644
--- a/desktop/download.c
+++ b/desktop/download.c
@@ -23,10 +23,12 @@
#include <assert.h>
#include <stdlib.h>
+#include <string.h>
#include "content/llcache.h"
#include "desktop/download.h"
-#include "desktop/gui.h"
+#include "desktop/gui_factory.h"
+#include "utils/corestrings.h"
#include "utils/http.h"
#include "utils/url.h"
#include "utils/utils.h"
@@ -69,11 +71,11 @@ static char *download_parse_filename(const char *filename)
* \param url URL of item being fetched
* \return Default filename, or NULL on memory exhaustion
*/
-static char *download_default_filename(const char *url)
+static char *download_default_filename(nsurl *url)
{
char *nice;
- if (url_nice(url, &nice, false) == URL_FUNC_OK)
+ if (url_nice(nsurl_access(url), &nice, false) == NSERROR_OK)
return nice;
return NULL;
@@ -113,26 +115,18 @@ static nserror download_context_process_headers(download_context *ctx)
http_header = llcache_handle_get_header(ctx->llcache,
"Content-Disposition");
if (http_header != NULL) {
- lwc_string *filename;
lwc_string *filename_value;
http_content_disposition *disposition;
- if (lwc_intern_string("filename", SLEN("filename"),
- &filename) != lwc_error_ok) {
- http_content_type_destroy(content_type);
- return NSERROR_NOMEM;
- }
-
error = http_parse_content_disposition(http_header,
&disposition);
if (error != NSERROR_OK) {
- lwc_string_unref(filename);
http_content_type_destroy(content_type);
return error;
}
error = http_parameter_list_find_item(disposition->parameters,
- filename, &filename_value);
+ corestring_lwc_filename, &filename_value);
if (error == NSERROR_OK) {
ctx->filename = download_parse_filename(
lwc_string_data(filename_value));
@@ -140,15 +134,13 @@ static nserror download_context_process_headers(download_context *ctx)
}
http_content_disposition_destroy(disposition);
- lwc_string_unref(filename);
}
ctx->mime_type = lwc_string_ref(content_type->media_type);
ctx->total_length = length;
if (ctx->filename == NULL) {
ctx->filename = download_default_filename(
- nsurl_access(
- llcache_handle_get_url(ctx->llcache)));
+ llcache_handle_get_url(ctx->llcache));
}
http_content_type_destroy(content_type);
@@ -160,7 +152,7 @@ static nserror download_context_process_headers(download_context *ctx)
}
/* Create the frontend window */
- ctx->window = gui_download_window_create(ctx, ctx->parent);
+ ctx->window = guit->download->create(ctx, ctx->parent);
if (ctx->window == NULL) {
free(ctx->filename);
ctx->filename = NULL;
@@ -210,7 +202,7 @@ static nserror download_callback(llcache_handle *handle,
if (error == NSERROR_OK) {
/** \todo Lose ugly cast */
- error = gui_download_window_data(ctx->window,
+ error = guit->download->data(ctx->window,
(char *) event->data.data.buf,
event->data.data.len);
if (error != NSERROR_OK)
@@ -222,7 +214,7 @@ static nserror download_callback(llcache_handle *handle,
case LLCACHE_EVENT_DONE:
/* There may be no associated window if there was no data or headers */
if (ctx->window != NULL)
- gui_download_window_done(ctx->window);
+ guit->download->done(ctx->window);
else
download_context_destroy(ctx);
@@ -230,7 +222,7 @@ static nserror download_callback(llcache_handle *handle,
case LLCACHE_EVENT_ERROR:
if (ctx->window != NULL)
- gui_download_window_error(ctx->window, event->data.msg);
+ guit->download->error(ctx->window, event->data.msg);
else
download_context_destroy(ctx);
@@ -290,9 +282,9 @@ void download_context_abort(download_context *ctx)
}
/* See download.h for documentation */
-const char *download_context_get_url(const download_context *ctx)
+nsurl *download_context_get_url(const download_context *ctx)
{
- return nsurl_access(llcache_handle_get_url(ctx->llcache));
+ return llcache_handle_get_url(ctx->llcache);
}
/* See download.h for documentation */
diff --git a/desktop/download.h b/desktop/download.h
index f53f38b95..dc2befd90 100644
--- a/desktop/download.h
+++ b/desktop/download.h
@@ -28,6 +28,7 @@
struct gui_window;
struct llcache_handle;
+struct nsurl;
/** Type of a download context */
typedef struct download_context download_context;
@@ -67,10 +68,14 @@ void download_context_abort(download_context *ctx);
/**
* Retrieve the URL for a download
*
- * \param ctx Context to retrieve URL from
- * \return URL string
+ * The caller is borrowing the url reference from the underlying low
+ * level cache object. If it is used beyond the immediate scope of the
+ * caller an additional reference should be made.
+ *
+ * \param ctx Context to retrieve URL from
+ * \return URL object
*/
-const char *download_context_get_url(const download_context *ctx);
+struct nsurl *download_context_get_url(const download_context *ctx);
/**
* Retrieve the MIME type for a download
diff --git a/desktop/frames.c b/desktop/frames.c
index 3f7613f32..534cca4f7 100644
--- a/desktop/frames.c
+++ b/desktop/frames.c
@@ -28,12 +28,11 @@
#include <string.h>
#include <time.h>
#include <math.h>
+
#include "utils/config.h"
#include "content/hlcache.h"
#include "desktop/browser_private.h"
#include "desktop/frames.h"
-#include "desktop/local_history.h"
-#include "desktop/gui.h"
#include "desktop/scrollbar.h"
#include "desktop/selection.h"
#include "utils/log.h"
@@ -209,7 +208,8 @@ void browser_window_create_iframes(struct browser_window *bw,
window = &(bw->iframes[index++]);
/* Initialise common parts */
- browser_window_initialise_common(window, NULL);
+ browser_window_initialise_common(BW_CREATE_NONE,
+ window, NULL);
/* window characteristics */
window->browser_window_type = BROWSER_WINDOW_IFRAME;
@@ -251,7 +251,7 @@ void browser_window_create_iframes(struct browser_window *bw,
browser_window_navigate(window,
cur->url,
hlcache_handle_get_url(bw->current_content),
- BROWSER_WINDOW_NONE,
+ BW_NAVIGATE_UNVERIFIABLE,
NULL,
NULL,
bw->current_content);
@@ -314,7 +314,8 @@ void browser_window_create_frameset(struct browser_window *bw,
window = &bw->children[index];
/* Initialise common parts */
- browser_window_initialise_common(window, NULL);
+ browser_window_initialise_common(BW_CREATE_NONE,
+ window, NULL);
/* window characteristics */
if (frame->children)
@@ -387,7 +388,8 @@ void browser_window_create_frameset(struct browser_window *bw,
browser_window_navigate(window,
frame->url,
hlcache_handle_get_url(parent),
- BROWSER_WINDOW_HISTORY,
+ BW_NAVIGATE_HISTORY |
+ BW_NAVIGATE_UNVERIFIABLE,
NULL,
NULL,
parent);
diff --git a/desktop/global_history.c b/desktop/global_history.c
index e8d99efc2..7d679e5a2 100644
--- a/desktop/global_history.c
+++ b/desktop/global_history.c
@@ -18,15 +18,18 @@
#include <stdlib.h>
+#include <string.h>
-#include "content/urldb.h"
-#include "desktop/global_history.h"
-#include "desktop/treeview.h"
#include "utils/messages.h"
#include "utils/utils.h"
#include "utils/utf8.h"
#include "utils/libdom.h"
#include "utils/log.h"
+#include "content/urldb.h"
+
+#include "desktop/global_history.h"
+#include "desktop/treeview.h"
+#include "desktop/browser.h"
#define N_DAYS 28
#define N_SEC_PER_DAY (60 * 60 * 24)
@@ -676,23 +679,22 @@ static nserror global_history_tree_node_entry_cb(
case TREE_MSG_NODE_LAUNCH:
{
nserror error;
- struct browser_window *clone = NULL;
- enum browser_window_nav_flags flags =
- BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_TAB;
+ struct browser_window *existing = NULL;
+ enum browser_window_create_flags flags =
+ BW_CREATE_HISTORY;
- /* TODO: Set clone window, to window that new tab appears in */
+ /* TODO: Set existing to window that new tab appears in */
if (msg.data.node_launch.mouse &
(BROWSER_MOUSE_MOD_1 | BROWSER_MOUSE_MOD_2) ||
- clone == NULL) {
+ existing == NULL) {
/* Shift or Ctrl launch, open in new window rather
* than tab. */
- flags ^= BROWSER_WINDOW_TAB;
+ /* TODO: flags ^= BW_CREATE_TAB; */
}
- error = browser_window_create(flags, e->url, NULL, clone, NULL);
+ error = browser_window_create(flags, e->url, NULL,
+ existing, NULL);
if (error != NSERROR_OK) {
warn_user(messages_get_errorcode(error), 0);
}
@@ -828,21 +830,21 @@ static nserror global_history_export_enter_cb(void *ctx, void *node_data,
enum treeview_node_type type, bool *abort)
{
struct treeview_export_walk_ctx *tw = ctx;
+ nserror ret;
if (type == TREE_NODE_ENTRY) {
struct global_history_entry *e = node_data;
- utf8_convert_ret ret;
char *t_text;
char *u_text;
ret = utf8_to_html(e->data[GH_TITLE].value, "iso-8859-1",
e->data[GH_TITLE].value_len, &t_text);
- if (ret != UTF8_CONVERT_OK)
+ if (ret != NSERROR_OK)
return NSERROR_SAVE_FAILED;
ret = utf8_to_html(e->data[GH_URL].value, "iso-8859-1",
e->data[GH_URL].value_len, &u_text);
- if (ret != UTF8_CONVERT_OK) {
+ if (ret != NSERROR_OK) {
free(t_text);
return NSERROR_SAVE_FAILED;
}
@@ -855,12 +857,11 @@ static nserror global_history_export_enter_cb(void *ctx, void *node_data,
} else if (type == TREE_NODE_FOLDER) {
struct global_history_folder *f = node_data;
- utf8_convert_ret ret;
char *f_text;
ret = utf8_to_html(f->data.value, "iso-8859-1",
f->data.value_len, &f_text);
- if (ret != UTF8_CONVERT_OK)
+ if (ret != NSERROR_OK)
return NSERROR_SAVE_FAILED;
fprintf(tw->fp, "<li><h4>%s</h4>\n<ul>\n", f_text);
@@ -954,10 +955,11 @@ bool global_history_has_selection(void)
bool global_history_get_selection(nsurl **url, const char **title)
{
struct global_history_entry *e;
+ enum treeview_node_type type;
void *v;
- treeview_get_selection(gh_ctx.tree, &v);
- if (v == NULL) {
+ type = treeview_get_selection(gh_ctx.tree, &v);
+ if (type != TREE_NODE_ENTRY || v == NULL) {
*url = NULL;
*title = NULL;
return false;
diff --git a/desktop/global_history.h b/desktop/global_history.h
index 7c49cfcb7..463ab1b9c 100644
--- a/desktop/global_history.h
+++ b/desktop/global_history.h
@@ -22,12 +22,12 @@
#include <stdbool.h>
#include <stdint.h>
-#include "desktop/browser.h"
#include "desktop/core_window.h"
#include "desktop/textinput.h"
#include "utils/errors.h"
#include "utils/nsurl.h"
+enum browser_mouse_state;
/**
* Initialise the global history.
@@ -92,7 +92,7 @@ void global_history_redraw(int x, int y, struct rect *clip,
* \param x X coordinate
* \param y Y coordinate
*/
-void global_history_mouse_action(browser_mouse_state mouse, int x, int y);
+void global_history_mouse_action(enum browser_mouse_state mouse, int x, int y);
/**
* Key press handling.
diff --git a/desktop/gui.h b/desktop/gui.h
index 9d35e1727..21dd85e68 100644
--- a/desktop/gui.h
+++ b/desktop/gui.h
@@ -1,6 +1,5 @@
/*
- * Copyright 2003 Phil Mellor <monkeyson@users.sourceforge.net>
- * Copyright 2004 James Bursa <bursa@users.sourceforge.net>
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -18,13 +17,20 @@
*/
/** \file
- * Interface to platform-specific gui functions.
+ * Interface to platform-specific gui operation tables.
*/
#ifndef _NETSURF_DESKTOP_GUI_H_
#define _NETSURF_DESKTOP_GUI_H_
-typedef enum {
+#include <stddef.h>
+
+#include "utils/types.h"
+#include "utils/errors.h"
+#include "desktop/plot_style.h"
+#include "desktop/mouse.h"
+
+typedef enum gui_save_type {
GUI_SAVE_SOURCE,
GUI_SAVE_DRAW,
GUI_SAVE_PDF,
@@ -48,133 +54,529 @@ typedef enum {
GDRAGGING_OTHER
} gui_drag_type;
+typedef enum {
+ GW_CREATE_NONE = 0, /* New window */
+ GW_CREATE_CLONE = (1 << 0), /* Clone existing window */
+ GW_CREATE_TAB = (1 << 1) /* In same window as existing */
+} gui_window_create_flags;
+
struct gui_window;
struct gui_download_window;
struct browser_window;
struct form_control;
+struct ssl_cert_info;
+struct hlcache_handle;
+struct download_context;
+struct nsurl;
+struct gui_file_table;
+struct gui_llcache_table;
+struct gui_search_web_table;
-#include <stdbool.h>
+typedef struct nsnsclipboard_styles {
+ size_t start; /**< Start of run */
-#include <libwapcaplet/libwapcaplet.h>
-#include <libcss/libcss.h>
+ plot_font_style_t style; /**< Style to give text run */
+} nsclipboard_styles;
-#include "utils/config.h"
-#include "content/hlcache.h"
-#include "desktop/download.h"
-#include "desktop/mouse.h"
-#include "desktop/search.h"
-#include "utils/errors.h"
+/**
+ * Graphical user interface window function table.
+ *
+ * function table implementing window operations
+ */
+struct gui_window_table {
+
+ /* Mandantory entries */
+
+ /**
+ * Create and open a gui window for a browsing context.
+ *
+ * \param bw bw to create gui_window for
+ * \param existing an existing gui_window, may be NULL
+ * \param flags flags for gui window creation
+ * \return gui window, or NULL on error
+ *
+ * If GW_CREATE_CLONE flag is set existing is non-NULL.
+ *
+ * Front end's gui_window must include a reference to the
+ * browser window passed in the bw param.
+ */
+ struct gui_window *(*create)(struct browser_window *bw,
+ struct gui_window *existing,
+ gui_window_create_flags flags);
+
+ /**
+ * Destroy previously created gui window
+ */
+ void (*destroy)(struct gui_window *g);
+
+ /**
+ * Force a redraw of the entire contents of a window.
+ *
+ * @todo this API should be merged with update.
+ *
+ * \param g gui_window to redraw
+ */
+ void (*redraw)(struct gui_window *g);
+
+ /**
+ * Redraw an area of a window.
+ *
+ * \param g gui_window
+ * \param rect area to redraw
+ */
+ void (*update)(struct gui_window *g, const struct rect *rect);
+
+ /**
+ * Get the scroll position of a browser window.
+ *
+ * \param g gui_window
+ * \param sx receives x ordinate of point at top-left of window
+ * \param sy receives y ordinate of point at top-left of window
+ * \return true iff successful
+ */
+ bool (*get_scroll)(struct gui_window *g, int *sx, int *sy);
-void gui_poll(bool active);
-void gui_quit(void);
-
-struct gui_window *gui_create_browser_window(struct browser_window *bw,
- struct browser_window *clone, bool new_tab);
-void gui_window_destroy(struct gui_window *g);
-void gui_window_set_title(struct gui_window *g, const char *title);
-void gui_window_redraw_window(struct gui_window *g);
-void gui_window_update_box(struct gui_window *g,
- const struct rect *rect);
-bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy);
-void gui_window_set_scroll(struct gui_window *g, int sx, int sy);
-void gui_window_scroll_visible(struct gui_window *g, int x0, int y0,
- int x1, int y1);
-void gui_window_get_dimensions(struct gui_window *g, int *width, int *height,
- bool scaled);
-void gui_window_update_extent(struct gui_window *g);
-void gui_window_set_status(struct gui_window *g, const char *text);
-void gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape);
-void gui_window_hide_pointer(struct gui_window *g);
-void gui_window_set_url(struct gui_window *g, const char *url);
-void gui_window_start_throbber(struct gui_window *g);
-void gui_window_stop_throbber(struct gui_window *g);
-void gui_window_set_icon(struct gui_window *g, hlcache_handle *icon);
-void gui_window_set_search_ico(hlcache_handle *ico);
-void gui_window_place_caret(struct gui_window *g, int x, int y, int height,
- const struct rect *clip);
-void gui_window_remove_caret(struct gui_window *g);
-void gui_window_new_content(struct gui_window *g);
-bool gui_window_scroll_start(struct gui_window *g);
-
-bool gui_window_drag_start(struct gui_window *g, gui_drag_type type,
- const struct rect *rect);
-
-void gui_window_save_link(struct gui_window *g, const char *url,
- const char *title);
-
-struct gui_download_window *gui_download_window_create(download_context *ctx,
- struct gui_window *parent);
-nserror gui_download_window_data(struct gui_download_window *dw,
- const char *data, unsigned int size);
-void gui_download_window_error(struct gui_download_window *dw,
- const char *error_msg);
-void gui_download_window_done(struct gui_download_window *dw);
-
-void gui_drag_save_object(gui_save_type type, hlcache_handle *c,
- struct gui_window *g);
-void gui_drag_save_selection(struct gui_window *g, const char *selection);
-void gui_start_selection(struct gui_window *g);
-void gui_clear_selection(struct gui_window *g);
+ /**
+ * Set the scroll position of a browser window.
+ *
+ * \param g gui_window to scroll
+ * \param sx point to place at top-left of window
+ * \param sy point to place at top-left of window
+ */
+ void (*set_scroll)(struct gui_window *g, int sx, int sy);
+ /**
+ * Find the current dimensions of a browser window's content area.
+ *
+ * @todo The implementations of this are buggy and its only
+ * used from frames code.
+ *
+ * \param g gui_window to measure
+ * \param width receives width of window
+ * \param height receives height of window
+ * \param scaled whether to return scaled values
+ */
+ void (*get_dimensions)(struct gui_window *g, int *width, int *height, bool scaled);
+
+ /**
+ * Update the extent of the inside of a browser window to that of the
+ * current content.
+ *
+ * @todo this is used to update scroll bars does it need
+ * renaming? some frontends (windows) do not even implement it.
+ *
+ * \param g gui_window to update the extent of
+ */
+ void (*update_extent)(struct gui_window *g);
+
+ /**
+ * Reformat a window.
+ *
+ * This is used to perform reformats when the page contents
+ * require reformating. The reformat is requested using
+ * browser_window_schedule_reformat and occours via a scheduled
+ * callback hence from top level context.
+ *
+ * \param g gui_window to reformat.
+ */
+ void (*reformat)(struct gui_window *g);
+
+
+ /* Optional entries */
+
+ /**
+ * Set the title of a window.
+ *
+ * \param g window to update
+ * \param title new window title
+ */
+ void (*set_title)(struct gui_window *g, const char *title);
+
+ /**
+ * set the navigation url.
+ */
+ void (*set_url)(struct gui_window *g, const char *url);
+
+ /** set favicon */
+ void (*set_icon)(struct gui_window *g, struct hlcache_handle *icon);
+
+ /**
+ * Set the status bar of a browser window.
+ *
+ * \param g gui_window to update
+ * \param text new status text
+ */
+ void (*set_status)(struct gui_window *g, const char *text);
+
+ /**
+ * Change mouse pointer shape
+ */
+ void (*set_pointer)(struct gui_window *g, gui_pointer_shape shape);
+
+ /**
+ * Place the caret in a browser window.
+ *
+ * \param g window with caret
+ * \param x coordinates of caret
+ * \param y coordinates of caret
+ * \param height height of caret
+ * \param clip clip rectangle, or NULL if none
+ */
+ void (*place_caret)(struct gui_window *g, int x, int y, int height, const struct rect *clip);
+
+ /**
+ * Remove the caret, if present.
+ *
+ * \param g window with caret
+ */
+ void (*remove_caret)(struct gui_window *g);
+
+ /** start the navigation throbber. */
+ void (*start_throbber)(struct gui_window *g);
+
+ /** stop the navigation throbber. */
+ void (*stop_throbber)(struct gui_window *g);
+
+ /** start a drag operation within a window */
+ bool (*drag_start)(struct gui_window *g, gui_drag_type type, const struct rect *rect);
+
+ /** save link operation */
+ void (*save_link)(struct gui_window *g, const char *url, const char *title);
+
+ /**
+ * Scrolls the specified area of a browser window into view.
+ *
+ * @todo investigate if this can be merged with set_scroll
+ * which is what the default implementation used by most
+ * toolkits uses.
+ *
+ * \param g gui_window to scroll
+ * \param x0 left point to ensure visible
+ * \param y0 bottom point to ensure visible
+ * \param x1 right point to ensure visible
+ * \param y1 top point to ensure visible
+ */
+ void (*scroll_visible)(struct gui_window *g, int x0, int y0, int x1, int y1);
+
+ /**
+ * Starts drag scrolling of a browser window
+ *
+ * \param g the window to scroll
+ */
+ bool (*scroll_start)(struct gui_window *g);
+
+ /**
+ * Called when the gui_window has new content.
+ *
+ * \param g the gui_window that has new content
+ */
+ void (*new_content)(struct gui_window *g);
+
+ /**
+ * Called when file chooser gadget is activated
+ */
+ void (*file_gadget_open)(struct gui_window *g, struct hlcache_handle *hl, struct form_control *gadget);
+
+ /** object dragged to window*/
+ void (*drag_save_object)(struct gui_window *g, struct hlcache_handle *c, gui_save_type type);
+
+ /** drag selection save */
+ void (*drag_save_selection)(struct gui_window *g, const char *selection);
+
+ /** selection started */
+ void (*start_selection)(struct gui_window *g);
+};
/**
- * Core asks front end for clipboard contents.
- *
- * \param buffer UTF-8 text, allocated by front end, ownership yeilded to core
- * \param length Byte length of UTF-8 text in buffer
+ * function table for download windows.
*/
-void gui_get_clipboard(char **buffer, size_t *length);
+struct gui_download_table {
+ struct gui_download_window *(*create)(struct download_context *ctx, struct gui_window *parent);
+
+ nserror (*data)(struct gui_download_window *dw, const char *data, unsigned int size);
+
+ void (*error)(struct gui_download_window *dw, const char *error_msg);
+
+ void (*done)(struct gui_download_window *dw);
+};
-typedef struct nsnsclipboard_styles {
- size_t start; /**< Start of run */
- plot_font_style_t style; /**< Style to give text run */
-} nsclipboard_styles;
/**
- * Core tells front end to put given text in clipboard
- *
- * \param buffer UTF-8 text, owned by core
- * \param length Byte length of UTF-8 text in buffer
- * \param styles Array of styles given to text runs, owned by core, or NULL
- * \param n_styles Number of text run styles in array
+ * function table for clipboard operations.
*/
-void gui_set_clipboard(const char *buffer, size_t length,
- nsclipboard_styles styles[], int n_styles);
+struct gui_clipboard_table {
+ /**
+ * Core asks front end for clipboard contents.
+ *
+ * \param buffer UTF-8 text, allocated by front end, ownership yeilded to core
+ * \param length Byte length of UTF-8 text in buffer
+ */
+ void (*get)(char **buffer, size_t *length);
+
+ /**
+ * Core tells front end to put given text in clipboard
+ *
+ * \param buffer UTF-8 text, owned by core
+ * \param length Byte length of UTF-8 text in buffer
+ * \param styles Array of styles given to text runs, owned by core, or NULL
+ * \param n_styles Number of text run styles in array
+ */
+ void (*set)(const char *buffer, size_t length, nsclipboard_styles styles[], int n_styles);
+};
+/**
+ * function table for fetcher operations
+ */
+struct gui_fetch_table {
+ /* Mandantory entries */
-void gui_create_form_select_menu(struct browser_window *bw,
- struct form_control *control);
+ /**
+ * Determine the MIME type of a local file.
+ *
+ * @note used in file fetcher
+ *
+ * \param unix_path Unix style path to file on disk
+ * \return Pointer to MIME type string (should not be freed) -
+ * invalidated on next call to fetch_filetype.
+ */
+ const char *(*filetype)(const char *unix_path);
-void gui_launch_url(const char *url);
+ /* Optional entries */
-struct ssl_cert_info;
+ /**
+ * Callback to translate resource to full url.
+ *
+ * @note used in resource fetcher
+ *
+ * Transforms a resource: path into a full URL. The returned URL
+ * is used as the target for a redirect. The caller takes ownership of
+ * the returned nsurl including unrefing it when finished with it.
+ *
+ * \param path The path of the resource to locate.
+ * \return A string containing the full URL of the target object or
+ * NULL if no suitable resource can be found.
+ */
+ struct nsurl* (*get_resource_url)(const char *path);
-void gui_cert_verify(nsurl *url, const struct ssl_cert_info *certs,
- unsigned long num, nserror (*cb)(bool proceed, void *pw),
- void *cbpw);
+ /**
+ * Find a MIME type for a local file
+ *
+ * @note only used in curl fetcher on RISC OS otherwise its a
+ * strdup of filetype.
+ *
+ * \param ro_path RISC OS style path to file on disk
+ * \return MIME type string (on heap, caller should free), or NULL
+ */
+ char *(*mimetype)(const char *ro_path);
+
+};
+
+
+/**
+ * User interface utf8 characterset conversion routines.
+ */
+struct gui_utf8_table {
+ /**
+ * Convert a UTF-8 encoded string into the system local encoding
+ *
+ * \param string The string to convert
+ * \param len The length (in bytes) of the string, or 0
+ * \param result Pointer to location in which to store result
+ * \return An nserror code
+ */
+ nserror (*utf8_to_local)(const char *string, size_t len, char **result);
+
+ /**
+ * Convert a string encoded in the system local encoding to UTF-8
+ *
+ * \param string The string to convert
+ * \param len The length (in bytes) of the string, or 0
+ * \param result Pointer to location in which to store result
+ * \return An nserror code
+ */
+ nserror (*local_to_utf8)(const char *string, size_t len, char **result);
+};
/**
- * Callback to translate resource to full url.
+ * function table for page text search.
+ */
+struct gui_search_table {
+ /**
+ * Change the displayed search status.
+ *
+ * \param found search pattern matched in text
+ * \param p gui private data pointer provided with search callbacks
+ */
+ void (*status)(bool found, void *p);
+
+ /**
+ * display hourglass while searching.
+ *
+ * \param active start/stop indicator
+ * \param p gui private data pointer provided with search callbacks
+ */
+ void (*hourglass)(bool active, void *p);
+
+ /**
+ * add search string to recent searches list
+ * front has full liberty how to implement the bare notification;
+ * core gives no guarantee of the integrity of the string
+ *
+ * \param string search pattern
+ * \param p gui private data pointer provided with search callbacks
+ */
+ void (*add_recent)(const char *string, void *p);
+
+ /**
+ * activate search forwards button in gui
+ *
+ * \param active activate/inactivate
+ * \param p gui private data pointer provided with search callbacks
+ */
+ void (*forward_state)(bool active, void *p);
+
+ /**
+ * activate search back button in gui
+ *
+ * \param active activate/inactivate
+ * \param p gui private data pointer provided with search callbacks
+ */
+ void (*back_state)(bool active, void *p);
+};
+
+/**
+ * Graphical user interface browser misc function table.
*
- * Transforms a resource: path into a full URL. The returned URL
- * is used as the target for a redirect. The caller takes ownership of
- * the returned nsurl including unrefing it when finished with it.
+ * function table implementing GUI interface to miscelaneous browser
+ * functionality
+ */
+struct gui_browser_table {
+ /* Mandantory entries */
+
+ /**
+ * called to let the frontend update its state and run any
+ * I/O operations.
+ */
+ void (*poll)(bool active);
+
+ /**
+ * Schedule a callback.
+ *
+ * \param t interval before the callback should be made in ms or
+ * negative value to remove any existing callback.
+ * \param callback callback function
+ * \param p user parameter passed to callback function
+ * \return NSERROR_OK on sucess or appropriate error on faliure
+ *
+ * The callback function will be called as soon as possible
+ * after the timeout has elapsed.
+ *
+ * Additional calls with the same callback and user parameter will
+ * reset the callback time to the newly specified value.
+ *
+ */
+ nserror (*schedule)(int t, void (*callback)(void *p), void *p);
+
+ /* Optional entries */
+
+ /** called to allow the gui to cleanup */
+ void (*quit)(void);
+
+ /**
+ * core has no fetcher for url
+ */
+ nserror (*launch_url)(struct nsurl *url);
+
+ /**
+ * create a form select menu
+ */
+ void (*create_form_select_menu)(struct browser_window *bw, struct form_control *control);
+
+ /**
+ * verify certificate
+ */
+ void (*cert_verify)(struct nsurl *url, const struct ssl_cert_info *certs, unsigned long num, nserror (*cb)(bool proceed, void *pw), void *cbpw);
+
+ /**
+ * Prompt user for login
+ */
+ void (*login)(struct nsurl *url, const char *realm,
+ nserror (*cb)(bool proceed, void *pw), void *cbpw);
+
+};
+
+/**
+ * NetSurf operation function table
*
- * \param path The path of the resource to locate.
- * \return A string containing the full URL of the target object or
- * NULL if no suitable resource can be found.
+ * Function table implementing interface operations for the browser core.
*/
-nsurl* gui_get_resource_url(const char *path);
+struct netsurf_table {
+
+ /**
+ * Browser table.
+ *
+ * Provides miscellaneous browser functionality. The table
+ * is mandantory and must be provided.
+ */
+ struct gui_browser_table *browser;
+
+ /** Window table */
+ struct gui_window_table *window;
+
+ /** Download table */
+ struct gui_download_table *download;
+
+ /** Clipboard table */
+ struct gui_clipboard_table *clipboard;
+
+ /** Fetcher table */
+ struct gui_fetch_table *fetch;
+
+ /**
+ * File table
+ *
+ * Provides file and filename operations to the core. The
+ * table is optional and may be NULL in which case the default
+ * posix compliant operations will be used.
+ */
+ struct gui_file_table *file;
+
+ /**
+ * UTF8 table.
+ *
+ * Provides for conversion between the gui local character
+ * encoding and utf8. The table optional and may be NULL which
+ * implies the local encoding is utf8.
+ */
+ struct gui_utf8_table *utf8;
+
+ /**
+ * Page search table.
+ *
+ * Provides routines for the interactive text search on a page.
+ */
+ struct gui_search_table *search;
-/** css callback to obtain named system colours from a frontend. */
-css_error gui_system_colour(void *pw, lwc_string *name, css_color *color);
+ /**
+ * Web search table.
+ *
+ * Used by the web search provider system. The table is
+ * optional and may be NULL which uses the default empty
+ * implementation.
+ */
+ struct gui_search_web_table *search_web;
-/** Obtain a named system colour from a frontend. */
-colour gui_system_colour_char(const char *name);
+ /**
+ * Low level cache table.
+ *
+ * Used by the low level cache to push objects to persistant
+ * storage. The table is optional and may be NULL which
+ * uses the default implementation.
+ */
+ struct gui_llcache_table *llcache;
+};
-bool gui_system_colour_init(void);
-void gui_system_colour_finalize(void);
#endif
diff --git a/desktop/gui_factory.c b/desktop/gui_factory.c
new file mode 100644
index 000000000..977805e9c
--- /dev/null
+++ b/desktop/gui_factory.c
@@ -0,0 +1,705 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "content/hlcache.h"
+#include "content/backing_store.h"
+
+#include "desktop/download.h"
+#include "desktop/searchweb.h"
+#include "desktop/gui_factory.h"
+#include "utils/file.h"
+
+/** The global interface table */
+struct netsurf_table *guit = NULL;
+
+
+static void gui_default_window_set_title(struct gui_window *g, const char *title)
+{
+}
+
+static void gui_default_window_set_url(struct gui_window *g, const char *url)
+{
+}
+
+static void gui_default_window_start_throbber(struct gui_window *g)
+{
+}
+
+static void gui_default_window_stop_throbber(struct gui_window *g)
+{
+}
+
+static bool gui_default_window_drag_start(struct gui_window *g,
+ gui_drag_type type,
+ const struct rect *rect)
+{
+ return true;
+}
+
+static void gui_default_window_save_link(struct gui_window *g,
+ const char *url,
+ const char *title)
+{
+}
+
+static void gui_default_window_set_icon(struct gui_window *g,
+ hlcache_handle *icon)
+{
+}
+
+static void gui_default_window_scroll_visible(struct gui_window *g,
+ int x0, int y0,
+ int x1, int y1)
+{
+ guit->window->set_scroll(g, x0, y0);
+}
+
+static void gui_default_window_new_content(struct gui_window *g)
+{
+}
+
+
+static bool gui_default_window_scroll_start(struct gui_window *g)
+{
+ return true;
+}
+
+static void gui_default_window_set_pointer(struct gui_window *g,
+ gui_pointer_shape shape)
+{
+}
+
+static void gui_default_window_set_status(struct gui_window *g,
+ const char *text)
+{
+}
+
+static void gui_default_window_place_caret(struct gui_window *g,
+ int x, int y, int height,
+ const struct rect *clip)
+{
+}
+
+static void gui_default_window_remove_caret(struct gui_window *g)
+{
+}
+
+static void gui_default_window_file_gadget_open(struct gui_window *g,
+ hlcache_handle *hl,
+ struct form_control *gadget)
+{
+}
+
+static void gui_default_window_drag_save_object(struct gui_window *g,
+ hlcache_handle *c,
+ gui_save_type type)
+{
+}
+
+static void gui_default_window_drag_save_selection(struct gui_window *g,
+ const char *selection)
+{
+}
+
+static void gui_default_window_start_selection(struct gui_window *g)
+{
+}
+
+
+/** verify window table is valid */
+static nserror verify_window_register(struct gui_window_table *gwt)
+{
+ /* check table is present */
+ if (gwt == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ /* check the mandantory fields are set */
+ if (gwt->create == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if (gwt->destroy == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if (gwt->redraw == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if (gwt->update == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if (gwt->get_scroll == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if (gwt->set_scroll == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if (gwt->get_dimensions == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if (gwt->update_extent == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if (gwt->reformat == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+
+ /* fill in the optional entries with defaults */
+ if (gwt->set_title == NULL) {
+ gwt->set_title = gui_default_window_set_title;
+ }
+ if (gwt->set_url == NULL) {
+ gwt->set_url = gui_default_window_set_url;
+ }
+ if (gwt->set_icon == NULL) {
+ gwt->set_icon = gui_default_window_set_icon;
+ }
+ if (gwt->set_status == NULL) {
+ gwt->set_status = gui_default_window_set_status;
+ }
+ if (gwt->set_pointer == NULL) {
+ gwt->set_pointer = gui_default_window_set_pointer;
+ }
+ if (gwt->place_caret == NULL) {
+ gwt->place_caret = gui_default_window_place_caret;
+ }
+ if (gwt->remove_caret == NULL) {
+ gwt->remove_caret = gui_default_window_remove_caret;
+ }
+ if (gwt->start_throbber == NULL) {
+ gwt->start_throbber = gui_default_window_start_throbber;
+ }
+ if (gwt->stop_throbber == NULL) {
+ gwt->stop_throbber = gui_default_window_stop_throbber;
+ }
+ if (gwt->drag_start == NULL) {
+ gwt->drag_start = gui_default_window_drag_start;
+ }
+ if (gwt->save_link == NULL) {
+ gwt->save_link = gui_default_window_save_link;
+ }
+ if (gwt->scroll_visible == NULL) {
+ gwt->scroll_visible = gui_default_window_scroll_visible;
+ }
+ if (gwt->new_content == NULL) {
+ gwt->new_content = gui_default_window_new_content;
+ }
+ if (gwt->scroll_start == NULL) {
+ gwt->scroll_start = gui_default_window_scroll_start;
+ }
+ if (gwt->file_gadget_open == NULL) {
+ gwt->file_gadget_open = gui_default_window_file_gadget_open;
+ }
+ if (gwt->drag_save_object == NULL) {
+ gwt->drag_save_object = gui_default_window_drag_save_object;
+ }
+ if (gwt->drag_save_selection == NULL) {
+ gwt->drag_save_selection = gui_default_window_drag_save_selection;
+ }
+ if (gwt->start_selection == NULL) {
+ gwt->start_selection = gui_default_window_start_selection;
+ }
+
+ return NSERROR_OK;
+}
+
+
+
+static struct gui_download_window *
+gui_default_download_create(download_context *ctx, struct gui_window *parent)
+{
+ return NULL;
+}
+
+static nserror gui_default_download_data(struct gui_download_window *dw,
+ const char *data, unsigned int size)
+{
+ return NSERROR_OK;
+}
+
+static void gui_default_download_error(struct gui_download_window *dw,
+ const char *error_msg)
+{
+}
+
+static void gui_default_download_done(struct gui_download_window *dw)
+{
+}
+
+
+/** verify download window table is valid */
+static nserror verify_download_register(struct gui_download_table *gdt)
+{
+ /* check table is present */
+ if (gdt == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ /* all enties are mandantory */
+ if (gdt->create == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if (gdt->data == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if (gdt->error == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if (gdt->done == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ return NSERROR_OK;
+}
+
+static void gui_default_get_clipboard(char **buffer, size_t *length)
+{
+ *buffer = NULL;
+ *length = 0;
+}
+
+static void gui_default_set_clipboard(const char *buffer, size_t length,
+ nsclipboard_styles styles[], int n_styles)
+{
+}
+
+static struct gui_clipboard_table default_clipboard_table = {
+ .get = gui_default_get_clipboard,
+ .set = gui_default_set_clipboard,
+};
+
+/** verify clipboard table is valid */
+static nserror verify_clipboard_register(struct gui_clipboard_table *gct)
+{
+ /* check table is present */
+ if (gct == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ /* optional operations */
+ if (gct->get == NULL) {
+ gct->get = gui_default_get_clipboard;
+ }
+ if (gct->set == NULL) {
+ gct->set = gui_default_set_clipboard;
+ }
+ return NSERROR_OK;
+}
+
+/**
+ * The default utf8 conversion implementation.
+ *
+ * The default implementation assumes the local encoding is utf8
+ * allowing the conversion to be a simple copy.
+ *
+ * @param [in] string The source string.
+ * @param [in] len The \a string length or 0 to compute it.
+ * @param [out] result A pointer to the converted string.
+ * @result NSERROR_OK or NSERROR_NOMEM if memory could not be allocated.
+ */
+static nserror gui_default_utf8(const char *string, size_t len, char **result)
+{
+ assert(string && result);
+
+ if (len == 0)
+ len = strlen(string);
+
+ *result = strndup(string, len);
+ if (!(*result))
+ return NSERROR_NOMEM;
+
+ return NSERROR_OK;
+}
+
+static struct gui_utf8_table default_utf8_table = {
+ .utf8_to_local = gui_default_utf8,
+ .local_to_utf8 = gui_default_utf8,
+};
+
+/** verify clipboard table is valid */
+static nserror verify_utf8_register(struct gui_utf8_table *gut)
+{
+ /* check table is present */
+ if (gut == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ /* mandantory operations */
+ if (gut->utf8_to_local == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if (gut->local_to_utf8 == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ return NSERROR_OK;
+}
+
+static void gui_default_status(bool found, void *p)
+{
+}
+
+static void gui_default_hourglass(bool active, void *p)
+{
+}
+
+static void gui_default_add_recent(const char *string, void *p)
+{
+}
+
+static void gui_default_forward_state(bool active, void *p)
+{
+}
+
+static void gui_default_back_state(bool active, void *p)
+{
+}
+
+static struct gui_search_table default_search_table = {
+ .status = gui_default_status,
+ .hourglass = gui_default_hourglass,
+ .add_recent = gui_default_add_recent,
+ .forward_state = gui_default_forward_state,
+ .back_state = gui_default_back_state,
+};
+
+/** verify search table is valid */
+static nserror verify_search_register(struct gui_search_table *gst)
+{
+ /* check table is present */
+ if (gst == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ /* fill in the optional entries with defaults */
+ if (gst->status == NULL) {
+ gst->status = default_search_table.status;
+ }
+ if (gst->hourglass == NULL) {
+ gst->hourglass = default_search_table.hourglass;
+ }
+ if (gst->add_recent == NULL) {
+ gst->add_recent = default_search_table.add_recent;
+ }
+ if (gst->forward_state == NULL) {
+ gst->forward_state = default_search_table.forward_state;
+ }
+ if (gst->back_state == NULL) {
+ gst->back_state = default_search_table.back_state;
+ }
+
+ return NSERROR_OK;
+}
+
+static nserror
+gui_default_provider_update(const char *provider_name,
+ struct bitmap *provider_bitmap)
+{
+ return NSERROR_OK;
+}
+
+static struct gui_search_web_table default_search_web_table = {
+ .provider_update = gui_default_provider_update,
+};
+
+/** verify search table is valid */
+static nserror verify_search_web_register(struct gui_search_web_table *gswt)
+{
+ /* check table is present */
+ if (gswt == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ /* mandantory operations */
+ if (gswt->provider_update == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ return NSERROR_OK;
+}
+
+/** verify low level cache persistant backing store table is valid */
+static nserror verify_llcache_register(struct gui_llcache_table *glt)
+{
+ /* check table is present */
+ if (glt == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ /* mandantory operations */
+ if (glt->store == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if (glt->fetch == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if (glt->invalidate == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if (glt->initialise == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if (glt->finalise == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ return NSERROR_OK;
+}
+
+static nsurl *gui_default_get_resource_url(const char *path)
+{
+ return NULL;
+}
+
+static char *gui_default_mimetype(const char *path)
+{
+ return strdup(guit->fetch->filetype(path));
+}
+
+/** verify fetch table is valid */
+static nserror verify_fetch_register(struct gui_fetch_table *gft)
+{
+ /* check table is present */
+ if (gft == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ /* check the mandantory fields are set */
+ if (gft->filetype == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ /* fill in the optional entries with defaults */
+ if (gft->get_resource_url == NULL) {
+ gft->get_resource_url = gui_default_get_resource_url;
+ }
+ if (gft->mimetype == NULL) {
+ gft->mimetype = gui_default_mimetype;
+ }
+
+ return NSERROR_OK;
+}
+
+/** verify file table is valid */
+static nserror verify_file_register(struct gui_file_table *gft)
+{
+ /* check table is present */
+ if (gft == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ /* check the mandantory fields are set */
+ if (gft->mkpath == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if (gft->basename == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if (gft->nsurl_to_path == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if (gft->path_to_nsurl == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if (gft->mkdir_all == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ return NSERROR_OK;
+}
+
+static void gui_default_quit(void)
+{
+}
+
+
+static nserror gui_default_launch_url(struct nsurl *url)
+{
+ return NSERROR_NO_FETCH_HANDLER;
+}
+
+static void gui_default_create_form_select_menu(struct browser_window *bw,
+ struct form_control *control)
+{
+}
+
+
+static void gui_default_cert_verify(nsurl *url,
+ const struct ssl_cert_info *certs,
+ unsigned long num,
+ nserror (*cb)(bool proceed, void *pw),
+ void *cbpw)
+{
+ cb(false, cbpw);
+}
+
+static void gui_default_401login_open(nsurl *url, const char *realm,
+ nserror (*cb)(bool proceed, void *pw), void *cbpw)
+{
+ cb(false, cbpw);
+}
+
+static struct gui_download_table default_download_table = {
+ .create = gui_default_download_create,
+ .data = gui_default_download_data,
+ .error = gui_default_download_error,
+ .done = gui_default_download_done,
+};
+
+/** verify browser table is valid */
+static nserror verify_browser_register(struct gui_browser_table *gbt)
+{
+ /* check table is present */
+ if (gbt == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ /* check the mandantory fields are set */
+ if (gbt->poll == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ if (gbt->schedule == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ /* fill in the optional entries with defaults */
+ if (gbt->quit == NULL) {
+ gbt->quit = gui_default_quit;
+ }
+ if (gbt->launch_url == NULL) {
+ gbt->launch_url = gui_default_launch_url;
+ }
+ if (gbt->create_form_select_menu == NULL) {
+ gbt->create_form_select_menu = gui_default_create_form_select_menu;
+ }
+ if (gbt->cert_verify == NULL) {
+ gbt->cert_verify = gui_default_cert_verify;
+ }
+ if (gbt->login == NULL) {
+ gbt->login = gui_default_401login_open;
+ }
+ return NSERROR_OK;
+}
+
+
+/* exported interface documented in desktop/gui_factory.h */
+nserror gui_factory_register(struct netsurf_table *gt)
+{
+ nserror err;
+
+ /* ensure not already initialised */
+ if (guit != NULL) {
+ return NSERROR_INIT_FAILED;
+ }
+
+ /* check table is present */
+ if (gt == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ /* browser table */
+ err = verify_browser_register(gt->browser);
+ if (err != NSERROR_OK) {
+ return err;
+ }
+
+ /* window table */
+ err = verify_window_register(gt->window);
+ if (err != NSERROR_OK) {
+ return err;
+ }
+
+ /* fetch table */
+ err = verify_fetch_register(gt->fetch);
+ if (err != NSERROR_OK) {
+ return err;
+ }
+
+ /* file table */
+ if (gt->file == NULL) {
+ gt->file = default_file_table;
+ }
+ err = verify_file_register(gt->file);
+ if (err != NSERROR_OK) {
+ return err;
+ }
+
+ /* download table */
+ if (gt->download == NULL) {
+ /* set default download table */
+ gt->download = &default_download_table;
+ }
+ err = verify_download_register(gt->download);
+ if (err != NSERROR_OK) {
+ return err;
+ }
+
+ /* clipboard table */
+ if (gt->clipboard == NULL) {
+ /* set default clipboard table */
+ gt->clipboard = &default_clipboard_table;
+ }
+ err = verify_clipboard_register(gt->clipboard);
+ if (err != NSERROR_OK) {
+ return err;
+ }
+
+ /* utf8 table */
+ if (gt->utf8 == NULL) {
+ /* set default utf8 table */
+ gt->utf8 = &default_utf8_table;
+ }
+ err = verify_utf8_register(gt->utf8);
+ if (err != NSERROR_OK) {
+ return err;
+ }
+
+ /* search table */
+ if (gt->search == NULL) {
+ /* set default search table */
+ gt->search = &default_search_table;
+ }
+ err = verify_search_register(gt->search);
+ if (err != NSERROR_OK) {
+ return err;
+ }
+
+ /* web search table */
+ if (gt->search_web == NULL) {
+ /* set default search table */
+ gt->search_web = &default_search_web_table;
+ }
+ err = verify_search_web_register(gt->search_web);
+ if (err != NSERROR_OK) {
+ return err;
+ }
+
+ /* llcache table */
+ if (gt->llcache == NULL) {
+ /* set default backing store table */
+ gt->llcache = null_llcache_table;
+ }
+ err = verify_llcache_register(gt->llcache);
+ if (err != NSERROR_OK) {
+ return err;
+ }
+
+ guit = gt;
+
+ return NSERROR_OK;
+}
diff --git a/render/list.h b/desktop/gui_factory.h
index 626eb5941..3c8661577 100644
--- a/render/list.h
+++ b/desktop/gui_factory.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2005 Richard Wilson <info@tinct.net>
+ * Copyright 2014 vincent Sanders <vince@netsurf-browser.org>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -17,22 +17,23 @@
*/
/** \file
- * HTML lists (interface).
+ * Interface to gui interface factory
*/
-#ifndef _NETSURF_RENDER_LIST_H_
-#define _NETSURF_RENDER_LIST_H_
+#ifndef _NETSURF_DESKTOP_GUI_FACTORY_H_
+#define _NETSURF_DESKTOP_GUI_FACTORY_H_
-#include <stdbool.h>
+#include "desktop/gui.h"
-#include "css/css.h"
+/** The global operation table */
+extern struct netsurf_table *guit;
-void render_list_destroy_counters(void);
-bool render_list_counter_reset(const char *name, int value);
-bool render_list_counter_increment(const char *name, int value);
-bool render_list_counter_end_scope(const char *name);
-char *render_list_counter(const css_computed_content_item *css_counter);
-
-void render_list_test(void);
+/** register and verify global operation table
+ *
+ * @param gt The global table to register
+ * @return NSERROR_OK on success or error code on faliure. On faliure
+ * global table will not be initialised
+ */
+nserror gui_factory_register(struct netsurf_table *gt);
#endif
diff --git a/desktop/hotlist.c b/desktop/hotlist.c
index 01fabc257..f0eda841b 100644
--- a/desktop/hotlist.c
+++ b/desktop/hotlist.c
@@ -19,6 +19,7 @@
#include <assert.h>
#include <stdlib.h>
+#include <string.h>
#include <dom/dom.h>
#include <dom/bindings/hubbub/parser.h>
@@ -26,6 +27,7 @@
#include "content/urldb.h"
#include "desktop/hotlist.h"
#include "desktop/treeview.h"
+#include "desktop/browser.h"
#include "utils/corestrings.h"
#include "utils/messages.h"
#include "utils/utils.h"
@@ -472,23 +474,22 @@ static nserror hotlist_tree_node_entry_cb(
case TREE_MSG_NODE_LAUNCH:
{
nserror error;
- struct browser_window *clone = NULL;
- enum browser_window_nav_flags flags =
- BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_TAB;
+ struct browser_window *existing = NULL;
+ enum browser_window_create_flags flags =
+ BW_CREATE_HISTORY;
- /* TODO: Set clone window, to window that new tab appears in */
+ /* TODO: Set existing to window that new tab appears in */
if (msg.data.node_launch.mouse &
(BROWSER_MOUSE_MOD_1 | BROWSER_MOUSE_MOD_2) ||
- clone == NULL) {
+ existing == NULL) {
/* Shift or Ctrl launch, open in new window rather
* than tab. */
- flags ^= BROWSER_WINDOW_TAB;
+ /* TODO: flags ^= BW_CREATE_TAB; */
}
- error = browser_window_create(flags, e->url, NULL, clone, NULL);
+ error = browser_window_create(flags, e->url, NULL,
+ existing, NULL);
if (error != NSERROR_OK) {
warn_user(messages_get_errorcode(error), 0);
}
@@ -879,21 +880,21 @@ static nserror hotlist_export_enter_cb(void *ctx, void *node_data,
enum treeview_node_type type, bool *abort)
{
struct treeview_export_walk_ctx *tw = ctx;
+ nserror ret;
if (type == TREE_NODE_ENTRY) {
struct hotlist_entry *e = node_data;
- utf8_convert_ret ret;
char *t_text;
char *u_text;
ret = utf8_to_html(e->data[HL_TITLE].value, "iso-8859-1",
e->data[HL_TITLE].value_len, &t_text);
- if (ret != UTF8_CONVERT_OK)
+ if (ret != NSERROR_OK)
return NSERROR_SAVE_FAILED;
ret = utf8_to_html(e->data[HL_URL].value, "iso-8859-1",
e->data[HL_URL].value_len, &u_text);
- if (ret != UTF8_CONVERT_OK) {
+ if (ret != NSERROR_OK) {
free(t_text);
return NSERROR_SAVE_FAILED;
}
@@ -906,12 +907,11 @@ static nserror hotlist_export_enter_cb(void *ctx, void *node_data,
} else if (type == TREE_NODE_FOLDER) {
struct hotlist_folder *f = node_data;
- utf8_convert_ret ret;
char *f_text;
ret = utf8_to_html(f->data.value, "iso-8859-1",
f->data.value_len, &f_text);
- if (ret != UTF8_CONVERT_OK)
+ if (ret != NSERROR_OK)
return NSERROR_SAVE_FAILED;
if (f == hl_ctx.default_folder) {
@@ -1502,10 +1502,11 @@ bool hotlist_has_selection(void)
bool hotlist_get_selection(nsurl **url, const char **title)
{
struct hotlist_entry *e;
+ enum treeview_node_type type;
void *v;
- treeview_get_selection(hl_ctx.tree, &v);
- if (v == NULL) {
+ type = treeview_get_selection(hl_ctx.tree, &v);
+ if (type != TREE_NODE_ENTRY || v == NULL) {
*url = NULL;
*title = NULL;
return false;
diff --git a/desktop/hotlist.h b/desktop/hotlist.h
index e5ae83499..7e2aa6955 100644
--- a/desktop/hotlist.h
+++ b/desktop/hotlist.h
@@ -22,12 +22,12 @@
#include <stdbool.h>
#include <stdint.h>
-#include "desktop/browser.h"
#include "desktop/core_window.h"
#include "desktop/textinput.h"
#include "utils/errors.h"
#include "utils/nsurl.h"
+enum browser_mouse_state;
/**
* Initialise the hotlist.
@@ -183,7 +183,7 @@ void hotlist_redraw(int x, int y, struct rect *clip,
* \param x X coordinate
* \param y Y coordinate
*/
-void hotlist_mouse_action(browser_mouse_state mouse, int x, int y);
+void hotlist_mouse_action(enum browser_mouse_state mouse, int x, int y);
/**
* Key press handling.
diff --git a/desktop/knockout.c b/desktop/knockout.c
index 0385ee80b..fa827cb39 100644
--- a/desktop/knockout.c
+++ b/desktop/knockout.c
@@ -64,10 +64,13 @@
#include <assert.h>
#include <string.h>
-#include "desktop/knockout.h"
-#include "desktop/plotters.h"
+#include <stdio.h>
+
#include "image/bitmap.h"
#include "utils/log.h"
+#include "content/content.h"
+#include "desktop/knockout.h"
+#include "desktop/plotters.h"
/* Define to enable knockout debug */
#undef KNOCKOUT_DEBUG
diff --git a/desktop/local_history.h b/desktop/local_history.h
deleted file mode 100644
index c4faa8532..000000000
--- a/desktop/local_history.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright 2006 James Bursa <bursa@users.sourceforge.net>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/** \file
- * Browser history tree (interface).
- */
-
-#ifndef _NETSURF_DESKTOP_HISTORY_H_
-#define _NETSURF_DESKTOP_HISTORY_H_
-
-#include <stdbool.h>
-#include <libwapcaplet/libwapcaplet.h>
-
-struct hlcache_handle;
-struct history;
-struct browser_window;
-struct history_entry;
-struct redraw_context;
-
-struct history *history_create(void);
-struct history *history_clone(struct history *history);
-void history_add(struct history *history, struct hlcache_handle *content,
- lwc_string *frag_id);
-void history_update(struct history *history, struct hlcache_handle *content);
-void history_destroy(struct history *history);
-void history_back(struct browser_window *bw, struct history *history);
-void history_forward(struct browser_window *bw, struct history *history);
-bool history_back_available(struct history *history);
-bool history_forward_available(struct history *history);
-void history_size(struct history *history, int *width, int *height);
-bool history_redraw(struct history *history, const struct redraw_context *ctx);
-bool history_redraw_rectangle(struct history *history,
- int x0, int y0, int x1, int y1, int x, int y,
- const struct redraw_context *ctx);
-bool history_click(struct browser_window *bw, struct history *history,
- int x, int y, bool new_window);
-const char *history_position_url(struct history *history, int x, int y);
-
-/**
- * Callback function type for history enumeration
- *
- * \param history history being enumerated
- * \param x0, y0, x1, y1 Coordinates of entry in history tree view
- * \param entry Current history entry
- * \return true to continue enumeration, false to cancel enumeration
- */
-typedef bool (*history_enumerate_cb)(const struct history *history, int x0, int y0,
- int x1, int y1,
- const struct history_entry *entry, void *user_data);
-
-/**
- * Enumerate all entries in the history.
- * Do not change the history while it is being enumerated.
- *
- * \param history history to enumerate
- * \param cb callback function
- * \param user_data context pointer passed to cb
- */
-void history_enumerate(const struct history *history, history_enumerate_cb cb, void *user_data);
-
-/**
- * Enumerate all entries that will be reached by the 'forward' button
- *
- * \param history The history object to enumerate in
- * \param cb The callback function
- * \param user_data Data passed to the callback
- */
-void history_enumerate_forward( struct history *history,
- history_enumerate_cb cb, void *user_data );
-
-/**
- * Enumerate all entries that will be reached by the 'back' button
- *
- * \param history The history object to enumerate in
- * \param cb The callback function
- * \param user_data Data passed to the callback
- */
-void history_enumerate_back( struct history *history,
- history_enumerate_cb cb, void *user_data );
-
-/**
- * Returns the URL to a history entry
- *
- * \param entry the history entry to retrieve the URL from
- * \return the URL
- */
-const char *history_entry_get_url(const struct history_entry *entry);
-
-/**
- * Returns the URL to a history entry
- *
- * \param entry the history entry to retrieve the fragment id from
- * \return the fragment id
- */
-const char *history_entry_get_fragment_id(const struct history_entry *entry);
-
-/**
- * Returns the title of a history entry
- *
- * \param entry the history entry to retrieve the title from
- * \return the title
- */
-const char *history_entry_get_title(const struct history_entry *entry);
-
-/**
- * Open a history entry in the specified browser window
- *
- * \param bw browser window
- * \param history history containing entry
- * \param entry entry to open
- * \param new_window open entry in new window
- */
-void history_go(struct browser_window *bw, struct history *history,
- struct history_entry *entry, bool new_window);
-
-#endif
diff --git a/desktop/mouse.h b/desktop/mouse.h
index 9a3a16702..083bd1731 100644
--- a/desktop/mouse.h
+++ b/desktop/mouse.h
@@ -27,7 +27,7 @@
/* Mouse state. 1 is primary mouse button (e.g. Select on RISC OS).
* 2 is secondary mouse button (e.g. Adjust on RISC OS). */
-typedef enum {
+typedef enum browser_mouse_state {
BROWSER_MOUSE_HOVER = 0, /* No mouse buttons pressed,
* May be used to indicate
* hover or end of drag. */
@@ -78,13 +78,14 @@ typedef enum {
} browser_mouse_state;
-typedef enum { GUI_POINTER_DEFAULT, GUI_POINTER_POINT, GUI_POINTER_CARET,
- GUI_POINTER_MENU, GUI_POINTER_UP, GUI_POINTER_DOWN,
- GUI_POINTER_LEFT, GUI_POINTER_RIGHT, GUI_POINTER_RU,
- GUI_POINTER_LD, GUI_POINTER_LU, GUI_POINTER_RD,
- GUI_POINTER_CROSS, GUI_POINTER_MOVE, GUI_POINTER_WAIT,
- GUI_POINTER_HELP, GUI_POINTER_NO_DROP, GUI_POINTER_NOT_ALLOWED,
- GUI_POINTER_PROGRESS } gui_pointer_shape;
+typedef enum gui_pointer_shape {
+ GUI_POINTER_DEFAULT, GUI_POINTER_POINT, GUI_POINTER_CARET,
+ GUI_POINTER_MENU, GUI_POINTER_UP, GUI_POINTER_DOWN,
+ GUI_POINTER_LEFT, GUI_POINTER_RIGHT, GUI_POINTER_RU,
+ GUI_POINTER_LD, GUI_POINTER_LU, GUI_POINTER_RD,
+ GUI_POINTER_CROSS, GUI_POINTER_MOVE, GUI_POINTER_WAIT,
+ GUI_POINTER_HELP, GUI_POINTER_NO_DROP, GUI_POINTER_NOT_ALLOWED,
+ GUI_POINTER_PROGRESS } gui_pointer_shape;
/** Mouse pointer type */
typedef enum {
diff --git a/desktop/netsurf.c b/desktop/netsurf.c
index fa026dc6a..579648bae 100644
--- a/desktop/netsurf.c
+++ b/desktop/netsurf.c
@@ -29,7 +29,7 @@
#include "utils/config.h"
#include "utils/utsname.h"
#include "content/content_factory.h"
-#include "content/fetch.h"
+#include "content/fetchers.h"
#include "content/hlcache.h"
#include "content/mimesniff.h"
#include "content/urldb.h"
@@ -37,9 +37,9 @@
#include "image/image.h"
#include "image/image_cache.h"
#include "desktop/netsurf.h"
-#include "desktop/401login.h"
#include "desktop/browser.h"
-#include "desktop/gui.h"
+#include "desktop/system_colour.h"
+#include "desktop/gui_factory.h"
#include "utils/nsoption.h"
#include "desktop/searchweb.h"
@@ -67,13 +67,24 @@
*/
#define SPECULATE_SMALL 4096
-/* the time between cache clean runs in ms */
+/** the time between image cache clean runs in ms. */
#define IMAGE_CACHE_CLEAN_TIME (10 * 1000)
+/** default time between content cache cleans. */
#define HL_CACHE_CLEAN_TIME (2 * IMAGE_CACHE_CLEAN_TIME)
+/** default minimum object time before object is pushed to backing store. */
+#define LLCACHE_MIN_DISC_LIFETIME (60 * 30)
+
+/** default maximum bandwidth for backing store writeout. */
+#define LLCACHE_MAX_DISC_BANDWIDTH (128 * 1024)
+
+/** ensure there is a minimal amount of memory for source objetcs and
+ * decoded bitmaps.
+ */
+#define MINIMUM_MEMORY_CACHE_SIZE (2 * 1024 * 1024)
+
bool netsurf_quit = false;
-bool verbose_log = false;
static void netsurf_lwc_iterator(lwc_string *str, void *pw)
{
@@ -94,14 +105,14 @@ static nserror netsurf_llcache_query_handler(const llcache_query *query,
{
switch (query->type) {
case LLCACHE_QUERY_AUTH:
- gui_401login_open(query->url, query->data.auth.realm, cb, cbpw);
+ guit->browser->login(query->url, query->data.auth.realm, cb, cbpw);
break;
case LLCACHE_QUERY_REDIRECT:
/** \todo Need redirect query dialog */
/* For now, do nothing, as this query type isn't emitted yet */
break;
case LLCACHE_QUERY_SSL:
- gui_cert_verify(query->url, query->data.ssl.certs,
+ guit->browser->cert_verify(query->url, query->data.ssl.certs,
query->data.ssl.num, cb, cbpw);
break;
}
@@ -109,20 +120,25 @@ static nserror netsurf_llcache_query_handler(const llcache_query *query,
return NSERROR_OK;
}
-#define MINIMUM_MEMORY_CACHE_SIZE (2 * 1024 * 1024)
-
-/**
- * Initialise components used by gui NetSurf.
- */
+/* exported interface documented in desktop/netsurf.h */
+nserror netsurf_register(struct netsurf_table *table)
+{
+ /* register the operation handlers */
+ return gui_factory_register(table);
+}
-nserror netsurf_init(const char *messages)
+/* exported interface documented in desktop/netsurf.h */
+nserror netsurf_init(const char *messages, const char *store_path)
{
- nserror error;
+ nserror ret;
struct utsname utsname;
- nserror ret = NSERROR_OK;
struct hlcache_parameters hlcache_parameters = {
.bg_clean_time = HL_CACHE_CLEAN_TIME,
- .cb = netsurf_llcache_query_handler,
+ .llcache = {
+ .cb = netsurf_llcache_query_handler,
+ .minimum_lifetime = LLCACHE_MIN_DISC_LIFETIME,
+ .bandwidth = LLCACHE_MAX_DISC_BANDWIDTH,
+ }
};
struct image_cache_parameters image_cache_parameters = {
.bg_clean_time = IMAGE_CACHE_CLEAN_TIME,
@@ -152,70 +168,86 @@ nserror netsurf_init(const char *messages)
messages_load(messages);
/* corestrings init */
- error = corestrings_init();
- if (error != NSERROR_OK)
- return error;
+ ret = corestrings_init();
+ if (ret != NSERROR_OK)
+ return ret;
/* set up cache limits based on the memory cache size option */
- hlcache_parameters.limit = nsoption_int(memory_cache_size);
+ hlcache_parameters.llcache.limit = nsoption_int(memory_cache_size);
- if (hlcache_parameters.limit < MINIMUM_MEMORY_CACHE_SIZE) {
- hlcache_parameters.limit = MINIMUM_MEMORY_CACHE_SIZE;
- LOG(("Setting minimum memory cache size to %d",
- hlcache_parameters.limit));
+ if (hlcache_parameters.llcache.limit < MINIMUM_MEMORY_CACHE_SIZE) {
+ hlcache_parameters.llcache.limit = MINIMUM_MEMORY_CACHE_SIZE;
+ LOG(("Setting minimum memory cache size %d",
+ hlcache_parameters.llcache.limit));
}
/* image cache is 25% of total memory cache size */
- image_cache_parameters.limit = (hlcache_parameters.limit * 25) / 100;
+ image_cache_parameters.limit = (hlcache_parameters.llcache.limit * 25) / 100;
/* image cache hysteresis is 20% of the image cache size */
image_cache_parameters.hysteresis = (image_cache_parameters.limit * 20) / 100;
/* account for image cache use from total */
- hlcache_parameters.limit -= image_cache_parameters.limit;
+ hlcache_parameters.llcache.limit -= image_cache_parameters.limit;
+
+ /* set backing store target limit */
+ hlcache_parameters.llcache.store.limit = nsoption_uint(disc_cache_size);
+
+ /* set backing store hysterissi to 20% */
+ hlcache_parameters.llcache.store.hysteresis = (hlcache_parameters.llcache.store.limit * 20) / 100;;
+
+ /* set the path to the backing store */
+ hlcache_parameters.llcache.store.path = store_path;
/* image handler bitmap cache */
- error = image_cache_init(&image_cache_parameters);
- if (error != NSERROR_OK)
- return error;
+ ret = image_cache_init(&image_cache_parameters);
+ if (ret != NSERROR_OK)
+ return ret;
/* content handler initialisation */
- error = nscss_init();
- if (error != NSERROR_OK)
- return error;
+ ret = nscss_init();
+ if (ret != NSERROR_OK)
+ return ret;
- error = html_init();
- if (error != NSERROR_OK)
- return error;
+ ret = html_init();
+ if (ret != NSERROR_OK)
+ return ret;
- error = image_init();
- if (error != NSERROR_OK)
- return error;
+ ret = image_init();
+ if (ret != NSERROR_OK)
+ return ret;
- error = textplain_init();
- if (error != NSERROR_OK)
- return error;
+ ret = textplain_init();
+ if (ret != NSERROR_OK)
+ return ret;
- error = mimesniff_init();
- if (error != NSERROR_OK)
- return error;
+ ret = mimesniff_init();
+ if (ret != NSERROR_OK)
+ return ret;
url_init();
setlocale(LC_ALL, "C");
- fetch_init();
+ /* initialise the fetchers */
+ ret = fetcher_init();
+ if (ret != NSERROR_OK)
+ return ret;
/* Initialise the hlcache and allow it to init the llcache for us */
- hlcache_initialise(&hlcache_parameters);
+ ret = hlcache_initialise(&hlcache_parameters);
+ if (ret != NSERROR_OK)
+ return ret;
/* Initialize system colours */
- gui_system_colour_init();
+ ret = ns_system_colour_init();
+ if (ret != NSERROR_OK)
+ return ret;
js_initialise();
- return ret;
+ return NSERROR_OK;
}
@@ -225,8 +257,7 @@ nserror netsurf_init(const char *messages)
int netsurf_main_loop(void)
{
while (!netsurf_quit) {
- gui_poll(fetch_active);
- hlcache_poll();
+ guit->browser->poll(false);
}
return 0;
@@ -241,19 +272,19 @@ void netsurf_exit(void)
hlcache_stop();
LOG(("Closing GUI"));
- gui_quit();
+ guit->browser->quit();
LOG(("Finalising JavaScript"));
js_finalise();
- LOG(("Closing search and related resources"));
- search_web_cleanup();
+ LOG(("Finalising Web Search"));
+ search_web_finalise();
LOG(("Finalising high-level cache"));
hlcache_finalise();
LOG(("Closing fetches"));
- fetch_quit();
+ fetcher_quit();
mimesniff_fini();
@@ -270,7 +301,7 @@ void netsurf_exit(void)
urldb_destroy();
LOG(("Destroying System colours"));
- gui_system_colour_finalize();
+ ns_system_colour_finalize();
corestrings_fini();
LOG(("Remaining lwc strings:"));
@@ -278,5 +309,3 @@ void netsurf_exit(void)
LOG(("Exited successfully"));
}
-
-
diff --git a/desktop/netsurf.h b/desktop/netsurf.h
index bfdb647ff..6c6a22a86 100644
--- a/desktop/netsurf.h
+++ b/desktop/netsurf.h
@@ -23,13 +23,37 @@
#include "utils/errors.h"
extern bool netsurf_quit;
-extern bool verbose_log;
extern const char * const netsurf_version;
extern const int netsurf_version_major;
extern const int netsurf_version_minor;
-nserror netsurf_init(const char *messages);
-extern void netsurf_exit(void);
+struct netsurf_table;
+
+/**
+ * Register operation table.
+ *
+ * @param table NetSurf operations table.
+ * @return NSERROR_OK on success or error code on faliure.
+ */
+nserror netsurf_register(struct netsurf_table *table);
+
+/**
+ * Initialise netsurf core.
+ *
+ * @param messages path to translation mesage file.
+ * @return NSERROR_OK on success or error code on faliure.
+ */
+nserror netsurf_init(const char *messages, const char *store_path);
+
+/**
+ * Run event loop.
+ */
extern int netsurf_main_loop(void);
+/**
+ * Finalise NetSurf core
+ */
+extern void netsurf_exit(void);
+
+
#endif
diff --git a/desktop/options.h b/desktop/options.h
index 391dfbc08..33ecb7554 100644
--- a/desktop/options.h
+++ b/desktop/options.h
@@ -89,7 +89,7 @@ NSOPTION_STRING(accept_charset, NULL)
NSOPTION_INTEGER(memory_cache_size, 12 * 1024 * 1024)
/** Preferred expiry size of disc cache / bytes. */
-NSOPTION_INTEGER(disc_cache_size, 1024 * 1024 * 1024)
+NSOPTION_UINT(disc_cache_size, 1024 * 1024 * 1024)
/** Preferred expiry age of disc cache / days. */
NSOPTION_INTEGER(disc_cache_age, 28)
diff --git a/desktop/plotters.h b/desktop/plotters.h
index 448cedef5..c34692433 100644
--- a/desktop/plotters.h
+++ b/desktop/plotters.h
@@ -24,8 +24,9 @@
#define _NETSURF_DESKTOP_PLOTTERS_H_
#include <stdbool.h>
-#include "css/css.h"
-#include "content/content.h"
+#include <stdio.h>
+
+#include "utils/types.h"
#include "desktop/plot_style.h"
struct bitmap;
diff --git a/desktop/save_complete.c b/desktop/save_complete.c
index 0c67654a6..71187eb10 100644
--- a/desktop/save_complete.c
+++ b/desktop/save_complete.c
@@ -21,8 +21,6 @@
* Save HTML document with dependencies (implementation).
*/
-#include "utils/config.h"
-
#include <assert.h>
#include <ctype.h>
#include <errno.h>
@@ -30,20 +28,24 @@
#include <string.h>
#include <sys/types.h>
#include <regex.h>
-
#include <dom/dom.h>
-#include "content/content.h"
-#include "content/hlcache.h"
-#include "css/css.h"
-#include "desktop/save_complete.h"
-#include "render/box.h"
-#include "render/html.h"
+#include "utils/config.h"
#include "utils/corestrings.h"
#include "utils/log.h"
#include "utils/nsurl.h"
#include "utils/utf8.h"
#include "utils/utils.h"
+#include "utils/file.h"
+#include "utils/messages.h"
+#include "content/content.h"
+#include "content/hlcache.h"
+#include "css/css.h"
+#include "render/box.h"
+#include "render/html.h"
+
+#include "desktop/gui_factory.h"
+#include "desktop/save_complete.h"
regex_t save_complete_import_re;
@@ -142,19 +144,19 @@ static bool save_complete_save_buffer(save_complete_ctx *ctx,
const char *leafname, const char *data, size_t data_len,
lwc_string *mime_type)
{
+ nserror ret;
FILE *fp;
- bool error;
- char fullpath[PATH_MAX];
+ char *fname = NULL;
- strncpy(fullpath, ctx->path, sizeof fullpath);
- error = path_add_part(fullpath, sizeof fullpath, leafname);
- if (error == false) {
- warn_user("NoMemory", NULL);
+ ret = netsurf_mkpath(&fname, NULL, 2, ctx->path, leafname);
+ if (ret != NSERROR_OK) {
+ warn_user(messages_get_errorcode(ret), 0);
return false;
}
- fp = fopen(fullpath, "wb");
+ fp = fopen(fname, "wb");
if (fp == NULL) {
+ free(fname);
LOG(("fopen(): errno = %i", errno));
warn_user("SaveError", strerror(errno));
return false;
@@ -164,8 +166,10 @@ static bool save_complete_save_buffer(save_complete_ctx *ctx,
fclose(fp);
- if (ctx->set_type != NULL)
- ctx->set_type(fullpath, mime_type);
+ if (ctx->set_type != NULL) {
+ ctx->set_type(fname, mime_type);
+ }
+ free(fname);
return true;
}
@@ -351,8 +355,11 @@ static bool save_complete_save_imported_sheets(save_complete_ctx *ctx,
uint32_t i;
for (i = 0; i < import_count; i++) {
- if (save_complete_save_stylesheet(ctx, imports[i].c) == false)
- return false;
+ /* treat a valid content as a stylesheet to save */
+ if ((imports[i].c != NULL) &&
+ (save_complete_save_stylesheet(ctx, imports[i].c) == false)) {
+ return false;
+ }
}
return true;
@@ -435,7 +442,7 @@ static bool save_complete_save_html_objects(save_complete_ctx *ctx,
object = html_get_objects(c, &count);
for (; object != NULL; object = object->next) {
- if (object->content != NULL) {
+ if ((object->content != NULL) && (object->box != NULL)) {
if (save_complete_save_html_object(ctx,
object->content) == false)
return false;
@@ -546,7 +553,6 @@ static bool save_complete_rewrite_url_value(save_complete_ctx *ctx,
hlcache_handle *content;
char *escaped;
nserror error;
- utf8_convert_ret ret;
error = nsurl_join(ctx->base, value, &url);
if (error == NSERROR_NOMEM)
@@ -561,11 +567,11 @@ static bool save_complete_rewrite_url_value(save_complete_ctx *ctx,
fprintf(ctx->fp, "\"%p\"", content);
} else {
/* no match found */
- ret = utf8_to_html(nsurl_access(url), "UTF-8",
+ error = utf8_to_html(nsurl_access(url), "UTF-8",
nsurl_length(url), &escaped);
nsurl_unref(url);
- if (ret != UTF8_CONVERT_OK)
+ if (error != NSERROR_OK)
return false;
fprintf(ctx->fp, "\"%s\"", escaped);
@@ -573,8 +579,8 @@ static bool save_complete_rewrite_url_value(save_complete_ctx *ctx,
free(escaped);
}
} else {
- ret = utf8_to_html(value, "UTF-8", value_len, &escaped);
- if (ret != UTF8_CONVERT_OK)
+ error = utf8_to_html(value, "UTF-8", value_len, &escaped);
+ if (error != NSERROR_OK)
return false;
fprintf(ctx->fp, "\"%s\"", escaped);
@@ -589,10 +595,10 @@ static bool save_complete_write_value(save_complete_ctx *ctx,
const char *value, size_t value_len)
{
char *escaped;
- utf8_convert_ret ret;
+ nserror ret;
ret = utf8_to_html(value, "UTF-8", value_len, &escaped);
- if (ret != UTF8_CONVERT_OK)
+ if (ret != NSERROR_OK)
return false;
fprintf(ctx->fp, "\"%s\"", escaped);
@@ -918,7 +924,7 @@ static bool save_complete_node_handler(dom_node *node,
save_complete_ctx *ctx = ctxin;
dom_node_type type;
dom_exception error;
- utf8_convert_ret ret;
+ nserror ret;
error = dom_node_get_node_type(node, &type);
if (error != DOM_NO_ERR)
@@ -952,7 +958,7 @@ static bool save_complete_node_handler(dom_node *node,
ret = utf8_to_html(text_data, "UTF-8",
text_len, &escaped);
- if (ret != UTF8_CONVERT_OK)
+ if (ret != NSERROR_OK)
return false;
fwrite(escaped, sizeof(*escaped),
@@ -1034,29 +1040,30 @@ static bool save_complete_node_handler(dom_node *node,
static bool save_complete_save_html_document(save_complete_ctx *ctx,
hlcache_handle *c, bool index)
{
- bool error;
+ nserror ret;
FILE *fp;
+ char *fname = NULL;
dom_document *doc;
lwc_string *mime_type;
char filename[32];
- char fullpath[PATH_MAX];
- strncpy(fullpath, ctx->path, sizeof fullpath);
-
- if (index)
+ if (index) {
snprintf(filename, sizeof filename, "index");
- else
+ } else {
snprintf(filename, sizeof filename, "%p", c);
+ }
- error = path_add_part(fullpath, sizeof fullpath, filename);
- if (error == false) {
- warn_user("NoMemory", NULL);
+ ret = netsurf_mkpath(&fname, NULL, 2, ctx->path, filename);
+ if (ret != NSERROR_OK) {
+ warn_user(messages_get_errorcode(ret), NULL);
return false;
}
- fp = fopen(fullpath, "wb");
+ fp = fopen(fname, "wb");
if (fp == NULL) {
- warn_user("NoMemory", NULL);
+ free(fname);
+ LOG(("fopen(): errno = %i", errno));
+ warn_user("SaveError", strerror(errno));
return false;
}
@@ -1068,6 +1075,7 @@ static bool save_complete_save_html_document(save_complete_ctx *ctx,
if (save_complete_libdom_treewalk((dom_node *) doc,
save_complete_node_handler, ctx) == false) {
+ free(fname);
warn_user("NoMemory", 0);
fclose(fp);
return false;
@@ -1078,10 +1086,11 @@ static bool save_complete_save_html_document(save_complete_ctx *ctx,
mime_type = content_get_mime_type(c);
if (mime_type != NULL) {
if (ctx->set_type != NULL)
- ctx->set_type(fullpath, mime_type);
+ ctx->set_type(fname, mime_type);
lwc_string_unref(mime_type);
}
+ free(fname);
return true;
}
@@ -1119,19 +1128,18 @@ static bool save_complete_save_html(save_complete_ctx *ctx, hlcache_handle *c,
static bool save_complete_inventory(save_complete_ctx *ctx)
{
+ nserror ret;
FILE *fp;
- bool error;
+ char *fname = NULL;
save_complete_entry *entry;
- char fullpath[PATH_MAX];
- strncpy(fullpath, ctx->path, sizeof fullpath);
- error = path_add_part(fullpath, sizeof fullpath, "Inventory");
- if (error == false) {
- warn_user("NoMemory", NULL);
+ ret = netsurf_mkpath(&fname, NULL, 2, ctx->path, "Inventory");
+ if (ret != NSERROR_OK) {
return false;
}
- fp = fopen(fullpath, "w");
+ fp = fopen(fname, "w");
+ free(fname);
if (fp == NULL) {
LOG(("fopen(): errno = %i", errno));
warn_user("SaveError", strerror(errno));
@@ -1193,8 +1201,9 @@ bool save_complete(hlcache_handle *c, const char *path,
result = save_complete_save_html(&ctx, c, true);
- if (result)
+ if (result) {
result = save_complete_inventory(&ctx);
+ }
save_complete_ctx_finalise(&ctx);
diff --git a/desktop/save_text.c b/desktop/save_text.c
index 92cf32a9f..bc4d4c57a 100644
--- a/desktop/save_text.c
+++ b/desktop/save_text.c
@@ -28,14 +28,16 @@
#include <dom/dom.h>
#include "utils/config.h"
+#include "utils/log.h"
+#include "utils/utf8.h"
+#include "utils/utils.h"
#include "content/content.h"
#include "content/hlcache.h"
-#include "desktop/save_text.h"
#include "render/box.h"
#include "render/html.h"
-#include "utils/log.h"
-#include "utils/utf8.h"
-#include "utils/utils.h"
+
+#include "desktop/gui_factory.h"
+#include "desktop/save_text.h"
static void extract_text(struct box *box, bool *first,
save_text_whitespace *before, struct save_text_state *save);
@@ -58,7 +60,7 @@ void save_as_text(hlcache_handle *c, char *path)
struct save_text_state save = { NULL, 0, 0 };
save_text_whitespace before = WHITESPACE_NONE;
bool first = true;
- utf8_convert_ret ret;
+ nserror ret;
char *result;
if (!c || content_get_type(c) != CONTENT_HTML) {
@@ -69,10 +71,10 @@ void save_as_text(hlcache_handle *c, char *path)
if (!save.block)
return;
- ret = utf8_to_local_encoding(save.block, save.length, &result);
+ ret = guit->utf8->utf8_to_local(save.block, save.length, &result);
free(save.block);
- if (ret != UTF8_CONVERT_OK) {
+ if (ret != NSERROR_OK) {
LOG(("failed to convert to local encoding, return %d", ret));
return;
}
diff --git a/desktop/scrollbar.c b/desktop/scrollbar.c
index d24ea727a..dadb82801 100644
--- a/desktop/scrollbar.c
+++ b/desktop/scrollbar.c
@@ -25,6 +25,7 @@
#include <stdbool.h>
#include <stdlib.h>
+#include "desktop/system_colour.h"
#include "desktop/mouse.h"
#include "desktop/scrollbar.h"
#include "utils/nsoption.h"
@@ -190,9 +191,9 @@ bool scrollbar_redraw(struct scrollbar *s, int x, int y,
int v[6]; /* array of triangle vertices */
int x0, y0, x1, y1;
- colour bg_fill_colour = gui_system_colour_char("Scrollbar");
- colour fg_fill_colour = gui_system_colour_char("ButtonFace");
- colour arrow_fill_colour = gui_system_colour_char("ButtonText");
+ colour bg_fill_colour = ns_system_colour_char("Scrollbar");
+ colour fg_fill_colour = ns_system_colour_char("ButtonFace");
+ colour arrow_fill_colour = ns_system_colour_char("ButtonText");
plot_style_t bg_fill_style = {
.fill_type = PLOT_OP_TYPE_SOLID,
diff --git a/desktop/search.c b/desktop/search.c
index 3a7c768a5..201d416dd 100644
--- a/desktop/search.c
+++ b/desktop/search.c
@@ -21,67 +21,27 @@
/** \file
* Free text search (core)
*/
-#include "utils/config.h"
-#include <ctype.h>
-#include <string.h>
-#include <dom/dom.h>
#include "content/content.h"
-#include "content/hlcache.h"
+
#include "desktop/browser_private.h"
-#include "desktop/gui.h"
-#include "utils/nsoption.h"
#include "desktop/search.h"
-#include "desktop/selection.h"
-#include "render/box.h"
-#include "render/html.h"
-#include "render/search.h"
-#include "render/textplain.h"
-#include "utils/config.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/url.h"
-#include "utils/utils.h"
-
-
-
-/**
- * Starts or continues an existing search.
- *
- * \param bw the browser_window to search
- * \param callbacks callbacks vtable to update frontend according to results
- * \param gui_data a pointer returned to the callbacks
- * \param flags search flags
- * \param string string to search for
- */
-void browser_window_search(struct browser_window *bw,
- struct gui_search_callbacks *gui_callbacks, void *gui_data,
+/* exported function documented in desktop/search.h */
+void browser_window_search(struct browser_window *bw, void *context,
search_flags_t flags, const char *string)
{
- assert(gui_callbacks != NULL);
-
- if (bw == NULL || bw->current_content == NULL)
- return;
-
- content_search(bw->current_content, gui_callbacks, gui_data,
- flags, string);
+ if ((bw != NULL) &&
+ (bw->current_content != NULL)) {
+ content_search(bw->current_content, context, flags, string);
+ }
}
-
-/**
- * Clear up a search. Frees any memory used by the search
- *
- * \param bw the browser_window to search
- * \param callbacks callbacks vtable to update frontend according to results
- * \param gui_data a pointer returned to the callbacks
- * \param flags search flags
- * \param string string to search for
- */
+/* exported function documented in desktop/search.h */
void browser_window_search_clear(struct browser_window *bw)
{
- if (bw == NULL || bw->current_content == NULL)
- return;
-
- content_search_clear(bw->current_content);
+ if ((bw != NULL) &&
+ (bw->current_content != NULL)) {
+ content_search_clear(bw->current_content);
+ }
}
diff --git a/desktop/search.h b/desktop/search.h
index 8440ce982..254acde99 100644
--- a/desktop/search.h
+++ b/desktop/search.h
@@ -33,54 +33,24 @@ typedef enum {
} search_flags_t;
/**
- * Change the displayed search status.
- * \param found search pattern matched in text
- * \param p gui private data pointer provided with search callbacks
- */
-typedef void (*gui_search_status)(bool found, void *p);
-
-/**
- * display hourglass while searching
- * \param active start/stop indicator
- * \param p gui private data pointer provided with search callbacks
- */
-typedef void (*gui_search_hourglass)(bool active, void *p);
-
-/**
- * add search string to recent searches list
- * front has full liberty how to implement the bare notification;
- * core gives no guarantee of the integrity of the const char *
- * \param string search pattern
- * \param p gui private data pointer provided with search callbacks
- */
-typedef void (*gui_search_add_recent)(const char *string, void *p);
-
-/**
- * activate search forwards button in gui
- * \param active activate/inactivate
- * \param p gui private data pointer provided with search callbacks
+ * Starts or continues an existing search.
+ *
+ * \param bw The browser_window to search.
+ * \param context A context pointer passed to the callbacks.
+ * \param flags Flags controlling the search operation.
+ * \param string The string being searched for.
*/
-typedef void (*gui_search_forward_state)(bool active, void *p);
+void browser_window_search(struct browser_window *bw, void *context, search_flags_t flags, const char *string);
/**
- * activate search back button in gui
- * \param active activate/inactivate
- * \param p gui private data pointer provided with search callbacks
+ * Clear up a search.
+ *
+ * Frees any memory used by the search.
+ *
+ * \param bw The browser window to clean up the search for.
+ * \param context A context pointer passed to the callbacks.
*/
-typedef void (*gui_search_back_state)(bool active, void *p);
-
-struct gui_search_callbacks {
- gui_search_forward_state forward_state;
- gui_search_back_state back_state;
- gui_search_status status;
- gui_search_hourglass hourglass;
- gui_search_add_recent add_recent;
-};
-
-void browser_window_search(struct browser_window *bw,
- struct gui_search_callbacks *gui_callbacks, void *gui_data,
- search_flags_t flags, const char *string);
void browser_window_search_clear(struct browser_window *bw);
#endif
diff --git a/desktop/searchweb.c b/desktop/searchweb.c
index 87e3e21f1..dc12170c1 100644
--- a/desktop/searchweb.c
+++ b/desktop/searchweb.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2009 Mark Benjamin <netsurf-browser.org.MarkBenjamin@dfgh.net>
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -15,320 +15,549 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-
- /** \file
- * web search (core)
+
+/**
+ * \file desktop/searchweb.c
+ * \brief core web search facilities implementation.
*/
-#include "utils/config.h"
-#include <ctype.h>
-#include <string.h>
-#include "content/content.h"
-#include "content/hlcache.h"
-#include "desktop/browser.h"
-#include "desktop/gui.h"
-#include "utils/nsoption.h"
-#include "desktop/searchweb.h"
-#include "utils/config.h"
#include "utils/log.h"
-#include "utils/messages.h"
#include "utils/url.h"
-#include "utils/utils.h"
+#include "utils/nsoption.h"
+#include "content/hlcache.h"
-static struct search_provider {
+#include "desktop/gui_factory.h"
+#include "desktop/searchweb.h"
+
+struct search_provider {
char *name; /**< readable name such as 'google', 'yahoo', etc */
char *hostname; /**< host address such as www.google.com */
char *searchstring; /** < such as "www.google.com?search=%s" */
char *ico; /** < location of domain's favicon */
-} current_search_provider;
+ hlcache_handle *ico_handle;
+};
-static hlcache_handle *search_ico = NULL;
-char *search_engines_file_location;
-char *search_default_ico_location;
+static struct search_web_ctx_s {
+ struct search_provider *providers; /* web search providers */
+ size_t providers_count; /* number of providers */
-#ifdef WITH_BMP
-static nserror search_web_ico_callback(hlcache_handle *ico,
- const hlcache_event *event, void *pw);
-#endif
+ size_t current; /* current provider */
-/**
- * creates a new browser window according to the search term
- * \param searchterm such as "my search term"
- */
+ hlcache_handle *default_ico_handle;
-bool search_web_new_window(struct browser_window *bw, const char *searchterm)
+} search_web_ctx;
+
+
+static const char *default_providers = "Google|www.google.com|http://www.google.com/search?q=%s|http://www.google.com/favicon.ico|\n";
+
+static const char *default_search_icon_url = "resource:icons/search.png";
+
+
+/**
+ * Read providers file.
+ *
+ * Allocates stoage of sufficient size for the providers file and
+ * reads the entire file in.
+ *
+ * \param fname The filename to read.
+ * \param providers_out A pointer to place the result buffer in.
+ * \param providers_size_out Size of buffer.
+ * \return NSERROR_OK and providers_out updated or appropriate error code.
+ */
+static nserror
+read_providers(const char *fname,
+ char **providers_out,
+ size_t *providers_size_out)
{
- char *encsearchterm;
- char *urltxt;
- nsurl *url;
- nserror error;
+ FILE *providersf;
+ long ftellsize;
+ size_t fsize;
+ char *providersd;
- if (url_escape(searchterm,0, true, NULL, &encsearchterm) != URL_FUNC_OK)
- return false;
+ if (fname == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
- urltxt = search_web_get_url(encsearchterm);
- free(encsearchterm);
+ providersf = fopen(fname, "r");
+ if (providersf == NULL) {
+ return NSERROR_NOT_FOUND;
+ }
- error = nsurl_create(urltxt, &url);
- if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_TAB,
- url,
- NULL,
- bw,
- NULL);
- nsurl_unref(url);
+ if (fseek(providersf, 0, SEEK_END) != 0) {
+ fclose(providersf);
+ return NSERROR_INVALID;
}
- if (error != NSERROR_OK) {
- warn_user(messages_get_errorcode(error), 0);
+
+ ftellsize = ftell(providersf);
+ if (ftellsize < 0) {
+ fclose(providersf);
+ return NSERROR_INVALID;
}
+ fsize = ftellsize;
- free(urltxt);
- return true;
-}
+ if (fseek(providersf, 0, SEEK_SET) != 0) {
+ fclose(providersf);
+ return NSERROR_INVALID;
+ }
-/** simplistic way of checking whether an entry from the url bar is an
- * url / a search; could be improved to properly test terms
- */
+ providersd = malloc(fsize + 1);
+ if (providersd == NULL) {
+ fclose(providersf);
+ return NSERROR_NOMEM;
+ }
-bool search_is_url(const char *url)
-{
- /** \todo Implement this properly */
+ if (fread(providersd, 1, fsize, providersf) != fsize) {
+ fclose(providersf);
+ free(providersd);
+ return NSERROR_BAD_SIZE;
+ }
+ providersd[fsize] = 0; /* ensure null terminated */
- /* For now, everything is an URL */
- return true;
-}
+ fclose(providersf);
-/**
- * caches the details of the current web search provider
- * \param reference the enum value of the provider
- * browser init code [as well as changing preferences code] should call
- * search_web_provider_details(option_search_provider)
- */
+ *providers_out = providersd;
+ *providers_size_out = fsize;
-void search_web_provider_details(int reference)
-{
- char buf[300];
- int ref = 0;
- FILE *f;
- if (search_engines_file_location == NULL)
- return;
- f = fopen(search_engines_file_location, "r");
- if (f == NULL)
- return;
- while (fgets(buf, sizeof(buf), f) != NULL) {
- if (buf[0] == '\0')
- continue;
- buf[strlen(buf)-1] = '\0';
- if (ref++ == (int)reference)
- break;
- }
- fclose(f);
- if (current_search_provider.name != NULL)
- free(current_search_provider.name);
- current_search_provider.name = strdup(strtok(buf, "|"));
- if (current_search_provider.hostname != NULL)
- free(current_search_provider.hostname);
- current_search_provider.hostname = strdup(strtok(NULL, "|"));
- if (current_search_provider.searchstring != NULL)
- free(current_search_provider.searchstring);
- current_search_provider.searchstring = strdup(strtok(NULL, "|"));
- if (current_search_provider.ico != NULL)
- free(current_search_provider.ico);
- current_search_provider.ico = strdup(strtok(NULL, "|"));
- return;
+ return NSERROR_OK;
}
/**
- * escapes a search term then creates the appropriate url from it
+ * parse search providers from a memory block.
+ *
+ * \param providersd The provider info data.
+ * \param providers_size The size of the provider data.
+ * \param providers_out The resulting provider array.
+ * \param providers_count The number of providers in the output array.
+ * \return NSERROR_OK on success or error code on faliure.
*/
-
-char *search_web_from_term(const char *searchterm)
+static nserror
+parse_providers(char *providersd,
+ size_t providers_size,
+ struct search_provider **providers_out,
+ size_t *providers_count)
{
- char *encsearchterm, *url;
- if (url_escape(searchterm, 0, true, NULL, &encsearchterm)
- != URL_FUNC_OK)
- return strdup(searchterm);
- url = search_web_get_url(encsearchterm);
- free(encsearchterm);
- return url;
-}
+ size_t pcount = 0; /* number of providers */
+ size_t pidx;
+ char *nl = providersd;
+ struct search_provider *providers;
+
+ /* count newlines */
+ while (nl != NULL) {
+ nl = strchr(nl, '\n');
+ if (nl != NULL) {
+ nl++;
+ pcount+=1;
+ }
+ }
-/** accessor for global search provider name */
+ if (pcount == 0) {
+ return NSERROR_INVALID;
+ }
-char *search_web_provider_name(void)
-{
- if (current_search_provider.name)
- return strdup(current_search_provider.name);
- return strdup("google");
-}
+ providers = malloc(pcount * sizeof(*providers));
+ if (providers == NULL) {
+ return NSERROR_NOMEM;
+ }
-/** accessor for global search provider hostname */
+ nl = providersd;
+ for (pidx = 0; pidx < pcount; pidx++) {
+ providers[pidx].name = nl;
+ nl = strchr(nl, '|');
+ if (nl == NULL) {
+ free(providers);
+ return NSERROR_INVALID;
+ }
+ *nl = 0;
+ nl++;
+
+ providers[pidx].hostname = nl;
+ nl = strchr(nl, '|');
+ if (nl == NULL) {
+ free(providers);
+ return NSERROR_INVALID;
+ }
+ *nl = 0;
+ nl++;
+
+ providers[pidx].searchstring = nl;
+ nl = strchr(nl, '|');
+ if (nl == NULL) {
+ free(providers);
+ return NSERROR_INVALID;
+ }
+ *nl = 0;
+ nl++;
+
+ providers[pidx].ico = nl;
+ nl = strchr(nl, '|');
+ if (nl == NULL) {
+ free(providers);
+ return NSERROR_INVALID;
+ }
+ *nl = 0;
+ nl++;
+
+ /* skip newline */
+ nl = strchr(nl, '\n');
+ if (nl == NULL) {
+ free(providers);
+ return NSERROR_INVALID;
+ }
+ nl++;
-char *search_web_provider_host(void)
-{
- if (current_search_provider.hostname)
- return strdup(current_search_provider.hostname);
- return strdup("www.google.com");
-}
+ providers[pidx].ico_handle = NULL;
+ }
-/** accessor for global search provider ico name */
+ *providers_out = providers;
+ *providers_count = pcount;
-char *search_web_ico_name(void)
-{
- if (current_search_provider.ico)
- return strdup(current_search_provider.ico);
- return strdup("http://www.google.com/favicon.ico");
+ return NSERROR_OK;
}
/**
- * creates a full url from an encoded search term
+ * create a url for a search provider and a term
+ *
+ * \param The provider to use.
+ * \param term The term being searched for.
+ * \param url_out The resulting url.
+ * \return NSERROR_OK on sucess or appropriate error code.
*/
-
-char *search_web_get_url(const char *encsearchterm)
+static nserror
+make_search_nsurl(struct search_provider *provider,
+ const char *term,
+ nsurl **url_out)
{
- char *pref, *ret;
- int len;
- if (current_search_provider.searchstring)
- pref = strdup(current_search_provider.searchstring);
- else
- pref = strdup("http://www.google.com/search?q=%s");
- if (pref == NULL) {
- warn_user(messages_get("NoMemory"), 0);
- return NULL;
- }
- len = strlen(encsearchterm) + strlen(pref);
- ret = malloc(len -1); /* + '\0' - "%s" */
- if (ret == NULL) {
- warn_user(messages_get("NoMemory"), 0);
- free(pref);
- return NULL;
- }
- snprintf(ret, len-1, pref, encsearchterm);
- free(pref);
- return ret;
+ nserror ret;
+ nsurl *url;
+ char *eterm; /* escaped term */
+ char *searchstr; /* the providers search string */
+ char *urlstr; /* the escaped term substituted into the provider */
+ char *urlstro;
+ size_t urlstr_len;
+
+ /* escape the search term and join it to the search url */
+ ret = url_escape(term, 0, true, NULL, &eterm);
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+
+ searchstr = provider->searchstring;
+
+ urlstr_len = strlen(searchstr) + strlen(eterm) + 1;
+ urlstro = urlstr = malloc(urlstr_len);
+ if (urlstr == NULL) {
+ free(eterm);
+ return NSERROR_NOMEM;
+ }
+
+ /* composite search url */
+ for ( ; *searchstr != 0; searchstr++, urlstro++) {
+ *urlstro = *searchstr;
+ if ((*searchstr == '%') && (searchstr[1] == 's')) {
+ searchstr++; /* skip % */
+ memcpy(urlstro, eterm, strlen(eterm));
+ urlstro += strlen(eterm) - 1;
+ }
+ }
+ free(eterm);
+ *urlstro = '\0'; /* ensure string is NULL-terminated */
+
+ ret = nsurl_create(urlstr, &url);
+ free(urlstr);
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+
+ *url_out = url;
+ return NSERROR_OK;
}
/**
- * function to retrieve the search web ico, from cache / from local
- * filesystem / from the web
- * \param localdefault true when there is no appropriate favicon
- * update the search_ico cache else delay until fetcher callback
+ * callback for hlcache icon fetch events.
*/
+static nserror
+search_web_ico_callback(hlcache_handle *ico,
+ const hlcache_event *event,
+ void *pw)
+{
+ struct search_provider *provider = pw;
+
+ switch (event->type) {
+
+ case CONTENT_MSG_DONE:
+ LOG(("icon '%s' retrived",
+ nsurl_access(hlcache_handle_get_url(ico))));
+ guit->search_web->provider_update(provider->name,
+ content_get_bitmap(ico));
+ break;
+
+ case CONTENT_MSG_ERROR:
+ LOG(("icon %s error: %s",
+ nsurl_access(hlcache_handle_get_url(ico)),
+ event->data.error));
+ hlcache_handle_release(ico);
+ /* clear reference to released handle */
+ provider->ico_handle = NULL;
+ break;
+
+ default:
+ break;
+ }
-void search_web_retrieve_ico(bool localdefault)
+ return NSERROR_OK;
+}
+
+/* exported interface documented in desktop/searchweb.h */
+nserror
+search_web_omni(const char *term,
+ enum search_web_omni_flags flags,
+ struct nsurl **url_out)
{
-#if !defined(WITH_BMP)
- /* This function is of limited use when no BMP support
- * is enabled, given the icons it is fetching are BMPs
- * more often than not. This also avoids an issue where
- * all this code goes mad if BMP support is not enabled.
- */
- return;
-#else
- content_type accept = CONTENT_IMAGE;
- char *url;
- nserror error;
- nsurl *icon_nsurl;
+ nserror ret;
+ nsurl *url;
+ char *eterm; /* encoded/altered search term */
+
+ if ((flags & SEARCH_WEB_OMNI_SEARCHONLY) == 0) {
+
+ /* first check to see if the term is a url */
+ ret = nsurl_create(term, &url);
+ if (ret == NSERROR_OK) {
+ *url_out = url;
+ return NSERROR_OK;
+ }
+
+ /* try with adding default scheme */
+ eterm = malloc(strlen(term) + SLEN("http://") + 1);
+ if (eterm == NULL) {
+ return NSERROR_NOMEM;
+ }
+ sprintf(eterm, "http://%s", term);
+ ret = nsurl_create(eterm, &url);
+ free(eterm);
+ if (ret == NSERROR_OK) {
+ *url_out = url;
+ return NSERROR_OK;
+ }
- if (localdefault) {
- if (search_default_ico_location == NULL)
- return;
- url = malloc(SLEN("file://") + strlen(
- search_default_ico_location) + 1);
- if (url == NULL) {
- warn_user(messages_get("NoMemory"), 0);
- return;
+ /* do not pass to search if user has disabled the option */
+ if (nsoption_bool(search_url_bar) == false) {
+ return NSERROR_BAD_URL;
}
- strcpy(url, "file://");
- strcat(url, search_default_ico_location);
- } else {
- url = search_web_ico_name();
}
- if (url == NULL) {
- warn_user(messages_get("NoMemory"), 0);
- return;
+ /* must be initialised */
+ if (search_web_ctx.providers == NULL) {
+ return NSERROR_INIT_FAILED;
}
- error = nsurl_create(url, &icon_nsurl);
- if (error != NSERROR_OK) {
- free(url);
- search_ico = NULL;
- return;
+ /* turn search into a nsurl */
+ ret = make_search_nsurl(&search_web_ctx.providers[search_web_ctx.current], term, &url);
+ if (ret != NSERROR_OK) {
+ return ret;
}
- error = hlcache_handle_retrieve(icon_nsurl, 0, NULL, NULL,
- search_web_ico_callback, NULL, NULL, accept,
- &search_ico);
+ *url_out = url;
+ return NSERROR_OK;
+}
- nsurl_unref(icon_nsurl);
+/* exported interface documented in desktop/searchweb.h */
+nserror search_web_select_provider(int selection)
+{
+ struct search_provider *provider;
+ struct bitmap *ico_bitmap = NULL;
- if (error != NSERROR_OK)
- search_ico = NULL;
+ /* must be initialised */
+ if (search_web_ctx.providers == NULL) {
+ return NSERROR_INIT_FAILED;
+ }
- free(url);
-#endif /* WITH_BMP */
-}
+ /* negative value just selects whatevers current */
+ if (selection >= 0) {
+ /* ensure selection lies within acceptable range */
+ if ((size_t)selection < search_web_ctx.providers_count) {
+ search_web_ctx.current = selection;
+ } else {
+ /* out of range */
+ search_web_ctx.current = 0;
+ }
+ }
-/**
- * returns a reference to the static global search_ico [ / NULL]
- * caller may adjust ico's settings; clearing / free()ing is the core's
- * responsibility
- */
+ provider = &search_web_ctx.providers[search_web_ctx.current];
-hlcache_handle *search_web_ico(void)
-{
- return search_ico;
-}
+ /* set the icon now (if we can) at least to the default */
+ if (provider->ico_handle != NULL) {
+ ico_bitmap = content_get_bitmap(provider->ico_handle);
+ }
+ if ((ico_bitmap == NULL) &&
+ (search_web_ctx.default_ico_handle != NULL)) {
+ ico_bitmap = content_get_bitmap(search_web_ctx.default_ico_handle);
+ }
+ /* update the callback with the provider change. Bitmap may
+ * be NULL at this point.
+ */
+ guit->search_web->provider_update(provider->name, ico_bitmap);
-/**
- * Cleans up any remaining resources during shutdown.
- */
-void search_web_cleanup(void)
-{
- if (search_ico != NULL) {
- hlcache_handle_release(search_ico);
- search_ico = NULL;
+
+ /* if the providers icon has not been retrived get it now */
+ if (provider->ico_handle == NULL) {
+ nsurl *icon_nsurl;
+ nserror ret;
+
+ /* create search icon url */
+ ret = nsurl_create(provider->ico, &icon_nsurl);
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+
+ ret = hlcache_handle_retrieve(icon_nsurl, 0, NULL, NULL,
+ search_web_ico_callback,
+ provider,
+ NULL, CONTENT_IMAGE,
+ &provider->ico_handle);
+ nsurl_unref(icon_nsurl);
+ if (ret != NSERROR_OK) {
+ provider->ico_handle = NULL;
+ return ret;
+ }
}
+
+ return NSERROR_OK;
}
/**
- * callback function to cache ico then notify front when successful
- * else retry default from local file system
+ * callback for hlcache icon fetch events.
*/
-
-#ifdef WITH_BMP
-nserror search_web_ico_callback(hlcache_handle *ico,
- const hlcache_event *event, void *pw)
+static nserror
+default_ico_callback(hlcache_handle *ico,
+ const hlcache_event *event,
+ void *pw)
{
+ struct search_web_ctx_s *ctx = pw;
+
switch (event->type) {
- case CONTENT_MSG_LOADING:
- case CONTENT_MSG_READY:
- break;
case CONTENT_MSG_DONE:
- LOG(("got favicon '%s'", nsurl_access(hlcache_handle_get_url(ico))));
- gui_window_set_search_ico(search_ico);
+ LOG(("default icon '%s' retrived",
+ nsurl_access(hlcache_handle_get_url(ico))));
+
+ /* only set to default icon if providers icon has no handle */
+ if (ctx->providers[search_web_ctx.current].ico_handle == NULL) {
+ guit->search_web->provider_update(
+ ctx->providers[search_web_ctx.current].name,
+ content_get_bitmap(ico));
+ }
break;
case CONTENT_MSG_ERROR:
- LOG(("favicon %s error: %s",
- nsurl_access(hlcache_handle_get_url(ico)),
- event->data.error));
- hlcache_handle_release(search_ico);
- search_ico = NULL;
- search_web_retrieve_ico(true);
+ LOG(("icon %s error: %s",
+ nsurl_access(hlcache_handle_get_url(ico)),
+ event->data.error));
+ hlcache_handle_release(ico);
+ /* clear reference to released handle */
+ ctx->default_ico_handle = NULL;
break;
- case CONTENT_MSG_STATUS:
+ default:
break;
+ }
- default:
- assert(0);
+ return NSERROR_OK;
+}
+
+/* exported interface documented in desktop/searchweb.h */
+ssize_t search_web_iterate_providers(ssize_t from, const char **name)
+{
+ if (from < 0)
+ return -1;
+
+ if ((size_t)from >= search_web_ctx.providers_count)
+ return -1;
+
+ *name = search_web_ctx.providers[from].name;
+
+ return from + 1;
+}
+
+
+/* exported interface documented in desktop/searchweb.h */
+nserror search_web_init(const char *provider_fname)
+{
+ nserror ret;
+ char *providers;
+ size_t providers_size;
+ nsurl *icon_nsurl;
+
+ /* create search icon url */
+ ret = nsurl_create(default_search_icon_url, &icon_nsurl);
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+
+ /* get a list of providers */
+ ret = read_providers(provider_fname, &providers, &providers_size);
+ if (ret != NSERROR_OK) {
+ providers = strdup(default_providers);
+ if (providers == NULL) {
+ return NSERROR_NOMEM;
+ }
+ providers_size = strlen(providers);
}
+ /* parse list of providers */
+ ret = parse_providers(providers,
+ providers_size,
+ &search_web_ctx.providers,
+ &search_web_ctx.providers_count);
+ if (ret != NSERROR_OK) {
+ free(providers);
+ return ret;
+ }
+
+ /* get default search icon */
+ ret = hlcache_handle_retrieve(icon_nsurl, 0, NULL, NULL,
+ default_ico_callback,
+ &search_web_ctx,
+ NULL, CONTENT_IMAGE,
+ &search_web_ctx.default_ico_handle);
+ nsurl_unref(icon_nsurl);
+ if (ret != NSERROR_OK) {
+ search_web_ctx.default_ico_handle = NULL;
+ free(search_web_ctx.providers);
+ search_web_ctx.providers = NULL;
+ free(providers);
+ return ret;
+ }
+
+
+ return NSERROR_OK;
+}
+
+/* exported interface documented in desktop/searchweb.h */
+nserror search_web_finalise(void)
+{
+ size_t pidx;
+
+ /* must be initialised */
+ if (search_web_ctx.providers == NULL) {
+ return NSERROR_INIT_FAILED;
+ }
+
+ if (search_web_ctx.default_ico_handle != NULL) {
+ hlcache_handle_release(search_web_ctx.default_ico_handle);
+ }
+ for (pidx = 0; pidx < search_web_ctx.providers_count; pidx++) {
+ if (search_web_ctx.providers[pidx].ico_handle != NULL) {
+ hlcache_handle_release(search_web_ctx.providers[pidx].ico_handle);
+ }
+ }
+
+ /* All the search provider data is held in a single block for
+ * efficiency.
+ */
+ free(search_web_ctx.providers[0].name);
+
+ free(search_web_ctx.providers);
+ search_web_ctx.providers = NULL;
+
return NSERROR_OK;
}
-#endif /* WITH_BMP */
diff --git a/desktop/searchweb.h b/desktop/searchweb.h
index 3920f3c6e..b3b3902cf 100644
--- a/desktop/searchweb.h
+++ b/desktop/searchweb.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2009 Mark Benjamin <netsurf-browser.org.MarkBenjamin@dfgh.net>
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -16,65 +16,105 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+/**
+ * \file desktop/searchweb.h
+ * \brief core web search facilities interface.
+ */
+
#ifndef _NETSURF_DESKTOP_SEARCH_WEB_H_
#define _NETSURF_DESKTOP_SEARCH_WEB_H_
-#include <ctype.h>
-#include <stdbool.h>
-#include <string.h>
-
-struct browser_window;
-struct hlcache_handle;
-
-extern char *search_engines_file_location;
-extern char *search_default_ico_location;
+struct bitmap;
/**
- * open new tab/window for web search term
+ * Graphical user interface browser web search function table.
+ *
*/
-bool search_web_new_window(struct browser_window *bw, const char *searchterm);
+struct gui_search_web_table {
+ /**
+ * called when the search provider details are updated.
+ *
+ * \param provider_name The name of the provider.
+ * \param ico_bitmap The bitmap of the search icon may be NULL
+ * if no icon is yet available.
+ */
+ nserror (*provider_update)(const char *provider_name, struct bitmap *ico_bitmap);
+};
/**
- * retrieve full search url from unencoded search term
+ * Flags which alter the behaviour of the omin search.
*/
-char *search_web_from_term(const char *searchterm);
+enum search_web_omni_flags {
+ SEARCH_WEB_OMNI_NONE = 0, /**< no changes to default operation */
+ SEARCH_WEB_OMNI_SEARCHONLY = 1, /**< The search does not attempt to
+ * interpret the url as a url before
+ * using it as a search term.
+ */
+};
/**
- * retrieve full search url from encoded web search term
+ * Generate a nsurl from a search term.
+ *
+ * This interface obtains a url appropriate for the given search
+ * term. The flags allow control over the operation. By default the
+ * operations are:
+ * - interpret the \a term as a url
+ * - if missing a scheme as a http: url
+ * - combined with the search providers url into a url for that provider.
+ *
+ * \param term The search term.
+ * \param flags Flags to control operation.
+ * \param url_out The ourput url on success.
+ * \return NSERROR_OK on success or appropriate error code.
*/
-char *search_web_get_url(const char *encsearchterm);
+nserror search_web_omni(const char *term, enum search_web_omni_flags flags, struct nsurl **url_out);
/**
- * cache details of web search provider from file
+ * Change the currently selected web search provider.
+ *
+ * \param selection Index of the search provider to select or -1 to
+ * reselect the current provider
+ * \return NSERROR_OK on success or appropriate error code.
*/
-void search_web_provider_details(int reference);
+nserror search_web_select_provider(int selection);
-/**
- * retrieve name of web search provider
- */
-char *search_web_provider_name(void);
/**
- * retrieve hostname of web search provider
+ * Iterate the search providers, returning their names.
+ *
+ * \param from Index to start iteration from. Use 0 to begin iteration.
+ * Use the value returned from search_web_iterate_providers to
+ * continue an iteration.
+ * \param name Pointer to fill in with the search provider name requested.
+ * \return -1 if there are no more, otherwise the iterator for the next item.
+ *
+ * \verb
+ * ssize_t iter;
+ * const char *name;
+ * ...
+ * for (iter = search_web_iterate_providers(0, &name);
+ * iter != -1;
+ * iter = search_web_iterate_providers(iter, &name)) {
+ * do_something_with(name);
+ * }
+ * \endverb
*/
-char *search_web_provider_host(void);
+ssize_t search_web_iterate_providers(ssize_t from, const char **name);
+
/**
- * retrieve name of .ico for search bar
+ * Initialise the web search operations.
+ *
+ * \param provider_fname Path to web search providers file.
+ * \return NSERROR_OK on successful initialisation or appropriate error code.
*/
-char *search_web_ico_name(void);
+nserror search_web_init(const char *provider_fname);
/**
- * check whether an URL is in fact a search term
- * \param url the url being checked
- * \return true for url, false for search
+ * Finalise the web search operations freeing all resources.
+ *
+ * \return NSERROR_OK on success or appropriate error code.
*/
-bool search_is_url(const char *url);
-
-void search_web_retrieve_ico(bool localdefault);
-
-struct hlcache_handle *search_web_ico(void);
-
-void search_web_cleanup(void);
+nserror search_web_finalise(void);
#endif
diff --git a/desktop/selection.c b/desktop/selection.c
index 13a1293e3..34292fdce 100644
--- a/desktop/selection.c
+++ b/desktop/selection.c
@@ -29,7 +29,7 @@
#include <dom/dom.h>
#include "desktop/browser_private.h"
-#include "desktop/gui.h"
+#include "desktop/gui_factory.h"
#include "desktop/mouse.h"
#include "desktop/plotters.h"
#include "desktop/save_text.h"
@@ -274,7 +274,7 @@ bool selection_click(struct selection *s, browser_mouse_state mouse,
(modkeys && (mouse & BROWSER_MOUSE_DRAG_2)))) {
/* drag-saving selection */
char *sel = selection_get_copy(s);
- gui_drag_save_selection(top->window, sel);
+ guit->window->drag_save_selection(top->window, sel);
free(sel);
}
else if (!modkeys) {
@@ -293,7 +293,7 @@ bool selection_click(struct selection *s, browser_mouse_state mouse,
s->drag_state = DRAG_END;
- gui_start_selection(top->window);
+ guit->window->start_selection(top->window);
}
else if (mouse & BROWSER_MOUSE_DRAG_2) {
@@ -312,7 +312,7 @@ bool selection_click(struct selection *s, browser_mouse_state mouse,
s->drag_state = DRAG_START;
}
- gui_start_selection(top->window);
+ guit->window->start_selection(top->window);
}
else if (mouse & BROWSER_MOUSE_CLICK_2) {
@@ -844,7 +844,7 @@ bool selection_copy_to_clipboard(struct selection *s)
return false;
}
- gui_set_clipboard(sel_string.buffer, sel_string.length,
+ guit->clipboard->set(sel_string.buffer, sel_string.length,
sel_string.styles, sel_string.n_styles);
free(sel_string.buffer);
diff --git a/desktop/sslcert_viewer.c b/desktop/sslcert_viewer.c
index e0e87fbbe..5280e094a 100644
--- a/desktop/sslcert_viewer.c
+++ b/desktop/sslcert_viewer.c
@@ -24,9 +24,9 @@
#include <assert.h>
#include <stdlib.h>
-
#include "content/fetch.h"
#include "content/urldb.h"
+#include "content/hlcache.h"
#include "desktop/sslcert_viewer.h"
#include "desktop/treeview.h"
#include "utils/messages.h"
@@ -47,7 +47,7 @@ enum sslcert_viewer_field {
/** ssl certificate verification context. */
struct sslcert_session_data {
- const struct ssl_cert_info *certs; /**< Certificates */
+ struct ssl_cert_info *certs; /**< Certificates */
unsigned long num; /**< Number of certificates in chain */
nsurl *url; /**< The url of the certificate */
llcache_query_response cb; /**< Cert accept/reject callback */
@@ -394,8 +394,15 @@ static void sslcert_cleanup_session(struct sslcert_session_data *ssl_d)
{
assert(ssl_d != NULL);
- if (ssl_d->url)
+ if (ssl_d->url) {
nsurl_unref(ssl_d->url);
+ ssl_d->url = NULL;
+ }
+
+ if (ssl_d->certs) {
+ free(ssl_d->certs);
+ ssl_d->certs = NULL;
+ }
free(ssl_d);
}
@@ -439,12 +446,19 @@ nserror sslcert_viewer_create_session_data(unsigned long num, nsurl *url,
data = malloc(sizeof(struct sslcert_session_data));
if (data == NULL) {
- warn_user("NoMemory", 0);
*ssl_d = NULL;
return NSERROR_NOMEM;
}
- data->certs = certs;
+ /* copy certificate data */
+ data->certs = malloc(num * sizeof(struct ssl_cert_info));
+ if (data->certs == NULL) {
+ free(data);
+ *ssl_d = NULL;
+ return NSERROR_NOMEM;
+ }
+ memcpy(data->certs, certs, num * sizeof(struct ssl_cert_info));
+
data->url = nsurl_ref(url);
data->num = num;
data->cb = cb;
@@ -486,6 +500,9 @@ void sslcert_viewer_redraw(struct sslcert_session_data *ssl_d,
int x, int y, struct rect *clip,
const struct redraw_context *ctx)
{
+ assert(ssl_d != NULL &&
+ "sslcert_viewer_redraw() given bad session data");
+
treeview_redraw(ssl_d->tree, x, y, clip, ctx);
}
diff --git a/desktop/sslcert_viewer.h b/desktop/sslcert_viewer.h
index e02f095f5..d6b0c1b8b 100644
--- a/desktop/sslcert_viewer.h
+++ b/desktop/sslcert_viewer.h
@@ -24,7 +24,6 @@
#include <stdbool.h>
#include <stdint.h>
-#include "desktop/browser.h"
#include "desktop/core_window.h"
#include "desktop/textinput.h"
#include "utils/errors.h"
diff --git a/desktop/system_colour.c b/desktop/system_colour.c
index 4ef170981..178c03536 100644
--- a/desktop/system_colour.c
+++ b/desktop/system_colour.c
@@ -21,45 +21,47 @@
*
*/
+#include <string.h>
+
+#include "utils/config.h"
#include "utils/utils.h"
#include "utils/log.h"
#include "css/utils.h"
-#include "desktop/gui.h"
+#include "desktop/system_colour.h"
#include "utils/nsoption.h"
-
#define colour_list_len ((NSOPTION_SYS_COLOUR_END - NSOPTION_SYS_COLOUR_START) + 1)
static lwc_string *colour_list[colour_list_len];
-static lwc_string **gui_system_colour_pw = NULL;
+static lwc_string **ns_system_colour_pw = NULL;
-bool gui_system_colour_init(void)
+nserror ns_system_colour_init(void)
{
unsigned int ccount;
- if (gui_system_colour_pw != NULL)
- return false;
+ if (ns_system_colour_pw != NULL)
+ return NSERROR_INIT_FAILED;
/* Intern colour strings */
for (ccount = 0; ccount < colour_list_len; ccount++) {
struct nsoption_s *opt;
opt = &nsoptions[ccount + NSOPTION_SYS_COLOUR_START];
- if (lwc_intern_string(opt->key + SLEN("sys_colour_"),
- opt->key_len - SLEN("sys_colour_"),
+ if (lwc_intern_string(opt->key + SLEN("sys_colour_"),
+ opt->key_len - SLEN("sys_colour_"),
&(colour_list[ccount])) != lwc_error_ok) {
- return false;
+ return NSERROR_NOMEM;
}
}
- gui_system_colour_pw = colour_list;
-
- return true;
+ ns_system_colour_pw = colour_list;
+
+ return NSERROR_OK;
}
-void gui_system_colour_finalize(void)
+void ns_system_colour_finalize(void)
{
unsigned int ccount;
@@ -68,7 +70,7 @@ void gui_system_colour_finalize(void)
}
}
-colour gui_system_colour_char(const char *name)
+colour ns_system_colour_char(const char *name)
{
colour ret = 0;
unsigned int ccount;
@@ -83,19 +85,19 @@ colour gui_system_colour_char(const char *name)
return ret;
}
-css_error gui_system_colour(void *pw, lwc_string *name, css_color *colour)
+css_error ns_system_colour(void *pw, lwc_string *name, css_color *colour)
{
unsigned int ccount;
bool match;
for (ccount = 0; ccount < colour_list_len; ccount++) {
- if (lwc_string_caseless_isequal(name,
+ if (lwc_string_caseless_isequal(name,
colour_list[ccount],
&match) == lwc_error_ok && match) {
*colour = ns_color_to_nscss(nsoptions[ccount + NSOPTION_SYS_COLOUR_START].value.c);
return CSS_OK;
}
- }
+ }
return CSS_INVALID;
}
diff --git a/desktop/401login.h b/desktop/system_colour.h
index 1c8140bae..b5d4baad4 100644
--- a/desktop/401login.h
+++ b/desktop/system_colour.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2003 John M Bell <jmb202@ecs.soton.ac.uk>
+ * Copyright 2014 vincent Sanders <vince@netsurf-browser.org>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -16,16 +16,25 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef NETSURF_DESKTOP_401LOGIN_H
-#define NETSURF_DESKTOP_401LOGIN_H
+/** \file
+ * Interface to system colour values.
+ */
+
+#ifndef _NETSURF_DESKTOP_SYSTEM_COLOUR_H_
+#define _NETSURF_DESKTOP_SYSTEM_COLOUR_H_
-#include <stdbool.h>
+#include <libcss/libcss.h>
-#include "utils/config.h"
-#include "utils/nsurl.h"
#include "utils/errors.h"
+#include "desktop/plot_style.h"
+
+/** css callback to obtain named system colours. */
+css_error ns_system_colour(void *pw, lwc_string *name, css_color *color);
+
+/** Obtain a named system colour from a frontend. */
+colour ns_system_colour_char(const char *name);
-void gui_401login_open(nsurl *url, const char *realm,
- nserror (*cb)(bool proceed, void *pw), void *cbpw);
+nserror ns_system_colour_init(void);
+void ns_system_colour_finalize(void);
#endif
diff --git a/desktop/textarea.c b/desktop/textarea.c
index bfa07ad4f..2ba09824d 100644
--- a/desktop/textarea.c
+++ b/desktop/textarea.c
@@ -24,11 +24,13 @@
#include <stdint.h>
#include <string.h>
#include "css/utils.h"
+
#include "desktop/mouse.h"
#include "desktop/textarea.h"
#include "desktop/textinput.h"
#include "desktop/plotters.h"
#include "desktop/scrollbar.h"
+#include "desktop/gui_factory.h"
#include "render/font.h"
#include "utils/log.h"
#include "utils/utf8.h"
@@ -160,6 +162,7 @@ static void textarea_normalise_text(struct textarea *ta,
unsigned int b_start, unsigned int b_len)
{
bool multi = (ta->flags & TEXTAREA_MULTILINE) ? true : false;
+ struct textarea_msg msg;
unsigned int index;
/* Remove CR characters. If it's a CRLF pair delete the CR, or replace
@@ -187,6 +190,25 @@ static void textarea_normalise_text(struct textarea *ta,
ta->text.data[b_start + index] = ' ';
}
+ /* Build text modified message */
+ msg.ta = ta;
+ msg.type = TEXTAREA_MSG_TEXT_MODIFIED;
+ msg.data.modified.text = ta->text.data;
+ msg.data.modified.len = ta->text.len;
+
+ /* Pass message to client */
+ ta->callback(ta->data, &msg);
+}
+
+
+/**
+ * Reset the selection (no redraw)
+ *
+ * \param ta Text area
+ */
+static inline void textarea_reset_selection(struct textarea *ta)
+{
+ ta->sel_start = ta->sel_end = -1;
}
@@ -1408,7 +1430,7 @@ static bool textarea_replace_text_internal(struct textarea *ta, size_t b_start,
/* Place CUTs on clipboard */
if (add_to_clipboard) {
- gui_set_clipboard(ta->show->data + b_start, b_end - b_start,
+ guit->clipboard->set(ta->show->data + b_start, b_end - b_start,
NULL, 0);
}
@@ -1758,13 +1780,14 @@ static void textarea_setup_text_offsets(struct textarea *ta)
if (ta->flags & TEXTAREA_MULTILINE) {
/* Multiline textarea */
text_y_offset += ta->pad_top;
- text_y_offset_baseline += (ta->line_height * 3 + 2) / 4 +
- ta->pad_top;
+ text_y_offset_baseline +=
+ (ta->line_height * 3 + 2) / 4 + ta->pad_top;
} else {
/* Single line text area; text is vertically centered */
int vis_height = ta->vis_height - 2 * ta->border_width;
text_y_offset += (vis_height - ta->line_height + 1) / 2;
- text_y_offset_baseline += (vis_height * 3 + 2) / 4;
+ text_y_offset_baseline +=
+ (2 * vis_height + ta->line_height + 2) / 4;
}
ta->text_y_offset = text_y_offset;
@@ -1872,9 +1895,9 @@ struct textarea *textarea_create(const textarea_flags flags,
ret->show = &ret->text;
}
- ret->line_height = FIXTOINT(FDIV((FMUL(FLTTOFIX(1.3),
- FMUL(nscss_screen_dpi, INTTOFIX((setup->text.size))))),
- FONT_SIZE_SCALE * F_72));
+ ret->line_height = FIXTOINT(FMUL(FLTTOFIX(1.3), FDIV(FMUL(
+ nscss_screen_dpi, FDIV(INTTOFIX(setup->text.size),
+ INTTOFIX(FONT_SIZE_SCALE))), F_72)));
ret->caret_pos.line = ret->caret_pos.byte_off = -1;
ret->caret_x = 0;
@@ -2067,10 +2090,17 @@ void textarea_redraw(struct textarea *ta, int x, int y, colour bg, float scale,
r = *clip;
- if (r.x1 < x || r.x0 > x + ta->vis_width || r.y1 < y ||
- r.y0 > y + ta->vis_height)
- /* Textarea outside the clipping rectangle */
+ /* Nothing to render if textarea is outside clip rectangle */
+ if (r.x1 < x || r.y1 < y)
return;
+ if (scale == 1.0) {
+ if (r.x0 > x + ta->vis_width || r.y0 > y + ta->vis_height)
+ return;
+ } else {
+ if (r.x0 > x + ta->vis_width * scale ||
+ r.y0 > y + ta->vis_height * scale)
+ return;
+ }
if (ta->lines == NULL)
/* Nothing to redraw */
@@ -2146,7 +2176,7 @@ void textarea_redraw(struct textarea *ta, int x, int y, colour bg, float scale,
scale)
r.y1 = y + (ta->vis_height - ta->border_width -
(ta->bar_x != NULL ? SCROLLBAR_WIDTH :
- 0) * scale);
+ 0)) * scale;
}
if (line0 > 0)
@@ -2253,6 +2283,8 @@ void textarea_redraw(struct textarea *ta, int x, int y, colour bg, float scale,
&right);
} else {
right = ta->lines[line].width;
+ if (scale != 1.0)
+ right *= scale;
}
right += x + ta->border_width + ta->pad_left -
ta->scroll_x;
@@ -2380,8 +2412,9 @@ bool textarea_keypress(struct textarea *ta, uint32_t key)
length, false, &byte_delta, &r))
return false;
+ redraw = true;
caret = ta->sel_end;
- textarea_clear_selection(ta);
+ textarea_reset_selection(ta);
} else {
if (!textarea_replace_text(ta, caret, caret,
utf8, length, false, &byte_delta, &r))
@@ -2411,8 +2444,9 @@ bool textarea_keypress(struct textarea *ta, uint32_t key)
"", 0, false, &byte_delta, &r))
return false;
+ redraw = true;
caret = ta->sel_end;
- textarea_clear_selection(ta);
+ textarea_reset_selection(ta);
} else if (caret > 0) {
b_off = utf8_prev(ta->show->data, caret);
if (!textarea_replace_text(ta, b_off, caret,
@@ -2431,8 +2465,9 @@ bool textarea_keypress(struct textarea *ta, uint32_t key)
"", 0, false, &byte_delta, &r))
return false;
+ redraw = true;
caret = ta->sel_end;
- textarea_clear_selection(ta);
+ textarea_reset_selection(ta);
} else if (caret < ta->show->len - 1) {
b_off = utf8_next(ta->show->data,
ta->show->len - 1, caret);
@@ -2456,8 +2491,9 @@ bool textarea_keypress(struct textarea *ta, uint32_t key)
&byte_delta, &r))
return false;
+ redraw = true;
caret = ta->sel_end;
- textarea_clear_selection(ta);
+ textarea_reset_selection(ta);
} else {
if (!textarea_replace_text(ta, caret, caret,
"\n", 1, false,
@@ -2475,7 +2511,7 @@ bool textarea_keypress(struct textarea *ta, uint32_t key)
if (readonly)
break;
- gui_get_clipboard(&clipboard, &clipboard_length);
+ guit->clipboard->get(&clipboard, &clipboard_length);
if (clipboard == NULL)
return false;
@@ -2486,8 +2522,9 @@ bool textarea_keypress(struct textarea *ta, uint32_t key)
false, &byte_delta, &r))
return false;
+ redraw = true;
caret = ta->sel_end;
- textarea_clear_selection(ta);
+ textarea_reset_selection(ta);
} else {
if (!textarea_replace_text(ta,
caret, caret,
@@ -2510,9 +2547,10 @@ bool textarea_keypress(struct textarea *ta, uint32_t key)
"", 0, true, &byte_delta, &r))
return false;
+ redraw = true;
caret = ta->sel_end;
caret += byte_delta;
- textarea_clear_selection(ta);
+ textarea_reset_selection(ta);
}
break;
case KEY_ESCAPE:
@@ -2684,8 +2722,9 @@ bool textarea_keypress(struct textarea *ta, uint32_t key)
ta->sel_start, ta->sel_end,
"", 0, false, &byte_delta, &r))
return false;
+ redraw = true;
caret = ta->sel_end;
- textarea_clear_selection(ta);
+ textarea_reset_selection(ta);
} else {
if (ta->lines[line].b_length != 0) {
/* Delete line */
@@ -2716,8 +2755,9 @@ bool textarea_keypress(struct textarea *ta, uint32_t key)
ta->sel_start, ta->sel_end,
"", 0, false, &byte_delta, &r))
return false;
+ redraw = true;
caret = ta->sel_end;
- textarea_clear_selection(ta);
+ textarea_reset_selection(ta);
} else {
b_len = ta->lines[line].b_length;
b_off = ta->lines[line].b_start + b_len;
@@ -2737,8 +2777,9 @@ bool textarea_keypress(struct textarea *ta, uint32_t key)
ta->sel_start, ta->sel_end,
"", 0, false, &byte_delta, &r))
return false;
+ redraw = true;
caret = ta->sel_end;
- textarea_clear_selection(ta);
+ textarea_reset_selection(ta);
} else {
if (!textarea_replace_text(ta,
caret - ta->caret_pos.byte_off,
@@ -3023,7 +3064,7 @@ bool textarea_clear_selection(struct textarea *ta)
break;
/* Clear selection and redraw */
- ta->sel_start = ta->sel_end = -1;
+ textarea_reset_selection(ta);
msg.ta = ta;
msg.type = TEXTAREA_MSG_REDRAW_REQUEST;
diff --git a/desktop/textarea.h b/desktop/textarea.h
index 016f15a10..1c24dd1cc 100644
--- a/desktop/textarea.h
+++ b/desktop/textarea.h
@@ -51,7 +51,8 @@ typedef enum {
TEXTAREA_MSG_DRAG_REPORT, /**< Textarea drag start/end report */
TEXTAREA_MSG_SELECTION_REPORT, /**< Textarea text selection presence */
TEXTAREA_MSG_REDRAW_REQUEST, /**< Textarea redraw request */
- TEXTAREA_MSG_CARET_UPDATE /**< Textarea caret */
+ TEXTAREA_MSG_CARET_UPDATE, /**< Textarea caret */
+ TEXTAREA_MSG_TEXT_MODIFIED /**< Textarea text modified */
} textarea_msg_type;
struct textarea_msg {
@@ -77,6 +78,10 @@ struct textarea_msg {
struct rect *clip; /**< Carret clip rect */
} pos; /**< With _CARET_SET_POS */
} caret; /**< With _CARET_UPDATE */
+ struct {
+ const char *text; /**< UTF8 text */
+ unsigned int len; /**< Byte length of text */
+ } modified; /**< With _TEXT_MODIFIED */
} data; /**< Depends on msg type */
};
diff --git a/desktop/textinput.c b/desktop/textinput.c
index e804829fa..fd6ae9ff1 100644
--- a/desktop/textinput.c
+++ b/desktop/textinput.c
@@ -30,7 +30,7 @@
#include <dom/dom.h>
#include "desktop/browser_private.h"
-#include "desktop/gui.h"
+#include "desktop/gui_factory.h"
#include "desktop/mouse.h"
#include "desktop/scrollbar.h"
#include "desktop/selection.h"
@@ -85,7 +85,7 @@ void browser_window_place_caret(struct browser_window *bw, int x, int y,
/* TODO: intersect with bw viewport */
- gui_window_place_caret(root_bw->window, x, y, height * bw->scale, crp);
+ guit->window->place_caret(root_bw->window, x, y, height * bw->scale, crp);
/* Set focus browser window */
root_bw->focus = bw;
@@ -110,8 +110,9 @@ void browser_window_remove_caret(struct browser_window *bw, bool only_hide)
else
root_bw->can_edit = false;
- if (root_bw->window)
- gui_window_remove_caret(root_bw->window);
+ if (root_bw->window) {
+ guit->window->remove_caret(root_bw->window);
+ }
}
diff --git a/desktop/tree.c b/desktop/tree.c
index 6097c22a6..c29afa761 100644
--- a/desktop/tree.c
+++ b/desktop/tree.c
@@ -36,7 +36,6 @@
#include "utils/log.h"
#include "utils/messages.h"
#include "utils/utils.h"
-#include "utils/url.h"
struct tree {
unsigned int flags; /* Tree flags */
@@ -133,6 +132,10 @@ static bool treeview_test_init(struct tree *tree)
switch (tree->flags) {
case TREE_COOKIES:
+ assert(ssl_current_session == NULL &&
+ "Call sslcert_viewer_init directly, "
+ "this compat. layer can't cope with simultanious "
+ "sslcert viewers");
err = cookie_manager_init(&cw_t, (struct core_window *)tree);
if (err != NSERROR_OK)
warn_user("Couldn't init new cookie manager.", 0);
@@ -180,7 +183,10 @@ static bool treeview_test_fini(struct tree *tree)
warn_user("Couldn't finalise hotlist.", 0);
break;
case TREE_SSLCERT:
+ assert(ssl_current_session != NULL &&
+ "Can't use sslcert window after sslcert_viewer_fini()");
err = sslcert_viewer_fini(ssl_current_session);
+ ssl_current_session = NULL;
if (err != NSERROR_OK)
warn_user("Couldn't finalise sslcert viewer.", 0);
break;
@@ -206,7 +212,9 @@ static bool treeview_test_redraw(struct tree *tree, int x, int y,
switch (tree->flags) {
case TREE_SSLCERT:
- sslcert_viewer_redraw(ssl_current_session, x, y, &clip, ctx);
+ if (ssl_current_session != NULL) {
+ sslcert_viewer_redraw(ssl_current_session, x, y, &clip, ctx);
+ }
return true;
case TREE_COOKIES:
cookie_manager_redraw(x, y, &clip, ctx);
@@ -227,6 +235,8 @@ static bool treeview_test_mouse_action(struct tree *tree,
{
switch (tree->flags) {
case TREE_SSLCERT:
+ assert(ssl_current_session != NULL &&
+ "Can't use sslcert window after sslcert_viewer_fini()");
sslcert_viewer_mouse_action(ssl_current_session, mouse, x, y);
return true;
case TREE_COOKIES:
@@ -247,6 +257,8 @@ static bool treeview_test_keypress(struct tree *tree, uint32_t key)
{
switch (tree->flags) {
case TREE_SSLCERT:
+ assert(ssl_current_session != NULL &&
+ "Can't use sslcert window after sslcert_viewer_fini()");
sslcert_viewer_keypress(ssl_current_session, key);
return true;
case TREE_COOKIES:
diff --git a/desktop/tree.h b/desktop/tree.h
index db164c013..b4e0f66b7 100644
--- a/desktop/tree.h
+++ b/desktop/tree.h
@@ -27,10 +27,18 @@
#include <stdbool.h>
#include <stdint.h>
-#include "desktop/browser.h"
+#include "desktop/mouse.h"
struct sslcert_session_data;
+struct tree;
+struct redraw_context;
+/**
+ * Current ssl session data for treeview
+ *
+ * @todo FIXME global certificate treeview state must go away, this is
+ * just wrong.
+ */
extern struct sslcert_session_data *ssl_current_session;
extern const char *tree_hotlist_path;
@@ -42,9 +50,6 @@ enum tree_flags {
TREE_HOTLIST
};
-
-struct tree;
-
typedef enum {
TREE_NO_DRAG = 0,
TREE_SELECT_DRAG,
diff --git a/desktop/treeview.c b/desktop/treeview.c
index a137c46c5..484d279cf 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -20,15 +20,17 @@
* Treeview handling (implementation).
*/
+#include "utils/log.h"
#include "css/utils.h"
-#include "desktop/gui.h"
+#include "image/bitmap.h"
+#include "render/font.h"
+#include "content/hlcache.h"
+
+#include "desktop/system_colour.h"
#include "desktop/knockout.h"
#include "desktop/plotters.h"
#include "desktop/textarea.h"
#include "desktop/treeview.h"
-#include "image/bitmap.h"
-#include "render/font.h"
-#include "utils/log.h"
/* TODO: get rid of REDRAW_MAX -- need to be able to know window size */
#define REDRAW_MAX 8000
@@ -64,10 +66,10 @@ struct treeview_field {
};
enum treeview_node_flags {
- TREE_NODE_NONE = 0, /**< No node flags set */
- TREE_NODE_EXPANDED = (1 << 0), /**< Whether node is expanded */
- TREE_NODE_SELECTED = (1 << 1), /**< Whether node is selected */
- TREE_NODE_SPECIAL = (1 << 2) /**< Render as special node */
+ TV_NFLAGS_NONE = 0, /**< No node flags set */
+ TV_NFLAGS_EXPANDED = (1 << 0), /**< Whether node is expanded */
+ TV_NFLAGS_SELECTED = (1 << 1), /**< Whether node is selected */
+ TV_NFLAGS_SPECIAL = (1 << 2) /**< Render as special node */
};
enum treeview_target_pos {
@@ -219,7 +221,7 @@ static inline treeview_node * treeview_node_next(treeview_node *node, bool full)
{
assert(node != NULL);
- if ((full || (node->flags & TREE_NODE_EXPANDED)) &&
+ if ((full || (node->flags & TV_NFLAGS_EXPANDED)) &&
node->children != NULL) {
/* Next node is child */
node = node->children;
@@ -330,7 +332,7 @@ static nserror treeview_walk_internal(treeview_node *root, bool full,
parent = node->parent;
next_sibling = node->next_sib;
child = (!skip_children &&
- (full || (node->flags & TREE_NODE_EXPANDED))) ?
+ (full || (node->flags & TV_NFLAGS_EXPANDED))) ?
node->children : NULL;
while (node != NULL) {
@@ -387,7 +389,7 @@ static nserror treeview_walk_internal(treeview_node *root, bool full,
parent = node->parent;
next_sibling = node->next_sib;
- child = (full || (node->flags & TREE_NODE_EXPANDED)) ?
+ child = (full || (node->flags & TV_NFLAGS_EXPANDED)) ?
node->children : NULL;
if (callback_fwd != NULL) {
@@ -423,7 +425,7 @@ static nserror treeview_create_node_root(treeview_node **root)
return NSERROR_NOMEM;
}
- n->flags = TREE_NODE_EXPANDED;
+ n->flags = TV_NFLAGS_EXPANDED;
n->type = TREE_NODE_ROOT;
n->height = 0;
@@ -506,7 +508,7 @@ static inline void treeview_insert_node(treeview_node *a,
treeview_set_inset_from_parent, NULL);
}
- if (a->parent->flags & TREE_NODE_EXPANDED) {
+ if (a->parent->flags & TV_NFLAGS_EXPANDED) {
int height = a->height;
/* Parent is expanded, so inserted node will be visible and
* affect layout */
@@ -550,7 +552,7 @@ nserror treeview_create_node_folder(treeview *tree,
}
n->flags = (flags & TREE_OPTION_SPECIAL_DIR) ?
- TREE_NODE_SPECIAL : TREE_NODE_NONE;
+ TV_NFLAGS_SPECIAL : TV_NFLAGS_NONE;
n->type = TREE_NODE_FOLDER;
n->height = tree_g.line_height;
@@ -568,7 +570,7 @@ nserror treeview_create_node_folder(treeview *tree,
treeview_insert_node(n, relation, rel);
- if (n->parent->flags & TREE_NODE_EXPANDED) {
+ if (n->parent->flags & TV_NFLAGS_EXPANDED) {
/* Inform front end of change in dimensions */
if (!(flags & TREE_OPTION_SUPPRESS_RESIZE))
tree->cw_t->update_size(tree->cw_h, -1,
@@ -613,7 +615,7 @@ nserror treeview_update_node_folder(treeview *tree,
folder->text.len = field->value_len;
folder->text.width = 0;
- if (folder->parent->flags & TREE_NODE_EXPANDED) {
+ if (folder->parent->flags & TV_NFLAGS_EXPANDED) {
/* Text will be seen, get its width */
nsfont.font_width(&plot_style_odd.text,
folder->text.data,
@@ -625,7 +627,7 @@ nserror treeview_update_node_folder(treeview *tree,
}
/* Redraw */
- if (folder->parent->flags & TREE_NODE_EXPANDED) {
+ if (folder->parent->flags & TV_NFLAGS_EXPANDED) {
struct rect r;
r.x0 = 0;
r.y0 = treeview_node_y(tree, folder);
@@ -663,7 +665,7 @@ nserror treeview_update_node_entry(treeview *tree,
entry->text.len = fields[0].value_len;
entry->text.width = 0;
- if (entry->parent->flags & TREE_NODE_EXPANDED) {
+ if (entry->parent->flags & TV_NFLAGS_EXPANDED) {
/* Text will be seen, get its width */
nsfont.font_width(&plot_style_odd.text,
entry->text.data,
@@ -683,7 +685,7 @@ nserror treeview_update_node_entry(treeview *tree,
e->fields[i - 1].value.data = fields[i].value;
e->fields[i - 1].value.len = fields[i].value_len;
- if (entry->flags & TREE_NODE_EXPANDED) {
+ if (entry->flags & TV_NFLAGS_EXPANDED) {
/* Text will be seen, get its width */
nsfont.font_width(&plot_style_odd.text,
e->fields[i - 1].value.data,
@@ -696,7 +698,7 @@ nserror treeview_update_node_entry(treeview *tree,
}
/* Redraw */
- if (entry->parent->flags & TREE_NODE_EXPANDED) {
+ if (entry->parent->flags & TV_NFLAGS_EXPANDED) {
struct rect r;
r.x0 = 0;
r.y0 = treeview_node_y(tree, entry);
@@ -740,7 +742,7 @@ nserror treeview_create_node_entry(treeview *tree,
n = (treeview_node *) e;
- n->flags = TREE_NODE_NONE;
+ n->flags = TV_NFLAGS_NONE;
n->type = TREE_NODE_ENTRY;
n->height = tree_g.line_height;
@@ -774,7 +776,7 @@ nserror treeview_create_node_entry(treeview *tree,
treeview_insert_node(n, relation, rel);
- if (n->parent->flags & TREE_NODE_EXPANDED) {
+ if (n->parent->flags & TV_NFLAGS_EXPANDED) {
/* Inform front end of change in dimensions */
if (!(flags & TREE_OPTION_SUPPRESS_RESIZE))
tree->cw_t->update_size(tree->cw_h, -1,
@@ -874,7 +876,7 @@ static inline bool treeview_unlink_node(treeview_node *n)
}
/* Reduce ancestor heights */
- if (n->parent != NULL && n->parent->flags & TREE_NODE_EXPANDED) {
+ if (n->parent != NULL && n->parent->flags & TV_NFLAGS_EXPANDED) {
return true;
}
@@ -1067,13 +1069,13 @@ static nserror treeview_delete_node_internal(treeview *tree, treeview_node *n,
n = p;
/* Reduce ancestor heights */
- while (n != NULL && n->flags & TREE_NODE_EXPANDED) {
+ while (n != NULL && n->flags & TV_NFLAGS_EXPANDED) {
n->height -= nd.h_reduction;
n = n->parent;
}
/* Inform front end of change in dimensions */
- if (tree->root != NULL && p != NULL && p->flags & TREE_NODE_EXPANDED &&
+ if (tree->root != NULL && p != NULL && p->flags & TV_NFLAGS_EXPANDED &&
nd.h_reduction > 0 &&
!(flags & TREE_OPTION_SUPPRESS_RESIZE)) {
tree->cw_t->update_size(tree->cw_h, -1,
@@ -1112,7 +1114,7 @@ static nserror treeview_delete_empty_nodes(treeview *tree, bool interaction)
node = tree->root;
parent = node->parent;
next_sibling = node->next_sib;
- child = (node->flags & TREE_NODE_EXPANDED) ? node->children : NULL;
+ child = (node->flags & TV_NFLAGS_EXPANDED) ? node->children : NULL;
while (node != NULL) {
@@ -1139,7 +1141,7 @@ static nserror treeview_delete_empty_nodes(treeview *tree, bool interaction)
/* Reduce ancestor heights */
while (p != NULL &&
p->flags &
- TREE_NODE_EXPANDED) {
+ TV_NFLAGS_EXPANDED) {
p->height -= nd.h_reduction;
p = p->parent;
}
@@ -1165,7 +1167,7 @@ static nserror treeview_delete_empty_nodes(treeview *tree, bool interaction)
/* Reduce ancestor heights */
while (p != NULL &&
- p->flags & TREE_NODE_EXPANDED) {
+ p->flags & TV_NFLAGS_EXPANDED) {
p->height -= nd.h_reduction;
p = p->parent;
}
@@ -1179,7 +1181,7 @@ static nserror treeview_delete_empty_nodes(treeview *tree, bool interaction)
parent = node->parent;
next_sibling = node->next_sib;
- child = (node->flags & TREE_NODE_EXPANDED) ?
+ child = (node->flags & TV_NFLAGS_EXPANDED) ?
node->children : NULL;
}
@@ -1199,7 +1201,7 @@ nserror treeview_delete_node(treeview *tree, treeview_node *n,
assert(n != NULL);
assert(n->parent != NULL);
- visible = n->parent->flags & TREE_NODE_EXPANDED;
+ visible = n->parent->flags & TV_NFLAGS_EXPANDED;
r.y0 = treeview_node_y(tree, n);
r.y1 = tree->root->height;
@@ -1365,7 +1367,7 @@ static nserror treeview_node_expand_internal(treeview *tree,
assert(tree != NULL);
assert(node != NULL);
- if (node->flags & TREE_NODE_EXPANDED) {
+ if (node->flags & TV_NFLAGS_EXPANDED) {
/* What madness is this? */
LOG(("Tried to expand an expanded node."));
return NSERROR_OK;
@@ -1380,7 +1382,7 @@ static nserror treeview_node_expand_internal(treeview *tree,
}
do {
- assert((child->flags & TREE_NODE_EXPANDED) == false);
+ assert((child->flags & TV_NFLAGS_EXPANDED) == false);
if (child->text.width == 0) {
nsfont.font_width(&plot_style_odd.text,
child->text.data,
@@ -1416,12 +1418,14 @@ static nserror treeview_node_expand_internal(treeview *tree,
break;
case TREE_NODE_ROOT:
+ case TREE_NODE_NONE:
assert(node->type != TREE_NODE_ROOT);
+ assert(node->type != TREE_NODE_NONE);
break;
}
/* Update the node */
- node->flags |= TREE_NODE_EXPANDED;
+ node->flags |= TV_NFLAGS_EXPANDED;
/* And parent's heights */
do {
@@ -1473,15 +1477,15 @@ static nserror treeview_node_contract_cb(treeview_node *n, void *ctx, bool *end)
assert(n != NULL);
assert(n->type != TREE_NODE_ROOT);
- n->flags &= ~TREE_NODE_SELECTED;
+ n->flags &= ~TV_NFLAGS_SELECTED;
- if ((n->flags & TREE_NODE_EXPANDED) == false ||
+ if ((n->flags & TV_NFLAGS_EXPANDED) == false ||
(n->type == TREE_NODE_FOLDER && data->only_entries)) {
/* Nothing to do. */
return NSERROR_OK;
}
- n->flags ^= TREE_NODE_EXPANDED;
+ n->flags ^= TV_NFLAGS_EXPANDED;
h_reduction = n->height - tree_g.line_height;
assert(h_reduction >= 0);
@@ -1507,14 +1511,14 @@ static nserror treeview_node_contract_internal(treeview *tree,
bool selected;
assert(node != NULL);
- if ((node->flags & TREE_NODE_EXPANDED) == false) {
+ if ((node->flags & TV_NFLAGS_EXPANDED) == false) {
/* What madness is this? */
LOG(("Tried to contract a contracted node."));
return NSERROR_OK;
}
data.only_entries = false;
- selected = node->flags & TREE_NODE_SELECTED;
+ selected = node->flags & TV_NFLAGS_SELECTED;
/* Contract children. */
treeview_walk_internal(node, false, treeview_node_contract_cb,
@@ -1524,7 +1528,7 @@ static nserror treeview_node_contract_internal(treeview *tree,
treeview_node_contract_cb(node, &data, false);
if (selected)
- node->flags |= TREE_NODE_SELECTED;
+ node->flags |= TV_NFLAGS_SELECTED;
/* Inform front end of change in dimensions */
tree->cw_t->update_size(tree->cw_h, -1, tree->root->height);
@@ -1576,11 +1580,11 @@ nserror treeview_contract(treeview *tree, bool all)
data.only_entries = !all;
for (n = tree->root->children; n != NULL; n = n->next_sib) {
- if ((n->flags & TREE_NODE_EXPANDED) == false) {
+ if ((n->flags & TV_NFLAGS_EXPANDED) == false) {
continue;
}
- selected = n->flags & TREE_NODE_SELECTED;
+ selected = n->flags & TV_NFLAGS_SELECTED;
/* Contract children. */
treeview_walk_internal(n, false,
@@ -1590,7 +1594,7 @@ nserror treeview_contract(treeview *tree, bool all)
treeview_node_contract_cb(n, &data, false);
if (selected)
- n->flags |= TREE_NODE_SELECTED;
+ n->flags |= TV_NFLAGS_SELECTED;
}
/* Inform front end of change in dimensions */
@@ -1617,7 +1621,7 @@ static nserror treeview_expand_cb(treeview_node *n, void *ctx,
assert(n != NULL);
assert(n->type != TREE_NODE_ROOT);
- if (n->flags & TREE_NODE_EXPANDED ||
+ if (n->flags & TV_NFLAGS_EXPANDED ||
(data->only_folders && n->type != TREE_NODE_FOLDER)) {
/* Nothing to do. */
return NSERROR_OK;
@@ -1683,7 +1687,7 @@ void treeview_redraw(treeview *tree, const int x, const int y,
assert(tree != NULL);
assert(tree->root != NULL);
- assert(tree->root->flags & TREE_NODE_EXPANDED);
+ assert(tree->root->flags & TV_NFLAGS_EXPANDED);
if (tree->drag.start.y > tree->drag.prev.y) {
sel_min = tree->drag.prev.y;
@@ -1716,7 +1720,7 @@ void treeview_redraw(treeview *tree, const int x, const int y,
while (node != NULL) {
int i;
- next = (node->flags & TREE_NODE_EXPANDED) ?
+ next = (node->flags & TV_NFLAGS_EXPANDED) ?
node->children : NULL;
if (next != NULL) {
@@ -1762,20 +1766,20 @@ void treeview_redraw(treeview *tree, const int x, const int y,
} else {
invert_selection = false;
}
- if ((node->flags & TREE_NODE_SELECTED && !invert_selection) ||
- (!(node->flags & TREE_NODE_SELECTED) &&
+ if ((node->flags & TV_NFLAGS_SELECTED && !invert_selection) ||
+ (!(node->flags & TV_NFLAGS_SELECTED) &&
invert_selection)) {
bg_style = &style->sbg;
text_style = &style->stext;
infotext_style = &style->sitext;
- furniture = (node->flags & TREE_NODE_EXPANDED) ?
+ furniture = (node->flags & TV_NFLAGS_EXPANDED) ?
style->furn[TREE_FURN_CONTRACT].sel :
style->furn[TREE_FURN_EXPAND].sel;
} else {
bg_style = &style->bg;
text_style = &style->text;
infotext_style = &style->itext;
- furniture = (node->flags & TREE_NODE_EXPANDED) ?
+ furniture = (node->flags & TV_NFLAGS_EXPANDED) ?
style->furn[TREE_FURN_CONTRACT].bmp :
style->furn[TREE_FURN_EXPAND].bmp;
}
@@ -1795,7 +1799,7 @@ void treeview_redraw(treeview *tree, const int x, const int y,
/* Render icon */
if (node->type == TREE_NODE_ENTRY)
res = TREE_RES_CONTENT;
- else if (node->flags & TREE_NODE_SPECIAL)
+ else if (node->flags & TV_NFLAGS_SPECIAL)
res = TREE_RES_FOLDER_SPECIAL;
else
res = TREE_RES_FOLDER;
@@ -1827,7 +1831,7 @@ void treeview_redraw(treeview *tree, const int x, const int y,
if (node->type != TREE_NODE_ENTRY ||
- !(node->flags & TREE_NODE_EXPANDED))
+ !(node->flags & TV_NFLAGS_EXPANDED))
/* Done everything for this node */
continue;
@@ -1949,7 +1953,7 @@ static nserror treeview_node_selection_walk_cb(treeview_node *n,
switch (sw->purpose) {
case TREEVIEW_WALK_HAS_SELECTION:
- if (n->flags & TREE_NODE_SELECTED) {
+ if (n->flags & TV_NFLAGS_SELECTED) {
sw->data.has_selection = true;
*end = true; /* Can abort tree walk */
return NSERROR_OK;
@@ -1957,7 +1961,7 @@ static nserror treeview_node_selection_walk_cb(treeview_node *n,
break;
case TREEVIEW_WALK_GET_FIRST_SELECTED:
- if (n->flags & TREE_NODE_SELECTED) {
+ if (n->flags & TV_NFLAGS_SELECTED) {
sw->data.first.n = n;
*end = true; /* Can abort tree walk */
return NSERROR_OK;
@@ -1965,7 +1969,7 @@ static nserror treeview_node_selection_walk_cb(treeview_node *n,
break;
case TREEVIEW_WALK_DELETE_SELECTION:
- if (n->flags & TREE_NODE_SELECTED) {
+ if (n->flags & TV_NFLAGS_SELECTED) {
err = treeview_delete_node_internal(sw->tree, n, true,
TREE_OPTION_NONE);
if (err != NSERROR_OK) {
@@ -1978,23 +1982,23 @@ static nserror treeview_node_selection_walk_cb(treeview_node *n,
case TREEVIEW_WALK_PROPAGATE_SELECTION:
if (n->parent != NULL &&
- n->parent->flags & TREE_NODE_SELECTED &&
- !(n->flags & TREE_NODE_SELECTED)) {
- n->flags ^= TREE_NODE_SELECTED;
+ n->parent->flags & TV_NFLAGS_SELECTED &&
+ !(n->flags & TV_NFLAGS_SELECTED)) {
+ n->flags ^= TV_NFLAGS_SELECTED;
changed = true;
}
break;
case TREEVIEW_WALK_CLEAR_SELECTION:
- if (n->flags & TREE_NODE_SELECTED) {
- n->flags ^= TREE_NODE_SELECTED;
+ if (n->flags & TV_NFLAGS_SELECTED) {
+ n->flags ^= TV_NFLAGS_SELECTED;
changed = true;
}
break;
case TREEVIEW_WALK_SELECT_ALL:
- if (!(n->flags & TREE_NODE_SELECTED)) {
- n->flags ^= TREE_NODE_SELECTED;
+ if (!(n->flags & TV_NFLAGS_SELECTED)) {
+ n->flags ^= TV_NFLAGS_SELECTED;
changed = true;
}
break;
@@ -2003,12 +2007,12 @@ static nserror treeview_node_selection_walk_cb(treeview_node *n,
if (sw->current_y >= sw->data.drag.sel_min &&
sw->current_y - height <
sw->data.drag.sel_max) {
- n->flags ^= TREE_NODE_SELECTED;
+ n->flags ^= TV_NFLAGS_SELECTED;
}
return NSERROR_OK;
case TREEVIEW_WALK_YANK_SELECTION:
- if (n->flags & TREE_NODE_SELECTED) {
+ if (n->flags & TV_NFLAGS_SELECTED) {
treeview_node *p = n->parent;
int h = 0;
@@ -2016,7 +2020,7 @@ static nserror treeview_node_selection_walk_cb(treeview_node *n,
h = n->height;
/* Reduce ancestor heights */
- while (p != NULL && p->flags & TREE_NODE_EXPANDED) {
+ while (p != NULL && p->flags & TV_NFLAGS_EXPANDED) {
p->height -= h;
p = p->parent;
}
@@ -2089,7 +2093,8 @@ static treeview_node * treeview_get_first_selected(treeview *tree)
/* Exported interface, documented in treeview.h */
-void treeview_get_selection(treeview *tree, void **node_data)
+enum treeview_node_type treeview_get_selection(treeview *tree,
+ void **node_data)
{
treeview_node *n;
@@ -2097,7 +2102,13 @@ void treeview_get_selection(treeview *tree, void **node_data)
n = treeview_get_first_selected(tree);
- *node_data = n->client_data;
+ if (n != NULL && n->type & (TREE_NODE_ENTRY | TREE_NODE_FOLDER)) {
+ *node_data = n->client_data;
+ return n->type;
+ }
+
+ *node_data = NULL;
+ return TREE_NODE_NONE;
}
@@ -2332,7 +2343,7 @@ static nserror treeview_move_selection(treeview *tree, struct rect *rect)
}
/* The node that we're moving selection to can't itself be selected */
- assert(!(relation->flags & TREE_NODE_SELECTED));
+ assert(!(relation->flags & TV_NFLAGS_SELECTED));
/* Move all selected nodes from treeview to tree->move.root */
treeview_move_yank_selection(tree);
@@ -2341,10 +2352,10 @@ static nserror treeview_move_selection(treeview *tree, struct rect *rect)
for (node = tree->move.root; node != NULL; node = next) {
next = node->next_sib;
- if (!(parent->flags & TREE_NODE_EXPANDED)) {
- if (node->flags & TREE_NODE_EXPANDED)
+ if (!(parent->flags & TV_NFLAGS_EXPANDED)) {
+ if (node->flags & TV_NFLAGS_EXPANDED)
treeview_node_contract_internal(tree, node);
- node->flags &= ~TREE_NODE_SELECTED;
+ node->flags &= ~TV_NFLAGS_SELECTED;
}
treeview_insert_node(node, relation, relationship);
@@ -2378,7 +2389,7 @@ static nserror treeview_node_launch_walk_bwd_cb(treeview_node *n, void *ctx,
{
struct treeview_launch_walk_data *lw = ctx;
- if (n->type == TREE_NODE_FOLDER && n->flags == TREE_NODE_SELECTED) {
+ if (n->type == TREE_NODE_FOLDER && n->flags == TV_NFLAGS_SELECTED) {
lw->selected_depth--;
}
@@ -2390,11 +2401,11 @@ static nserror treeview_node_launch_walk_fwd_cb(treeview_node *n, void *ctx,
{
struct treeview_launch_walk_data *lw = ctx;
- if (n->type == TREE_NODE_FOLDER && n->flags & TREE_NODE_SELECTED) {
+ if (n->type == TREE_NODE_FOLDER && n->flags & TV_NFLAGS_SELECTED) {
lw->selected_depth++;
} else if (n->type == TREE_NODE_ENTRY &&
- (n->flags & TREE_NODE_SELECTED ||
+ (n->flags & TV_NFLAGS_SELECTED ||
lw->selected_depth > 0)) {
struct treeview_node_msg msg;
msg.msg = TREE_MSG_NODE_LAUNCH;
@@ -2491,7 +2502,7 @@ static nserror treeview_node_nav_cb(treeview_node *node, void *ctx,
if (node == ns->tree->root)
return NSERROR_OK;
- if (node->flags & TREE_NODE_SELECTED) {
+ if (node->flags & TV_NFLAGS_SELECTED) {
ns->n_selected++;
if (ns->curr == NULL) {
ns->curr = node;
@@ -2554,51 +2565,51 @@ static bool treeview_keyboard_navigation(treeview *tree, uint32_t key,
ns.curr->parent != NULL &&
ns.curr->parent->type != TREE_NODE_ROOT) {
/* Step to parent */
- ns.curr->parent->flags |= TREE_NODE_SELECTED;
+ ns.curr->parent->flags |= TV_NFLAGS_SELECTED;
} else if (ns.curr != NULL && tree->root->children != NULL) {
/* Select first node in tree */
- tree->root->children->flags |= TREE_NODE_SELECTED;
+ tree->root->children->flags |= TV_NFLAGS_SELECTED;
}
break;
case KEY_RIGHT:
if (ns.curr != NULL) {
- if (!(ns.curr->flags & TREE_NODE_EXPANDED)) {
+ if (!(ns.curr->flags & TV_NFLAGS_EXPANDED)) {
/* Toggle node to expanded */
treeview_node_expand_internal(tree, ns.curr);
if (ns.curr->children != NULL) {
/* Step to first child */
ns.curr->children->flags |=
- TREE_NODE_SELECTED;
+ TV_NFLAGS_SELECTED;
} else {
/* Retain current node selection */
- ns.curr->flags |= TREE_NODE_SELECTED;
+ ns.curr->flags |= TV_NFLAGS_SELECTED;
}
} else {
/* Toggle node to contracted */
treeview_node_contract_internal(tree, ns.curr);
/* Retain current node selection */
- ns.curr->flags |= TREE_NODE_SELECTED;
+ ns.curr->flags |= TV_NFLAGS_SELECTED;
}
} else if (ns.curr != NULL) {
/* Retain current node selection */
- ns.curr->flags |= TREE_NODE_SELECTED;
+ ns.curr->flags |= TV_NFLAGS_SELECTED;
}
break;
case KEY_UP:
if (ns.prev != NULL) {
/* Step to previous node */
- ns.prev->flags |= TREE_NODE_SELECTED;
+ ns.prev->flags |= TV_NFLAGS_SELECTED;
}
break;
case KEY_DOWN:
if (ns.next != NULL) {
/* Step to next node */
- ns.next->flags |= TREE_NODE_SELECTED;
+ ns.next->flags |= TV_NFLAGS_SELECTED;
}
break;
@@ -2720,16 +2731,16 @@ static bool treeview_set_move_indicator(treeview *tree, bool need_redraw,
assert(tree->root->children != NULL);
assert(target != NULL);
- if (target->flags & TREE_NODE_SELECTED) {
+ if (target->flags & TV_NFLAGS_SELECTED) {
/* Find top selected ancestor */
while (target->parent &&
- target->parent->flags & TREE_NODE_SELECTED) {
+ target->parent->flags & TV_NFLAGS_SELECTED) {
target = target->parent;
}
/* Find top ajdacent selected sibling */
while (target->prev_sib &&
- target->prev_sib->flags & TREE_NODE_SELECTED) {
+ target->prev_sib->flags & TV_NFLAGS_SELECTED) {
target = target->prev_sib;
}
target_pos = TV_TARGET_ABOVE;
@@ -2739,7 +2750,7 @@ static bool treeview_set_move_indicator(treeview *tree, bool need_redraw,
if (mouse_pos <= node_height / 4) {
target_pos = TV_TARGET_ABOVE;
} else if (mouse_pos <= (3 * node_height) / 4 ||
- target->flags & TREE_NODE_EXPANDED) {
+ target->flags & TV_NFLAGS_EXPANDED) {
target_pos = TV_TARGET_INSIDE;
} else {
target_pos = TV_TARGET_BELOW;
@@ -3127,7 +3138,7 @@ static nserror treeview_node_mouse_action_cb(treeview_node *node, void *ctx,
/* Record what position / part a drag started on */
if (ma->mouse & (BROWSER_MOUSE_PRESS_1 | BROWSER_MOUSE_PRESS_2) &&
ma->tree->drag.type == TV_DRAG_NONE) {
- ma->tree->drag.selected = node->flags & TREE_NODE_SELECTED;
+ ma->tree->drag.selected = node->flags & TV_NFLAGS_SELECTED;
ma->tree->drag.start_node = node;
ma->tree->drag.part = part;
ma->tree->drag.start.x = ma->x;
@@ -3167,7 +3178,7 @@ static nserror treeview_node_mouse_action_cb(treeview_node *node, void *ctx,
if (ma->tree->drag.start_node != NULL &&
ma->tree->drag.type == TV_DRAG_SELECTION) {
- ma->tree->drag.start_node->flags ^= TREE_NODE_SELECTED;
+ ma->tree->drag.start_node->flags ^= TV_NFLAGS_SELECTED;
}
}
@@ -3212,7 +3223,7 @@ static nserror treeview_node_mouse_action_cb(treeview_node *node, void *ctx,
redraw |= treeview_clear_selection(ma->tree, &r);
/* Toggle node expansion */
- if (node->flags & TREE_NODE_EXPANDED) {
+ if (node->flags & TV_NFLAGS_EXPANDED) {
err = treeview_node_contract_internal(ma->tree, node);
} else {
err = treeview_node_expand_internal(ma->tree, node);
@@ -3260,7 +3271,7 @@ static nserror treeview_node_mouse_action_cb(treeview_node *node, void *ctx,
} else if (ma->mouse & BROWSER_MOUSE_PRESS_1 &&
!(ma->mouse &
(BROWSER_MOUSE_MOD_1 | BROWSER_MOUSE_MOD_3)) &&
- !(node->flags & TREE_NODE_SELECTED) &&
+ !(node->flags & TV_NFLAGS_SELECTED) &&
part != TV_NODE_PART_TOGGLE) {
/* Clear any existing selection */
redraw |= treeview_clear_selection(ma->tree, &r);
@@ -3272,7 +3283,7 @@ static nserror treeview_node_mouse_action_cb(treeview_node *node, void *ctx,
if (action & TV_NODE_ACTION_SELECTION) {
/* Handle change in selection */
- node->flags ^= TREE_NODE_SELECTED;
+ node->flags ^= TV_NFLAGS_SELECTED;
/* Redraw */
if (!redraw) {
@@ -3398,7 +3409,7 @@ void treeview_mouse_action(treeview *tree,
if (tree->drag.start_node != NULL &&
tree->drag.type == TV_DRAG_SELECTION) {
tree->drag.start_node->flags ^=
- TREE_NODE_SELECTED;
+ TV_NFLAGS_SELECTED;
}
}
@@ -3466,15 +3477,15 @@ static void treeview_init_plot_styles(int font_pt_size)
plot_style_even.bg.stroke_width = 0;
plot_style_even.bg.stroke_colour = 0;
plot_style_even.bg.fill_type = PLOT_OP_TYPE_SOLID;
- plot_style_even.bg.fill_colour = gui_system_colour_char("Window");
+ plot_style_even.bg.fill_colour = ns_system_colour_char("Window");
/* Text colour */
plot_style_even.text.family = PLOT_FONT_FAMILY_SANS_SERIF;
plot_style_even.text.size = font_pt_size * FONT_SIZE_SCALE;
plot_style_even.text.weight = 400;
plot_style_even.text.flags = FONTF_NONE;
- plot_style_even.text.foreground = gui_system_colour_char("WindowText");
- plot_style_even.text.background = gui_system_colour_char("Window");
+ plot_style_even.text.foreground = ns_system_colour_char("WindowText");
+ plot_style_even.text.background = ns_system_colour_char("Window");
/* Entry field text colour */
plot_style_even.itext = plot_style_even.text;
@@ -3484,13 +3495,13 @@ static void treeview_init_plot_styles(int font_pt_size)
/* Selected background colour */
plot_style_even.sbg = plot_style_even.bg;
- plot_style_even.sbg.fill_colour = gui_system_colour_char("Highlight");
+ plot_style_even.sbg.fill_colour = ns_system_colour_char("Highlight");
/* Selected text colour */
plot_style_even.stext = plot_style_even.text;
plot_style_even.stext.foreground =
- gui_system_colour_char("HighlightText");
- plot_style_even.stext.background = gui_system_colour_char("Highlight");
+ ns_system_colour_char("HighlightText");
+ plot_style_even.stext.background = ns_system_colour_char("Highlight");
/* Selected entry field text colour */
plot_style_even.sitext = plot_style_even.stext;
diff --git a/desktop/treeview.h b/desktop/treeview.h
index 6fda230b1..0b5bbbbd9 100644
--- a/desktop/treeview.h
+++ b/desktop/treeview.h
@@ -26,6 +26,7 @@
#include <stdbool.h>
#include <stdint.h>
+#include "desktop/mouse.h"
#include "desktop/core_window.h"
#include "desktop/textinput.h"
#include "utils/types.h"
@@ -34,9 +35,10 @@ typedef struct treeview treeview;
typedef struct treeview_node treeview_node;
enum treeview_node_type {
- TREE_NODE_ROOT = (1 << 0),
- TREE_NODE_FOLDER = (1 << 1),
- TREE_NODE_ENTRY = (1 << 2)
+ TREE_NODE_NONE = 0, /**< No node */
+ TREE_NODE_ROOT = (1 << 0), /**< Node is treeview's root */
+ TREE_NODE_FOLDER = (1 << 1), /**< Node is folder */
+ TREE_NODE_ENTRY = (1 << 2) /**< Node is an entry */
};
enum treeview_relationship {
@@ -381,8 +383,10 @@ bool treeview_has_selection(treeview *tree);
*
* \param tree Treeview object to get selected node in
* \param node_data Client data for the selected treeview node, or NULL
+ * \return node type of first selected node.
*/
-void treeview_get_selection(treeview *tree, void **node_data);
+enum treeview_node_type treeview_get_selection(treeview *tree,
+ void **node_data);
/**
* Edit the first selected node
diff --git a/desktop/version.c b/desktop/version.c
index 11544c01b..44d58715f 100644
--- a/desktop/version.c
+++ b/desktop/version.c
@@ -1,10 +1,10 @@
-#include "utils/testament.h"
+#include "testament.h"
-const char * const netsurf_version = "3.1 (Dev"
+const char * const netsurf_version = "3.3 (Dev"
#if defined(CI_BUILD)
" CI #" CI_BUILD
#endif
")"
;
const int netsurf_version_major = 3;
-const int netsurf_version_minor = 0;
+const int netsurf_version_minor = 3;
diff --git a/framebuffer/Makefile.defaults b/framebuffer/Makefile.defaults
index 6e2a3d159..5fe8e2c40 100644
--- a/framebuffer/Makefile.defaults
+++ b/framebuffer/Makefile.defaults
@@ -2,46 +2,46 @@
# Framebuffer-target-specific options
# ----------------------------------------------------------------------------
- # Optimisation levels
- CFLAGS += -O2
-
- # Framebuffer default surface provider.
- # Valid values are: x, sdl, linux, vnc, able,
- NETSURF_FB_FRONTEND := sdl
-
- # Use libharu to enable PDF export and GTK printing support.
- # Valid options: YES, NO
- NETSURF_USE_HARU_PDF := NO
-
- # Enable NetSurf's use of librosprite for displaying RISC OS Sprites
- # Valid options: YES, NO, AUTO
- NETSURF_USE_ROSPRITE := AUTO
-
- # Library to use for font plotting
- # Valid options: internal, freetype
- NETSURF_FB_FONTLIB := internal
-
- # Default freetype font files
- NETSURF_FB_FONT_SANS_SERIF := DejaVuSans.ttf
- NETSURF_FB_FONT_SANS_SERIF_BOLD := DejaVuSans-Bold.ttf
- NETSURF_FB_FONT_SANS_SERIF_ITALIC := DejaVuSans-Oblique.ttf
- NETSURF_FB_FONT_SANS_SERIF_ITALIC_BOLD := DejaVuSans-BoldOblique.ttf
- NETSURF_FB_FONT_SERIF := DejaVuSerif.ttf
- NETSURF_FB_FONT_SERIF_BOLD := DejaVuSerif-Bold.ttf
- NETSURF_FB_FONT_MONOSPACE := DejaVuSansMono.ttf
- NETSURF_FB_FONT_MONOSPACE_BOLD := DejaVuSansMono-Bold.ttf
- NETSURF_FB_FONT_CURSIVE := Comic_Sans_MS.ttf
- NETSURF_FB_FONT_FANTASY := Impact.ttf
-
- # Default binary install path
- NETSURF_FRAMEBUFFER_BIN := $(PREFIX)/bin/
-
- # Default resource install path
- NETSURF_FRAMEBUFFER_RESOURCES := $(PREFIX)/share/netsurf/
-
- # Default framebuffer search path
- NETSURF_FB_RESPATH := $${HOME}/.netsurf/:$${NETSURFRES}:$(NETSURF_FRAMEBUFFER_RESOURCES):./framebuffer/res
-
- # freetype compiled in font serch path
- NETSURF_FB_FONTPATH := /usr/share/fonts/truetype/ttf-dejavu:/usr/share/fonts/truetype/msttcorefonts
+# Optimisation levels
+CFLAGS += -O2
+
+# Framebuffer default surface provider.
+# Valid values are: x, sdl, linux, vnc, able,
+NETSURF_FB_FRONTEND := sdl
+
+# Use libharu to enable PDF export and GTK printing support.
+# Valid options: YES, NO
+NETSURF_USE_HARU_PDF := NO
+
+# Enable NetSurf's use of librosprite for displaying RISC OS Sprites
+# Valid options: YES, NO, AUTO
+NETSURF_USE_ROSPRITE := AUTO
+
+# Library to use for font plotting
+# Valid options: internal, freetype
+NETSURF_FB_FONTLIB := internal
+
+# Default freetype font files
+NETSURF_FB_FONT_SANS_SERIF := DejaVuSans.ttf
+NETSURF_FB_FONT_SANS_SERIF_BOLD := DejaVuSans-Bold.ttf
+NETSURF_FB_FONT_SANS_SERIF_ITALIC := DejaVuSans-Oblique.ttf
+NETSURF_FB_FONT_SANS_SERIF_ITALIC_BOLD := DejaVuSans-BoldOblique.ttf
+NETSURF_FB_FONT_SERIF := DejaVuSerif.ttf
+NETSURF_FB_FONT_SERIF_BOLD := DejaVuSerif-Bold.ttf
+NETSURF_FB_FONT_MONOSPACE := DejaVuSansMono.ttf
+NETSURF_FB_FONT_MONOSPACE_BOLD := DejaVuSansMono-Bold.ttf
+NETSURF_FB_FONT_CURSIVE := Comic_Sans_MS.ttf
+NETSURF_FB_FONT_FANTASY := Impact.ttf
+
+# Default binary install path
+NETSURF_FRAMEBUFFER_BIN := $(PREFIX)/bin/
+
+# Default resource install path
+NETSURF_FRAMEBUFFER_RESOURCES := $(PREFIX)/share/netsurf/
+
+# Default framebuffer search path
+NETSURF_FB_RESPATH := $${HOME}/.netsurf/:$${NETSURFRES}:$(NETSURF_FRAMEBUFFER_RESOURCES):./framebuffer/res
+
+# freetype compiled in font serch path
+NETSURF_FB_FONTPATH := /usr/share/fonts/truetype/ttf-dejavu:/usr/share/fonts/truetype/msttcorefonts
diff --git a/framebuffer/Makefile.target b/framebuffer/Makefile.target
index d423e298f..44b9626ed 100644
--- a/framebuffer/Makefile.target
+++ b/framebuffer/Makefile.target
@@ -2,8 +2,6 @@
# Framebuffer target setup
# ----------------------------------------------------------------------------
-
-$(eval $(call feature_enabled,MNG,-DWITH_MNG,-lmng,PNG/MNG/JNG (libmng)))
$(eval $(call feature_enabled,PNG,-DWITH_PNG,-lpng,PNG (libpng) ))
ifeq ($(NETSURF_FB_FONTLIB),freetype)
@@ -44,12 +42,11 @@ $(eval $(call pkg_config_find_and_add_enabled,GIF,libnsgif,GIF))
$(eval $(call pkg_config_find_and_add_enabled,MOZJS,mozjs185,JavaScript))
$(eval $(call pkg_config_find_and_add_enabled,JS,mozilla-js,JavaScript))
-CFLAGS += -std=c99 -g -Dsmall $(WARNFLAGS) \
+CFLAGS += -std=c99 -g -Dsmall \
-D_BSD_SOURCE \
-D_XOPEN_SOURCE=600 \
-D_POSIX_C_SOURCE=200112L \
- $(shell $(PKG_CONFIG) --cflags libnsfb libhubbub libcss openssl) \
- $(shell xml2-config --cflags)
+ $(shell $(PKG_CONFIG) --cflags libnsfb libhubbub libcss openssl)
LDFLAGS += -lm -Wl,--whole-archive $(shell $(PKG_CONFIG) --libs libnsfb) -Wl,--no-whole-archive
@@ -73,11 +70,6 @@ endif
# built-in resource setup
# ----------------------------------------------------------------------------
-# We make convert_image depend on fb_bitmap.h so that if we change
-# that header, we get new images built just in case.
-$(TOOLROOT)/convert_image: $(TOOLROOT)/created framebuffer/convert_image.c framebuffer/fbtk.h
- $(VQ)echo " HOST CC: $@"
- $(Q)$(HOST_CC) -o $@ framebuffer/convert_image.c -lpng
FB_IMAGE_left_arrow := framebuffer/res/icons/back.png
FB_IMAGE_right_arrow := framebuffer/res/icons/forward.png
@@ -115,6 +107,14 @@ FB_IMAGE_throbber6 := framebuffer/res/throbber/throbber6.png
FB_IMAGE_throbber7 := framebuffer/res/throbber/throbber7.png
FB_IMAGE_throbber8 := framebuffer/res/throbber/throbber8.png
+# Host tool to convert image bitmaps to source code.
+#
+# convert_image dependd on fb_bitmap.h so that if we change that
+# header, we get new images built.
+$(TOOLROOT)/convert_image: $(TOOLROOT)/created framebuffer/convert_image.c framebuffer/fbtk.h
+ $(VQ)echo " HOST CC: $@"
+ $(Q)$(HOST_CC) -o $@ framebuffer/convert_image.c -lpng
+
# 1: input file
# 2: output file
# 3: bitmap name
@@ -129,7 +129,34 @@ endef
S_IMAGES :=
-$(eval $(foreach V,$(filter FB_IMAGE_%,$(.VARIABLES)),$(call convert_image,$($(V)),$(OBJROOT)/$(patsubst FB_IMAGE_%,%,$(V)).c,$(patsubst FB_IMAGE_%,%,$(V)))))
+$(eval $(foreach V,$(filter FB_IMAGE_%,$(.VARIABLES)),$(call convert_image,$($(V)),$(OBJROOT)/image-$(patsubst FB_IMAGE_%,%,$(V)).c,$(patsubst FB_IMAGE_%,%,$(V)))))
+
+
+# Internal fonts to generate
+FB_FONT_internal_ns-sans := framebuffer/res/fonts/glyph_data
+
+# Internal font conversion
+$(TOOLROOT)/convert_font: $(TOOLROOT)/created framebuffer/convert_font.c
+ $(VQ)echo " HOST CC: $@"
+ $(Q)$(HOST_CC) -o $@ framebuffer/convert_font.c
+
+# 1: input file
+# 2: output source code file
+# 3: output header file
+# 4: font name
+define convert_font
+
+S_FONTS += $(2)
+
+$(2): $(1) $(TOOLROOT)/convert_font
+ $(VQ)echo " FONT: $(1) ($(4))"
+ $(Q)$(TOOLROOT)/convert_font -H $(3) $(1) $(2)
+
+endef
+
+S_FONTS :=
+
+$(eval $(foreach V,$(filter FB_FONT_$(NETSURF_FB_FONTLIB)_%,$(.VARIABLES)),$(call convert_font,$($(V)),$(OBJROOT)/font-$(patsubst FB_FONT_$(NETSURF_FB_FONTLIB)_%,%,$(V)).c,$(OBJROOT)/font-$(patsubst FB_FONT_$(NETSURF_FB_FONTLIB)_%,%,$(V)).h,$(patsubst FB_FONT_$(NETSURF_FB_FONTLIB)_%,%,$(V)))))
# ----------------------------------------------------------------------------
# Source file setup
@@ -137,7 +164,7 @@ $(eval $(foreach V,$(filter FB_IMAGE_%,$(.VARIABLES)),$(call convert_image,$($(V
# S_FRAMEBUFFER are sources purely for the framebuffer build
S_FRAMEBUFFER := gui.c framebuffer.c schedule.c \
- thumbnail.c misc.c bitmap.c filetype.c login.c findfile.c \
+ thumbnail.c misc.c bitmap.c fetch.c findfile.c \
localhistory.c clipboard.c
S_FRAMEBUFFER_FBTK := fbtk.c event.c fill.c bitmap.c user.c window.c \
@@ -145,17 +172,12 @@ S_FRAMEBUFFER_FBTK := fbtk.c event.c fill.c bitmap.c user.c window.c \
S_FRAMEBUFFER += font_$(NETSURF_FB_FONTLIB).c
-ifeq ($(NETSURF_FB_FONTLIB),internal)
-S_FRAMEBUFFER += nsfont_regular.c nsfont_italic.c nsfont_bold.c \
- nsfont_italic_bold.c
-endif
-
S_FRAMEBUFFER := $(addprefix framebuffer/,$(S_FRAMEBUFFER)) $(addprefix framebuffer/fbtk/,$(S_FRAMEBUFFER_FBTK))
# This is the final source build list
# Note this is deliberately *not* expanded here as common and image
# are not yet available
-SOURCES = $(S_COMMON) $(S_IMAGE) $(S_BROWSER) $(S_FRAMEBUFFER) $(S_IMAGES)
+SOURCES = $(S_COMMON) $(S_IMAGE) $(S_BROWSER) $(S_FRAMEBUFFER) $(S_IMAGES) $(S_FONTS)
EXETARGET := nsfb
# ----------------------------------------------------------------------------
@@ -164,7 +186,7 @@ EXETARGET := nsfb
NETSURF_FRAMEBUFFER_RESOURCE_LIST := adblock.css credits.html \
default.css internal.css licence.html \
- netsurf.png quirks.css welcome.html
+ netsurf.png quirks.css welcome.html Messages
install-framebuffer:
$(Q)mkdir -p $(DESTDIR)$(NETSURF_FRAMEBUFFER_BIN)
diff --git a/framebuffer/clipboard.c b/framebuffer/clipboard.c
index 46a1bb018..3729cd49b 100644
--- a/framebuffer/clipboard.c
+++ b/framebuffer/clipboard.c
@@ -23,10 +23,14 @@
#include <assert.h>
#include <stdint.h>
#include <string.h>
+#include <stdlib.h>
+
+#include "utils/log.h"
#include "desktop/browser.h"
#include "desktop/gui.h"
+
#include "framebuffer/gui.h"
-#include "utils/log.h"
+#include "framebuffer/clipboard.h"
static struct gui_clipboard {
@@ -36,15 +40,13 @@ static struct gui_clipboard {
} gui_clipboard;
-
-
/**
* Core asks front end for clipboard contents.
*
* \param buffer UTF-8 text, allocated by front end, ownership yeilded to core
* \param length Byte length of UTF-8 text in buffer
*/
-void gui_get_clipboard(char **buffer, size_t *length)
+static void gui_get_clipboard(char **buffer, size_t *length)
{
*buffer = NULL;
*length = 0;
@@ -73,7 +75,7 @@ void gui_get_clipboard(char **buffer, size_t *length)
* \param styles Array of styles given to text runs, owned by core, or NULL
* \param n_styles Number of text run styles in array
*/
-void gui_set_clipboard(const char *buffer, size_t length,
+static void gui_set_clipboard(const char *buffer, size_t length,
nsclipboard_styles styles[], int n_styles)
{
if (gui_clipboard.buffer_len < length + 1) {
@@ -95,3 +97,9 @@ void gui_set_clipboard(const char *buffer, size_t length,
gui_clipboard.buffer[gui_clipboard.length] = '\0';
}
+static struct gui_clipboard_table clipboard_table = {
+ .get = gui_get_clipboard,
+ .set = gui_set_clipboard,
+};
+
+struct gui_clipboard_table *framebuffer_clipboard_table = &clipboard_table;
diff --git a/windows/login.c b/framebuffer/clipboard.h
index 7a5e195f4..b5f7b0f29 100644
--- a/windows/login.c
+++ b/framebuffer/clipboard.h
@@ -16,10 +16,9 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "desktop/401login.h"
+#ifndef NETSURF_FB_CLIPBOARD_H
+#define NETSURF_FB_CLIPBOARD_H
-void gui_401login_open(nsurl *url, const char *realm,
- nserror (*cb)(bool proceed, void *pw), void *cbpw)
-{
- cb(false, cbpw);
-}
+extern struct gui_clipboard_table *framebuffer_clipboard_table;
+
+#endif
diff --git a/framebuffer/convert_font.c b/framebuffer/convert_font.c
new file mode 100644
index 000000000..eb8f3cb03
--- /dev/null
+++ b/framebuffer/convert_font.c
@@ -0,0 +1,1222 @@
+/*
+ * Copyright 2014 Michael Drake <tlsa@netsurf-browser.org>
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of the convert_font tool used to convert font
+ * glyph data into a compilable representation.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <unistd.h>
+#include <getopt.h>
+
+#define GLYPH_LEN 16
+#define BUCKETS 512
+#define CHUNK_SIZE (64 * 1024)
+#define HEADER_MAX 2000
+
+#define SECTION_SIZE (sizeof(uint16_t) * 256)
+
+const char *labels[4] = {
+ " Regular",
+ " Italic",
+ " Bold",
+ "Bold & Italic"
+};
+
+const char *var_lables[4] = {
+ "fb_regular",
+ "fb_italic",
+ "fb_bold",
+ "fb_bold_italic"
+};
+
+const char *short_labels[4] = {
+ " ",
+ " i",
+ "b ",
+ "bi"
+};
+
+enum font_style {
+ REGULAR = 0,
+ ITALIC = (1 << 0),
+ BOLD = (1 << 1),
+ ITALIC_BOLD = (1 << 2)
+};
+
+enum log_level {
+ LOG_DEBUG,
+ LOG_INFO,
+ LOG_RESULT,
+ LOG_WARNING,
+ LOG_ERROR
+};
+
+enum log_level level;
+
+typedef struct glyph_entry {
+ union {
+ uint32_t u32[GLYPH_LEN / 4];
+ uint8_t u8[GLYPH_LEN];
+ } data;
+ uint32_t index;
+ struct glyph_entry *next;
+} glyph_entry;
+
+/** Scratch glyph for generated code points */
+uint8_t code_point[GLYPH_LEN];
+
+/** Hash table */
+glyph_entry *ht[BUCKETS];
+
+#define LOG(lev, fmt, ...) \
+ if (lev >= level) \
+ printf(fmt, ##__VA_ARGS__);
+
+/**
+ * Get hash for glyph data
+ * \param g Glyph data (GLYPH_LEN bytes)
+ * \return glyph's hash
+ */
+static inline uint32_t glyph_hash(const uint8_t *g)
+{
+ uint32_t hash = 0x811c9dc5;
+ unsigned int len = GLYPH_LEN;
+
+ while (len > 0) {
+ hash *= 0x01000193;
+ hash ^= *g++;
+ len--;
+ }
+
+ return hash;
+}
+
+
+/**
+ * Check whether glyphs are identical (compares glyph data)
+ *
+ * \param g1 First glyph's data (GLYPH_LEN bytes)
+ * \param g2 Second glyph's data (GLYPH_LEN bytes)
+ * \return true iff both glyphs are identical, else false
+ */
+static inline bool glyphs_match(const uint8_t *g1, const uint8_t *g2)
+{
+ return (memcmp(g1, g2, GLYPH_LEN) == 0);
+}
+
+
+/**
+ * Add a glyph to a hash chain (or free, and return pointer to existing glyph)
+ *
+ * Note that if new glyph already exists in chain, it is freed and a pointer to
+ * the existing glyph is returned. If the glyph does not exist in the chain
+ * it is added and its pointer is returned.
+ *
+ * \param head Head of hash chain
+ * \param new New glyph to add (may be freed)
+ * \return pointer to glyph in hash chain
+ */
+static glyph_entry * glyph_add_to_chain(glyph_entry **head, glyph_entry *new)
+{
+ glyph_entry *e = *head;
+
+ if (*head == NULL) {
+ new->next = NULL;
+ *head = new;
+ return new;
+ }
+
+ do {
+ if (glyphs_match(new->data.u8, e->data.u8)) {
+ free(new);
+ return e;
+ }
+ if (e->next == NULL)
+ break;
+ e = e->next;
+ } while (1);
+
+ new->next = e->next;
+ e->next = new;
+ return new;
+}
+
+
+/**
+ * Free a glyph entry chain
+ *
+ * \param head Head of hash chain
+ */
+static void free_chain(glyph_entry *head)
+{
+ glyph_entry *e = head;
+
+ if (head == NULL)
+ return;
+
+ while (e != NULL) {
+ head = e->next;
+ free(e);
+ e = head;
+ };
+}
+
+
+/**
+ * Add new glyph to hash table (or free, and return pointer to existing glyph)
+ *
+ * Note that if new glyph already exists in table, it is freed and a pointer to
+ * the existing glyph is returned. If the glyph does not exist in the table
+ * it is added and its pointer is returned.
+ *
+ * \param new New glyph to add (may be freed)
+ * \return pointer to glyph in hash table
+ */
+static glyph_entry * glyph_add_to_table(glyph_entry *new)
+{
+ uint32_t hash = glyph_hash(new->data.u8);
+
+ return glyph_add_to_chain(&ht[hash % BUCKETS], new);
+}
+
+
+/**
+ * Add new glyph to hash table (or free, and return pointer to existing glyph)
+ *
+ * Note that if new glyph already exists in table, it is freed and a pointer to
+ * the existing glyph is returned. If the glyph does not exist in the table
+ * it is added and its pointer is returned.
+ *
+ * \param new New glyph to add (may be freed)
+ * \return pointer to glyph in hash table
+ */
+static void free_table(void)
+{
+ int i;
+
+ for (i = 0; i < BUCKETS; i++) {
+ free_chain(ht[i]);
+ }
+}
+
+struct parse_context {
+ enum {
+ START,
+ IN_HEADER,
+ BEFORE_ID,
+ GLYPH_ID,
+ BEFORE_GLYPH_DATA,
+ IN_GLYPH_DATA
+ } state; /**< Current parser state */
+
+ union {
+ struct {
+ bool new_line;
+ } in_header;
+ struct {
+ bool new_line;
+ bool u;
+ } before_id;
+ struct {
+ int c;
+ } g_id;
+ struct {
+ bool new_line;
+ bool prev_h;
+ bool prev_s;
+ int c;
+ } before_gd;
+ struct {
+ int line;
+ int pos;
+ int styles;
+ int line_styles;
+ glyph_entry *e[4];
+ } in_gd;
+ } data; /**< The state specific data */
+
+ int id; /**< Current ID */
+
+ int codepoints; /**< Glyphs containing codepoints */
+ int count[4]; /**< Count of glyphs in file */
+};
+
+struct font_data {
+ char header[HEADER_MAX];
+ int header_len;
+
+ uint8_t section_table[4][256];
+ uint8_t sec_count[4];
+ uint16_t *sections[4];
+
+ glyph_entry *e[0xffff];
+ int glyphs;
+};
+
+bool generate_font_header(const char *path, struct font_data *data)
+{
+ FILE *fp;
+ int s;
+
+ fp = fopen(path, "wb");
+ if (fp == NULL) {
+ LOG(LOG_ERROR, "Couldn't open header file \"%s\"\n", path);
+ return false;
+ }
+
+ fprintf(fp, "/*\n");
+ fwrite(data->header, 1, data->header_len, fp);
+ fprintf(fp, " */\n\n");
+ fprintf(fp, "/* Don't edit this file, it was generated from the "
+ "plain text source data. */\n\n");
+
+
+ for (s = 0; s < 4; s++) {
+ fprintf(fp, "const uint8_t *%s_section_table;\n",
+ var_lables[s]);
+ fprintf(fp, "const uint16_t *%s_sections;\n",
+ var_lables[s]);
+
+ }
+
+ fprintf(fp, "const uint8_t *font_glyph_data;\n");
+
+ fprintf(fp, "\n\n");
+
+ fclose(fp);
+
+ return true;
+
+}
+
+bool generate_font_source(const char *path, struct font_data *data)
+{
+ int s, i, y;
+ int limit;
+ FILE *fp;
+
+ fp = fopen(path, "wb");
+ if (fp == NULL) {
+ LOG(LOG_ERROR, "Couldn't open output file \"%s\"\n", path);
+ return false;
+ }
+
+ fprintf(fp, "/*\n");
+ fwrite(data->header, 1, data->header_len, fp);
+ fprintf(fp, " */\n\n");
+ fprintf(fp, "/* Don't edit this file, it was generated from the "
+ "plain text source data. */\n\n");
+
+ fprintf(fp, "#include <stdint.h>\n");
+ fprintf(fp, "\n");
+
+ for (s = 0; s < 4; s++) {
+
+ fprintf(fp, "static const uint8_t %s_section_table_c[256] = {\n",
+ var_lables[s]);
+
+ for (i = 0; i < 256; i++) {
+ if (i == 255)
+ fprintf(fp, "0x%.2X\n",
+ data->section_table[s][i]);
+ else if (i % 8 == 7)
+ fprintf(fp, "0x%.2X,\n",
+ data->section_table[s][i]);
+ else if (i % 8 == 0)
+ fprintf(fp, "\t0x%.2X, ",
+ data->section_table[s][i]);
+ else
+ fprintf(fp, "0x%.2X, ",
+ data->section_table[s][i]);
+ }
+
+ fprintf(fp, "};\nconst uint8_t *%s_section_table = &%s_section_table_c[0];\n\n",
+ var_lables[s], var_lables[s]);
+ fprintf(fp, "static const uint16_t %s_sections_c[%i] = {\n",
+ var_lables[s], data->sec_count[s] * 256);
+
+ limit = data->sec_count[s] * 256;
+ for (i = 0; i < limit; i++) {
+ uint16_t offset = data->sections[s][i];
+ if (i == limit - 1)
+ fprintf(fp, "0x%.4X\n", offset);
+ else if (i % 4 == 3)
+ fprintf(fp, "0x%.4X,\n", offset);
+ else if (i % 4 == 0)
+ fprintf(fp, "\t0x%.4X, ", offset);
+ else
+ fprintf(fp, "0x%.4X, ", offset);
+ }
+
+ fprintf(fp, "};\nconst uint16_t *%s_sections = &%s_sections_c[0];\n\n", var_lables[s], var_lables[s]);
+ }
+
+ fprintf(fp, "static const uint8_t font_glyph_data_c[%i] = {\n",
+ (data->glyphs + 1) * 16);
+
+ fprintf(fp, "\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n"
+ "\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n");
+
+ limit = data->glyphs;
+ for (i = 0; i < limit; i++) {
+ glyph_entry *e = data->e[i];
+
+ for (y = 0; y < 16; y++) {
+ if (i == limit - 1 && y == 15)
+ fprintf(fp, "0x%.2X\n", e->data.u8[y]);
+ else if (y % 8 == 7)
+ fprintf(fp, "0x%.2X,\n", e->data.u8[y]);
+ else if (y % 8 == 0)
+ fprintf(fp, "\t0x%.2X, ", e->data.u8[y]);
+ else
+ fprintf(fp, "0x%.2X, ", e->data.u8[y]);
+ }
+ }
+
+ fprintf(fp, "};\n");
+ fprintf(fp, "const uint8_t *font_glyph_data = &font_glyph_data_c[0];\n\n");
+
+ fclose(fp);
+
+ return true;
+}
+
+static bool add_glyph_to_data(glyph_entry *add, int id, int style,
+ struct font_data *d)
+{
+ glyph_entry *e;
+ int offset;
+ int s;
+
+ /* Find out if 'add' is unique, and get its unique table entry */
+ e = glyph_add_to_table(add);
+ if (e == add) {
+ /* Unique glyph */
+ d->e[d->glyphs++] = e;
+ e->index = d->glyphs;
+ if (d->glyphs >= 0xfffd) {
+ LOG(LOG_ERROR, " Too many glyphs for internal data "
+ "representation\n");
+ return false;
+ }
+ } else {
+ /* Duplicate glyph */
+ LOG(LOG_DEBUG, " U+%.4X (%s) is duplicate\n",
+ id, short_labels[style]);
+ }
+
+ /* Find glyph's section */
+ s = id / 256;
+
+ /* Allocate section if needed */
+ if ((s == 0 && d->sections[style] == NULL) ||
+ (s != 0 && d->section_table[style][s] == 0)) {
+ size_t size = (d->sec_count[style] + 1) * SECTION_SIZE;
+ uint16_t *temp = realloc(d->sections[style], size);
+ if (temp == NULL) {
+ LOG(LOG_ERROR, " Couldn't increase sections "
+ "allocation\n");
+ return false;
+ }
+ memset(temp + d->sec_count[style] * 256, 0,
+ SECTION_SIZE);
+ d->section_table[style][s] = d->sec_count[style];
+ d->sections[style] = temp;
+ d->sec_count[style]++;
+ }
+
+ offset = d->section_table[style][s] * 256 + (id & 0xff);
+ d->sections[style][offset] = e->index;
+
+ return true;
+}
+
+
+static bool check_glyph_data_valid(int pos, char c)
+{
+ int offset = pos % 11;
+
+ if (pos == 44) {
+ if (c != '\n') {
+ LOG(LOG_ERROR, " Invalid glyph data: "
+ "expecting '\\n', got '%c' (%i)\n",
+ c, c);
+ return false;
+ } else {
+ return true;
+ }
+ } else if (pos < 3) {
+ if (c != ' ') {
+ LOG(LOG_ERROR, " Invalid glyph data: "
+ "expecting ' ', got '%c' (%i)\n",
+ c, c);
+ return false;
+ } else {
+ return true;
+ }
+ } else if (offset == 0) {
+ if (c != '\n' && c != ' ') {
+ LOG(LOG_ERROR, " Invalid glyph data: "
+ "expecting '\\n' or ' ', "
+ "got '%c' (%i)\n",
+ c, c);
+ return false;
+ } else {
+ return true;
+ }
+ } else if (offset < 3) {
+ if (c != ' ') {
+ LOG(LOG_ERROR, " Invalid glyph data: "
+ "expecting ' ', got '%c' (%i)\n",
+ c, c);
+ return false;
+ } else {
+ return true;
+ }
+ } else if (offset >= 3 && pos < 11) {
+ if (c != '.' && c != '#') {
+ LOG(LOG_ERROR, " Invalid glyph data: "
+ "expecting '.' or '#', "
+ "got '%c' (%i)\n",
+ c, c);
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ /* offset must be >=3 */
+ if (c != '.' && c != '#' && c != ' ') {
+ LOG(LOG_ERROR, " Invalid glyph data: "
+ "expecting '.', '#', or ' ', "
+ "got '%c' (%i)\n",
+ c, c);
+ return false;
+ }
+
+ return true;
+}
+
+#define SEVEN_SET ((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | \
+ (1 << 4) | (1 << 5) | (1 << 6))
+
+#define THREE_SSS ((1 << 0) | (1 << 1) | (1 << 2))
+#define THREE_S_S ((1 << 0) | (1 << 2))
+#define THREE__SS ((1 << 0) | (1 << 1) )
+#define THREE_SS_ ( (1 << 1) | (1 << 2))
+#define THREE_S__ (1 << 2)
+#define THREE__S_ (1 << 1)
+#define THREE___S (1 << 0)
+
+uint8_t frag[16][5] = {
+ { THREE_SSS,
+ THREE_S_S,
+ THREE_S_S,
+ THREE_S_S,
+ THREE_SSS },
+
+ { THREE__S_,
+ THREE_SS_,
+ THREE__S_,
+ THREE__S_,
+ THREE_SSS },
+
+ { THREE_SS_,
+ THREE___S,
+ THREE__S_,
+ THREE_S__,
+ THREE_SSS },
+
+ { THREE_SS_,
+ THREE___S,
+ THREE_SS_,
+ THREE___S,
+ THREE_SS_ },
+
+ { THREE_S_S,
+ THREE_S_S,
+ THREE_SSS,
+ THREE___S,
+ THREE___S },
+
+ { THREE_SSS,
+ THREE_S__,
+ THREE_SSS,
+ THREE___S,
+ THREE_SSS },
+
+ { THREE__SS,
+ THREE_S__,
+ THREE_SSS,
+ THREE_S_S,
+ THREE_SSS },
+
+ { THREE_SSS,
+ THREE___S,
+ THREE__S_,
+ THREE__S_,
+ THREE__S_ },
+
+ { THREE_SSS,
+ THREE_S_S,
+ THREE_SSS,
+ THREE_S_S,
+ THREE_SSS },
+
+ { THREE_SSS,
+ THREE_S_S,
+ THREE_SSS,
+ THREE___S,
+ THREE___S },
+
+ { THREE__S_,
+ THREE_S_S,
+ THREE_SSS,
+ THREE_S_S,
+ THREE_S_S },
+
+ { THREE_SS_,
+ THREE_S_S,
+ THREE_SS_,
+ THREE_S_S,
+ THREE_SS_ },
+
+ { THREE__S_,
+ THREE_S_S,
+ THREE_S__,
+ THREE_S_S,
+ THREE__S_ },
+
+ { THREE_SS_,
+ THREE_S_S,
+ THREE_S_S,
+ THREE_S_S,
+ THREE_SS_ },
+
+ { THREE_SSS,
+ THREE_S__,
+ THREE_SS_,
+ THREE_S__,
+ THREE_SSS },
+
+ { THREE_SSS,
+ THREE_S__,
+ THREE_SS_,
+ THREE_S__,
+ THREE_S__ }
+};
+
+void build_codepoint(int id, bool italic, uint8_t *code_point)
+{
+ int shift = 0;
+ int l;
+ int r;
+
+ if (!italic)
+ shift = 1;
+
+ l = (id >> 12);
+ r = 0xf & (id >> 8);
+
+ code_point[ 0] = 0;
+ code_point[ 1] = SEVEN_SET << shift;
+ code_point[ 2] = 0;
+
+ code_point[ 3] = (frag[l][0] << (4 + shift)) | (frag[r][0] << shift);
+ code_point[ 4] = (frag[l][1] << (4 + shift)) | (frag[r][1] << shift);
+ code_point[ 5] = (frag[l][2] << (4 + shift)) | (frag[r][2] << shift);
+ code_point[ 6] = (frag[l][3] << (4 + shift)) | (frag[r][3] << shift);
+ code_point[ 7] = (frag[l][4] << (4 + shift)) | (frag[r][4] << shift);
+
+ code_point[ 8] = 0;
+
+ shift = 1;
+
+ l = 0xf & (id >> 4);
+ r = 0xf & id ;
+
+ code_point[ 9] = (frag[l][0] << (4 + shift)) | (frag[r][0] << shift);
+ code_point[10] = (frag[l][1] << (4 + shift)) | (frag[r][1] << shift);
+ code_point[11] = (frag[l][2] << (4 + shift)) | (frag[r][2] << shift);
+ code_point[12] = (frag[l][3] << (4 + shift)) | (frag[r][3] << shift);
+ code_point[13] = (frag[l][4] << (4 + shift)) | (frag[r][4] << shift);
+
+ code_point[14] = 0;
+ code_point[15] = SEVEN_SET << shift;
+}
+
+#undef SEVEN_SET
+#undef THREE_SSS
+#undef THREE_S_S
+#undef THREE__SS
+#undef THREE_SS_
+#undef THREE_S__
+#undef THREE__S_
+#undef THREE___S
+
+static bool glyph_is_codepoint(const glyph_entry *e, int id, int style)
+{
+ bool italic = false;
+
+ if (style == 1 || style == 3) {
+ italic = true;
+ }
+
+ build_codepoint(id, italic, code_point);
+
+ return glyphs_match(code_point, e->data.u8);
+}
+
+
+static bool parse_glyph_data(struct parse_context *ctx, char c,
+ struct font_data *d)
+{
+ int glyph = ctx->data.in_gd.pos / 11;
+ int g_pos = ctx->data.in_gd.pos % 11 - 3;
+ uint8_t *row;
+ bool ok;
+ int i;
+
+ /* Check that character is valid */
+ if (check_glyph_data_valid(ctx->data.in_gd.pos, c) == false) {
+ LOG(LOG_ERROR, " Error in U+%.4X data: "
+ "glyph line: %i, pos: %i\n",
+ ctx->id,
+ ctx->data.in_gd.line,
+ ctx->data.in_gd.pos);
+ goto error;
+ }
+
+ /* Allocate glyph data if needed */
+ if (ctx->data.in_gd.line == 0 &&
+ (c == '.' || c == '#')) {
+ if (ctx->data.in_gd.e[glyph] == NULL) {
+ ctx->data.in_gd.e[glyph] =
+ calloc(sizeof(struct glyph_entry), 1);
+ if (ctx->data.in_gd.e[glyph] == NULL) {
+ LOG(LOG_ERROR, " Couldn't allocate memory for "
+ "glyph entry\n");
+ goto error;
+ }
+
+ ctx->data.in_gd.styles |= 1 << glyph;
+ }
+ }
+
+ /* Build glyph data */
+ if (c == '#') {
+ row = &ctx->data.in_gd.e[glyph]->data.u8[ctx->data.in_gd.line];
+ *row += 1 << (7 - g_pos);
+
+ ctx->data.in_gd.line_styles |= 1 << glyph;
+ } else if (c == '.') {
+ ctx->data.in_gd.line_styles |= 1 << glyph;
+ }
+
+ /* Deal with current position */
+ if (c == '\n') {
+ if (ctx->data.in_gd.line == 0) {
+ if (ctx->data.in_gd.e[0] == NULL) {
+ LOG(LOG_ERROR, " Error in U+%.4X data: "
+ "\"Regular\" glyph style must "
+ "be present\n", ctx->id);
+ goto error;
+ }
+ } else if (ctx->data.in_gd.styles !=
+ ctx->data.in_gd.line_styles) {
+ LOG(LOG_ERROR, " Error in U+%.4X data: "
+ "glyph line: %i "
+ "styles don't match first line\n",
+ ctx->id,
+ ctx->data.in_gd.line);
+ goto error;
+ }
+
+ ctx->data.in_gd.pos = 0;
+ ctx->data.in_gd.line++;
+ ctx->data.in_gd.line_styles = 0;
+ } else {
+ ctx->data.in_gd.pos++;
+ }
+
+ /* If we've got all the glyph data, tidy up and advance state */
+ if (ctx->data.in_gd.line == 16) {
+ for (i = 0; i < 4; i++) {
+ if (ctx->data.in_gd.e[i] != NULL) {
+ ctx->count[i] += 1;
+ if (glyph_is_codepoint(ctx->data.in_gd.e[i],
+ ctx->id, i)) {
+ LOG(LOG_DEBUG, " U+%.4X (%s) is "
+ "codepoint\n",
+ ctx->id,
+ short_labels[i]);
+ ctx->codepoints += 1;
+ free(ctx->data.in_gd.e[i]);
+ ctx->data.in_gd.e[i] = NULL;
+ continue;
+ }
+
+ ok = add_glyph_to_data(ctx->data.in_gd.e[i],
+ ctx->id, i, d);
+ if (!ok) {
+ goto error;
+ }
+ }
+ }
+
+ ctx->data.before_id.new_line = false;
+ ctx->data.before_id.u = false;
+ ctx->state = BEFORE_ID;
+ }
+
+ return true;
+
+error:
+
+ for (i = 0; i < 4; i++) {
+ free(ctx->data.in_gd.e[i]);
+ }
+
+ return false;
+}
+
+static void parse_init(struct parse_context *ctx)
+{
+ memset(ctx, 0, sizeof(struct parse_context));
+}
+
+static bool get_hex_digit_value(char c, int *v)
+{
+ if (c >= '0' && c <= '9')
+ *v = (c - '0');
+ else if (c >= 'A' && c <= 'F')
+ *v = (10 + c - 'A');
+ else {
+ LOG(LOG_ERROR, "Invalid hex digit '%c' (%i)\n", c, c);
+ return false;
+ }
+
+ return true;
+}
+
+static bool assemble_codepoint(const char* c, int n, int *id)
+{
+ bool ok;
+ int v;
+
+ ok = get_hex_digit_value(*c, &v);
+ if (!ok) {
+ return false;
+ }
+
+ *id += v << (4 * (3 - n));
+
+ return true;
+}
+
+static bool parse_chunk(struct parse_context *ctx, const char *buf, size_t len,
+ struct font_data *d)
+{
+ int i;
+ bool ok;
+ int count[4];
+ const char *pos = buf;
+ const char *end = buf + len;
+
+ for (i = 0; i < 4; i++) {
+ count[i] = ctx->count[i];
+ }
+
+ while (pos < end) {
+ if (*pos == '\r') {
+ LOG(LOG_ERROR, "Detected \'\\r\': Bad line ending\n");
+ return false;
+ }
+
+ switch (ctx->state) {
+ case START:
+ if (*pos != '*') {
+ LOG(LOG_ERROR, "First character must be '*'\n");
+ printf("Got: %c (%i)\n", *pos, *pos);
+ return false;
+ }
+ d->header_len = 0;
+ ctx->data.in_header.new_line = true;
+ ctx->state = IN_HEADER;
+
+ /* Fall through */
+ case IN_HEADER:
+ if (ctx->data.in_header.new_line == true) {
+ if (*pos != '*') {
+ LOG(LOG_INFO, " Got header "
+ "(%i bytes)\n",
+ d->header_len);
+ LOG(LOG_DEBUG, " Header:\n\n%.*s\n",
+ d->header_len,
+ d->header);
+ ctx->data.before_id.new_line = false;
+ ctx->data.before_id.u = false;
+ ctx->state = BEFORE_ID;
+ continue;
+ } else if (*pos == '*') {
+ d->header[d->header_len++] = ' ';
+ }
+ ctx->data.in_header.new_line = false;
+
+ } else if (*pos == '\n') {
+ ctx->data.in_header.new_line = true;
+ }
+
+ if (d->header_len == HEADER_MAX) {
+ LOG(LOG_ERROR, " Header too long "
+ "(>%i bytes)\n",
+ d->header_len);
+ return false;
+ }
+
+ d->header[d->header_len++] = *pos;
+ break;
+
+ case BEFORE_ID:
+ if (*pos == '+' &&
+ ctx->data.before_id.new_line == true &&
+ ctx->data.before_id.u == true) {
+ ctx->data.g_id.c = 0;
+ ctx->id = 0;
+ ctx->state = GLYPH_ID;
+ break;
+
+ } else if (*pos == 'U' &&
+ ctx->data.before_id.new_line == true) {
+ ctx->data.before_id.u = true;
+
+ } else if (*pos == '\n') {
+ ctx->data.before_id.new_line = true;
+ ctx->data.before_id.u = false;
+
+ } else {
+ ctx->data.before_id.new_line = false;
+ ctx->data.before_id.u = false;
+ }
+ break;
+
+ case GLYPH_ID:
+ ok = assemble_codepoint(pos, ctx->data.g_id.c++,
+ &ctx->id);
+ if (!ok) {
+ LOG(LOG_ERROR, " Invalid glyph ID\n");
+ return false;
+ }
+
+ if (ctx->data.g_id.c == 4) {
+ ctx->data.before_gd.new_line = false;
+ ctx->data.before_gd.prev_h = false;
+ ctx->data.before_gd.prev_s = false;
+ ctx->data.before_gd.c = 0;
+ ctx->state = BEFORE_GLYPH_DATA;
+ break;
+ }
+ break;
+
+ case BEFORE_GLYPH_DATA:
+ /* Skip until end of dashed line */
+ if (*pos == '\n' && ctx->data.before_gd.c == 53) {
+ ctx->state = IN_GLYPH_DATA;
+ ctx->data.in_gd.e[0] = NULL;
+ ctx->data.in_gd.e[1] = NULL;
+ ctx->data.in_gd.e[2] = NULL;
+ ctx->data.in_gd.e[3] = NULL;
+ ctx->data.in_gd.line = 0;
+ ctx->data.in_gd.pos = 0;
+ ctx->data.in_gd.line_styles = 0;
+ ctx->data.in_gd.styles = 0;
+ break;
+
+ } else if (*pos == '\n') {
+ ctx->data.before_gd.new_line = true;
+ ctx->data.before_gd.prev_h = false;
+ ctx->data.before_gd.prev_s = false;
+ ctx->data.before_gd.c = 0;
+ } else if (*pos == '-' &&
+ ctx->data.before_gd.new_line == true) {
+ assert(ctx->data.before_gd.c == 0);
+ ctx->data.before_gd.new_line = false;
+ ctx->data.before_gd.c++;
+ ctx->data.before_gd.prev_h = true;
+ } else if (*pos == ' ' &&
+ ctx->data.before_gd.prev_h == true) {
+ assert(ctx->data.before_gd.prev_s == false);
+ ctx->data.before_gd.c++;
+ ctx->data.before_gd.prev_h = false;
+ ctx->data.before_gd.prev_s = true;
+ } else if (*pos == '-' &&
+ ctx->data.before_gd.prev_s == true) {
+ assert(ctx->data.before_gd.prev_h == false);
+ ctx->data.before_gd.c++;
+ ctx->data.before_gd.prev_h = true;
+ ctx->data.before_gd.prev_s = false;
+ } else {
+ ctx->data.before_gd.new_line = false;
+ ctx->data.before_gd.prev_h = false;
+ ctx->data.before_gd.prev_s = false;
+ ctx->data.before_gd.c = 0;
+ }
+ break;
+
+ case IN_GLYPH_DATA:
+ ok = parse_glyph_data(ctx, *pos, d);
+ if (!ok) {
+ return false;
+ }
+
+ break;
+ }
+
+ pos++;
+ }
+
+ for (i = 0; i < 4; i++) {
+ LOG(LOG_DEBUG, " %s: %i gylphs\n", labels[i],
+ ctx->count[i] - count[i]);
+ }
+
+ return true;
+}
+
+
+bool load_font(const char *path, struct font_data **data)
+{
+ struct parse_context ctx;
+ struct font_data *d;
+ size_t file_len;
+ size_t done;
+ size_t len;
+ int count;
+ char *buf;
+ FILE *fp;
+ bool ok;
+ int i;
+
+ *data = NULL;
+
+ fp = fopen(path, "rb");
+ if (fp == NULL) {
+ LOG(LOG_ERROR, "Couldn't open font data file\n");
+ return false;
+ }
+
+ d = calloc(sizeof(struct font_data), 1);
+ if (d == NULL) {
+ LOG(LOG_ERROR, "Couldn't allocate memory for font data\n");
+ fclose(fp);
+ return false;
+ }
+
+ /* Find filesize */
+ fseek(fp, 0L, SEEK_END);
+ file_len = ftell(fp);
+ if (file_len == -1) {
+ LOG(LOG_ERROR, "Could not size input file\n");
+ free(d);
+ fclose(fp);
+ return false;
+ }
+ fseek(fp, 0L, SEEK_SET);
+ LOG(LOG_DEBUG, "Input size: %zu bytes\n", file_len);
+
+ /* Allocate buffer for data chunks */
+ buf = malloc(CHUNK_SIZE);
+ if (buf == NULL) {
+ LOG(LOG_ERROR, "Couldn't allocate memory for input buffer\n");
+ free(d);
+ fclose(fp);
+ return false;
+ }
+
+ /* Initialise parser */
+ parse_init(&ctx);
+
+ LOG(LOG_DEBUG, "Using chunk size of %i bytes\n", CHUNK_SIZE);
+
+ /* Parse the input file in chunks */
+ for (done = 0; done < file_len; done += CHUNK_SIZE) {
+ LOG(LOG_INFO, "Parsing input chunk %zu\n", done / CHUNK_SIZE);
+
+ /* Read chunk */
+ len = fread(buf, 1, CHUNK_SIZE, fp);
+ if (file_len - done < CHUNK_SIZE &&
+ len != file_len - done) {
+ LOG(LOG_WARNING, "Last chunk has suspicious size\n");
+ } else if (file_len - done >= CHUNK_SIZE &&
+ len != CHUNK_SIZE) {
+ LOG(LOG_ERROR, "Problem reading file\n");
+ free(buf);
+ free(d);
+ fclose(fp);
+ return false;
+ }
+
+ /* Parse chunk */
+ ok = parse_chunk(&ctx, buf, len, d);
+ if (!ok) {
+ free(buf);
+ free(d);
+ fclose(fp);
+ return false;
+ }
+ LOG(LOG_DEBUG, "Parsed %zu bytes\n", done + len);
+ }
+
+ fclose(fp);
+
+ if (ctx.state != BEFORE_ID) {
+ LOG(LOG_ERROR, "Unexpected end of file\n");
+ free(buf);
+ free(d);
+ return false;
+ }
+
+ LOG(LOG_INFO, "Parsing complete:\n");
+ count = 0;
+ for (i = 0; i < 4; i++) {
+ LOG(LOG_INFO, " %s: %i gylphs\n", labels[i], ctx.count[i]);
+ count += ctx.count[i];
+ }
+
+ LOG(LOG_RESULT, " Total %i gylphs "
+ "(of which %i unique, %i codepoints, %i duplicates)\n",
+ count, d->glyphs, ctx.codepoints,
+ count - d->glyphs - ctx.codepoints);
+
+ free(buf);
+
+ *data = d;
+ return true;
+}
+
+static void log_usage(const char *argv0)
+{
+ level = LOG_INFO;
+ LOG(LOG_INFO,
+ "Usage:\n"
+ "\t%s [options] <in_file> <out_file>\n"
+ "\n"
+ "Options:\n"
+ "\t--help -h Display this text\n"
+ "\t--quiet -q Don't show warnings\n"
+ "\t--verbose -v Verbose output\n"
+ "\t--debug -d Full debug output\n",
+ argv0);
+}
+
+int main(int argc, char** argv)
+{
+ const char *in_path = NULL;
+ const char *out_path = NULL;
+ char *header_path = NULL;
+ struct font_data *data;
+ bool ok;
+ int i;
+ int opt;
+
+ level = LOG_RESULT;
+
+ /* Handle program arguments */
+ struct option long_options[] = {
+ { "help", no_argument, NULL, 'h' },
+ { "quiet", no_argument, NULL, 'q' },
+ { "verbose", no_argument, NULL, 'v' },
+ { "debug", no_argument, NULL, 'd' },
+ { "header", required_argument, NULL, 'H' },
+ };
+
+ while ((opt = getopt_long(argc, argv, "hqvdH:", long_options, NULL)) != -1) {
+ switch (opt) {
+ case 'q':
+ level = LOG_WARNING;
+ break;
+
+ case 'v':
+ level = LOG_INFO;
+ break;
+
+ case 'd':
+ level = LOG_DEBUG;
+ break;
+
+ case 'H':
+ header_path = strdup(optarg);
+ break;
+
+ case 'h':
+ log_usage(argv[0]);
+ free(header_path);
+ return EXIT_SUCCESS;
+
+ default:
+ log_usage(argv[0]);
+ free(header_path);
+ return EXIT_FAILURE;
+ }
+ }
+
+ if ((argc - optind) < 2) {
+ log_usage(argv[0]);
+ free(header_path);
+ return EXIT_FAILURE;
+ }
+
+ in_path = argv[optind];
+ out_path = argv[optind + 1];
+
+ LOG(LOG_DEBUG, "Using input path: \"%s\"\n", in_path);
+ LOG(LOG_DEBUG, "Using output path: \"%s\"\n", out_path);
+
+ ok = load_font(in_path, &data);
+ if (!ok) {
+ free_table();
+ free(header_path);
+ return EXIT_FAILURE;
+ }
+
+ ok = generate_font_source(out_path, data);
+ if (ok && (header_path != NULL)) {
+ ok = generate_font_header(header_path, data);
+ }
+ free(header_path);
+ free_table();
+ for (i = 0; i < 4; i++) {
+ free(data->sections[i]);
+ }
+ free(data);
+ if (!ok) {
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}
diff --git a/framebuffer/convert_image.c b/framebuffer/convert_image.c
index bf47a3515..838a90703 100644
--- a/framebuffer/convert_image.c
+++ b/framebuffer/convert_image.c
@@ -159,6 +159,7 @@ main(int argc, char **argv)
if (br < 0) {
printf("Error reading input: %s\n", strerror(errno));
+ fclose(f);
return 1;
}
diff --git a/framebuffer/fbtk.h b/framebuffer/fbtk.h
index 220700fef..aff281439 100644
--- a/framebuffer/fbtk.h
+++ b/framebuffer/fbtk.h
@@ -270,7 +270,7 @@ bool fbtk_get_caret(fbtk_widget_t *widget, int *x, int *y, int *height);
/******************* Widget Manipulation **********************/
-/** Change the widget's position and size.
+/** Change the widget's position and size. (Doesn't redraw)
*
*/
bool fbtk_set_pos_and_size(fbtk_widget_t *widget, int x, int y, int width, int height);
@@ -312,7 +312,8 @@ int fbtk_destroy_widget(fbtk_widget_t *widget);
/********************************* Widgets *********************************/
-/** Create a window widget.
+/**
+ * Create a window widget.
*
* @param parent The parent window or the root widget for a top level window.
* @param x The x location relative to the parent window.
@@ -323,7 +324,7 @@ int fbtk_destroy_widget(fbtk_widget_t *widget);
* window.
* @param height The height of the window limited in a similar way to the
* /a width.
- * @param c The background colour.
+ * @param bg The background colour.
* @return new window widget handle or NULL on error.
*/
fbtk_widget_t *fbtk_create_window(fbtk_widget_t *parent, int x, int y, int width, int height, colour bg);
@@ -368,6 +369,27 @@ bool fbtk_set_scroll_parameters(fbtk_widget_t *widget, int min, int max, int thu
bool fbtk_set_scroll_position(fbtk_widget_t *widget, int pos);
+/** Move and/or resize a horizontal scroll widget
+ *
+ * @param vscroll the horizontal scroll widget
+ * @param x new x pos
+ * @param y new y pos
+ * @param width new width
+ * @param height new height
+ */
+void fbtk_reposition_hscroll(fbtk_widget_t *scrollh,
+ int x, int y, int width, int height);
+
+/** Move and/or resize a vertical scroll widget
+ *
+ * @param vscroll the vertical scroll widget
+ * @param x new x pos
+ * @param y new y pos
+ * @param width new width
+ * @param height new height
+ */
+void fbtk_reposition_vscroll(fbtk_widget_t *scrollv,
+ int x, int y, int width, int height);
diff --git a/framebuffer/fbtk/event.c b/framebuffer/fbtk/event.c
index bd018c52c..2ef36321e 100644
--- a/framebuffer/fbtk/event.c
+++ b/framebuffer/fbtk/event.c
@@ -248,6 +248,13 @@ fbtk_event(fbtk_widget_t *root, nsfb_event_t *event, int timeout)
timeout = 0;
break;
+ case NSFB_EVENT_RESIZE:
+ /* Try to resize framebuffer */
+ gui_resize(root,
+ event->value.resize.w,
+ event->value.resize.h);
+ break;
+
default:
break;
}
diff --git a/framebuffer/fbtk/fbtk.c b/framebuffer/fbtk/fbtk.c
index 984748402..cb8aec57f 100644
--- a/framebuffer/fbtk/fbtk.c
+++ b/framebuffer/fbtk/fbtk.c
@@ -209,6 +209,29 @@ fbtk_set_pos_and_size(fbtk_widget_t *widget,
int x, int y,
int width, int height)
{
+ if (widget->parent != NULL) {
+ fbtk_widget_t *parent = widget->parent;
+
+ /* make new window fit inside parent */
+ if (width == 0) {
+ width = parent->width - x;
+ } else if (width < 0) {
+ width = parent->width + width - x;
+ }
+ if ((width + x) > parent->width) {
+ width = parent->width - x;
+ }
+
+ if (height == 0) {
+ height = parent->height - y;
+ } else if (height < 0) {
+ height = parent->height + height - y;
+ }
+ if ((height + y) > parent->height) {
+ height = parent->height - y;
+ }
+ }
+
if ((widget->x != x) ||
(widget->y != y) ||
(widget->width != width) ||
@@ -217,10 +240,6 @@ fbtk_set_pos_and_size(fbtk_widget_t *widget,
widget->y = y;
widget->width = width;
widget->height = height;
- /* @todo This should limit the redrawn area to the sum
- * of the old and new widget dimensions, not redraw the lot.
- */
- fbtk_request_redraw(widget->parent);
return true;
}
return false;
diff --git a/framebuffer/fbtk/scroll.c b/framebuffer/fbtk/scroll.c
index 0ce56a6ee..e91c3ef6e 100644
--- a/framebuffer/fbtk/scroll.c
+++ b/framebuffer/fbtk/scroll.c
@@ -18,6 +18,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <assert.h>
+
#include <stdbool.h>
#include <libnsfb.h>
@@ -272,6 +274,26 @@ fbtk_create_vscroll(fbtk_widget_t *parent,
return neww;
}
+
+/* exported function documented in fbtk.h */
+void
+fbtk_reposition_vscroll(fbtk_widget_t *vscroll,
+ int x,
+ int y,
+ int width,
+ int height)
+{
+ assert(vscroll->type == FB_WIDGET_TYPE_VSCROLL);
+
+ fbtk_set_pos_and_size(vscroll, x, y + scrollu.height,
+ width, height - scrollu.height - scrolld.height);
+ fbtk_set_pos_and_size(vscroll->u.scroll.btnul,
+ x, y, width, scrollu.height);
+ fbtk_set_pos_and_size(vscroll->u.scroll.btndr,
+ x, y + height - scrolld.height,
+ width, scrolld.height);
+}
+
/* Horizontal scroll widget */
static int
@@ -488,6 +510,25 @@ fbtk_create_hscroll(fbtk_widget_t *parent,
return neww;
}
+/* exported function documented in fbtk.h */
+void
+fbtk_reposition_hscroll(fbtk_widget_t *scrollh,
+ int x,
+ int y,
+ int width,
+ int height)
+{
+ assert(scrollh->type == FB_WIDGET_TYPE_HSCROLL);
+
+ fbtk_set_pos_and_size(scrollh, x + scrolll.width, y,
+ width - scrolll.width - scrollr.width, height);
+ fbtk_set_pos_and_size(scrollh->u.scroll.btnul,
+ x, y, scrolll.width, height);
+ fbtk_set_pos_and_size(scrollh->u.scroll.btndr,
+ x + width - scrollr.width, y,
+ scrollr.width, height);
+}
+
/* exported function documented in fbtk.h */
bool
diff --git a/framebuffer/fbtk/text.c b/framebuffer/fbtk/text.c
index a4562289b..b05271b44 100644
--- a/framebuffer/fbtk/text.c
+++ b/framebuffer/fbtk/text.c
@@ -66,7 +66,7 @@ fb_text_font_style(fbtk_widget_t *widget, int *font_height, int *padding,
*padding += widget->height / 6;
*font_height = widget->height - *padding - *padding;
#else
- *font_height = font_regular.height;
+ *font_height = FB_FONT_HEIGHT;
*padding = (widget->height - *padding - *font_height) / 2;
#endif
diff --git a/framebuffer/filetype.c b/framebuffer/fetch.c
index 84e286d0c..b32a95168 100644
--- a/framebuffer/filetype.c
+++ b/framebuffer/fetch.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2003 James Bursa <bursa@users.sourceforge.net>
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -16,17 +16,54 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+/** \file
+ * Interfaces for fetch table.
+ */
+
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "content/fetch.h"
+#include <limits.h>
+
+#include "utils/nsurl.h"
#include "utils/log.h"
-#include "utils/utils.h"
+#include "utils/filepath.h"
+#include "utils/file.h"
+#include "desktop/gui.h"
+
+#include "framebuffer/findfile.h"
+#include "framebuffer/fetch.h"
+
+
/**
- * filetype -- determine the MIME type of a local file
+ * Translate resource to full url.
+ *
+ * Transforms a resource: path into a full URL. The returned URL
+ * is used as the target for a redirect. The caller takes ownership of
+ * the returned nsurl including unrefing it when finished with it.
+ *
+ * \param path The path of the resource to locate.
+ * \return A string containing the full URL of the target object or
+ * NULL if no suitable resource can be found.
*/
+static nsurl *get_resource_url(const char *path)
+{
+ char buf[PATH_MAX];
+ nsurl *url = NULL;
-const char *fetch_filetype(const char *unix_path)
+ if (strcmp(path, "favicon.ico") == 0)
+ path = "favicon.png";
+
+ netsurf_path_to_nsurl(filepath_sfind(respaths, buf, path), &url);
+
+ return url;
+}
+
+/**
+ * filetype -- determine the MIME type of a local file
+ */
+static const char *fetch_filetype(const char *unix_path)
{
int l;
LOG(("unix path %s", unix_path));
@@ -52,8 +89,11 @@ const char *fetch_filetype(const char *unix_path)
return "text/html";
}
+/* table for fetch operations */
+static struct gui_fetch_table fetch_table = {
+ .filetype = fetch_filetype,
-char *fetch_mimetype(const char *ro_path)
-{
- return strdup("text/plain");
-}
+ .get_resource_url = get_resource_url,
+};
+
+struct gui_fetch_table *framebuffer_fetch_table = &fetch_table;
diff --git a/image/mng.h b/framebuffer/fetch.h
index 7ad779904..718b08300 100644
--- a/image/mng.h
+++ b/framebuffer/fetch.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2004 Richard Wilson <not_ginger_matt@users.sourceforge.net>
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -16,14 +16,10 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/** \file
- * Content for image/mng, image/png, and image/jng (interface).
- */
-#ifndef _NETSURF_IMAGE_MNG_H_
-#define _NETSURF_IMAGE_MNG_H_
+#ifndef NETSURF_FB_FETCH_H
+#define NETSURF_FB_FETCH_H
-nserror nsmng_init(void);
-nserror nsjpng_init(void);
+struct gui_fetch_table *framebuffer_fetch_table;
#endif
diff --git a/framebuffer/findfile.c b/framebuffer/findfile.c
index 821a66305..67312f452 100644
--- a/framebuffer/findfile.c
+++ b/framebuffer/findfile.c
@@ -16,19 +16,9 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <limits.h>
-#include <unistd.h>
-#include <stdbool.h>
#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <curl/curl.h>
#include "utils/filepath.h"
-#include "utils/log.h"
-#include "utils/url.h"
-#include "desktop/gui.h"
#include "framebuffer/findfile.h"
@@ -57,64 +47,6 @@ fb_init_resource(const char *resource_path)
}
-char *path_to_url(const char *path)
-{
- int urllen;
- char *url;
-
- if (path == NULL)
- return NULL;
-
- urllen = strlen(path) + FILE_SCHEME_PREFIX_LEN + 1;
- url = malloc(urllen);
-
- if (*path == '/') {
- path++; /* file: paths are already absolute */
- }
-
- snprintf(url, urllen, "%s%s", FILE_SCHEME_PREFIX, path);
-
- return url;
-}
-
-
-char *url_to_path(const char *url)
-{
- char *path;
- char *respath;
- url_func_result res; /* result from url routines */
-
- res = url_path(url, &path);
- if (res != URL_FUNC_OK) {
- return NULL;
- }
-
- res = url_unescape(path, &respath);
- free(path);
- if (res != URL_FUNC_OK) {
- return NULL;
- }
-
- return respath;
-}
-
-nsurl *gui_get_resource_url(const char *path)
-{
- char buf[PATH_MAX];
- char *raw;
- nsurl *url = NULL;
-
- if (strcmp(path, "favicon.ico") == 0)
- path = "favicon.png";
-
- raw = path_to_url(filepath_sfind(respaths, buf, path));
- if (raw != NULL) {
- nsurl_create(raw, &url);
- free(raw);
- }
-
- return url;
-}
/*
* Local Variables:
diff --git a/framebuffer/font.h b/framebuffer/font.h
index 5ae5bb3ad..6350421e7 100644
--- a/framebuffer/font.h
+++ b/framebuffer/font.h
@@ -21,6 +21,8 @@
#include "utils/utf8.h"
+extern struct gui_utf8_table *framebuffer_utf8_table;
+
bool fb_font_init(void);
bool fb_font_finalise(void);
diff --git a/framebuffer/font_freetype.c b/framebuffer/font_freetype.c
index 521a5bc5f..4381db62a 100644
--- a/framebuffer/font_freetype.c
+++ b/framebuffer/font_freetype.c
@@ -23,13 +23,14 @@
#include <ft2build.h>
#include FT_CACHE_H
-#include "css/css.h"
-#include "css/utils.h"
-#include "render/font.h"
#include "utils/filepath.h"
#include "utils/utf8.h"
#include "utils/log.h"
#include "utils/nsoption.h"
+#include "css/css.h"
+#include "css/utils.h"
+#include "render/font.h"
+#include "desktop/gui.h"
#include "framebuffer/gui.h"
#include "framebuffer/font.h"
@@ -74,30 +75,6 @@ enum fb_face_e {
static fb_faceid_t *fb_faces[FB_FACE_COUNT];
-
-utf8_convert_ret utf8_to_local_encoding(const char *string,
- size_t len,
- char **result)
-{
- return utf8_to_enc(string, "UTF-8", len, result);
-}
-
-utf8_convert_ret utf8_from_local_encoding(const char *string,
- size_t len,
- char **result)
-{
- *result = malloc(len + 1);
- if (*result == NULL) {
- return UTF8_CONVERT_NOMEM;
- }
-
- memcpy(*result, string, len);
-
- (*result)[len] = '\0';
-
- return UTF8_CONVERT_OK;
-}
-
/* map cache manager handle to face id */
static FT_Error ft_face_requester(FTC_FaceID face_id, FT_Library library, FT_Pointer request_data, FT_Face *face )
{
@@ -581,6 +558,8 @@ const struct font_functions nsfont = {
nsfont_split
};
+struct gui_utf8_table *framebuffer_utf8_table = NULL;
+
/*
* Local Variables:
* c-basic-offset:8
diff --git a/framebuffer/font_internal.c b/framebuffer/font_internal.c
index dc1b35820..9b850d5c8 100644
--- a/framebuffer/font_internal.c
+++ b/framebuffer/font_internal.c
@@ -19,16 +19,170 @@
#include <inttypes.h>
#include <string.h>
-
#include <assert.h>
-#include "css/css.h"
-#include "render/font.h"
+
#include "utils/nsoption.h"
#include "utils/utf8.h"
+#include "desktop/gui.h"
+#include "css/css.h"
+#include "render/font.h"
#include "framebuffer/gui.h"
#include "framebuffer/font.h"
+#include <font-ns-sans.h>
+
+#define GLYPH_LEN 16
+
+uint8_t code_point[GLYPH_LEN];
+uint8_t glyph_x2[GLYPH_LEN * 4];
+
+#define SEVEN_SET ((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | \
+ (1 << 4) | (1 << 5) | (1 << 6))
+
+#define THREE_SSS ((1 << 0) | (1 << 1) | (1 << 2))
+#define THREE_S_S ((1 << 0) | (1 << 2))
+#define THREE__SS ((1 << 0) | (1 << 1) )
+#define THREE_SS_ ( (1 << 1) | (1 << 2))
+#define THREE_S__ (1 << 2)
+#define THREE__S_ (1 << 1)
+#define THREE___S (1 << 0)
+
+uint8_t frag[16][5] = {
+ { THREE_SSS,
+ THREE_S_S,
+ THREE_S_S,
+ THREE_S_S,
+ THREE_SSS },
+
+ { THREE__S_,
+ THREE_SS_,
+ THREE__S_,
+ THREE__S_,
+ THREE_SSS },
+
+ { THREE_SS_,
+ THREE___S,
+ THREE__S_,
+ THREE_S__,
+ THREE_SSS },
+
+ { THREE_SS_,
+ THREE___S,
+ THREE_SS_,
+ THREE___S,
+ THREE_SS_ },
+
+ { THREE_S_S,
+ THREE_S_S,
+ THREE_SSS,
+ THREE___S,
+ THREE___S },
+
+ { THREE_SSS,
+ THREE_S__,
+ THREE_SSS,
+ THREE___S,
+ THREE_SSS },
+
+ { THREE__SS,
+ THREE_S__,
+ THREE_SSS,
+ THREE_S_S,
+ THREE_SSS },
+
+ { THREE_SSS,
+ THREE___S,
+ THREE__S_,
+ THREE__S_,
+ THREE__S_ },
+
+ { THREE_SSS,
+ THREE_S_S,
+ THREE_SSS,
+ THREE_S_S,
+ THREE_SSS },
+
+ { THREE_SSS,
+ THREE_S_S,
+ THREE_SSS,
+ THREE___S,
+ THREE___S },
+
+ { THREE__S_,
+ THREE_S_S,
+ THREE_SSS,
+ THREE_S_S,
+ THREE_S_S },
+
+ { THREE_SS_,
+ THREE_S_S,
+ THREE_SS_,
+ THREE_S_S,
+ THREE_SS_ },
+
+ { THREE__S_,
+ THREE_S_S,
+ THREE_S__,
+ THREE_S_S,
+ THREE__S_ },
+
+ { THREE_SS_,
+ THREE_S_S,
+ THREE_S_S,
+ THREE_S_S,
+ THREE_SS_ },
+
+ { THREE_SSS,
+ THREE_S__,
+ THREE_SS_,
+ THREE_S__,
+ THREE_SSS },
+
+ { THREE_SSS,
+ THREE_S__,
+ THREE_SS_,
+ THREE_S__,
+ THREE_S__ }
+};
+
+static uint8_t * get_codepoint(uint32_t id, bool italic)
+{
+ int shift = 0;
+ int l;
+ int r;
+
+ if (!italic)
+ shift = 1;
+
+ l = (id >> 12);
+ r = 0xf & (id >> 8);
+
+ code_point[ 0] = SEVEN_SET << shift;
+
+ code_point[ 2] = (frag[l][0] << (4 + shift)) | (frag[r][0] << shift);
+ code_point[ 3] = (frag[l][1] << (4 + shift)) | (frag[r][1] << shift);
+ code_point[ 4] = (frag[l][2] << (4 + shift)) | (frag[r][2] << shift);
+ code_point[ 5] = (frag[l][3] << (4 + shift)) | (frag[r][3] << shift);
+ code_point[ 6] = (frag[l][4] << (4 + shift)) | (frag[r][4] << shift);
+
+ shift = 1;
+
+ l = 0xf & (id >> 4);
+ r = 0xf & id;
+
+ code_point[ 8] = (frag[l][0] << (4 + shift)) | (frag[r][0] << shift);
+ code_point[ 9] = (frag[l][1] << (4 + shift)) | (frag[r][1] << shift);
+ code_point[10] = (frag[l][2] << (4 + shift)) | (frag[r][2] << shift);
+ code_point[11] = (frag[l][3] << (4 + shift)) | (frag[r][3] << shift);
+ code_point[12] = (frag[l][4] << (4 + shift)) | (frag[r][4] << shift);
+
+ code_point[14] = SEVEN_SET << shift;
+
+ return (uint8_t *)code_point;
+}
+
+
bool fb_font_init(void)
{
return true;
@@ -39,36 +193,132 @@ bool fb_font_finalise(void)
return true;
}
-const struct fb_font_desc*
-fb_get_font(const plot_font_style_t *fstyle)
+enum fb_font_style
+fb_get_font_style(const plot_font_style_t *fstyle)
+{
+ enum fb_font_style style = FB_REGULAR;
+
+ if (fstyle->weight >= 700)
+ style |= FB_BOLD;
+ if ((fstyle->flags & FONTF_ITALIC) || (fstyle->flags & FONTF_OBLIQUE))
+ style |= FB_ITALIC;
+
+ return style;
+}
+
+int
+fb_get_font_size(const plot_font_style_t *fstyle)
+{
+ int size = fstyle->size * 10 /
+ (((nsoption_int(font_min_size) * 3 +
+ nsoption_int(font_size)) / 4) * FONT_SIZE_SCALE);
+ if (size > 2)
+ size = 2;
+ else if (size <= 0)
+ size = 1;
+
+ return size;
+}
+
+/** Lookup table to scale 4 bits to 8 bits, so e.g. 0101 --> 00110011 */
+const uint8_t glyph_lut[16] = {
+ 0x00, 0x03, 0x0c, 0x0f,
+ 0x30, 0x33, 0x3c, 0x3f,
+ 0xc0, 0xc3, 0xcc, 0xcf,
+ 0xf0, 0xf3, 0xfc, 0xff
+};
+
+static const uint8_t *
+glyph_scale_2(const uint8_t *glyph_data)
+{
+ const uint8_t *glyph_max = glyph_data + GLYPH_LEN;
+ uint8_t *pos = glyph_x2;
+
+ do {
+ *pos++ = glyph_lut[*glyph_data >> 4];
+ *pos++ = glyph_lut[*glyph_data & 0xf];
+ *pos++ = glyph_lut[*glyph_data >> 4];
+ *pos++ = glyph_lut[*glyph_data & 0xf];
+ } while (++glyph_data < glyph_max);
+
+ return glyph_x2;
+}
+
+const uint8_t *
+fb_get_glyph(uint32_t ucs4, enum fb_font_style style, int scale)
{
- if (fstyle->weight >= 700) {
- if ((fstyle->flags & FONTF_ITALIC) ||
- (fstyle->flags & FONTF_OBLIQUE)) {
- return &font_italic_bold;
- } else {
- return &font_bold;
+ const uint8_t *glyph_data;
+ unsigned int section;
+ unsigned int offset;
+ uint16_t g_offset;
+
+ /* Internal font has no glyphs beyond U+FFFF and there isn't
+ * space to render a >4 digit codepoint; just show replacement
+ * character. */
+ if (ucs4 > 0xffff)
+ ucs4 = 0xfffd;
+
+ switch (style) {
+ case FB_BOLD_ITALIC:
+ section = fb_bold_italic_section_table[ucs4 / 256];
+ if (section != 0 || ucs4 / 256 == 0) {
+ offset = section * 256 + (ucs4 & 0xff);
+ g_offset = fb_bold_italic_sections[offset] * 16;
+ if (g_offset != 0) {
+ glyph_data = &font_glyph_data[g_offset];
+ break;
+ }
+ }
+ case FB_BOLD:
+ section = fb_bold_section_table[ucs4 / 256];
+ if (section != 0 || ucs4 / 256 == 0) {
+ offset = section * 256 + (ucs4 & 0xff);
+ g_offset = fb_bold_sections[offset] * 16;
+ if (g_offset != 0) {
+ glyph_data = &font_glyph_data[g_offset];
+ break;
+ }
}
- } else {
- if ((fstyle->flags & FONTF_ITALIC) ||
- (fstyle->flags & FONTF_OBLIQUE)) {
- return &font_italic;
- } else {
- return &font_regular;
+ case FB_ITALIC:
+ section = fb_italic_section_table[ucs4 / 256];
+ if (section != 0 || ucs4 / 256 == 0) {
+ offset = section * 256 + (ucs4 & 0xff);
+ g_offset = fb_italic_sections[offset] * 16;
+ if (g_offset != 0) {
+ glyph_data = &font_glyph_data[g_offset];
+ break;
+ }
}
+ case FB_REGULAR:
+ section = fb_regular_section_table[ucs4 / 256];
+ if (section != 0 || ucs4 / 256 == 0) {
+ offset = section * 256 + (ucs4 & 0xff);
+ g_offset = fb_regular_sections[offset] * 16;
+ if (g_offset != 0) {
+ glyph_data = &font_glyph_data[g_offset];
+ break;
+ }
+ }
+ default:
+ glyph_data = get_codepoint(ucs4, style & FB_ITALIC);
+ break;
}
-}
-utf8_convert_ret utf8_to_font_encoding(const struct fb_font_desc* font,
- const char *string,
- size_t len,
- char **result)
-{
- return utf8_to_enc(string, font->encoding, len, result);
+ switch (scale) {
+ case 1:
+ break;
+ case 2:
+ glyph_data = glyph_scale_2(glyph_data);
+ break;
+ default:
+ assert(scale >= 1 && scale <= 2);
+ break;
+ }
+ return glyph_data;
}
-utf8_convert_ret utf8_to_local_encoding(const char *string,
+static nserror utf8_to_local(const char *string,
size_t len,
char **result)
{
@@ -76,28 +326,41 @@ utf8_convert_ret utf8_to_local_encoding(const char *string,
}
-utf8_convert_ret utf8_from_local_encoding(const char *string,
+static nserror utf8_from_local(const char *string,
size_t len,
char **result)
{
*result = malloc(len + 1);
if (*result == NULL) {
- return UTF8_CONVERT_NOMEM;
+ return NSERROR_NOMEM;
}
memcpy(*result, string, len);
(*result)[len] = '\0';
- return UTF8_CONVERT_OK;
+ return NSERROR_OK;
}
+
static bool nsfont_width(const plot_font_style_t *fstyle,
const char *string, size_t length,
int *width)
{
- const struct fb_font_desc* fb_font = fb_get_font(fstyle);
- *width = fb_font->width * utf8_bounded_length(string, length);
+ size_t nxtchr = 0;
+
+ *width = 0;
+ while (nxtchr < length) {
+ uint32_t ucs4;
+ ucs4 = utf8_to_ucs4(string + nxtchr, length - nxtchr);
+ if (codepoint_displayable(ucs4)) {
+ *width += FB_FONT_WIDTH;
+ }
+
+ nxtchr = utf8_next(string, length, nxtchr);
+ }
+
+ *width *= fb_get_font_size(fstyle);
return true;
}
@@ -117,11 +380,26 @@ static bool nsfont_position_in_string(const plot_font_style_t *fstyle,
const char *string, size_t length,
int x, size_t *char_offset, int *actual_x)
{
- const struct fb_font_desc* fb_font = fb_get_font(fstyle);
- *char_offset = (x + fb_font->width / 2) / fb_font->width;
- if (*char_offset > length)
- *char_offset = length;
- *actual_x = *char_offset * fb_font->width;
+ const int width = fb_get_font_size(fstyle) * FB_FONT_WIDTH;
+ size_t nxtchr = 0;
+ int x_pos = 0;
+
+ while (nxtchr < length) {
+ uint32_t ucs4;
+ if (abs(x_pos - x) <= (width / 2))
+ break;
+
+ ucs4 = utf8_to_ucs4(string + nxtchr, length - nxtchr);
+ if (codepoint_displayable(ucs4)) {
+ x_pos += width;
+ }
+
+ nxtchr = utf8_next(string, length, nxtchr);
+ }
+
+ *actual_x = x_pos;
+
+ *char_offset = nxtchr;
return true;
}
@@ -154,26 +432,38 @@ static bool nsfont_split(const plot_font_style_t *fstyle,
const char *string, size_t length,
int x, size_t *char_offset, int *actual_x)
{
+ const int width = fb_get_font_size(fstyle) * FB_FONT_WIDTH;
+ size_t nxtchr = 0;
+ int last_space_x = 0;
+ int last_space_idx = 0;
- const struct fb_font_desc* fb_font = fb_get_font(fstyle);
- int c_off = *char_offset = x / fb_font->width;
- if (*char_offset > length) {
- *char_offset = length;
- } else {
- while (*char_offset > 0) {
- if (string[*char_offset] == ' ')
- break;
- (*char_offset)--;
+ *actual_x = 0;
+ while (nxtchr < length) {
+ uint32_t ucs4;
+
+ if (string[nxtchr] == ' ') {
+ last_space_x = *actual_x;
+ last_space_idx = nxtchr;
}
- if (*char_offset == 0) {
- *char_offset = c_off;
- while (*char_offset < length &&
- string[*char_offset] != ' ') {
- (*char_offset)++;
- }
+
+ ucs4 = utf8_to_ucs4(string + nxtchr, length - nxtchr);
+ if (codepoint_displayable(ucs4)) {
+ *actual_x += width;
+ }
+
+ if (*actual_x > x && last_space_idx != 0) {
+ /* string has exceeded available width and we've
+ * found a space; return previous space */
+ *actual_x = last_space_x;
+ *char_offset = last_space_idx;
+ return true;
}
+
+ nxtchr = utf8_next(string, length, nxtchr);
}
- *actual_x = *char_offset * fb_font->width;
+
+ *char_offset = nxtchr;
+
return true;
}
@@ -183,6 +473,14 @@ const struct font_functions nsfont = {
nsfont_split
};
+static struct gui_utf8_table utf8_table = {
+ .utf8_to_local = utf8_to_local,
+ .local_to_utf8 = utf8_from_local,
+};
+
+struct gui_utf8_table *framebuffer_utf8_table = &utf8_table;
+
+
/*
* Local Variables:
* c-basic-offset:8
diff --git a/framebuffer/font_internal.h b/framebuffer/font_internal.h
index 5b0f30ba1..d066f6bf4 100644
--- a/framebuffer/font_internal.h
+++ b/framebuffer/font_internal.h
@@ -19,24 +19,31 @@
#ifndef NETSURF_FB_FONT_INTERNAL_H
#define NETSURF_FB_FONT_INTERNAL_H
+#include <stdbool.h>
+
struct fb_font_desc {
const char *name;
- int width, height;
- const char *encoding;
- const uint32_t *data;
+ int width, height, pitch;
+};
+
+#define FB_FONT_WIDTH 8
+#define FB_FONT_HEIGHT 16
+#define FB_FONT_PITCH 8
+
+enum fb_font_style {
+ FB_REGULAR = 0,
+ FB_ITALIC = (1 << 0),
+ FB_BOLD = (1 << 1),
+ FB_BOLD_ITALIC = (FB_ITALIC | FB_BOLD)
};
-extern const struct fb_font_desc font_regular;
-extern const struct fb_font_desc font_italic;
-extern const struct fb_font_desc font_bold;
-extern const struct fb_font_desc font_italic_bold;
+enum fb_font_style fb_get_font_style(const plot_font_style_t *fstyle);
+int fb_get_font_size(const plot_font_style_t *fstyle);
-extern const struct fb_font_desc* fb_get_font(const plot_font_style_t *fstyle);
+const uint8_t *fb_get_glyph(uint32_t ucs4, enum fb_font_style style, int scale);
-extern utf8_convert_ret utf8_to_font_encoding(const struct fb_font_desc* font,
- const char *string,
- size_t len,
- char **result);
+#define codepoint_displayable(u) \
+ (!(u >= 0x200b && u <= 0x200f))
#endif /* NETSURF_FB_FONT_INTERNAL_H */
diff --git a/framebuffer/framebuffer.c b/framebuffer/framebuffer.c
index c2d73acb0..a0f39707c 100644
--- a/framebuffer/framebuffer.c
+++ b/framebuffer/framebuffer.c
@@ -125,42 +125,40 @@ framebuffer_plot_text(int x, int y, const char *text, size_t length,
static bool framebuffer_plot_text(int x, int y, const char *text, size_t length,
const plot_font_style_t *fstyle)
{
- const struct fb_font_desc* fb_font = fb_get_font(fstyle);
- const uint32_t *chrp;
- char *buffer = NULL;
- int chr;
- int blen;
+ enum fb_font_style style = fb_get_font_style(fstyle);
+ int size = fb_get_font_size(fstyle);
+ const uint8_t *chrp;
+ size_t nxtchr = 0;
nsfb_bbox_t loc;
+ uint32_t ucs4;
+ int p = FB_FONT_PITCH * size;
+ int w = FB_FONT_WIDTH * size;
+ int h = FB_FONT_HEIGHT * size;
- utf8_to_font_encoding(fb_font, text, length, &buffer);
- if (buffer == NULL)
- return true;
-
- /* y is given as the baseline, at 3/4 from top.
- * we need it to the top */
- y -= ((fb_font->height * 3) / 4);
+ y -= ((h * 3) / 4);
+ /* the coord is the bottom-left of the pixels offset by 1 to make
+ * it work since fb coords are the top-left of pixels */
+ y += 1;
- /* the coord is the bottom-left of the pixels offset by 1 to make
- * it work since fb coords are the top-left of pixels
- */
- y += 1;
+ while (nxtchr < length) {
+ ucs4 = utf8_to_ucs4(text + nxtchr, length - nxtchr);
+ nxtchr = utf8_next(text, length, nxtchr);
- blen = strlen(buffer);
+ if (!codepoint_displayable(ucs4))
+ continue;
- for (chr = 0; chr < blen; chr++) {
loc.x0 = x;
loc.y0 = y;
- loc.x1 = loc.x0 + fb_font->width;
- loc.y1 = loc.y0 + fb_font->height;
+ loc.x1 = loc.x0 + w;
+ loc.y1 = loc.y0 + h;
- chrp = fb_font->data + ((unsigned char)buffer[chr] * fb_font->height);
- nsfb_plot_glyph1(nsfb, &loc, (uint8_t *)chrp, 32, fstyle->foreground);
+ chrp = fb_get_glyph(ucs4, style, size);
+ nsfb_plot_glyph1(nsfb, &loc, chrp, p, fstyle->foreground);
- x += fb_font->width;
+ x += w;
}
- free(buffer);
return true;
}
#endif
@@ -347,6 +345,42 @@ const struct plotter_table fb_plotters = {
};
+static bool framebuffer_format_from_bpp(int bpp, enum nsfb_format_e *fmt)
+{
+ switch (bpp) {
+ case 32:
+ *fmt = NSFB_FMT_XRGB8888;
+ break;
+
+ case 24:
+ *fmt = NSFB_FMT_RGB888;
+ break;
+
+ case 16:
+ *fmt = NSFB_FMT_RGB565;
+ break;
+
+ case 8:
+ *fmt = NSFB_FMT_I8;
+ break;
+
+ case 4:
+ *fmt = NSFB_FMT_I4;
+ break;
+
+ case 1:
+ *fmt = NSFB_FMT_I1;
+ break;
+
+ default:
+ LOG(("Bad bits per pixel (%d)\n", bpp));
+ return false;
+ }
+
+ return true;
+}
+
+
nsfb_t *
framebuffer_initialise(const char *fename, int width, int height, int bpp)
@@ -355,34 +389,8 @@ framebuffer_initialise(const char *fename, int width, int height, int bpp)
enum nsfb_format_e fbfmt;
/* bpp is a proxy for the framebuffer format */
- switch (bpp) {
- case 32:
- fbfmt = NSFB_FMT_XRGB8888;
- break;
-
- case 24:
- fbfmt = NSFB_FMT_RGB888;
- break;
-
- case 16:
- fbfmt = NSFB_FMT_RGB565;
- break;
-
- case 8:
- fbfmt = NSFB_FMT_I8;
- break;
-
- case 4:
- fbfmt = NSFB_FMT_I4;
- break;
-
- case 1:
- fbfmt = NSFB_FMT_I1;
- break;
-
- default:
- LOG(("Bad bits per pixel (%d)\n", bpp));
- return NULL;
+ if (framebuffer_format_from_bpp(bpp, &fbfmt) == false) {
+ return NULL;
}
fbtype = nsfb_type_from_name(fename);
@@ -415,6 +423,25 @@ framebuffer_initialise(const char *fename, int width, int height, int bpp)
}
+bool
+framebuffer_resize(nsfb_t *nsfb, int width, int height, int bpp)
+{
+ enum nsfb_format_e fbfmt;
+
+ /* bpp is a proxy for the framebuffer format */
+ if (framebuffer_format_from_bpp(bpp, &fbfmt) == false) {
+ return false;
+ }
+
+ if (nsfb_set_geometry(nsfb, width, height, fbfmt) == -1) {
+ LOG(("Unable to change surface geometry\n"));
+ return false;
+ }
+
+ return true;
+
+}
+
void
framebuffer_finalise(void)
{
diff --git a/framebuffer/framebuffer.h b/framebuffer/framebuffer.h
index 0e46cb1f5..5204dbd92 100644
--- a/framebuffer/framebuffer.h
+++ b/framebuffer/framebuffer.h
@@ -3,6 +3,7 @@
extern const struct plotter_table fb_plotters;
nsfb_t *framebuffer_initialise(const char *fename, int width, int height, int bpp);
+bool framebuffer_resize(nsfb_t *nsfb, int width, int height, int bpp);
void framebuffer_finalise(void);
bool framebuffer_set_cursor(struct fbtk_bitmap *bm);
diff --git a/framebuffer/gui.c b/framebuffer/gui.c
index b4bb3ef43..4069df2c2 100644
--- a/framebuffer/gui.c
+++ b/framebuffer/gui.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2008 Vincent Sanders <vince@simtec.co.uk>
+ * Copyright 2008, 2014 Vincent Sanders <vince@netsurf-browser.org>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -31,19 +31,17 @@
#include <libnsfb_plot.h>
#include <libnsfb_event.h>
-#include "desktop/browser_private.h"
+#include "desktop/browser_history.h"
#include "desktop/gui.h"
#include "desktop/mouse.h"
#include "desktop/plotters.h"
#include "desktop/netsurf.h"
+#include "utils/utils.h"
#include "utils/nsoption.h"
#include "utils/filepath.h"
#include "utils/log.h"
#include "utils/messages.h"
-#include "utils/schedule.h"
#include "utils/types.h"
-#include "utils/url.h"
-#include "utils/utils.h"
#include "desktop/textinput.h"
#include "render/form.h"
@@ -54,9 +52,10 @@
#include "framebuffer/findfile.h"
#include "framebuffer/image_data.h"
#include "framebuffer/font.h"
+#include "framebuffer/clipboard.h"
+#include "framebuffer/fetch.h"
#include "content/urldb.h"
-#include "desktop/local_history.h"
#include "content/fetch.h"
#define NSFB_TOOLBAR_DEFAULT_LAYOUT "blfsrutc"
@@ -122,9 +121,8 @@ static void
widget_scroll_y(struct gui_window *gw, int y, bool abs)
{
struct browser_widget_s *bwidget = fbtk_get_userpw(gw->browser);
- int content_height;
+ int content_width, content_height;
int height;
- float scale = gw->bw->scale;
LOG(("window scroll"));
if (abs) {
@@ -133,7 +131,8 @@ widget_scroll_y(struct gui_window *gw, int y, bool abs)
bwidget->pany += y;
}
- content_height = content_get_height(gw->bw->current_content) * scale;
+ browser_window_get_extents(gw->bw, true,
+ &content_width, &content_height);
height = fbtk_get_height(gw->browser);
@@ -160,9 +159,8 @@ static void
widget_scroll_x(struct gui_window *gw, int x, bool abs)
{
struct browser_widget_s *bwidget = fbtk_get_userpw(gw->browser);
- int content_width;
+ int content_width, content_height;
int width;
- float scale = gw->bw->scale;
if (abs) {
bwidget->panx = x - bwidget->scrollx;
@@ -170,7 +168,8 @@ widget_scroll_x(struct gui_window *gw, int x, bool abs)
bwidget->panx += x;
}
- content_width = content_get_width(gw->bw->current_content) * scale;
+ browser_window_get_extents(gw->bw, true,
+ &content_width, &content_height);
width = fbtk_get_width(gw->browser);
@@ -329,6 +328,7 @@ fb_redraw(fbtk_widget_t *widget,
.plot = &fb_plotters
};
nsfb_t *nsfb = fbtk_get_nsfb(widget);
+ float scale = browser_window_get_scale(bw);
LOG(("%d,%d to %d,%d",
bwidget->redraw_box.x0,
@@ -354,8 +354,8 @@ fb_redraw(fbtk_widget_t *widget,
clip.y1 = bwidget->redraw_box.y1;
browser_window_redraw(bw,
- (x - bwidget->scrollx) / bw->scale,
- (y - bwidget->scrolly) / bw->scale,
+ (x - bwidget->scrollx) / scale,
+ (y - bwidget->scrolly) / scale,
&clip, &ctx);
if (fbtk_get_caret(widget, &caret_x, &caret_y, &caret_h)) {
@@ -555,104 +555,9 @@ static bool nslog_stream_configure(FILE *fptr)
return true;
}
-/** Entry point from OS.
- *
- * /param argc The number of arguments in the string vector.
- * /param argv The argument string vector.
- * /return The return code to the OS
- */
-int
-main(int argc, char** argv)
-{
- struct browser_window *bw;
- char *options;
- char *messages;
- nsurl *url;
- nserror ret;
- nsfb_t *nsfb;
-
- respaths = fb_init_resource(NETSURF_FB_RESPATH":"NETSURF_FB_FONTPATH);
-
- /* initialise logging. Not fatal if it fails but not much we
- * can do about it either.
- */
- nslog_init(nslog_stream_configure, &argc, argv);
-
- /* user options setup */
- ret = nsoption_init(set_defaults, &nsoptions, &nsoptions_default);
- if (ret != NSERROR_OK) {
- die("Options failed to initialise");
- }
- options = filepath_find(respaths, "Choices");
- nsoption_read(options, nsoptions);
- free(options);
- nsoption_commandline(&argc, argv, nsoptions);
-
- /* common initialisation */
- messages = filepath_find(respaths, "Messages");
- ret = netsurf_init(messages);
- free(messages);
- if (ret != NSERROR_OK) {
- die("NetSurf failed to initialise");
- }
-
- /* Override, since we have no support for non-core SELECT menu */
- nsoption_set_bool(core_select_menu, true);
-
- if (process_cmdline(argc,argv) != true)
- die("unable to process command line.\n");
-
- nsfb = framebuffer_initialise(fename, fewidth, feheight, febpp);
- if (nsfb == NULL)
- die("Unable to initialise framebuffer");
-
- framebuffer_set_cursor(&pointer_image);
-
- if (fb_font_init() == false)
- die("Unable to initialise the font system");
-
- fbtk = fbtk_init(nsfb);
-
- fbtk_enable_oskb(fbtk);
-
- urldb_load_cookies(nsoption_charp(cookie_file));
-
- /* create an initial browser window */
-
- LOG(("calling browser_window_create"));
-
- ret = nsurl_create(feurl, &url);
- if (ret == NSERROR_OK) {
- ret = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
- url,
- NULL,
- NULL,
- &bw);
- nsurl_unref(url);
- }
- if (ret != NSERROR_OK) {
- warn_user(messages_get_errorcode(ret), 0);
- } else {
- netsurf_main_loop();
-
- browser_window_destroy(bw);
- }
-
- netsurf_exit();
-
- if (fb_font_finalise() == false)
- LOG(("Font finalisation failed."));
- /* finalise options */
- nsoption_finalise(nsoptions, nsoptions_default);
-
- return 0;
-}
-
-void
-gui_poll(bool active)
+static void framebuffer_poll(bool active)
{
nsfb_event_t event;
int timeout; /* timeout in miliseconds */
@@ -660,10 +565,6 @@ gui_poll(bool active)
/* run the scheduler and discover how long to wait for the next event */
timeout = schedule_run();
- /* if active do not wait for event, return immediately */
- if (active)
- timeout = 0;
-
/* if redraws are pending do not wait for event, return immediately */
if (fbtk_get_redraw_pending(fbtk))
timeout = 0;
@@ -678,8 +579,7 @@ gui_poll(bool active)
}
-void
-gui_quit(void)
+static void gui_quit(void)
{
LOG(("gui_quit"));
@@ -695,7 +595,7 @@ fb_browser_window_click(fbtk_widget_t *widget, fbtk_callback_info *cbi)
struct gui_window *gw = cbi->context;
struct browser_widget_s *bwidget = fbtk_get_userpw(widget);
browser_mouse_state mouse;
- float scale = gw->bw->scale;
+ float scale = browser_window_get_scale(gw->bw);
int x = (cbi->x + bwidget->scrollx) / scale;
int y = (cbi->y + bwidget->scrolly) / scale;
unsigned int time_now;
@@ -847,8 +747,9 @@ fb_browser_window_move(fbtk_widget_t *widget, fbtk_callback_info *cbi)
browser_mouse_state mouse = 0;
struct gui_window *gw = cbi->context;
struct browser_widget_s *bwidget = fbtk_get_userpw(widget);
- int x = (cbi->x + bwidget->scrollx) / gw->bw->scale;
- int y = (cbi->y + bwidget->scrolly) / gw->bw->scale;
+ float scale = browser_window_get_scale(gw->bw);
+ int x = (cbi->x + bwidget->scrollx) / scale;
+ int y = (cbi->y + bwidget->scrolly) / scale;
if (gui_drag.state == GUI_DRAG_PRESSED &&
(abs(x - gui_drag.x) > 5 ||
@@ -1080,8 +981,8 @@ fb_leftarrow_click(fbtk_widget_t *widget, fbtk_callback_info *cbi)
if (cbi->event->type != NSFB_EVENT_KEY_UP)
return 0;
- if (history_back_available(bw->history))
- history_back(bw, bw->history);
+ if (browser_window_back_available(bw))
+ browser_window_history_back(bw, false);
fb_update_back_forward(gw);
@@ -1098,8 +999,8 @@ fb_rightarrow_click(fbtk_widget_t *widget, fbtk_callback_info *cbi)
if (cbi->event->type != NSFB_EVENT_KEY_UP)
return 0;
- if (history_forward_available(bw->history))
- history_forward(bw, bw->history);
+ if (browser_window_forward_available(bw))
+ browser_window_history_forward(bw, false);
fb_update_back_forward(gw);
return 1;
@@ -1186,14 +1087,8 @@ fb_url_enter(void *pw, char *text)
if (error != NSERROR_OK) {
warn_user(messages_get_errorcode(error), 0);
} else {
- browser_window_navigate(bw,
- url,
- NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
- NULL,
- NULL,
- NULL);
+ browser_window_navigate(bw, url, NULL, BW_NAVIGATE_HISTORY,
+ NULL, NULL, NULL);
nsurl_unref(url);
}
@@ -1334,6 +1229,7 @@ create_toolbar(struct gui_window *gw,
&history_image,
fb_localhistory_btn_clik,
gw);
+ gw->history = widget;
break;
case 'f': /* forward */
@@ -1361,6 +1257,7 @@ create_toolbar(struct gui_window *gw,
&stop_image_g,
fb_close_click,
gw->bw);
+ gw->close = widget;
break;
case 's': /* stop */
@@ -1374,6 +1271,7 @@ create_toolbar(struct gui_window *gw,
&stop_image,
fb_stop_click,
gw->bw);
+ gw->stop = widget;
break;
case 'r': /* reload */
@@ -1387,6 +1285,7 @@ create_toolbar(struct gui_window *gw,
&reload,
fb_reload_click,
gw->bw);
+ gw->reload = widget;
break;
case 't': /* throbber/activity indicator */
@@ -1461,6 +1360,155 @@ create_toolbar(struct gui_window *gw,
return toolbar;
}
+
+/** Resize a toolbar.
+ *
+ * @param gw Parent window
+ * @param toolbar_height The height in pixels of the toolbar
+ * @param padding The padding in pixels round each element of the toolbar
+ * @param toolbar_layout A string defining which buttons and controls
+ * should be added to the toolbar. May be empty
+ * string to disable the bar.
+ */
+static void
+resize_toolbar(struct gui_window *gw,
+ int toolbar_height,
+ int padding,
+ const char *toolbar_layout)
+{
+ fbtk_widget_t *widget;
+
+ int xpos; /* The position of the next widget. */
+ int xlhs = 0; /* extent of the left hand side widgets */
+ int xdir = 1; /* the direction of movement + or - 1 */
+ const char *itmtype; /* type of the next item */
+ int x = 0, y = 0, w = 0, h = 0;
+
+ if (gw->toolbar == NULL) {
+ return;
+ }
+
+ if (toolbar_layout == NULL) {
+ toolbar_layout = NSFB_TOOLBAR_DEFAULT_LAYOUT;
+ }
+
+ itmtype = toolbar_layout;
+
+ if (*itmtype == 0) {
+ return;
+ }
+
+ fbtk_set_pos_and_size(gw->toolbar, 0, 0, 0, toolbar_height);
+
+ xpos = padding;
+
+ /* loop proceeds creating widget on the left hand side until
+ * it runs out of layout or encounters a url bar declaration
+ * wherupon it works backwards from the end of the layout
+ * untill the space left is for the url bar
+ */
+ while (itmtype >= toolbar_layout && xdir != 0) {
+
+ switch (*itmtype) {
+ case 'b': /* back */
+ widget = gw->back;
+ x = (xdir == 1) ? xpos : xpos - left_arrow.width;
+ y = padding;
+ w = left_arrow.width;
+ h = -padding;
+ break;
+
+ case 'l': /* local history */
+ widget = gw->history;
+ x = (xdir == 1) ? xpos : xpos - history_image.width;
+ y = padding;
+ w = history_image.width;
+ h = -padding;
+ break;
+
+ case 'f': /* forward */
+ widget = gw->forward;
+ x = (xdir == 1) ? xpos : xpos - right_arrow.width;
+ y = padding;
+ w = right_arrow.width;
+ h = -padding;
+ break;
+
+ case 'c': /* close the current window */
+ widget = gw->close;
+ x = (xdir == 1) ? xpos : xpos - stop_image_g.width;
+ y = padding;
+ w = stop_image_g.width;
+ h = -padding;
+ break;
+
+ case 's': /* stop */
+ widget = gw->stop;
+ x = (xdir == 1) ? xpos : xpos - stop_image.width;
+ y = padding;
+ w = stop_image.width;
+ h = -padding;
+ break;
+
+ case 'r': /* reload */
+ widget = gw->reload;
+ x = (xdir == 1) ? xpos : xpos - reload.width;
+ y = padding;
+ w = reload.width;
+ h = -padding;
+ break;
+
+ case 't': /* throbber/activity indicator */
+ widget = gw->throbber;
+ x = (xdir == 1) ? xpos : xpos - throbber0.width;
+ y = padding;
+ w = throbber0.width;
+ h = -padding;
+ break;
+
+
+ case 'u': /* url bar*/
+ if (xdir == -1) {
+ /* met the u going backwards add url
+ * now we know available extent
+ */
+ widget = gw->url;
+ x = xlhs;
+ y = padding;
+ w = xpos - xlhs;
+ h = -padding;
+
+ /* toolbar is complete */
+ xdir = 0;
+ break;
+ }
+ /* met url going forwards, note position and
+ * reverse direction
+ */
+ itmtype = toolbar_layout + strlen(toolbar_layout);
+ xdir = -1;
+ xlhs = xpos;
+ w = fbtk_get_width(gw->toolbar);
+ xpos = 2 * w;
+ widget = gw->toolbar;
+ break;
+
+ default:
+ widget = NULL;
+ break;
+
+ }
+
+ if (widget != NULL) {
+ if (widget != gw->toolbar)
+ fbtk_set_pos_and_size(widget, x, y, w, h);
+ xpos += xdir * (w + padding);
+ }
+
+ itmtype += xdir;
+ }
+}
+
/** Routine called when "stripped of focus" event occours for browser widget.
*
* @param widget The widget reciving "stripped of focus" event.
@@ -1497,6 +1545,14 @@ create_browser_widget(struct gui_window *gw, int toolbar_height, int furniture_w
}
static void
+resize_browser_widget(struct gui_window *gw, int x, int y,
+ int width, int height)
+{
+ fbtk_set_pos_and_size(gw->browser, x, y, width, height);
+ browser_window_reformat(gw->bw, false, width, height);
+}
+
+static void
create_normal_browser_window(struct gui_window *gw, int furniture_width)
{
fbtk_widget_t *widget;
@@ -1517,6 +1573,7 @@ create_normal_browser_window(struct gui_window *gw, int furniture_width)
2,
FB_FRAME_COLOUR,
nsoption_charp(fb_toolbar_layout));
+ gw->toolbar = toolbar;
/* set the actually created toolbar height */
if (toolbar != NULL) {
@@ -1578,6 +1635,8 @@ create_normal_browser_window(struct gui_window *gw, int furniture_width)
fbtk_set_handler(widget, FBTK_CBT_POINTERENTER, set_ptr_default_move, NULL);
}
+ gw->bottom_right = widget;
+
/* create vertical scrollbar */
gw->vscroll = fbtk_create_vscroll(gw->window,
fbtk_get_width(gw->window) - furniture_width,
@@ -1596,11 +1655,86 @@ create_normal_browser_window(struct gui_window *gw, int furniture_width)
fbtk_set_focus(gw->browser);
}
+static void
+resize_normal_browser_window(struct gui_window *gw, int furniture_width)
+{
+ bool resized;
+ int width, height;
+ int statusbar_width;
+ int toolbar_height = fbtk_get_height(gw->toolbar);
+
+ /* Resize the main window widget */
+ resized = fbtk_set_pos_and_size(gw->window, 0, 0, 0, 0);
+ if (!resized)
+ return;
+
+ width = fbtk_get_width(gw->window);
+ height = fbtk_get_height(gw->window);
+ statusbar_width = nsoption_int(toolbar_status_size) * width / 10000;
+
+ resize_toolbar(gw, toolbar_height, 2,
+ nsoption_charp(fb_toolbar_layout));
+ fbtk_set_pos_and_size(gw->status,
+ 0, height - furniture_width,
+ statusbar_width, furniture_width);
+ fbtk_reposition_hscroll(gw->hscroll,
+ statusbar_width, height - furniture_width,
+ width - statusbar_width - furniture_width,
+ furniture_width);
+ fbtk_set_pos_and_size(gw->bottom_right,
+ width - furniture_width, height - furniture_width,
+ furniture_width, furniture_width);
+ fbtk_reposition_vscroll(gw->vscroll,
+ width - furniture_width,
+ toolbar_height, furniture_width,
+ height - toolbar_height - furniture_width);
+ resize_browser_widget(gw,
+ 0, toolbar_height,
+ width - furniture_width,
+ height - furniture_width - toolbar_height);
+}
+
+static void gui_window_add_to_window_list(struct gui_window *gw)
+{
+ gw->next = NULL;
+ gw->prev = NULL;
+
+ if (window_list == NULL) {
+ window_list = gw;
+ } else {
+ window_list->prev = gw;
+ gw->next = window_list;
+ window_list = gw;
+ }
+}
+
+static void gui_window_remove_from_window_list(struct gui_window *gw)
+{
+ struct gui_window *list;
+
+ for (list = window_list; list != NULL; list = list->next) {
+ if (list != gw)
+ continue;
+
+ if (list == window_list) {
+ window_list = list->next;
+ if (window_list != NULL)
+ window_list->prev = NULL;
+ } else {
+ list->prev->next = list->next;
+ if (list->next != NULL) {
+ list->next->prev = list->prev;
+ }
+ }
+ break;
+ }
+}
+
-struct gui_window *
-gui_create_browser_window(struct browser_window *bw,
- struct browser_window *clone,
- bool new_tab)
+static struct gui_window *
+gui_window_create(struct browser_window *bw,
+ struct gui_window *existing,
+ gui_window_create_flags flags)
{
struct gui_window *gw;
@@ -1609,8 +1743,7 @@ gui_create_browser_window(struct browser_window *bw,
if (gw == NULL)
return NULL;
- /* seems we need to associate the gui window with the underlying
- * browser window
+ /* associate the gui window with the underlying browser window
*/
gw->bw = bw;
@@ -1620,30 +1753,29 @@ gui_create_browser_window(struct browser_window *bw,
/* map and request redraw of gui window */
fbtk_set_mapping(gw->window, true);
+ /* Add it to the window list */
+ gui_window_add_to_window_list(gw);
+
return gw;
}
-void
+static void
gui_window_destroy(struct gui_window *gw)
{
+ gui_window_remove_from_window_list(gw);
+
fbtk_destroy_widget(gw->window);
free(gw);
}
-void
-gui_window_set_title(struct gui_window *g, const char *title)
-{
- LOG(("%p, %s", g, title));
-}
-
-void
+static void
gui_window_redraw_window(struct gui_window *g)
{
fb_queue_redraw(g->browser, 0, 0, fbtk_get_width(g->browser), fbtk_get_height(g->browser) );
}
-void
+static void
gui_window_update_box(struct gui_window *g, const struct rect *rect)
{
struct browser_widget_s *bwidget = fbtk_get_userpw(g->browser);
@@ -1654,71 +1786,68 @@ gui_window_update_box(struct gui_window *g, const struct rect *rect)
rect->y1 - bwidget->scrolly);
}
-bool
+static bool
gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
{
struct browser_widget_s *bwidget = fbtk_get_userpw(g->browser);
+ float scale = browser_window_get_scale(g->bw);
- *sx = bwidget->scrollx / g->bw->scale;
- *sy = bwidget->scrolly / g->bw->scale;
+ *sx = bwidget->scrollx / scale;
+ *sy = bwidget->scrolly / scale;
return true;
}
-void
+static void
gui_window_set_scroll(struct gui_window *gw, int sx, int sy)
{
struct browser_widget_s *bwidget = fbtk_get_userpw(gw->browser);
+ float scale = browser_window_get_scale(gw->bw);
assert(bwidget);
- widget_scroll_x(gw, sx * gw->bw->scale, true);
- widget_scroll_y(gw, sy * gw->bw->scale, true);
+ widget_scroll_x(gw, sx * scale, true);
+ widget_scroll_y(gw, sy * scale, true);
}
-void
-gui_window_scroll_visible(struct gui_window *g, int x0, int y0,
- int x1, int y1)
-{
- LOG(("%s:(%p, %d, %d, %d, %d)", __func__, g, x0, y0, x1, y1));
-}
-void
+static void
gui_window_get_dimensions(struct gui_window *g,
int *width,
int *height,
bool scaled)
{
+ float scale = browser_window_get_scale(g->bw);
+
*width = fbtk_get_width(g->browser);
*height = fbtk_get_height(g->browser);
if (scaled) {
- *width /= g->bw->scale;
- *height /= g->bw->scale;
+ *width /= scale;
+ *height /= scale;
}
}
-void
+static void
gui_window_update_extent(struct gui_window *gw)
{
- float scale = gw->bw->scale;
+ int w, h;
+ browser_window_get_extents(gw->bw, true, &w, &h);
- fbtk_set_scroll_parameters(gw->hscroll, 0,
- content_get_width(gw->bw->current_content) * scale,
+ fbtk_set_scroll_parameters(gw->hscroll, 0, w,
fbtk_get_width(gw->browser), 100);
- fbtk_set_scroll_parameters(gw->vscroll, 0,
- content_get_height(gw->bw->current_content) * scale,
+ fbtk_set_scroll_parameters(gw->vscroll, 0, h,
fbtk_get_height(gw->browser), 100);
}
-void
+static void
gui_window_set_status(struct gui_window *g, const char *text)
{
fbtk_set_text(g->status, text);
}
-void
+static void
gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape)
{
switch (shape) {
@@ -1748,12 +1877,7 @@ gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape)
}
}
-void
-gui_window_hide_pointer(struct gui_window *g)
-{
-}
-
-void
+static void
gui_window_set_url(struct gui_window *g, const char *url)
{
fbtk_set_text(g->url, url);
@@ -1812,18 +1936,18 @@ throbber_advance(void *pw)
if (g->throbber_index >= 0) {
fbtk_set_bitmap(g->throbber, image);
- schedule(10, throbber_advance, g);
+ framebuffer_schedule(100, throbber_advance, g);
}
}
-void
+static void
gui_window_start_throbber(struct gui_window *g)
{
g->throbber_index = 0;
- schedule(10, throbber_advance, g);
+ framebuffer_schedule(100, throbber_advance, g);
}
-void
+static void
gui_window_stop_throbber(struct gui_window *gw)
{
gw->throbber_index = -1;
@@ -1850,7 +1974,7 @@ gui_window_remove_caret_cb(fbtk_widget_t *widget)
}
}
-void
+static void
gui_window_place_caret(struct gui_window *g, int x, int y, int height,
const struct rect *clip)
{
@@ -1868,7 +1992,7 @@ gui_window_place_caret(struct gui_window *g, int x, int y, int height,
y + height - bwidget->scrolly);
}
-void
+static void
gui_window_remove_caret(struct gui_window *g)
{
int c_x, c_y, c_h;
@@ -1879,115 +2003,179 @@ gui_window_remove_caret(struct gui_window *g)
}
}
-void
-gui_window_new_content(struct gui_window *g)
+static void framebuffer_window_reformat(struct gui_window *gw)
{
-}
+ /** @todo if we ever do zooming reformat should be implemented */
+ LOG(("window:%p", gw));
-bool
-gui_window_scroll_start(struct gui_window *g)
-{
- return true;
+ /*
+ browser_window_reformat(gw->bw, false, width, height);
+ */
}
-bool
-gui_window_drag_start(struct gui_window *g, gui_drag_type type,
- const struct rect *rect)
-{
- return true;
-}
+static struct gui_window_table framebuffer_window_table = {
+ .create = gui_window_create,
+ .destroy = gui_window_destroy,
+ .redraw = gui_window_redraw_window,
+ .update = gui_window_update_box,
+ .get_scroll = gui_window_get_scroll,
+ .set_scroll = gui_window_set_scroll,
+ .get_dimensions = gui_window_get_dimensions,
+ .update_extent = gui_window_update_extent,
+ .reformat = framebuffer_window_reformat,
-void
-gui_window_save_link(struct gui_window *g, const char *url, const char *title)
-{
-}
+ .set_url = gui_window_set_url,
+ .set_status = gui_window_set_status,
+ .set_pointer = gui_window_set_pointer,
+ .place_caret = gui_window_place_caret,
+ .remove_caret = gui_window_remove_caret,
+ .start_throbber = gui_window_start_throbber,
+ .stop_throbber = gui_window_stop_throbber,
+};
-/**
- * set favicon
- */
-void
-gui_window_set_icon(struct gui_window *g, hlcache_handle *icon)
-{
-}
-/**
- * set gui display of a retrieved favicon representing the search provider
- * \param ico may be NULL for local calls; then access current cache from
- * search_web_ico()
+static struct gui_browser_table framebuffer_browser_table = {
+ .poll = framebuffer_poll,
+ .schedule = framebuffer_schedule,
+
+ .quit = gui_quit,
+};
+
+/** Entry point from OS.
+ *
+ * /param argc The number of arguments in the string vector.
+ * /param argv The argument string vector.
+ * /return The return code to the OS
*/
-void
-gui_window_set_search_ico(hlcache_handle *ico)
+int
+main(int argc, char** argv)
{
-}
+ struct browser_window *bw;
+ char *options;
+ char *messages;
+ nsurl *url;
+ nserror ret;
+ nsfb_t *nsfb;
+ struct netsurf_table framebuffer_table = {
+ .browser = &framebuffer_browser_table,
+ .window = &framebuffer_window_table,
+ .clipboard = framebuffer_clipboard_table,
+ .fetch = framebuffer_fetch_table,
+ .utf8 = framebuffer_utf8_table,
+ };
-struct gui_download_window *
-gui_download_window_create(download_context *ctx, struct gui_window *parent)
-{
- return NULL;
-}
+ ret = netsurf_register(&framebuffer_table);
+ if (ret != NSERROR_OK) {
+ die("NetSurf operation table failed registration");
+ }
-nserror
-gui_download_window_data(struct gui_download_window *dw,
- const char *data,
- unsigned int size)
-{
- return NSERROR_OK;
-}
+ respaths = fb_init_resource(NETSURF_FB_RESPATH":"NETSURF_FB_FONTPATH);
-void
-gui_download_window_error(struct gui_download_window *dw,
- const char *error_msg)
-{
-}
+ /* initialise logging. Not fatal if it fails but not much we
+ * can do about it either.
+ */
+ nslog_init(nslog_stream_configure, &argc, argv);
-void
-gui_download_window_done(struct gui_download_window *dw)
-{
-}
+ /* user options setup */
+ ret = nsoption_init(set_defaults, &nsoptions, &nsoptions_default);
+ if (ret != NSERROR_OK) {
+ die("Options failed to initialise");
+ }
+ options = filepath_find(respaths, "Choices");
+ nsoption_read(options, nsoptions);
+ free(options);
+ nsoption_commandline(&argc, argv, nsoptions);
-void
-gui_drag_save_object(gui_save_type type,
- hlcache_handle *c,
- struct gui_window *w)
-{
-}
+ /* common initialisation */
+ messages = filepath_find(respaths, "Messages");
+ ret = netsurf_init(messages, NULL);
+ free(messages);
+ if (ret != NSERROR_OK) {
+ die("NetSurf failed to initialise");
+ }
-void
-gui_drag_save_selection(struct gui_window *g, const char *selection)
-{
-}
+ /* Override, since we have no support for non-core SELECT menu */
+ nsoption_set_bool(core_select_menu, true);
-void
-gui_start_selection(struct gui_window *g)
-{
-}
+ if (process_cmdline(argc,argv) != true)
+ die("unable to process command line.\n");
-void
-gui_clear_selection(struct gui_window *g)
-{
-}
+ nsfb = framebuffer_initialise(fename, fewidth, feheight, febpp);
+ if (nsfb == NULL)
+ die("Unable to initialise framebuffer");
-void
-gui_create_form_select_menu(struct browser_window *bw,
- struct form_control *control)
-{
-}
+ framebuffer_set_cursor(&pointer_image);
-void
-gui_launch_url(const char *url)
-{
+ if (fb_font_init() == false)
+ die("Unable to initialise the font system");
+
+ fbtk = fbtk_init(nsfb);
+
+ fbtk_enable_oskb(fbtk);
+
+ urldb_load_cookies(nsoption_charp(cookie_file));
+
+ /* create an initial browser window */
+
+ LOG(("calling browser_window_create"));
+
+ ret = nsurl_create(feurl, &url);
+ if (ret == NSERROR_OK) {
+ ret = browser_window_create(BW_CREATE_HISTORY,
+ url,
+ NULL,
+ NULL,
+ &bw);
+ nsurl_unref(url);
+ }
+ if (ret != NSERROR_OK) {
+ warn_user(messages_get_errorcode(ret), 0);
+ } else {
+ netsurf_main_loop();
+
+ browser_window_destroy(bw);
+ }
+
+ netsurf_exit();
+
+ if (fb_font_finalise() == false)
+ LOG(("Font finalisation failed."));
+
+ /* finalise options */
+ nsoption_finalise(nsoptions, nsoptions_default);
+
+ return 0;
}
-void
-gui_cert_verify(nsurl *url,
- const struct ssl_cert_info *certs,
- unsigned long num,
- nserror (*cb)(bool proceed, void *pw),
- void *cbpw)
+void gui_resize(fbtk_widget_t *root, int width, int height)
{
- cb(false, cbpw);
+ struct gui_window *gw;
+ nsfb_t *nsfb = fbtk_get_nsfb(root);
+
+ /* Enforce a minimum */
+ if (width < 300)
+ width = 300;
+ if (height < 200)
+ height = 200;
+
+ if (framebuffer_resize(nsfb, width, height, febpp) == false) {
+ return;
+ }
+
+ fbtk_set_pos_and_size(root, 0, 0, width, height);
+
+ fewidth = width;
+ feheight = height;
+
+ for (gw = window_list; gw != NULL; gw = gw->next) {
+ resize_normal_browser_window(gw,
+ nsoption_int(fb_furniture_size));
+ }
+
+ fbtk_request_redraw(root);
}
+
/*
* Local Variables:
* c-basic-offset:8
diff --git a/framebuffer/gui.h b/framebuffer/gui.h
index c1fa3cc1d..e102b2551 100644
--- a/framebuffer/gui.h
+++ b/framebuffer/gui.h
@@ -20,6 +20,7 @@
#define NETSURF_FB_GUI_H
typedef struct fb_cursor_s fb_cursor_t;
+typedef struct fbtk_widget_s fbtk_widget_t;
/* bounding box */
typedef struct nsfb_bbox_s bbox_t;
@@ -41,16 +42,25 @@ struct gui_window {
struct fbtk_widget_s *window;
struct fbtk_widget_s *back;
struct fbtk_widget_s *forward;
+ struct fbtk_widget_s *history;
+ struct fbtk_widget_s *stop;
+ struct fbtk_widget_s *reload;
+ struct fbtk_widget_s *close;
struct fbtk_widget_s *url;
struct fbtk_widget_s *status;
struct fbtk_widget_s *throbber;
struct fbtk_widget_s *hscroll;
struct fbtk_widget_s *vscroll;
struct fbtk_widget_s *browser;
+ struct fbtk_widget_s *toolbar;
+ struct fbtk_widget_s *bottom_right;
int throbber_index;
struct gui_localhistory *localhistory;
+
+ struct gui_window *next;
+ struct gui_window *prev;
};
@@ -59,6 +69,8 @@ extern struct gui_window *window_list;
struct gui_localhistory *fb_create_localhistory(struct browser_window *bw, struct fbtk_widget_s *parent, int furniture_width);
void fb_localhistory_map(struct gui_localhistory * glh);
+void gui_resize(fbtk_widget_t *root, int width, int height);
+
#endif /* NETSURF_FB_GUI_H */
diff --git a/framebuffer/localhistory.c b/framebuffer/localhistory.c
index d4820980f..caacae7e5 100644
--- a/framebuffer/localhistory.c
+++ b/framebuffer/localhistory.c
@@ -16,44 +16,21 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <limits.h>
-#include <unistd.h>
-#include <assert.h>
-#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
+#include <limits.h>
#include <libnsfb.h>
#include <libnsfb_plot.h>
#include <libnsfb_event.h>
-#include "desktop/browser_private.h"
-#include "desktop/gui.h"
+#include "utils/types.h"
+#include "desktop/browser_history.h"
#include "desktop/plotters.h"
-#include "desktop/netsurf.h"
-#include "utils/nsoption.h"
-#include "utils/log.h"
-#include "utils/url.h"
-#include "utils/messages.h"
-#include "utils/utils.h"
-#include "desktop/textinput.h"
-#include "render/form.h"
#include "framebuffer/gui.h"
#include "framebuffer/fbtk.h"
#include "framebuffer/framebuffer.h"
-#include "framebuffer/schedule.h"
-#include "framebuffer/findfile.h"
-#include "framebuffer/image_data.h"
-#include "framebuffer/font.h"
-
-#include "content/urldb.h"
-#include "desktop/local_history.h"
-#include "content/fetch.h"
static int
localhistory_redraw(fbtk_widget_t *widget, fbtk_callback_info *cbi)
@@ -77,7 +54,7 @@ localhistory_redraw(fbtk_widget_t *widget, fbtk_callback_info *cbi)
nsfb_plot_rectangle_fill(fbtk_get_nsfb(widget), &rbox, 0xffffffff);
- history_redraw_rectangle(glh->bw->history,
+ browser_window_history_redraw_rectangle(glh->bw,
glh->scrollx,
glh->scrolly,
fbtk_get_width(widget) + glh->scrollx,
@@ -97,7 +74,7 @@ localhistory_click(fbtk_widget_t *widget, fbtk_callback_info *cbi)
if (cbi->event->type != NSFB_EVENT_KEY_UP)
return 0;
- history_click(glh->bw, glh->bw->history, cbi->x, cbi->y, false);
+ browser_window_history_click(glh->bw, cbi->x, cbi->y, false);
fbtk_set_mapping(glh->window, false);
diff --git a/framebuffer/misc.c b/framebuffer/misc.c
index 2dd03677d..0a45b2842 100644
--- a/framebuffer/misc.c
+++ b/framebuffer/misc.c
@@ -24,7 +24,6 @@
#include "utils/log.h"
#include "utils/messages.h"
#include "utils/utils.h"
-#include "utils/url.h"
void warn_user(const char *warning, const char *detail)
{
@@ -37,40 +36,3 @@ void die(const char *error)
exit(1);
}
-/**
- * Return the filename part of a full path
- *
- * \param path full path and filename
- * \return filename (will be freed with free())
- */
-char *filename_from_path(char *path)
-{
- char *leafname;
-
- leafname = strrchr(path, '/');
- if (!leafname)
- leafname = path;
- else
- leafname += 1;
-
- return strdup(leafname);
-}
-
-/**
- * Add a path component/filename to an existing path
- *
- * \param path buffer containing path + free space
- * \param length length of buffer "path"
- * \param newpart string containing path component to add to path
- * \return true on success
- */
-
-bool path_add_part(char *path, int length, const char *newpart)
-{
- if(path[strlen(path) - 1] != '/')
- strncat(path, "/", length);
-
- strncat(path, newpart, length);
-
- return true;
-}
diff --git a/framebuffer/nsfont_bold.c b/framebuffer/nsfont_bold.c
deleted file mode 100644
index 6ea4d71cd..000000000
--- a/framebuffer/nsfont_bold.c
+++ /dev/null
@@ -1,556 +0,0 @@
-/*
- * Licensed under the MIT License,
- * http://www.opensource.org/licenses/mit-license.php
- *
- * Copyright Tim Tyler
- * Copyright Michael Drake <tlsa@netsurf-browser.org>
- *
- * This font is based on the "Default" font with Zap 1.47 [TEST], which
- * was created for Zap by Tim Tyler. It was converted to a plain text
- * format and many glyphs added for use in the NetSurf project.
- *
- * Plain text font data:
- * http://source.netsurf-browser.org/?p=art.git;a=blob_plain;f=fonts/netsurf/glyph_data;hb=HEAD
- *
- * Zap: http://zap.tartarus.org/
- * NetSurf: http://www.netsurf-browser.org/
- *
- * Thanks to Tim Tyler for the original font and his permission to use it.
- * Thanks to James Aylett for helping track down Tim.
- * Thanks to Christian Ludlam for helping with Zap font info.
- *
- * Please contact Michael Drake if you want to contribute gylphs to
- * this font.
- */
-
-/* Don't edit this file, it was generated from the plain text source data. */
-
-#include "desktop/plotters.h"
-#include "utils/utf8.h"
-
-#include "framebuffer/font_internal.h"
-
-#define FONTDATAMAX 4096
-
-static const uint32_t fontdata_bold[FONTDATAMAX] = {
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xE4, 0xAC, 0xA4, 0xA4, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEC, 0xA2, 0xA4, 0xA8, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEC, 0xA2, 0xAC, 0xA2, 0xEC, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEA, 0xAA, 0xAE, 0xA2, 0xE2, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEE, 0xA8, 0xAE, 0xA2, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xE6, 0xA8, 0xAE, 0xAA, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEE, 0xA2, 0xA4, 0xA4, 0xE4, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEE, 0xAA, 0xAE, 0xAA, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEE, 0xAA, 0xAE, 0xA2, 0xE2, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xE4, 0xAA, 0xAE, 0xAA, 0xEA, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEC, 0xAA, 0xAC, 0xAA, 0xEC, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xE4, 0xAA, 0xA8, 0xAA, 0xE4, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEC, 0xAA, 0xAA, 0xAA, 0xEC, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEE, 0xA8, 0xAC, 0xA8, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEE, 0xA8, 0xAC, 0xA8, 0xE8, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4E, 0xCA, 0x4A, 0x4A, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x44, 0xCC, 0x44, 0x44, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4C, 0xC2, 0x44, 0x48, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4C, 0xC2, 0x4C, 0x42, 0xEC, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4A, 0xCA, 0x4E, 0x42, 0xE2, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4E, 0xC8, 0x4E, 0x42, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x46, 0xC8, 0x4E, 0x4A, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4E, 0xC2, 0x44, 0x44, 0xE4, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4E, 0xCA, 0x4E, 0x4A, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4E, 0xCA, 0x4E, 0x42, 0xE2, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x44, 0xCA, 0x4E, 0x4A, 0xEA, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4C, 0xCA, 0x4C, 0x4A, 0xEC, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x44, 0xCA, 0x48, 0x4A, 0xE4, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4C, 0xCA, 0x4A, 0x4A, 0xEC, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4E, 0xC8, 0x4C, 0x48, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4E, 0xC8, 0x4C, 0x48, 0xE8, 0x00, 0xFE,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
- 0x1C, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x6C, 0x6C, 0xFE, 0xFE, 0xFE, 0x6C, 0x6C,
- 0xFE, 0xFE, 0xFE, 0x6C, 0x6C, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x7C, 0xFE, 0xF6, 0xF0, 0xF8, 0x7C,
- 0x3E, 0x1E, 0xDE, 0xFE, 0x7C, 0x10, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE6, 0xEE, 0x1C,
- 0x38, 0x70, 0xEE, 0xCE, 0x0E, 0x00, 0x00, 0x00,
- 0x00, 0x70, 0xF8, 0xF8, 0xF8, 0xF8, 0x76, 0xFE,
- 0xFE, 0xEC, 0xEE, 0xFE, 0x76, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x06, 0x0C, 0x1C, 0x38, 0x38, 0x70, 0x70, 0x70,
- 0x70, 0x70, 0x38, 0x38, 0x1C, 0x0C, 0x06, 0x00,
- 0x60, 0x30, 0x38, 0x1C, 0x1C, 0x0E, 0x0E, 0x0E,
- 0x0E, 0x0E, 0x1C, 0x1C, 0x38, 0x30, 0x60, 0x00,
- 0x00, 0x00, 0x00, 0x10, 0x54, 0xFE, 0x7C, 0x38,
- 0x7C, 0xFE, 0x54, 0x10, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0xFE,
- 0xFE, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x38, 0x78, 0x70, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
- 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x1E, 0x3C,
- 0x78, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x7C, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0x7C, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x18, 0x38, 0x78, 0x78, 0x38, 0x38, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xEE, 0x0E, 0x0E, 0x7E, 0xFC,
- 0xE0, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xEE, 0x0E, 0x0E, 0x3C, 0x3C,
- 0x0E, 0x0E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x04, 0x0C, 0x1C, 0x3C, 0x7C, 0x6C, 0xEC,
- 0xFE, 0xFE, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00,
- 0x00, 0xFE, 0xFE, 0xE0, 0xE0, 0xFC, 0xFE, 0x0E,
- 0x0E, 0x0E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFC, 0xE0, 0xE0, 0xFC, 0xFE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0xFE, 0xFE, 0x0E, 0x0E, 0x1C, 0x1C, 0x1C,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xEE, 0xEE, 0xFE, 0x7C, 0xFE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xEE, 0xEE, 0xEE, 0xFE, 0x7E,
- 0x0E, 0x0E, 0x0E, 0x7C, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x00,
- 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x00,
- 0x00, 0x18, 0x38, 0x38, 0x30, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x06, 0x0E, 0x1C, 0x38, 0x70,
- 0x70, 0x38, 0x1C, 0x0E, 0x06, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00,
- 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x60, 0x70, 0x38, 0x1C, 0x0E,
- 0x0E, 0x1C, 0x38, 0x70, 0x60, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xEE, 0x0E, 0x0E, 0x3E, 0x7C,
- 0x70, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xEE, 0xEE, 0xEE, 0xFE, 0xFE,
- 0xEC, 0xE0, 0xE0, 0xFC, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xFE,
- 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0xFC, 0xFE, 0xEE, 0xEE, 0xEE, 0xFC, 0xFC,
- 0xEE, 0xEE, 0xEE, 0xFE, 0xFC, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xEE, 0xEE, 0xE0, 0xE0, 0xE0,
- 0xE0, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0xF8, 0xFC, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFC, 0xF8, 0x00, 0x00, 0x00,
- 0x00, 0xFE, 0xFE, 0xE0, 0xE0, 0xE0, 0xF8, 0xF8,
- 0xE0, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0xFE, 0xFE, 0xE0, 0xE0, 0xE0, 0xF8, 0xF8,
- 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xEE, 0xEE, 0xE0, 0xE0, 0xFE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xFE, 0xFE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0xFE, 0xFE, 0x38, 0x38, 0x38, 0x38, 0x38,
- 0x38, 0x38, 0x38, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E,
- 0x0E, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0xE0, 0xE6, 0xEE, 0xFE, 0xFC, 0xF8, 0xF0,
- 0xF8, 0xFC, 0xFE, 0xEE, 0xE6, 0x00, 0x00, 0x00,
- 0x00, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
- 0xE0, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0xC6, 0xEE, 0xFE, 0xFE, 0xFE, 0xFE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0xCE, 0xEE, 0xEE, 0xFE, 0xFE, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xEE, 0xEE, 0xE6, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0xFC, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xFE,
- 0xFC, 0xE0, 0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xFE, 0xFE, 0xFE, 0x7E, 0x06, 0x00, 0x00,
- 0x00, 0xFC, 0xFE, 0xEE, 0xEE, 0xEE, 0xFE, 0xFC,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xEE, 0xE0, 0xE0, 0xFC, 0x7E,
- 0x0E, 0x0E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0xFE, 0xFE, 0x38, 0x38, 0x38, 0x38, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0x6C, 0x7C, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xFE, 0xFE, 0xFE, 0xEE, 0x44, 0x00, 0x00, 0x00,
- 0x00, 0xEE, 0xEE, 0xEE, 0xEE, 0x7C, 0x38, 0x38,
- 0x7C, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x7C, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0xFE, 0xFE, 0x0E, 0x0E, 0x1C, 0x38, 0x38,
- 0x70, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x3E, 0x38, 0x38, 0x38, 0x38, 0x38,
- 0x38, 0x38, 0x38, 0x3E, 0x3E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xE0, 0xF0, 0x78,
- 0x3C, 0x1E, 0x0E, 0x04, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xFC, 0xFC, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
- 0x1C, 0x1C, 0x1C, 0xFC, 0xFC, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x7C, 0xEE, 0xC6, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00,
- 0x00, 0x00, 0x00, 0x30, 0x38, 0x18, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7E, 0x0E,
- 0x7E, 0xFE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0xE0, 0xE0, 0xE0, 0xE0, 0xFC, 0xFE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0xFC, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFE, 0xEE,
- 0xE0, 0xE0, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x7E, 0xFE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFE, 0xEE,
- 0xFE, 0xFE, 0xE0, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x7E, 0x70, 0x70, 0x70, 0xF8, 0xF8,
- 0x70, 0x70, 0x70, 0x70, 0x70, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x0E, 0x7E, 0x7C,
- 0x00, 0x00, 0xE0, 0xE0, 0xE0, 0xFC, 0xFE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x38, 0x38, 0x00, 0x78, 0x78, 0x38,
- 0x38, 0x38, 0x38, 0x7C, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x3C, 0x3C, 0x1C,
- 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x7C, 0x78,
- 0x00, 0xE0, 0xE0, 0xE0, 0xE6, 0xEE, 0xFE, 0xFC,
- 0xF8, 0xFC, 0xFE, 0xEE, 0xE6, 0x00, 0x00, 0x00,
- 0x00, 0x78, 0x78, 0x38, 0x38, 0x38, 0x38, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xFE, 0xFE,
- 0xFE, 0xFE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0xFC, 0xE0, 0xE0, 0xE0,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x0E, 0x0F, 0x0F,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xFE, 0xE0,
- 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFE, 0xE0,
- 0xFC, 0x7E, 0x0E, 0xFE, 0xFC, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x30, 0x70, 0x70, 0xFC, 0xFC, 0x70,
- 0x70, 0x70, 0x70, 0x7E, 0x3E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xEE, 0xEE,
- 0xFE, 0xFE, 0xFE, 0xEE, 0x44, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xEE, 0xEE,
- 0x7C, 0x7C, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xFE, 0x7E, 0x0E, 0x0E, 0xFE, 0xFC,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x1E,
- 0x3C, 0x78, 0xF0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x1E, 0x3E, 0x38, 0x38, 0x38, 0xF0, 0xF0,
- 0x38, 0x38, 0x38, 0x3E, 0x1E, 0x00, 0x00, 0x00,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00,
- 0x00, 0xF0, 0xF8, 0x38, 0x38, 0x38, 0x1E, 0x1E,
- 0x38, 0x38, 0x38, 0xF8, 0xF0, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x66, 0xFE, 0xFE, 0xCC, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEE, 0x28, 0x4C, 0x48, 0x48, 0x00, 0xFE,
- 0x00, 0x38, 0x7C, 0xEE, 0xE0, 0xFC, 0xE0, 0xF8,
- 0xE0, 0xE0, 0xEE, 0x7C, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE,
- 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x38, 0x38, 0x18, 0x30, 0x00,
- 0x00, 0x3E, 0x7E, 0x70, 0x70, 0x70, 0xF8, 0xF8,
- 0x70, 0x70, 0x70, 0x70, 0x70, 0xF0, 0xE0, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0xEE, 0xEE, 0x66, 0xCC, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xDB, 0xDB, 0xDB, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x38, 0x38, 0x38, 0xFE, 0xFE, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00,
- 0x00, 0x38, 0x38, 0x38, 0xFE, 0xFE, 0x38, 0xFE,
- 0xFE, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00,
- 0x00, 0x7C, 0xEE, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xCE, 0x1C,
- 0x38, 0x70, 0xE0, 0xDB, 0x1B, 0x00, 0x00, 0x00,
- 0xEE, 0x7C, 0x00, 0x7C, 0xFE, 0xEE, 0xE0, 0xFC,
- 0x7E, 0x0E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0E, 0x1C,
- 0x38, 0x70, 0x38, 0x1C, 0x0E, 0x06, 0x00, 0x00,
- 0x00, 0x7F, 0xFF, 0xEE, 0xEE, 0xEE, 0xEF, 0xEF,
- 0xEE, 0xEE, 0xEE, 0xFF, 0x7F, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE,
- 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0xEE, 0x7C, 0x00, 0xFE, 0xFE, 0x0E, 0x1E, 0x3C,
- 0x78, 0xF0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE,
- 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE,
- 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x18, 0x30, 0x30, 0x30, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x36, 0x6C, 0x6C, 0x6C, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x36, 0x36, 0x36, 0x6C, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E,
- 0x7E, 0x7E, 0x7E, 0x3C, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7B, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xF1, 0xFB, 0x5F, 0x55, 0x51, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xEE, 0x7C, 0x38, 0x00, 0x7E, 0xFE, 0xE0,
- 0xFC, 0x7E, 0x0E, 0xFE, 0xFC, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x70, 0x38,
- 0x1C, 0x0E, 0x1C, 0x38, 0x70, 0x60, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xFA,
- 0xDE, 0xDE, 0xFC, 0xFE, 0x6E, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE,
- 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0xEE, 0x7C, 0x38, 0x00, 0xFE, 0xFE, 0x1E,
- 0x3C, 0x78, 0xF0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0xEE, 0x00, 0xEE, 0xEE, 0xEE, 0xEE, 0x7C,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x00,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00,
- 0x00, 0x00, 0x00, 0x10, 0x10, 0x7C, 0xFE, 0xD6,
- 0xD0, 0xD0, 0xD6, 0xFE, 0x7C, 0x10, 0x10, 0x00,
- 0x00, 0x3C, 0x7E, 0x76, 0x70, 0xFC, 0xFC, 0xFC,
- 0x70, 0x76, 0xFE, 0xFE, 0xDC, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xEE, 0xEE, 0x7C, 0xFE,
- 0xFE, 0xFE, 0xFE, 0x7C, 0xEE, 0xEE, 0x00, 0x00,
- 0x00, 0x00, 0xEE, 0xEE, 0xEE, 0x7C, 0x38, 0xFE,
- 0x38, 0xFE, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x38, 0x00,
- 0x00, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x3C, 0x7C, 0x7C, 0x70, 0x3C, 0x7E, 0x66,
- 0x7E, 0x3C, 0x0E, 0x3E, 0x3E, 0x3C, 0x00, 0x00,
- 0x00, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x3C, 0x7E, 0xC3, 0x99, 0xBD, 0xA5, 0xA1,
- 0xA5, 0xBD, 0x99, 0xC3, 0x7E, 0x3C, 0x00, 0x00,
- 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x7C, 0x00, 0xFC,
- 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E,
- 0x7C, 0xF8, 0xF8, 0x7C, 0x3E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x06, 0x02, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x3C, 0x7E, 0xC3, 0xB9, 0xBD, 0xA5, 0xB9,
- 0xB9, 0xA5, 0xA5, 0xC3, 0x7E, 0x3C, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x78, 0xFC, 0xCC, 0xFC, 0x78, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x38, 0x38, 0xFE, 0xFE, 0xFE, 0x38,
- 0x38, 0x00, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xF0, 0xF8, 0x18, 0x78, 0xF0, 0xC0,
- 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xF0, 0xF8, 0x18, 0x30, 0x18, 0xF8,
- 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x38, 0x70, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0xFC, 0xE0, 0xE0, 0xC0,
- 0x00, 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB, 0x7B,
- 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38,
- 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x18, 0x1C, 0x0C, 0x1C, 0x18, 0x00, 0x00,
- 0x00, 0x00, 0x60, 0xE0, 0x60, 0x60, 0x60, 0xF0,
- 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x70, 0xF8, 0x88, 0xF8, 0x70, 0x00, 0xF8,
- 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8,
- 0x6C, 0x36, 0x36, 0x6C, 0xD8, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x60, 0xE0, 0x62, 0x66, 0xFE, 0x1C,
- 0x38, 0x76, 0xEE, 0xD6, 0x3E, 0x3E, 0x06, 0x00,
- 0x00, 0x00, 0x60, 0xE0, 0x62, 0x66, 0xFE, 0x1C,
- 0x38, 0x70, 0xFC, 0xC6, 0x0C, 0x18, 0x1E, 0x00,
- 0x00, 0x00, 0xE0, 0x30, 0x62, 0x36, 0xEE, 0x1C,
- 0x3A, 0x76, 0xEE, 0xD6, 0x3E, 0x3E, 0x06, 0x00,
- 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x1C, 0x1C,
- 0x7C, 0xF8, 0xE0, 0xEE, 0xEE, 0xFE, 0x7C, 0x00,
- 0x00, 0xE0, 0x70, 0x00, 0x10, 0x38, 0x7C, 0xEE,
- 0xFE, 0xFE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x0E, 0x1C, 0x00, 0x10, 0x38, 0x7C, 0xEE,
- 0xFE, 0xFE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x6C, 0xC6, 0x10, 0x38, 0x7C, 0xEE,
- 0xFE, 0xFE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x76, 0xDC, 0x00, 0x10, 0x38, 0x7C, 0xEE,
- 0xFE, 0xFE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0xEE, 0xEE, 0x10, 0x38, 0x7C, 0xEE, 0xFE,
- 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x6C, 0x38, 0x38, 0x7C, 0xEE, 0xFE,
- 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x1F, 0x3F, 0x7F, 0xFE, 0xEE, 0xFF, 0xFF,
- 0xFE, 0xEE, 0xEF, 0xEF, 0xEF, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xEE, 0xE0, 0xE0, 0xE0, 0xE0,
- 0xE0, 0xE0, 0xEE, 0xFE, 0x7C, 0x0E, 0x6E, 0x7C,
- 0x00, 0x70, 0x38, 0x00, 0xFE, 0xFE, 0xE0, 0xE0,
- 0xF8, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x1C, 0x38, 0x00, 0xFE, 0xFE, 0xE0, 0xE0,
- 0xF8, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xEE, 0x00, 0xFE, 0xFE, 0xE0, 0xE0,
- 0xF8, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0xEE, 0xEE, 0x00, 0xFE, 0xFE, 0xE0, 0xE0, 0xF8,
- 0xF8, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x70, 0x38, 0x00, 0x38, 0x38, 0x38, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x1C, 0x38, 0x00, 0x38, 0x38, 0x38, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x6C, 0x38, 0x38, 0x38, 0x38, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0xEE, 0xEE, 0x00, 0x38, 0x38, 0x38, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xF8, 0xFC, 0xEE, 0xEE, 0xEE, 0xFE,
- 0xEE, 0xEE, 0xEE, 0xFC, 0xF8, 0x00, 0x00, 0x00,
- 0x00, 0x76, 0xDC, 0x00, 0xEE, 0xEE, 0xEE, 0xF6,
- 0xFE, 0xDE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x70, 0x38, 0x00, 0x7C, 0xFE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x1C, 0x38, 0x00, 0x7C, 0xFE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xEE, 0x00, 0x7C, 0xFE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x76, 0xDC, 0x00, 0x7C, 0xFE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0xEE, 0xEE, 0x00, 0x7C, 0xFE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xEE, 0x7C,
- 0x38, 0x38, 0x7C, 0xEE, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x7A, 0xFC, 0xEE, 0xEE, 0xEE, 0xFE, 0xFE,
- 0xFE, 0xEE, 0xEE, 0xFE, 0x7C, 0x80, 0x00, 0x00,
- 0x00, 0x70, 0x38, 0x00, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x1C, 0x38, 0x00, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xEE, 0x00, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0xEE, 0xEE, 0x00, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x1C, 0x38, 0x00, 0xEE, 0xEE, 0xEE, 0xEE,
- 0x7C, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xE0, 0xE0, 0xFC, 0xFE, 0xEE, 0xEE,
- 0xEE, 0xFE, 0xFC, 0xE0, 0xE0, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xEE, 0xEE, 0xEE, 0xFE, 0xFC,
- 0xEE, 0xEE, 0xEE, 0xFE, 0xFC, 0xE0, 0xC0, 0x00,
- 0x00, 0x00, 0x70, 0x38, 0x00, 0x7C, 0x7E, 0x0E,
- 0x7E, 0xFE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1C, 0x38, 0x00, 0x7C, 0x7E, 0x0E,
- 0x7E, 0xFE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x7C, 0xEE, 0x00, 0x7C, 0x7E, 0x0E,
- 0x7E, 0xFE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x76, 0xDC, 0x00, 0x7C, 0x7E, 0x0E,
- 0x7E, 0xFE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xEE, 0xEE, 0x00, 0x7C, 0x7E, 0x0E,
- 0x7E, 0xFE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x6C, 0x38, 0x00, 0x7C, 0x7E, 0x0E,
- 0x7E, 0xFE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x74, 0x7E, 0x7E, 0x1A,
- 0x7E, 0xFE, 0xD8, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFE,
- 0xEE, 0xE0, 0xEE, 0xFE, 0x7C, 0x1C, 0x7E, 0x7C,
- 0x00, 0x00, 0x70, 0x38, 0x00, 0x7C, 0xFE, 0xEE,
- 0xFE, 0xFE, 0xE0, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x38, 0x70, 0x00, 0x7C, 0xFE, 0xEE,
- 0xFE, 0xFE, 0xE0, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x7C, 0xEE, 0x00, 0x7C, 0xFE, 0xEE,
- 0xFE, 0xFE, 0xE0, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xEE, 0xEE, 0x00, 0x7C, 0xFE, 0xEE,
- 0xFE, 0xFE, 0xE0, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x70, 0x38, 0x00, 0x38, 0x38, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1C, 0x38, 0x00, 0x38, 0x38, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x7C, 0xEE, 0x00, 0x38, 0x38, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xEE, 0xEE, 0x00, 0x38, 0x38, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0xEC, 0x7C, 0xF8, 0xFC, 0x7E, 0xFE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x76, 0xFE, 0xDC, 0x00, 0xFC, 0xFE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xE0, 0x70, 0x00, 0x7C, 0xFE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x38, 0x70, 0x00, 0x7C, 0xFE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x7C, 0xEE, 0x00, 0x7C, 0xFE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x76, 0xFE, 0xDC, 0x00, 0x7C, 0xFE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xEE, 0xEE, 0x00, 0x7C, 0xFE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0xFE,
- 0xFE, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x02, 0x7C, 0xFE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x80, 0x00, 0x00,
- 0x00, 0x00, 0xE0, 0x70, 0x00, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x38, 0x70, 0x00, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x7C, 0xEE, 0x00, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xEE, 0xEE, 0x00, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1C, 0x38, 0x00, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x0E, 0xFE, 0xFC,
- 0x00, 0x00, 0xE0, 0xE0, 0xFC, 0xFE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xFE, 0xFC, 0xE0, 0xE0,
- 0x00, 0x00, 0xEE, 0xEE, 0x00, 0xEE, 0xEE, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x0E, 0xFE, 0xFC,
-};
-
-const struct fb_font_desc font_bold = {
- .name = "NetSurf Bold",
- .width = 8,
- .height = 16,
- .encoding = "CP1252",
- .data = fontdata_bold,
-};
diff --git a/framebuffer/nsfont_italic.c b/framebuffer/nsfont_italic.c
deleted file mode 100644
index 9dc29553a..000000000
--- a/framebuffer/nsfont_italic.c
+++ /dev/null
@@ -1,556 +0,0 @@
-/*
- * Licensed under the MIT License,
- * http://www.opensource.org/licenses/mit-license.php
- *
- * Copyright Tim Tyler
- * Copyright Michael Drake <tlsa@netsurf-browser.org>
- *
- * This font is based on the "Default" font with Zap 1.47 [TEST], which
- * was created for Zap by Tim Tyler. It was converted to a plain text
- * format and many glyphs added for use in the NetSurf project.
- *
- * Plain text font data:
- * http://source.netsurf-browser.org/?p=art.git;a=blob_plain;f=fonts/netsurf/glyph_data;hb=HEAD
- *
- * Zap: http://zap.tartarus.org/
- * NetSurf: http://www.netsurf-browser.org/
- *
- * Thanks to Tim Tyler for the original font and his permission to use it.
- * Thanks to James Aylett for helping track down Tim.
- * Thanks to Christian Ludlam for helping with Zap font info.
- *
- * Please contact Michael Drake if you want to contribute gylphs to
- * this font.
- */
-
-/* Don't edit this file, it was generated from the plain text source data. */
-
-#include "desktop/plotters.h"
-#include "utils/utf8.h"
-
-#include "framebuffer/font_internal.h"
-
-#define FONTDATAMAX 4096
-
-static const uint32_t fontdata_italic[FONTDATAMAX] = {
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xE4, 0xAC, 0xA4, 0xA4, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEC, 0xA2, 0xA4, 0xA8, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEC, 0xA2, 0xAC, 0xA2, 0xEC, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEA, 0xAA, 0xAE, 0xA2, 0xE2, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEE, 0xA8, 0xAE, 0xA2, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xE6, 0xA8, 0xAE, 0xAA, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEE, 0xA2, 0xA4, 0xA4, 0xE4, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEE, 0xAA, 0xAE, 0xAA, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEE, 0xAA, 0xAE, 0xA2, 0xE2, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xE4, 0xAA, 0xAE, 0xAA, 0xEA, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEC, 0xAA, 0xAC, 0xAA, 0xEC, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xE4, 0xAA, 0xA8, 0xAA, 0xE4, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEC, 0xAA, 0xAA, 0xAA, 0xEC, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEE, 0xA8, 0xAC, 0xA8, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEE, 0xA8, 0xAC, 0xA8, 0xE8, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4E, 0xCA, 0x4A, 0x4A, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x44, 0xCC, 0x44, 0x44, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4C, 0xC2, 0x44, 0x48, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4C, 0xC2, 0x4C, 0x42, 0xEC, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4A, 0xCA, 0x4E, 0x42, 0xE2, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4E, 0xC8, 0x4E, 0x42, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x46, 0xC8, 0x4E, 0x4A, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4E, 0xC2, 0x44, 0x44, 0xE4, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4E, 0xCA, 0x4E, 0x4A, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4E, 0xCA, 0x4E, 0x42, 0xE2, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x44, 0xCA, 0x4E, 0x4A, 0xEA, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4C, 0xCA, 0x4C, 0x4A, 0xEC, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x44, 0xCA, 0x48, 0x4A, 0xE4, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4C, 0xCA, 0x4A, 0x4A, 0xEC, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4E, 0xC8, 0x4C, 0x48, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4E, 0xC8, 0x4C, 0x48, 0xE8, 0x00, 0xFE,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x06, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x0C,
- 0x0C, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1B, 0x1B, 0x36, 0x36, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x1B, 0x1B, 0x1B, 0x7F, 0x7F, 0x36, 0x36,
- 0xFF, 0xFF, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00,
- 0x00, 0x04, 0x3E, 0x7F, 0x6B, 0x68, 0x78, 0x3C,
- 0x1E, 0x16, 0xD6, 0xFE, 0x7C, 0x20, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xCE, 0x1C,
- 0x38, 0x70, 0xE6, 0xC6, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x1C, 0x3E, 0x36, 0x36, 0x3C, 0x39, 0x7F,
- 0x6E, 0xCC, 0xCC, 0xFE, 0x7A, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x06, 0x06, 0x0C, 0x0C, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x06, 0x0E, 0x1C, 0x38, 0x30, 0x60, 0x60, 0xC0,
- 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0x70, 0x30, 0x00,
- 0x18, 0x1C, 0x0E, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x0C, 0x0C, 0x18, 0x38, 0x70, 0xE0, 0xC0, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x1C, 0x7F,
- 0xFE, 0x38, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E,
- 0xFC, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x18, 0x38, 0x70, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFC,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0E, 0x1C,
- 0x38, 0x70, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x1E, 0x3F, 0x33, 0x33, 0x67, 0x6E, 0x76,
- 0xE6, 0xCC, 0xCC, 0xFC, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x06, 0x0E, 0x1E, 0x3C, 0x0C, 0x0C, 0x18,
- 0x18, 0x18, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00,
- 0x00, 0x1E, 0x3F, 0x33, 0x03, 0x07, 0x1E, 0x7C,
- 0x60, 0xC0, 0xC0, 0xFC, 0xFC, 0x00, 0x00, 0x00,
- 0x00, 0x1E, 0x3F, 0x33, 0x03, 0x06, 0x1E, 0x1E,
- 0x06, 0x06, 0xCC, 0xFC, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1E, 0x36, 0x7F,
- 0x7F, 0x0C, 0x0C, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x1F, 0x1F, 0x30, 0x30, 0x7C, 0x7E, 0x06,
- 0x06, 0x06, 0xCE, 0xFC, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x0F, 0x1F, 0x38, 0x30, 0x60, 0x7C, 0x7E,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x3F, 0x7F, 0x63, 0x03, 0x06, 0x06, 0x0C,
- 0x0C, 0x18, 0x18, 0x30, 0x30, 0x00, 0x00, 0x00,
- 0x00, 0x1E, 0x3F, 0x33, 0x33, 0x33, 0x1E, 0x7C,
- 0x66, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x1E, 0x3F, 0x33, 0x63, 0x63, 0x7E, 0x3E,
- 0x06, 0x0C, 0x1C, 0xF8, 0xF0, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00,
- 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00,
- 0x00, 0x00, 0x18, 0x38, 0x30, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x06, 0x0E, 0x1C, 0x38, 0x70, 0x70,
- 0x70, 0x38, 0x1C, 0x0C, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x00,
- 0x7C, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x18, 0x18, 0x0C, 0x0C, 0x06, 0x0E,
- 0x1C, 0x38, 0x70, 0x60, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x1E, 0x3F, 0x33, 0x33, 0x03, 0x07, 0x0E,
- 0x1C, 0x18, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00,
- 0x00, 0x1E, 0x3F, 0x33, 0x63, 0x6F, 0x6B, 0x6B,
- 0xCF, 0xCE, 0xC0, 0xFC, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x1E, 0x3F, 0x33, 0x33, 0x66, 0x7E, 0x7E,
- 0x66, 0xCC, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x3F, 0x33, 0x63, 0x63, 0x7E, 0x7C,
- 0x66, 0xC6, 0xC6, 0xFE, 0xFC, 0x00, 0x00, 0x00,
- 0x00, 0x1E, 0x3F, 0x33, 0x30, 0x60, 0x60, 0x60,
- 0x60, 0xC0, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x3F, 0x33, 0x63, 0x63, 0x63, 0x63,
- 0xC3, 0xC6, 0xCE, 0xFC, 0xF8, 0x00, 0x00, 0x00,
- 0x00, 0x3F, 0x3F, 0x30, 0x30, 0x60, 0x7C, 0x7C,
- 0x60, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x3F, 0x3F, 0x30, 0x30, 0x60, 0x7C, 0x7C,
- 0x60, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00,
- 0x00, 0x1E, 0x3F, 0x33, 0x30, 0x60, 0x60, 0x6E,
- 0x6E, 0xC6, 0xCE, 0xFC, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x33, 0x33, 0x33, 0x63, 0x66, 0x7E, 0x7E,
- 0xC6, 0xC6, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00,
- 0x00, 0x3F, 0x3F, 0x0C, 0x0C, 0x18, 0x18, 0x18,
- 0x18, 0x30, 0x30, 0xFC, 0xFC, 0x00, 0x00, 0x00,
- 0x00, 0x03, 0x03, 0x03, 0x03, 0x06, 0x06, 0x06,
- 0x06, 0x0C, 0xCC, 0xFC, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x30, 0x30, 0x33, 0x36, 0x7C, 0x78, 0x70,
- 0x78, 0xF8, 0xDC, 0xCE, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x30, 0x30, 0x30, 0x30, 0x60, 0x60, 0x60,
- 0x60, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x33, 0x33, 0x3F, 0x3F, 0x7F, 0x6B, 0x66,
- 0x66, 0xC6, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00,
- 0x00, 0x33, 0x33, 0x3B, 0x3B, 0x7B, 0x7E, 0x6E,
- 0x6E, 0xCE, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00,
- 0x00, 0x1E, 0x3F, 0x33, 0x33, 0x63, 0x66, 0x66,
- 0xC6, 0xCC, 0xCC, 0xFC, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x3F, 0x33, 0x33, 0x67, 0x7E, 0x7C,
- 0x60, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00,
- 0x00, 0x1E, 0x3F, 0x33, 0x33, 0x63, 0x66, 0x66,
- 0xC6, 0xF6, 0xDC, 0xF8, 0x7C, 0x0C, 0x00, 0x00,
- 0x00, 0x3E, 0x3F, 0x33, 0x33, 0x63, 0x7E, 0x7C,
- 0x6E, 0xC6, 0xC6, 0xCC, 0xCC, 0x00, 0x00, 0x00,
- 0x00, 0x1E, 0x3F, 0x33, 0x60, 0x60, 0x7C, 0x3E,
- 0x06, 0x06, 0xCE, 0xFC, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x7F, 0x7F, 0x18, 0x18, 0x30, 0x30, 0x30,
- 0x30, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00,
- 0x00, 0x33, 0x33, 0x33, 0x33, 0x63, 0x66, 0x66,
- 0x66, 0xC6, 0xCC, 0xFC, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x33, 0x33, 0x33, 0x33, 0x63, 0x63, 0x66,
- 0x66, 0x6C, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0x33, 0x33, 0x33, 0x33, 0x63, 0x63, 0x6B,
- 0x6B, 0xFE, 0xFE, 0xEE, 0x44, 0x00, 0x00, 0x00,
- 0x00, 0x63, 0x63, 0x63, 0x77, 0x3E, 0x1C, 0x38,
- 0x7C, 0xEE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x3C, 0x18,
- 0x18, 0x30, 0x30, 0x60, 0x60, 0x00, 0x00, 0x00,
- 0x00, 0x7F, 0x7F, 0x03, 0x07, 0x0E, 0x0C, 0x18,
- 0x38, 0x70, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x0F, 0x0F, 0x0C, 0x0C, 0x18, 0x18, 0x18,
- 0x18, 0x30, 0x30, 0x3E, 0x3E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0x70,
- 0x38, 0x1C, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x1F, 0x1F, 0x03, 0x03, 0x06, 0x06, 0x06,
- 0x06, 0x0C, 0x0C, 0x7C, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x04, 0x0E, 0x1F, 0x3B, 0x63, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00,
- 0x00, 0x00, 0x00, 0x0C, 0x0E, 0x0C, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x3E, 0x06,
- 0x7E, 0xFC, 0xCC, 0xFC, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x18, 0x18, 0x30, 0x30, 0x3E, 0x7F, 0x63,
- 0x63, 0xC6, 0xC6, 0xFE, 0xFC, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0x66,
- 0xC0, 0xC0, 0xCC, 0xFC, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x03, 0x03, 0x03, 0x06, 0x3E, 0x7E, 0x66,
- 0xC6, 0xCC, 0xCC, 0xFC, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0x66,
- 0xFE, 0xFC, 0xC0, 0xFC, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x07, 0x0F, 0x0C, 0x18, 0x7E, 0x7E, 0x30,
- 0x30, 0x30, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x63,
- 0x63, 0xC6, 0xC6, 0xFE, 0x7E, 0x0C, 0xFC, 0xF8,
- 0x00, 0x00, 0x30, 0x30, 0x30, 0x6E, 0x7F, 0x73,
- 0x63, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x06, 0x06, 0x00, 0x1C, 0x3C, 0x0C,
- 0x0C, 0x18, 0x18, 0x7C, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x03, 0x03, 0x00, 0x0E, 0x1E, 0x06,
- 0x06, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0xF8, 0xF0,
- 0x00, 0x30, 0x30, 0x30, 0x33, 0x67, 0x6E, 0x7C,
- 0x7C, 0xDC, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x0E, 0x0E, 0x06, 0x06, 0x0C, 0x0C, 0x0C,
- 0x0C, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x7F, 0x7F,
- 0x6B, 0xD6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x7E, 0x76,
- 0x66, 0xCC, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0x66,
- 0x66, 0xCC, 0xCC, 0xFC, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x3F, 0x33,
- 0x63, 0x66, 0x66, 0xFE, 0xFC, 0xC0, 0xC0, 0xC0,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x63,
- 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x0C, 0x0E, 0x0E,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x7F, 0x70,
- 0x60, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x60,
- 0x7C, 0x3E, 0x06, 0xFE, 0xFC, 0x00, 0x00, 0x00,
- 0x00, 0x06, 0x06, 0x0C, 0x0C, 0x3F, 0x3F, 0x18,
- 0x18, 0x30, 0x30, 0x3E, 0x1C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x33, 0x66,
- 0x66, 0x66, 0xCC, 0xFE, 0x76, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66,
- 0xCC, 0xCC, 0xF8, 0x70, 0x20, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x63, 0x63,
- 0x6B, 0xDE, 0xFE, 0xFE, 0x6C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x63, 0x77,
- 0x3E, 0x7C, 0xEE, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x63, 0x63,
- 0x63, 0xC6, 0xC6, 0xFE, 0x7E, 0x0C, 0xFC, 0xF8,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x07,
- 0x1E, 0x78, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x07, 0x0E, 0x0C, 0x0C, 0x18, 0x70, 0x70,
- 0x18, 0x18, 0x30, 0x38, 0x1C, 0x00, 0x00, 0x00,
- 0x06, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x0C, 0x0C,
- 0x18, 0x18, 0x18, 0x18, 0x30, 0x30, 0x30, 0x00,
- 0x00, 0x38, 0x1C, 0x0C, 0x18, 0x18, 0x0E, 0x0E,
- 0x18, 0x30, 0x30, 0x70, 0xE0, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1D, 0x3F, 0x37, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEE, 0x28, 0x4C, 0x48, 0x48, 0x00, 0xFE,
- 0x00, 0x06, 0x0F, 0x1B, 0x18, 0x7E, 0x30, 0x7C,
- 0x60, 0x60, 0x6C, 0x3C, 0x30, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE,
- 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x18, 0x18, 0x10, 0x20, 0x00,
- 0x00, 0x07, 0x0F, 0x0C, 0x18, 0x7E, 0x7E, 0x30,
- 0x30, 0x30, 0x60, 0x60, 0x60, 0xC0, 0x80, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x66, 0x66, 0x44, 0x88, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0xDB, 0xDB, 0x00, 0x00, 0x00,
- 0x00, 0x06, 0x06, 0x06, 0x1F, 0x3F, 0x0C, 0x0C,
- 0x0C, 0x18, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00,
- 0x00, 0x06, 0x06, 0x06, 0x1F, 0x3F, 0x0C, 0x3F,
- 0x3F, 0x18, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00,
- 0x00, 0x3E, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x63, 0x06,
- 0x0C, 0x30, 0x60, 0xDB, 0x9B, 0x00, 0x00, 0x00,
- 0x63, 0x3E, 0x00, 0x1E, 0x3F, 0x33, 0x60, 0x7C,
- 0x3E, 0x06, 0xCE, 0xFC, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0E,
- 0x1C, 0x30, 0x38, 0x1C, 0x0C, 0x00, 0x00, 0x00,
- 0x00, 0x1F, 0x3F, 0x33, 0x33, 0x66, 0x67, 0x67,
- 0x66, 0xCC, 0xCC, 0xFF, 0x7F, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE,
- 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x63, 0x3E, 0x00, 0x7F, 0x7F, 0x03, 0x07, 0x0E,
- 0x18, 0x70, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE,
- 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE,
- 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x04, 0x08, 0x10, 0x18, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x0C, 0x04, 0x08, 0x10, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x09, 0x12, 0x1B, 0x36, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1B, 0x1B, 0x09, 0x12, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x3F,
- 0x3F, 0x7E, 0x7E, 0x3C, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x19, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xFB, 0xFF, 0x55, 0xA2, 0xA2, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x63, 0x36, 0x1C, 0x00, 0x3F, 0x7F, 0x60,
- 0x7C, 0x3E, 0x06, 0xFE, 0xFC, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x1C,
- 0x0E, 0x0C, 0x1C, 0x38, 0x30, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x7F, 0x6D,
- 0x6F, 0xDE, 0xD8, 0xFE, 0x6E, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE,
- 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0x63, 0x36, 0x1C, 0x00, 0x7F, 0x7F, 0x07,
- 0x1E, 0x78, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x33, 0x00, 0x66, 0x66, 0x66, 0x3C, 0x3C,
- 0x18, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00,
- 0x0C, 0x18, 0x18, 0x18, 0x18, 0x30, 0x30, 0x00,
- 0x00, 0x00, 0x00, 0x04, 0x04, 0x3E, 0x7F, 0x6B,
- 0x68, 0xD0, 0xD6, 0xFE, 0x7C, 0x20, 0x20, 0x00,
- 0x00, 0x0F, 0x1F, 0x19, 0x18, 0x30, 0x7C, 0x7C,
- 0x30, 0x60, 0xE6, 0xFE, 0xDC, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x19, 0x33, 0x1E, 0x3F,
- 0x33, 0x66, 0x7E, 0x3C, 0x66, 0xCC, 0x00, 0x00,
- 0x00, 0x00, 0x19, 0x19, 0x19, 0x1E, 0x0C, 0x3F,
- 0x0C, 0x7E, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x06, 0x06, 0x0C, 0x0C, 0x00,
- 0x00, 0x18, 0x18, 0x30, 0x30, 0x00, 0x00, 0x00,
- 0x00, 0x07, 0x0E, 0x18, 0x18, 0x3C, 0x7E, 0x66,
- 0x7E, 0x3C, 0x18, 0x18, 0x70, 0xE0, 0x00, 0x00,
- 0x00, 0x00, 0x33, 0x66, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x0E, 0x1F, 0x21, 0x21, 0x4D, 0x51, 0x51,
- 0x91, 0xA1, 0x9A, 0x82, 0x7C, 0x38, 0x00, 0x00,
- 0x00, 0x1C, 0x02, 0x1E, 0x22, 0x3C, 0x00, 0x7C,
- 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B,
- 0x36, 0xD8, 0xD8, 0x6C, 0x36, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1E, 0x3E, 0x06, 0x0C, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x0E, 0x1F, 0x21, 0x49, 0x55, 0x55, 0x59,
- 0x99, 0xA5, 0xA5, 0x82, 0x7E, 0x78, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x1E, 0x3F, 0x33, 0x3F, 0x3C, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x06, 0x06, 0x3F, 0x3F, 0x0C,
- 0x0C, 0x00, 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x3C, 0x3E, 0x06, 0x3C, 0x78, 0x60,
- 0x7C, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x3C, 0x3E, 0x06, 0x18, 0x0C, 0x7C,
- 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x33,
- 0x33, 0x66, 0x66, 0x7E, 0x7C, 0xC0, 0xC0, 0x80,
- 0x00, 0x00, 0x00, 0x3F, 0x6F, 0xDB, 0xDB, 0x7B,
- 0x1B, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C,
- 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x18, 0x1C, 0x0C, 0x1C, 0x30, 0x00, 0x00,
- 0x00, 0x00, 0x18, 0x38, 0x18, 0x30, 0x30, 0x78,
- 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x0C, 0x1E, 0x22, 0x3C, 0x18, 0x00, 0x3C,
- 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C,
- 0x36, 0x36, 0x36, 0x6C, 0xD8, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x10, 0x30, 0x10, 0x23, 0x76, 0x0C,
- 0x18, 0x64, 0xCC, 0x94, 0x3E, 0x08, 0x08, 0x00,
- 0x00, 0x00, 0x10, 0x30, 0x10, 0x23, 0x76, 0x0C,
- 0x18, 0x60, 0xDC, 0x82, 0x1C, 0x20, 0x3C, 0x00,
- 0x00, 0x00, 0x38, 0x04, 0x18, 0x0B, 0x76, 0x0C,
- 0x18, 0x64, 0xCC, 0x96, 0x3E, 0x08, 0x08, 0x00,
- 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C,
- 0x3C, 0x70, 0xC0, 0xC6, 0xC6, 0xFC, 0x78, 0x00,
- 0x00, 0x18, 0x0C, 0x00, 0x04, 0x1C, 0x36, 0x63,
- 0x7F, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x03, 0x06, 0x00, 0x04, 0x1C, 0x36, 0x63,
- 0x7F, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x0E, 0x1B, 0x11, 0x04, 0x1C, 0x36, 0x63,
- 0x7F, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x1D, 0x37, 0x00, 0x04, 0x1C, 0x36, 0x63,
- 0x7F, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x1B, 0x1B, 0x04, 0x0E, 0x36, 0x63, 0x7F,
- 0x7F, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x0E, 0x11, 0x0E, 0x0E, 0x36, 0x63, 0x7F,
- 0x7F, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x07, 0x0F, 0x1F, 0x3B, 0x66, 0x7F, 0x7F,
- 0x66, 0xCC, 0xCC, 0xCF, 0xCF, 0x00, 0x00, 0x00,
- 0x00, 0x1E, 0x3F, 0x33, 0x30, 0x60, 0x60, 0x60,
- 0x60, 0xC0, 0xC6, 0xFE, 0x7C, 0x1C, 0xCC, 0x78,
- 0x00, 0x0C, 0x06, 0x00, 0x3F, 0x7F, 0x60, 0x78,
- 0x78, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x03, 0x06, 0x00, 0x3F, 0x7F, 0x60, 0x78,
- 0x78, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x0E, 0x1B, 0x00, 0x3F, 0x7F, 0x60, 0x78,
- 0x78, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x1B, 0x1B, 0x00, 0x3F, 0x3F, 0x60, 0x60, 0x78,
- 0x78, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x0C, 0x06, 0x00, 0x1F, 0x1F, 0x0C, 0x0C,
- 0x0C, 0x18, 0x18, 0x7C, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x03, 0x06, 0x00, 0x1F, 0x1F, 0x0C, 0x0C,
- 0x0C, 0x18, 0x18, 0x7C, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x06, 0x09, 0x1F, 0x1F, 0x0C, 0x0C, 0x0C,
- 0x0C, 0x18, 0x18, 0x7C, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x1B, 0x1B, 0x00, 0x1F, 0x1F, 0x0C, 0x0C,
- 0x0C, 0x18, 0x18, 0x7C, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1E, 0x1F, 0x1B, 0x33, 0x33, 0x7B,
- 0x33, 0x66, 0x6E, 0x7C, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x1D, 0x37, 0x00, 0x31, 0x63, 0x73, 0x7B,
- 0x7F, 0xDE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x0C, 0x06, 0x00, 0x3E, 0x7F, 0x63, 0x63,
- 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x03, 0x06, 0x00, 0x3E, 0x7F, 0x63, 0x63,
- 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x0E, 0x1B, 0x00, 0x3E, 0x7F, 0x63, 0x63,
- 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x1D, 0x37, 0x00, 0x3E, 0x7F, 0x63, 0x63,
- 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x1B, 0x1B, 0x00, 0x3E, 0x7F, 0x63, 0x63,
- 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x77, 0x3E,
- 0x1C, 0x38, 0x7C, 0xEE, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x1D, 0x3E, 0x37, 0x6B, 0x6B, 0x6B, 0xD6,
- 0xD6, 0xD6, 0xEE, 0x7C, 0xB8, 0x00, 0x00, 0x00,
- 0x00, 0x0C, 0x06, 0x00, 0x33, 0x33, 0x63, 0x66,
- 0x66, 0xC6, 0xCE, 0xFC, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x03, 0x06, 0x00, 0x33, 0x33, 0x63, 0x66,
- 0x66, 0xC6, 0xCE, 0xFC, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x0E, 0x1B, 0x00, 0x33, 0x33, 0x63, 0x66,
- 0x66, 0xC6, 0xCE, 0xFC, 0x78, 0x00, 0x00, 0x00,
- 0x1B, 0x1B, 0x00, 0x33, 0x33, 0x63, 0x63, 0x63,
- 0x66, 0xC6, 0xCE, 0xFC, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x06, 0x0C, 0x00, 0x33, 0x33, 0x66, 0x6E,
- 0x7C, 0x38, 0x30, 0x60, 0x60, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x18, 0x18, 0x1F, 0x3F, 0x33, 0x33,
- 0x3F, 0x7C, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00,
- 0x00, 0x0E, 0x1F, 0x1B, 0x1B, 0x33, 0x3F, 0x3E,
- 0x33, 0x66, 0x66, 0x7E, 0x7C, 0xC0, 0x80, 0x00,
- 0x00, 0x00, 0x0C, 0x06, 0x00, 0x3F, 0x7F, 0x63,
- 0x63, 0xCE, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x06, 0x0C, 0x00, 0x3F, 0x7F, 0x63,
- 0x63, 0xC6, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00,
- 0x00, 0x04, 0x0E, 0x1B, 0x00, 0x3F, 0x7F, 0x63,
- 0x63, 0xC6, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1D, 0x37, 0x00, 0x3F, 0x7F, 0x63,
- 0x63, 0xC6, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1B, 0x1B, 0x00, 0x3F, 0x7F, 0x63,
- 0x63, 0xC6, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00,
- 0x00, 0x0E, 0x1B, 0x0E, 0x00, 0x3E, 0x7F, 0x63,
- 0x63, 0xC6, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x3F, 0x0D,
- 0x1F, 0x7E, 0xD8, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F,
- 0x63, 0xC0, 0xC6, 0xFE, 0x7C, 0x30, 0xF8, 0xF0,
- 0x00, 0x00, 0x0C, 0x06, 0x00, 0x3E, 0x7F, 0x63,
- 0x7F, 0xFE, 0xC0, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x06, 0x0C, 0x00, 0x3E, 0x7F, 0x63,
- 0x7F, 0xFE, 0xC0, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x04, 0x0E, 0x1B, 0x00, 0x3E, 0x7F, 0x63,
- 0x7F, 0xFE, 0xC0, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1B, 0x1B, 0x00, 0x3E, 0x7F, 0x63,
- 0x7F, 0xFE, 0xC0, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x0C, 0x0C,
- 0x0C, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x03, 0x06, 0x00, 0x0C, 0x0C, 0x0C,
- 0x0C, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x06, 0x0F, 0x19, 0x00, 0x0C, 0x0C, 0x0C,
- 0x0C, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1B, 0x1B, 0x00, 0x0C, 0x0C, 0x0C,
- 0x0C, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x1B, 0x1F, 0x3E, 0x37, 0x3E, 0x7F, 0x63,
- 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x1D, 0x3F, 0x37, 0x00, 0x7E, 0x7F, 0x63,
- 0x63, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x18, 0x0C, 0x00, 0x3E, 0x7F, 0x63,
- 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x06, 0x0C, 0x00, 0x3E, 0x7F, 0x63,
- 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x04, 0x0E, 0x1B, 0x00, 0x3E, 0x7F, 0x63,
- 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x1D, 0x3F, 0x37, 0x00, 0x3E, 0x7F, 0x63,
- 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1B, 0x1B, 0x00, 0x3E, 0x7F, 0x63,
- 0x63, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x3F,
- 0x7E, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x67,
- 0x6B, 0xD6, 0xE6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x18, 0x0C, 0x00, 0x63, 0x63, 0x63,
- 0x63, 0xC6, 0xC6, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x06, 0x0C, 0x00, 0x63, 0x63, 0x63,
- 0x63, 0xC6, 0xC6, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x04, 0x0E, 0x1B, 0x00, 0x63, 0x63, 0x63,
- 0x63, 0xC6, 0xC6, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1B, 0x1B, 0x00, 0x63, 0x63, 0x63,
- 0x63, 0xC6, 0xC6, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x03, 0x06, 0x00, 0x63, 0x63, 0x63,
- 0x63, 0xC6, 0xC6, 0xFE, 0x7E, 0x0C, 0xF8, 0xF0,
- 0x00, 0x00, 0x18, 0x18, 0x18, 0x3E, 0x3F, 0x33,
- 0x33, 0x66, 0x66, 0x7E, 0x7C, 0xC0, 0xC0, 0xC0,
- 0x00, 0x00, 0x00, 0x1B, 0x00, 0x63, 0x63, 0x63,
- 0x63, 0xC6, 0xC6, 0xFE, 0x7E, 0x0C, 0xF8, 0xF0,
-};
-
-const struct fb_font_desc font_italic = {
- .name = "NetSurf Italic",
- .width = 8,
- .height = 16,
- .encoding = "CP1252",
- .data = fontdata_italic,
-};
diff --git a/framebuffer/nsfont_italic_bold.c b/framebuffer/nsfont_italic_bold.c
deleted file mode 100644
index d70794668..000000000
--- a/framebuffer/nsfont_italic_bold.c
+++ /dev/null
@@ -1,556 +0,0 @@
-/*
- * Licensed under the MIT License,
- * http://www.opensource.org/licenses/mit-license.php
- *
- * Copyright Tim Tyler
- * Copyright Michael Drake <tlsa@netsurf-browser.org>
- *
- * This font is based on the "Default" font with Zap 1.47 [TEST], which
- * was created for Zap by Tim Tyler. It was converted to a plain text
- * format and many glyphs added for use in the NetSurf project.
- *
- * Plain text font data:
- * http://source.netsurf-browser.org/?p=art.git;a=blob_plain;f=fonts/netsurf/glyph_data;hb=HEAD
- *
- * Zap: http://zap.tartarus.org/
- * NetSurf: http://www.netsurf-browser.org/
- *
- * Thanks to Tim Tyler for the original font and his permission to use it.
- * Thanks to James Aylett for helping track down Tim.
- * Thanks to Christian Ludlam for helping with Zap font info.
- *
- * Please contact Michael Drake if you want to contribute gylphs to
- * this font.
- */
-
-/* Don't edit this file, it was generated from the plain text source data. */
-
-#include "desktop/plotters.h"
-#include "utils/utf8.h"
-
-#include "framebuffer/font_internal.h"
-
-#define FONTDATAMAX 4096
-
-static const uint32_t fontdata_italic_bold[FONTDATAMAX] = {
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xE4, 0xAC, 0xA4, 0xA4, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEC, 0xA2, 0xA4, 0xA8, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEC, 0xA2, 0xAC, 0xA2, 0xEC, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEA, 0xAA, 0xAE, 0xA2, 0xE2, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEE, 0xA8, 0xAE, 0xA2, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xE6, 0xA8, 0xAE, 0xAA, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEE, 0xA2, 0xA4, 0xA4, 0xE4, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEE, 0xAA, 0xAE, 0xAA, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEE, 0xAA, 0xAE, 0xA2, 0xE2, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xE4, 0xAA, 0xAE, 0xAA, 0xEA, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEC, 0xAA, 0xAC, 0xAA, 0xEC, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xE4, 0xAA, 0xA8, 0xAA, 0xE4, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEC, 0xAA, 0xAA, 0xAA, 0xEC, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEE, 0xA8, 0xAC, 0xA8, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEE, 0xA8, 0xAC, 0xA8, 0xE8, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4E, 0xCA, 0x4A, 0x4A, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x44, 0xCC, 0x44, 0x44, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4C, 0xC2, 0x44, 0x48, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4C, 0xC2, 0x4C, 0x42, 0xEC, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4A, 0xCA, 0x4E, 0x42, 0xE2, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4E, 0xC8, 0x4E, 0x42, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x46, 0xC8, 0x4E, 0x4A, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4E, 0xC2, 0x44, 0x44, 0xE4, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4E, 0xCA, 0x4E, 0x4A, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4E, 0xCA, 0x4E, 0x42, 0xE2, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x44, 0xCA, 0x4E, 0x4A, 0xEA, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4C, 0xCA, 0x4C, 0x4A, 0xEC, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x44, 0xCA, 0x48, 0x4A, 0xE4, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4C, 0xCA, 0x4A, 0x4A, 0xEC, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4E, 0xC8, 0x4C, 0x48, 0xEE, 0x00, 0xFE,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0x4E, 0xC8, 0x4C, 0x48, 0xE8, 0x00, 0xFE,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x1C, 0x1C, 0x1C,
- 0x1C, 0x00, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x36, 0x36, 0x7F, 0x7F, 0x7F, 0x36, 0x6C,
- 0xFE, 0xFE, 0xFE, 0x6C, 0x6C, 0x00, 0x00, 0x00,
- 0x00, 0x08, 0x3E, 0x7F, 0x7B, 0x78, 0x7C, 0x7C,
- 0x3E, 0x1E, 0xDE, 0xFE, 0x7C, 0x10, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x70, 0x73, 0x77, 0x0E,
- 0x3C, 0x70, 0xEE, 0xCE, 0x0E, 0x00, 0x00, 0x00,
- 0x00, 0x1C, 0x3E, 0x7E, 0x7C, 0x7C, 0x3B, 0xFE,
- 0xFE, 0xEC, 0xEE, 0xFE, 0x74, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x03, 0x06, 0x0E, 0x1C, 0x1C, 0x38, 0x38, 0x70,
- 0x70, 0x70, 0x38, 0x38, 0x1C, 0x0C, 0x06, 0x00,
- 0x60, 0x30, 0x38, 0x1C, 0x1C, 0x0E, 0x0E, 0x0E,
- 0x1C, 0x1C, 0x38, 0x38, 0x70, 0x60, 0xC0, 0x00,
- 0x00, 0x00, 0x00, 0x08, 0x2A, 0x7F, 0x3E, 0x18,
- 0x7C, 0xFE, 0x54, 0x10, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x7E,
- 0x7E, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x38, 0x78, 0x70, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
- 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x3C,
- 0x78, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x1C, 0x3E, 0x77, 0x77, 0x77, 0x77, 0xEE,
- 0xEE, 0xEE, 0xEE, 0x7C, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x0C, 0x1C, 0x3C, 0x3C, 0x1C, 0x1C, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x7F, 0x77, 0x07, 0x07, 0x3E, 0x7C,
- 0xE0, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x7F, 0x77, 0x07, 0x07, 0x1E, 0x3C,
- 0x0E, 0x0E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x02, 0x06, 0x0E, 0x1E, 0x3E, 0x76, 0xEC,
- 0xFE, 0xFE, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00,
- 0x00, 0x7F, 0x7F, 0x70, 0x70, 0x7C, 0x7E, 0x0E,
- 0x0E, 0x0E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x7E, 0x70, 0x70, 0x7C, 0x7E, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x7F, 0x7F, 0x07, 0x07, 0x0E, 0x0E, 0x1C,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x7F, 0x77, 0x77, 0x7F, 0x3E, 0x7E,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x7F, 0x77, 0x77, 0x77, 0x7F, 0x3E,
- 0x0E, 0x0E, 0x0E, 0x7C, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00,
- 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00,
- 0x00, 0x18, 0x38, 0x38, 0x30, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x03, 0x07, 0x0E, 0x1C, 0x70,
- 0x70, 0x38, 0x1C, 0x0E, 0x06, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00,
- 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x30, 0x38, 0x1C, 0x0E, 0x0E,
- 0x0E, 0x1C, 0x38, 0x70, 0x60, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x7F, 0x77, 0x07, 0x07, 0x1E, 0x7C,
- 0x70, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x7F, 0x77, 0x77, 0x77, 0x7F, 0xFE,
- 0xEC, 0xE0, 0xE0, 0xFC, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x7F, 0x77, 0x77, 0x77, 0x76, 0xFE,
- 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x7E, 0x7F, 0x77, 0x77, 0x77, 0x7E, 0xFC,
- 0xEE, 0xEE, 0xEE, 0xFE, 0xFC, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x7F, 0x77, 0x77, 0x70, 0x70, 0xE0,
- 0xE0, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0x7E, 0x77, 0x77, 0x77, 0x76, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFC, 0xF8, 0x00, 0x00, 0x00,
- 0x00, 0x7F, 0x7F, 0x70, 0x70, 0x70, 0x7C, 0xF8,
- 0xE0, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x7F, 0x7F, 0x70, 0x70, 0x70, 0x7C, 0xF8,
- 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x7F, 0x77, 0x77, 0x70, 0x70, 0xFE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7E, 0xFE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x7F, 0x7F, 0x1C, 0x1C, 0x1C, 0x1C, 0x38,
- 0x38, 0x38, 0x38, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x0E,
- 0x0E, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x70, 0x70, 0x72, 0x77, 0x7F, 0x7E, 0xF8,
- 0xF8, 0xFC, 0xFE, 0xEE, 0xE6, 0x00, 0x00, 0x00,
- 0x00, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0xE0,
- 0xE0, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x63, 0x77, 0x7F, 0x7F, 0x7F, 0x7E, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x67, 0x77, 0x77, 0x7F, 0x7F, 0x7E, 0xFE,
- 0xFE, 0xFE, 0xEE, 0xEE, 0xE6, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x7F, 0x77, 0x77, 0x77, 0x76, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x7E, 0x7F, 0x77, 0x77, 0x77, 0x77, 0xFE,
- 0xFC, 0xE0, 0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x7F, 0x77, 0x77, 0x77, 0x76, 0xEE,
- 0xEE, 0xFE, 0xFE, 0xFE, 0x7E, 0x06, 0x00, 0x00,
- 0x00, 0x7E, 0x7F, 0x77, 0x77, 0x77, 0x7E, 0xFC,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x7F, 0x77, 0x70, 0x70, 0x7C, 0x3E,
- 0x0E, 0x0E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x7F, 0x7F, 0x1C, 0x1C, 0x1C, 0x1C, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0xEE,
- 0x6C, 0x7C, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0xEE,
- 0xFE, 0xFE, 0xFE, 0xEE, 0x44, 0x00, 0x00, 0x00,
- 0x00, 0x77, 0x77, 0x77, 0x77, 0x3E, 0x1C, 0x38,
- 0x7C, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x3E, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x7F, 0x7F, 0x07, 0x07, 0x0E, 0x1C, 0x38,
- 0x70, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x1F, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x38,
- 0x38, 0x38, 0x38, 0x3E, 0x3E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x70, 0x78, 0x38,
- 0x1C, 0x1E, 0x0E, 0x04, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7E, 0x7E, 0x0E, 0x0E, 0x0E, 0x0E, 0x1C,
- 0x1C, 0x1C, 0x1C, 0xFC, 0xFC, 0x00, 0x00, 0x00,
- 0x00, 0x08, 0x1C, 0x3E, 0x77, 0x63, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00,
- 0x00, 0x00, 0x00, 0x18, 0x1C, 0x0C, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x3E, 0x0E,
- 0x3E, 0x7E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x38, 0x38, 0x70, 0x7C, 0x7E, 0x6E,
- 0xEE, 0xEE, 0xEE, 0xFC, 0xF8, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0xEE,
- 0xE0, 0xE0, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x07, 0x07, 0x07, 0x07, 0x3F, 0x7E, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0xEE,
- 0xFE, 0xFC, 0xE0, 0xFC, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x1F, 0x3F, 0x38, 0x38, 0x70, 0x7C, 0x7C,
- 0x70, 0xE0, 0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7E, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x1C, 0xFC, 0xF8,
- 0x00, 0x00, 0x70, 0x70, 0x70, 0x7C, 0x7E, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x0E, 0x0E, 0x00, 0x1E, 0x3E, 0x1C,
- 0x1C, 0x38, 0x38, 0x7C, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x0E, 0x0E, 0x00, 0x1E, 0x3E, 0x0E,
- 0x1C, 0x1C, 0x1C, 0x1C, 0x38, 0x38, 0xF8, 0xF0,
- 0x00, 0x38, 0x38, 0x38, 0x3A, 0x7F, 0x7E, 0x7C,
- 0x70, 0xF8, 0xFC, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x3C, 0x3C, 0x1C, 0x1C, 0x38, 0x38, 0x38,
- 0x38, 0x70, 0x70, 0x70, 0x70, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x7E, 0xFE,
- 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7E, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFC, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7E, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFC, 0xF8, 0xE0, 0xE0, 0xE0,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7E, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFC, 0x7C, 0x1C, 0x1E, 0x1E,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x7E, 0x70,
- 0x70, 0xE0, 0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3E, 0x70,
- 0x7C, 0x3E, 0x0E, 0x7C, 0xF8, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x38, 0x38, 0x70, 0x7C, 0x7C, 0x70,
- 0xE0, 0xE0, 0xE0, 0xFC, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x76, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x76, 0xEE,
- 0xEE, 0xEE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x76, 0xEE,
- 0xFE, 0xFE, 0xFE, 0xEE, 0x44, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x76, 0x7E,
- 0x38, 0x7C, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x76, 0xEE,
- 0xEE, 0xEE, 0xFE, 0x7E, 0x1C, 0x1C, 0xFC, 0xF8,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7E, 0x1E,
- 0x3C, 0x78, 0xF0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x0F, 0x1F, 0x1C, 0x1C, 0x1C, 0x78, 0xF0,
- 0x38, 0x38, 0x38, 0x3E, 0x1E, 0x00, 0x00, 0x00,
- 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00,
- 0x00, 0x78, 0x7C, 0x1C, 0x1C, 0x1C, 0x0F, 0x1E,
- 0x38, 0x38, 0x38, 0xF8, 0xF0, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x33, 0x7F, 0x7F, 0x66, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7F, 0x00, 0x77, 0x55, 0x55, 0x55, 0x77,
- 0x00, 0xEE, 0x28, 0x4C, 0x48, 0x48, 0x00, 0xFE,
- 0x00, 0x06, 0x1F, 0x3B, 0x70, 0xFE, 0x70, 0xF8,
- 0xE0, 0xE0, 0xEE, 0xFC, 0x70, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE,
- 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x38, 0x38, 0x30, 0x60, 0x00,
- 0x00, 0x1F, 0x3F, 0x38, 0x38, 0x70, 0x7C, 0x7C,
- 0x70, 0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0xEE, 0xEE, 0xCC, 0x98, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xDB, 0xDB, 0xDB, 0x00, 0x00, 0x00,
- 0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x7F, 0x7F, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00,
- 0x00, 0x1C, 0x1C, 0x1C, 0x7F, 0x7F, 0x1C, 0xFE,
- 0xFE, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00,
- 0x00, 0x3E, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x67, 0x1C,
- 0x38, 0x70, 0xE0, 0xDB, 0x1B, 0x00, 0x00, 0x00,
- 0x77, 0x3E, 0x00, 0x3E, 0x7F, 0x77, 0x70, 0x7C,
- 0x3E, 0x0E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x1C,
- 0x38, 0x70, 0x38, 0x1C, 0x0E, 0x06, 0x00, 0x00,
- 0x00, 0x3F, 0x7F, 0x77, 0x77, 0x77, 0x77, 0xEF,
- 0xEE, 0xEE, 0xEE, 0xFF, 0x7F, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE,
- 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x77, 0x3E, 0x00, 0x7F, 0x7F, 0x07, 0x0E, 0x1C,
- 0x38, 0x70, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE,
- 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE,
- 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x0C, 0x18, 0x18, 0x18, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1B, 0x36, 0x36, 0x36, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1B, 0x1B, 0x1B, 0x36, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7E,
- 0x7E, 0x7E, 0x7E, 0x3C, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x3B, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x79, 0x7F, 0x2F, 0x29, 0x29, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x77, 0x3E, 0x1C, 0x00, 0x1F, 0x3E, 0x70,
- 0x7C, 0x3E, 0x0E, 0x7C, 0xF8, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x38, 0x38,
- 0x1C, 0x0E, 0x1C, 0x38, 0x70, 0x60, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x7F, 0xFA,
- 0xDE, 0xDE, 0xFC, 0xFE, 0x6E, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE,
- 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0x77, 0x3E, 0x1C, 0x00, 0x7F, 0x7E, 0x1E,
- 0x3C, 0x78, 0xF0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x3B, 0x00, 0x77, 0x77, 0x77, 0x77, 0x3E,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00,
- 0x00, 0x00, 0x00, 0x08, 0x08, 0x3E, 0x7F, 0xD6,
- 0xD0, 0xD0, 0xD6, 0xFE, 0x7C, 0x10, 0x10, 0x00,
- 0x00, 0x1E, 0x3F, 0x3B, 0x38, 0x7E, 0x7E, 0xFC,
- 0x70, 0x76, 0xFE, 0xFE, 0xDC, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x3E, 0xFE,
- 0xFE, 0xFE, 0xFE, 0x7C, 0xEE, 0xEE, 0x00, 0x00,
- 0x00, 0x00, 0x77, 0x77, 0x77, 0x3E, 0x1C, 0xFE,
- 0x38, 0xFE, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x00,
- 0x00, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x1E, 0x3E, 0x3E, 0x38, 0x1E, 0x3F, 0x66,
- 0x7E, 0x3C, 0x0E, 0x3E, 0x3E, 0x3C, 0x00, 0x00,
- 0x00, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x1E, 0x3F, 0x61, 0x4D, 0x5D, 0x51, 0xA1,
- 0xA5, 0xBD, 0x99, 0xC3, 0x7E, 0x3C, 0x00, 0x00,
- 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, 0xFC,
- 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E,
- 0x7C, 0xF8, 0xF8, 0x7C, 0x3E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x03, 0x01, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x1E, 0x3F, 0x61, 0x59, 0x5D, 0x55, 0xB9,
- 0xB9, 0xA5, 0xA5, 0xC3, 0x7E, 0x3C, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x3C, 0x7E, 0x66, 0x7E, 0x3C, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1C, 0x1C, 0x7F, 0x7F, 0x7F, 0x38,
- 0x38, 0x00, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x78, 0x7C, 0x0C, 0x3C, 0x78, 0xC0,
- 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x78, 0x7C, 0x0C, 0x18, 0x0C, 0xF8,
- 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x1C, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0xFC, 0xE0, 0xE0, 0xC0,
- 0x00, 0x00, 0x00, 0x3F, 0x6D, 0x6D, 0x6D, 0x7A,
- 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x38,
- 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x18, 0x1C, 0x0C, 0x1C, 0x18, 0x00, 0x00,
- 0x00, 0x00, 0x30, 0x70, 0x30, 0x30, 0x30, 0xF0,
- 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x7C, 0x44, 0x7C, 0x38, 0x00, 0xF8,
- 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8,
- 0x6C, 0x36, 0x36, 0x6C, 0xD8, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x30, 0x70, 0x31, 0x33, 0x7F, 0x1C,
- 0x38, 0x76, 0xEE, 0xD6, 0x3E, 0x3E, 0x06, 0x00,
- 0x00, 0x00, 0x30, 0x70, 0x31, 0x33, 0x7F, 0x1C,
- 0x38, 0x70, 0xFC, 0xC6, 0x0C, 0x18, 0x1E, 0x00,
- 0x00, 0x00, 0x70, 0x18, 0x31, 0x1B, 0x77, 0x1C,
- 0x3A, 0x76, 0xEE, 0xD6, 0x3E, 0x3E, 0x06, 0x00,
- 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x00, 0x0E, 0x1C,
- 0x7C, 0xF8, 0xE0, 0xEE, 0xEE, 0xFE, 0x7C, 0x00,
- 0x00, 0x70, 0x38, 0x00, 0x08, 0x1C, 0x3E, 0xEE,
- 0xFE, 0xFE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x07, 0x0E, 0x00, 0x08, 0x1C, 0x3E, 0xEE,
- 0xFE, 0xFE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x1C, 0x36, 0x63, 0x08, 0x1C, 0x3E, 0xEE,
- 0xFE, 0xFE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x3B, 0x6E, 0x00, 0x08, 0x1C, 0x3E, 0xEE,
- 0xFE, 0xFE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x77, 0x77, 0x08, 0x1C, 0x3E, 0x76, 0xFE,
- 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x1C, 0x36, 0x1C, 0x1C, 0x3E, 0x76, 0xFE,
- 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x0F, 0x1F, 0x3F, 0x7F, 0x77, 0x7F, 0xFF,
- 0xFE, 0xEE, 0xEF, 0xEF, 0xEF, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x7F, 0x77, 0x70, 0x70, 0x70, 0xE0,
- 0xE0, 0xE0, 0xEE, 0xFE, 0x7C, 0x0E, 0x6E, 0x7C,
- 0x00, 0x38, 0x1C, 0x00, 0x7F, 0x7F, 0x70, 0xE0,
- 0xF8, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x0E, 0x1C, 0x00, 0x7F, 0x7F, 0x70, 0xE0,
- 0xF8, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x77, 0x00, 0x7F, 0x7F, 0x70, 0xE0,
- 0xF8, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x77, 0x77, 0x00, 0x7F, 0x7F, 0x70, 0x70, 0xF8,
- 0xF8, 0xE0, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x1C, 0x00, 0x1C, 0x1C, 0x1C, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x0E, 0x1C, 0x00, 0x1C, 0x1C, 0x1C, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x1C, 0x36, 0x1C, 0x1C, 0x1C, 0x1C, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x77, 0x77, 0x00, 0x1C, 0x1C, 0x1C, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x7C, 0x7E, 0x77, 0x77, 0x76, 0xFE,
- 0xEE, 0xEE, 0xEE, 0xFC, 0xF8, 0x00, 0x00, 0x00,
- 0x00, 0x3B, 0x6E, 0x00, 0x77, 0x77, 0x76, 0xF6,
- 0xFE, 0xDE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x1C, 0x00, 0x3E, 0x7F, 0x76, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x0E, 0x1C, 0x00, 0x3E, 0x7F, 0x76, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x77, 0x00, 0x3E, 0x7F, 0x76, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x3B, 0x6E, 0x00, 0x3E, 0x7F, 0x76, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x77, 0x77, 0x00, 0x3E, 0x7F, 0x77, 0x76, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x76, 0x7C,
- 0x38, 0x38, 0x7C, 0xEE, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x3D, 0x7E, 0x77, 0x77, 0x77, 0x7E, 0xFE,
- 0xFE, 0xEE, 0xEE, 0xFE, 0x7C, 0x80, 0x00, 0x00,
- 0x00, 0x38, 0x1C, 0x00, 0x77, 0x77, 0x76, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x0E, 0x1C, 0x00, 0x77, 0x77, 0x76, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x77, 0x00, 0x77, 0x77, 0x76, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x76, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x0E, 0x1C, 0x00, 0x77, 0x77, 0x76, 0xEE,
- 0x7C, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x70, 0x70, 0x7E, 0x7F, 0x76, 0xEE,
- 0xEE, 0xFE, 0xFC, 0xE0, 0xE0, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x7F, 0x77, 0x77, 0x77, 0x7E, 0xFC,
- 0xEE, 0xEE, 0xEE, 0xFE, 0xFC, 0xE0, 0xC0, 0x00,
- 0x00, 0x00, 0x70, 0x38, 0x00, 0x3C, 0x3E, 0x0E,
- 0x3E, 0x7E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1C, 0x38, 0x00, 0x3C, 0x3E, 0x0E,
- 0x3E, 0x7E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x7C, 0xEE, 0x00, 0x3C, 0x3E, 0x0E,
- 0x3E, 0x7E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x76, 0xDC, 0x00, 0x3C, 0x3E, 0x0E,
- 0x3E, 0x7E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xEE, 0xEE, 0x00, 0x3C, 0x3E, 0x0E,
- 0x3E, 0x7E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x6C, 0x38, 0x00, 0x3C, 0x3E, 0x0E,
- 0x3E, 0x7E, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x3A, 0x3F, 0x3F, 0x1A,
- 0x7E, 0xFE, 0xD8, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFE,
- 0xEE, 0xE0, 0xEE, 0xFE, 0x7C, 0x1C, 0x7E, 0x7C,
- 0x00, 0x00, 0x38, 0x1C, 0x00, 0x3E, 0x7F, 0xEE,
- 0xFE, 0xFE, 0xE0, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1C, 0x38, 0x00, 0x3E, 0x7F, 0xEE,
- 0xFE, 0xFE, 0xE0, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x1C, 0x3E, 0x77, 0x00, 0x3E, 0x7F, 0xEE,
- 0xFE, 0xFE, 0xE0, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x77, 0x77, 0x00, 0x3E, 0x7F, 0xEE,
- 0xFE, 0xFE, 0xE0, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x38, 0x1C, 0x00, 0x1C, 0x1C, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x1C, 0x1C, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x1C, 0x3E, 0x77, 0x00, 0x1C, 0x1C, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x77, 0x77, 0x00, 0x1C, 0x1C, 0x38,
- 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00,
- 0x00, 0x76, 0x3E, 0x7C, 0x7E, 0x3F, 0x7E, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x3B, 0x7F, 0x6E, 0x00, 0x7E, 0x7F, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x70, 0x38, 0x00, 0x3C, 0x7E, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFC, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1C, 0x38, 0x00, 0x3C, 0x7E, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFC, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x1C, 0x3E, 0x77, 0x00, 0x3C, 0x7E, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFC, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x3B, 0x7F, 0x6E, 0x00, 0x3C, 0x7E, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFC, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x77, 0x77, 0x00, 0x3C, 0x7E, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFC, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0xFE,
- 0xFE, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x01, 0x3E, 0x7E, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7C, 0x80, 0x00, 0x00,
- 0x00, 0x00, 0x70, 0x38, 0x00, 0x77, 0x76, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1C, 0x38, 0x00, 0x77, 0x76, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x1C, 0x3E, 0x77, 0x00, 0x77, 0x76, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x77, 0x77, 0x00, 0x77, 0x76, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x77, 0x76, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x0E, 0xFE, 0xFC,
- 0x00, 0x00, 0x70, 0x70, 0x7E, 0x7F, 0x76, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xEE, 0xFE, 0xFC, 0xE0, 0xE0,
- 0x00, 0x00, 0x77, 0x77, 0x00, 0x77, 0x76, 0xEE,
- 0xEE, 0xEE, 0xEE, 0xFE, 0x7E, 0x0E, 0xFE, 0xFC,
-};
-
-const struct fb_font_desc font_italic_bold = {
- .name = "NetSurf Italic Bold",
- .width = 8,
- .height = 16,
- .encoding = "CP1252",
- .data = fontdata_italic_bold,
-};
diff --git a/framebuffer/nsfont_regular.c b/framebuffer/nsfont_regular.c
deleted file mode 100644
index 829e3876b..000000000
--- a/framebuffer/nsfont_regular.c
+++ /dev/null
@@ -1,556 +0,0 @@
-/*
- * Licensed under the MIT License,
- * http://www.opensource.org/licenses/mit-license.php
- *
- * Copyright Tim Tyler
- * Copyright Michael Drake <tlsa@netsurf-browser.org>
- *
- * This font is based on the "Default" font with Zap 1.47 [TEST], which
- * was created for Zap by Tim Tyler. It was converted to a plain text
- * format and many glyphs added for use in the NetSurf project.
- *
- * Plain text font data:
- * http://source.netsurf-browser.org/?p=art.git;a=blob_plain;f=fonts/netsurf/glyph_data;hb=HEAD
- *
- * Zap: http://zap.tartarus.org/
- * NetSurf: http://www.netsurf-browser.org/
- *
- * Thanks to Tim Tyler for the original font and his permission to use it.
- * Thanks to James Aylett for helping track down Tim.
- * Thanks to Christian Ludlam for helping with Zap font info.
- *
- * Please contact Michael Drake if you want to contribute gylphs to
- * this font.
- */
-
-/* Don't edit this file, it was generated from the plain text source data. */
-
-#include "desktop/plotters.h"
-#include "utils/utf8.h"
-
-#include "framebuffer/font_internal.h"
-
-#define FONTDATAMAX 4096
-
-static const uint32_t fontdata_regular[FONTDATAMAX] = {
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xE4, 0xAC, 0xA4, 0xA4, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEC, 0xA2, 0xA4, 0xA8, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEC, 0xA2, 0xAC, 0xA2, 0xEC, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEA, 0xAA, 0xAE, 0xA2, 0xE2, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEE, 0xA8, 0xAE, 0xA2, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xE6, 0xA8, 0xAE, 0xAA, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEE, 0xA2, 0xA4, 0xA4, 0xE4, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEE, 0xAA, 0xAE, 0xAA, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEE, 0xAA, 0xAE, 0xA2, 0xE2, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xE4, 0xAA, 0xAE, 0xAA, 0xEA, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEC, 0xAA, 0xAC, 0xAA, 0xEC, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xE4, 0xAA, 0xA8, 0xAA, 0xE4, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEC, 0xAA, 0xAA, 0xAA, 0xEC, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEE, 0xA8, 0xAC, 0xA8, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEE, 0xA8, 0xAC, 0xA8, 0xE8, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4E, 0xCA, 0x4A, 0x4A, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x44, 0xCC, 0x44, 0x44, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4C, 0xC2, 0x44, 0x48, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4C, 0xC2, 0x4C, 0x42, 0xEC, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4A, 0xCA, 0x4E, 0x42, 0xE2, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4E, 0xC8, 0x4E, 0x42, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x46, 0xC8, 0x4E, 0x4A, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4E, 0xC2, 0x44, 0x44, 0xE4, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4E, 0xCA, 0x4E, 0x4A, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4E, 0xCA, 0x4E, 0x42, 0xE2, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x44, 0xCA, 0x4E, 0x4A, 0xEA, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4C, 0xCA, 0x4C, 0x4A, 0xEC, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x44, 0xCA, 0x48, 0x4A, 0xE4, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4C, 0xCA, 0x4A, 0x4A, 0xEC, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4E, 0xC8, 0x4C, 0x48, 0xEE, 0x00, 0xFE,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0x4E, 0xC8, 0x4C, 0x48, 0xE8, 0x00, 0xFE,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
- 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x6C, 0x6C, 0x6C, 0xFE, 0xFE, 0x6C, 0x6C,
- 0xFE, 0xFE, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x7C, 0xFE, 0xD6, 0xD0, 0xF0, 0x7C,
- 0x1E, 0x16, 0xD6, 0xFE, 0x7C, 0x10, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xCE, 0x1C,
- 0x38, 0x70, 0xE6, 0xC6, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x70, 0xF8, 0xD8, 0xD8, 0xF8, 0x72, 0xFE,
- 0xDE, 0xCC, 0xCC, 0xFE, 0x7A, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x06, 0x0E, 0x1C, 0x18, 0x38, 0x30, 0x30, 0x30,
- 0x30, 0x38, 0x18, 0x1C, 0x0E, 0x06, 0x00, 0x00,
- 0x60, 0x70, 0x38, 0x18, 0x1C, 0x0C, 0x0C, 0x0C,
- 0x0C, 0x1C, 0x18, 0x38, 0x70, 0x60, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x6C, 0x6C, 0x38, 0xFE,
- 0xFE, 0x38, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x7E,
- 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x18, 0x38, 0x30, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0E, 0x1C,
- 0x38, 0x70, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xC6, 0xCE, 0xCE, 0xD6, 0xD6,
- 0xE6, 0xE6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x18, 0x38, 0x78, 0x78, 0x18, 0x18, 0x18,
- 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xC6, 0x06, 0x06, 0x3E, 0x7C,
- 0xE0, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xC6, 0x06, 0x06, 0x3C, 0x3C,
- 0x06, 0x06, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x04, 0x0C, 0x1C, 0x3C, 0x7C, 0xEC, 0xFE,
- 0xFE, 0x0C, 0x0C, 0x0C, 0x0C, 0x00, 0x00, 0x00,
- 0x00, 0xFE, 0xFE, 0xC0, 0xC0, 0xC0, 0xFC, 0xFE,
- 0x06, 0x06, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x3C, 0x7C, 0xE0, 0xC0, 0xC0, 0xFC, 0xFE,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0xFE, 0xFE, 0xC6, 0x0E, 0x0C, 0x1C, 0x18,
- 0x38, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xC6, 0xC6, 0xC6, 0x7C, 0x7C,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xC6, 0xC6, 0xC6, 0xFE, 0x7E,
- 0x06, 0x06, 0x0E, 0x7C, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00,
- 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00,
- 0x00, 0x18, 0x18, 0x38, 0x30, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x06, 0x0E, 0x1C, 0x38, 0x70, 0x70,
- 0x38, 0x1C, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x00, 0x00,
- 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x60, 0x70, 0x38, 0x1C, 0x0E, 0x0E,
- 0x1C, 0x38, 0x70, 0x60, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xC6, 0xC6, 0x06, 0x1E, 0x3C,
- 0x30, 0x30, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xC6, 0xCE, 0xDE, 0xD6, 0xD6,
- 0xDE, 0xCC, 0xC0, 0xFC, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xC6, 0xC6, 0xC6, 0xFE, 0xFE,
- 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0xFC, 0xFE, 0xC6, 0xC6, 0xC6, 0xFC, 0xFC,
- 0xC6, 0xC6, 0xC6, 0xFE, 0xFC, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xC6, 0xC0, 0xC0, 0xC0, 0xC0,
- 0xC0, 0xC0, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0xF8, 0xFC, 0xCE, 0xC6, 0xC6, 0xC6, 0xC6,
- 0xC6, 0xC6, 0xCE, 0xFC, 0xF8, 0x00, 0x00, 0x00,
- 0x00, 0xFE, 0xFE, 0xC0, 0xC0, 0xC0, 0xF8, 0xF8,
- 0xC0, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0xFE, 0xFE, 0xC0, 0xC0, 0xC0, 0xF8, 0xF8,
- 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xC6, 0xC0, 0xC0, 0xDE, 0xDE,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xFE,
- 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x7E, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18,
- 0x18, 0x18, 0x18, 0x7E, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
- 0x0C, 0x0C, 0xCC, 0xFC, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0xC0, 0xC6, 0xCE, 0xDC, 0xF8, 0xF0, 0xE0,
- 0xF0, 0xF8, 0xDC, 0xCE, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
- 0xC0, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0xC6, 0xC6, 0xEE, 0xFE, 0xFE, 0xFE, 0xD6,
- 0xD6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0xC6, 0xC6, 0xE6, 0xE6, 0xF6, 0xF6, 0xDE,
- 0xDE, 0xCE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0xFC, 0xFE, 0xC6, 0xC6, 0xC6, 0xFE, 0xFC,
- 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
- 0xC6, 0xD6, 0xDE, 0xFE, 0x7C, 0x06, 0x00, 0x00,
- 0x00, 0xFC, 0xFE, 0xC6, 0xC6, 0xC6, 0xFC, 0xFC,
- 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xC6, 0xC0, 0xC0, 0xFC, 0x7E,
- 0x06, 0x06, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x7E, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18,
- 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xEE,
- 0x6C, 0x7C, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6,
- 0xD6, 0xFE, 0xFE, 0xEE, 0x44, 0x00, 0x00, 0x00,
- 0x00, 0xC6, 0xC6, 0xC6, 0xEE, 0x7C, 0x38, 0x38,
- 0x7C, 0xEE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xEE, 0x7C, 0x38,
- 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0xFE, 0xFE, 0x0E, 0x0C, 0x1C, 0x18, 0x38,
- 0x30, 0x70, 0x60, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x3E, 0x3E, 0x30, 0x30, 0x30, 0x30, 0x30,
- 0x30, 0x30, 0x30, 0x3E, 0x3E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0x70,
- 0x38, 0x1C, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0x7C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
- 0x0C, 0x0C, 0x0C, 0x7C, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x7C, 0xEE, 0xC6, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00,
- 0x00, 0x00, 0x30, 0x30, 0x18, 0x08, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7E, 0x06,
- 0x7E, 0xFE, 0xC6, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xFC, 0xFE, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0xFC, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFE, 0xC6,
- 0xC0, 0xC0, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x06, 0x06, 0x06, 0x06, 0x7E, 0xFE, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFE, 0xC6,
- 0xFE, 0xFE, 0xC0, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x1E, 0x3E, 0x30, 0x30, 0x30, 0x78, 0x78,
- 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFE, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7E, 0x06, 0x7E, 0x7C,
- 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xDC, 0xFE, 0xE6,
- 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x38, 0x18,
- 0x18, 0x18, 0x18, 0x3C, 0x3C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x1C, 0x1C, 0x0C,
- 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x7C, 0x78,
- 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC6, 0xCE, 0xDC,
- 0xF8, 0xF8, 0xDC, 0xCE, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18,
- 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xFE, 0xFE,
- 0xD6, 0xD6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0xFE, 0xE6,
- 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFE, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFE, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0xFC, 0xC0, 0xC0, 0xC0,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFE, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7E, 0x06, 0x07, 0x07,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xFE, 0xE0,
- 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFE, 0xC0,
- 0xFC, 0x7C, 0x06, 0xFE, 0xFC, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x30, 0x30, 0x30, 0x7C, 0xFC, 0x30,
- 0x30, 0x30, 0x30, 0x3E, 0x1E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
- 0xC6, 0xC6, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
- 0xC6, 0xEE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
- 0xD6, 0xD6, 0xFE, 0xFE, 0x6C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xEE,
- 0x7C, 0x7C, 0xEE, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7E, 0x06, 0xFE, 0xFC,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x0E,
- 0x3C, 0x78, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x0E, 0x1E, 0x18, 0x18, 0x18, 0x70, 0x70,
- 0x18, 0x18, 0x18, 0x1E, 0x0E, 0x00, 0x00, 0x00,
- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00,
- 0x00, 0x70, 0x78, 0x18, 0x18, 0x18, 0x0E, 0x0E,
- 0x18, 0x18, 0x18, 0x78, 0x70, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x76, 0xFE, 0xDC, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xFE, 0x00, 0xEE, 0xAA, 0xAA, 0xAA, 0xEE,
- 0x00, 0xEE, 0x28, 0x4C, 0x48, 0x48, 0x00, 0xFE,
- 0x00, 0x18, 0x3C, 0x66, 0x60, 0xFC, 0x60, 0xF8,
- 0x60, 0x60, 0x66, 0x3C, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE,
- 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x18, 0x18, 0x08, 0x10, 0x00,
- 0x00, 0x1E, 0x3E, 0x30, 0x30, 0x30, 0x78, 0x78,
- 0x30, 0x30, 0x30, 0x30, 0x30, 0xF0, 0x60, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x66, 0x66, 0x22, 0x44, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0xDB, 0xDB, 0x00, 0x00, 0x00,
- 0x00, 0x18, 0x18, 0x18, 0x7E, 0x7E, 0x18, 0x18,
- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
- 0x00, 0x18, 0x18, 0x18, 0x7E, 0x7E, 0x18, 0x7E,
- 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
- 0x00, 0x7C, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xC6, 0x0C,
- 0x18, 0x30, 0x60, 0xDB, 0x9B, 0x00, 0x00, 0x00,
- 0xC6, 0x7C, 0x00, 0x7C, 0xFE, 0xC6, 0xC0, 0xFC,
- 0x7E, 0x06, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x1C,
- 0x38, 0x30, 0x38, 0x1C, 0x0C, 0x00, 0x00, 0x00,
- 0x00, 0x7F, 0xFF, 0xCC, 0xCC, 0xCC, 0xCF, 0xCF,
- 0xCC, 0xCC, 0xCC, 0xFF, 0x7F, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE,
- 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0xC6, 0x7C, 0x00, 0xFE, 0xFE, 0x06, 0x0C, 0x18,
- 0x30, 0x60, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE,
- 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE,
- 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x10, 0x20, 0x30, 0x30, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x30, 0x30, 0x10, 0x20, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x24, 0x48, 0x6C, 0x6C, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x36, 0x36, 0x12, 0x24, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E,
- 0x7E, 0x7E, 0x7E, 0x3C, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x32, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xF1, 0xFB, 0x5F, 0x55, 0x51, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xC6, 0x6C, 0x38, 0x00, 0x7E, 0xFE, 0xC0,
- 0xFC, 0x7C, 0x06, 0xFE, 0xFC, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x38,
- 0x1C, 0x0C, 0x1C, 0x38, 0x30, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xDA,
- 0xDE, 0xDE, 0xD8, 0xFE, 0x6E, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x38, 0x6C, 0x54, 0xF6, 0xEE,
- 0x6C, 0x7C, 0x28, 0x38, 0x10, 0x00, 0x00, 0x00,
- 0x00, 0xC6, 0x6C, 0x38, 0x00, 0xFE, 0xFE, 0x0E,
- 0x3C, 0x78, 0xE0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0xEE, 0x7C,
- 0x38, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00,
- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00,
- 0x00, 0x00, 0x00, 0x10, 0x10, 0x7C, 0xFE, 0xD6,
- 0xD0, 0xD0, 0xD6, 0xFE, 0x7C, 0x10, 0x10, 0x00,
- 0x00, 0x3C, 0x7E, 0x66, 0x60, 0x60, 0xF8, 0xF8,
- 0x60, 0x60, 0xE6, 0xFE, 0xDC, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x3C, 0x7E,
- 0x66, 0x66, 0x7E, 0x3C, 0x66, 0x66, 0x00, 0x00,
- 0x00, 0x00, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E,
- 0x18, 0x7E, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00,
- 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x3C, 0x7C, 0x60, 0x60, 0x3C, 0x7E, 0x66,
- 0x7E, 0x3C, 0x06, 0x06, 0x3E, 0x3C, 0x00, 0x00,
- 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x3C, 0x7E, 0xC3, 0x99, 0xBD, 0xA5, 0xA1,
- 0xA5, 0xBD, 0x99, 0xC3, 0x7E, 0x3C, 0x00, 0x00,
- 0x00, 0x70, 0x08, 0x78, 0x88, 0x78, 0x00, 0xF8,
- 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36,
- 0x6C, 0xD8, 0xD8, 0x6C, 0x36, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x7E, 0x7E, 0x06, 0x02, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x3C, 0x7E, 0xC3, 0xB9, 0xBD, 0xA5, 0xB9,
- 0xB9, 0xA5, 0xA5, 0xC3, 0x7E, 0x3C, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x78, 0xFC, 0xCC, 0xFC, 0x78, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x7E, 0x18,
- 0x18, 0x00, 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xF0, 0xF8, 0x18, 0x78, 0xF0, 0xC0,
- 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xF0, 0xF8, 0x18, 0x30, 0x18, 0xF8,
- 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x18, 0x30, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66,
- 0x66, 0x66, 0x66, 0x7E, 0x7C, 0x60, 0x60, 0xC0,
- 0x00, 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB, 0x7B,
- 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
- 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x18, 0x1C, 0x0C, 0x1C, 0x18, 0x00, 0x00,
- 0x00, 0x00, 0x60, 0xE0, 0x60, 0x60, 0x60, 0xF0,
- 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x70, 0xF8, 0x88, 0xF8, 0x70, 0x00, 0xF8,
- 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8,
- 0x6C, 0x36, 0x36, 0x6C, 0xD8, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x40, 0xC0, 0x42, 0x46, 0xEC, 0x18,
- 0x30, 0x64, 0xCC, 0x94, 0x3E, 0x04, 0x04, 0x00,
- 0x00, 0x00, 0x40, 0xC0, 0x42, 0x46, 0xEC, 0x18,
- 0x30, 0x60, 0xDC, 0x82, 0x0C, 0x10, 0x1E, 0x00,
- 0x00, 0x00, 0xE0, 0x10, 0x62, 0x16, 0xEC, 0x18,
- 0x30, 0x64, 0xCC, 0x96, 0x3E, 0x04, 0x04, 0x00,
- 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18,
- 0x78, 0xF0, 0xC0, 0xC6, 0xC6, 0xFE, 0x7C, 0x00,
- 0x00, 0x60, 0x30, 0x00, 0x10, 0x38, 0x6C, 0xC6,
- 0xFE, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x0C, 0x18, 0x00, 0x10, 0x38, 0x6C, 0xC6,
- 0xFE, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x6C, 0x44, 0x10, 0x38, 0x6C, 0xC6,
- 0xFE, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x76, 0xDC, 0x00, 0x10, 0x38, 0x6C, 0xC6,
- 0xFE, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x6C, 0x6C, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xFE,
- 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x44, 0x38, 0x38, 0x6C, 0xC6, 0xFE,
- 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x1F, 0x3F, 0x7C, 0xEC, 0xCC, 0xFE, 0xFE,
- 0xCC, 0xCC, 0xCC, 0xCF, 0xCF, 0x00, 0x00, 0x00,
- 0x00, 0x7C, 0xFE, 0xC6, 0xC0, 0xC0, 0xC0, 0xC0,
- 0xC0, 0xC0, 0xC6, 0xFE, 0x7C, 0x0E, 0x66, 0x3C,
- 0x00, 0x30, 0x18, 0x00, 0xFE, 0xFE, 0xC0, 0xF0,
- 0xF0, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x0C, 0x18, 0x00, 0xFE, 0xFE, 0xC0, 0xF0,
- 0xF0, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x6C, 0x00, 0xFE, 0xFE, 0xC0, 0xF0,
- 0xF0, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x6C, 0x6C, 0x00, 0xFE, 0xFE, 0xC0, 0xC0, 0xF0,
- 0xF0, 0xC0, 0xC0, 0xFE, 0xFE, 0x00, 0x00, 0x00,
- 0x00, 0x30, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18,
- 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x0C, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18,
- 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x18, 0x24, 0x18, 0x18, 0x18, 0x18, 0x18,
- 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x66, 0x66, 0x00, 0x18, 0x18, 0x18, 0x18,
- 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x78, 0x7C, 0x6E, 0x66, 0x66, 0xF6,
- 0x66, 0x66, 0x6E, 0x7C, 0x78, 0x00, 0x00, 0x00,
- 0x00, 0x76, 0xDC, 0x00, 0xC6, 0xC6, 0xE6, 0xF6,
- 0xFE, 0xDE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x30, 0x18, 0x00, 0x7C, 0xFE, 0xC6, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x0C, 0x18, 0x00, 0x7C, 0xFE, 0xC6, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x6C, 0x00, 0x7C, 0xFE, 0xC6, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x76, 0xDC, 0x00, 0x7C, 0xFE, 0xC6, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x6C, 0x00, 0x7C, 0xFE, 0xC6, 0xC6, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xEE, 0x7C,
- 0x38, 0x38, 0x7C, 0xEE, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x7E, 0xFE, 0xC6, 0xC6, 0xCE, 0xCE, 0xD6,
- 0xD6, 0xE6, 0xE6, 0xFE, 0x7C, 0x80, 0x00, 0x00,
- 0x00, 0x30, 0x18, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x0C, 0x18, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x6C, 0x6C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x0C, 0x18, 0x00, 0x66, 0x66, 0x66, 0x7E,
- 0x3C, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x60, 0x60, 0x7C, 0x7E, 0x66, 0x66,
- 0x7E, 0x7C, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00,
- 0x00, 0x3C, 0x7E, 0x66, 0x66, 0x66, 0x7E, 0x7C,
- 0x66, 0x66, 0x66, 0x7E, 0x7C, 0xE0, 0xC0, 0x00,
- 0x00, 0x00, 0x30, 0x18, 0x00, 0x7E, 0xFE, 0xC6,
- 0xC6, 0xCE, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x18, 0x30, 0x00, 0x7E, 0xFE, 0xC6,
- 0xC6, 0xC6, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7E, 0xFE, 0xC6,
- 0xC6, 0xC6, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x76, 0xDC, 0x00, 0x7E, 0xFE, 0xC6,
- 0xC6, 0xC6, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x6C, 0x6C, 0x00, 0x7E, 0xFE, 0xC6,
- 0xC6, 0xC6, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00,
- 0x00, 0x38, 0x6C, 0x38, 0x00, 0x7E, 0xFE, 0xC6,
- 0xC6, 0xC6, 0xCE, 0xFE, 0x76, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x7E, 0x1A,
- 0x3E, 0x7E, 0xD8, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFE,
- 0xC6, 0xC0, 0xC6, 0xFE, 0x7C, 0x18, 0x7C, 0x78,
- 0x00, 0x00, 0x30, 0x18, 0x00, 0x7C, 0xFE, 0xC6,
- 0xFE, 0xFE, 0xC0, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x18, 0x30, 0x00, 0x7C, 0xFE, 0xC6,
- 0xFE, 0xFE, 0xC0, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C, 0xFE, 0xC6,
- 0xFE, 0xFE, 0xC0, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x6C, 0x6C, 0x00, 0x7C, 0xFE, 0xC6,
- 0xFE, 0xFE, 0xC0, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x30, 0x18, 0x00, 0x18, 0x18, 0x18,
- 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x18, 0x18,
- 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x18, 0x3C, 0x66, 0x00, 0x18, 0x18, 0x18,
- 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x66, 0x66, 0x00, 0x18, 0x18, 0x18,
- 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x6C, 0x7C, 0xF8, 0xDC, 0x7C, 0xFE, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x76, 0xFE, 0xDC, 0x00, 0xFC, 0xFE, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x60, 0x30, 0x00, 0x7C, 0xFE, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x18, 0x30, 0x00, 0x7C, 0xFE, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C, 0xFE, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x76, 0xFE, 0xDC, 0x00, 0x7C, 0xFE, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x6C, 0x6C, 0x00, 0x7C, 0xFE, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7E,
- 0x7E, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x02, 0x7C, 0xFE, 0xCE,
- 0xD6, 0xD6, 0xE6, 0xFE, 0x7C, 0x80, 0x00, 0x00,
- 0x00, 0x00, 0x60, 0x30, 0x00, 0xC6, 0xC6, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x18, 0x30, 0x00, 0xC6, 0xC6, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x38, 0x6C, 0x00, 0xC6, 0xC6, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x6C, 0x6C, 0x00, 0xC6, 0xC6, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7E, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x0C, 0x18, 0x00, 0xC6, 0xC6, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7E, 0x06, 0xFC, 0xF8,
- 0x00, 0x00, 0x60, 0x60, 0x60, 0x7C, 0x7E, 0x66,
- 0x66, 0x66, 0x66, 0x7E, 0x7C, 0x60, 0x60, 0x60,
- 0x00, 0x00, 0x6C, 0x6C, 0x00, 0xC6, 0xC6, 0xC6,
- 0xC6, 0xC6, 0xC6, 0xFE, 0x7E, 0x06, 0xFE, 0xFC,
-};
-
-const struct fb_font_desc font_regular = {
- .name = "NetSurf Regular",
- .width = 8,
- .height = 16,
- .encoding = "CP1252",
- .data = fontdata_regular,
-};
diff --git a/framebuffer/res/messages b/framebuffer/res/Messages
index f4a4d2bba..f4a4d2bba 120000
--- a/framebuffer/res/messages
+++ b/framebuffer/res/Messages
diff --git a/framebuffer/res/fonts/glyph_data b/framebuffer/res/fonts/glyph_data
new file mode 100644
index 000000000..c4bb2b1cb
--- /dev/null
+++ b/framebuffer/res/fonts/glyph_data
@@ -0,0 +1,9489 @@
+* Licensed under the MIT License,
+* http://www.opensource.org/licenses/mit-license.php
+*
+* Copyright Tim Tyler
+* Copyright Michael Drake <tlsa@netsurf-browser.org>
+*
+* This font is based on the "Default" font with Zap 1.47 [TEST], which
+* was created for Zap by Tim Tyler. It was converted to a plain text
+* format and many glyphs added for use in the NetSurf project.
+*
+* Plain text font data:
+* http://git.netsurf-browser.org/art.git/plain/fonts/netsurf/glyph_data
+*
+* Zap: http://zap.tartarus.org/
+* NetSurf: http://www.netsurf-browser.org/
+*
+* Thanks to Tim Tyler for the original font and his permission to use it.
+* Thanks to James Aylett for helping track down Tim.
+* Thanks to Christian Ludlam for helping with Zap font info.
+*
+* Please contact Michael Drake if you want to contribute gylphs to
+* this font.
+
+-----------------------------------------------------
+ Regular Italic Bold Bold &
+ Italic
+-----------------------------------------------------
+U+0000 - NULL <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ ###.###. ###.###. ###.###. ###.###.
+ #.#.#.#. #.#.#.#. #.#.#.#. #.#.#.#.
+ #.#.#.#. #.#.#.#. #.#.#.#. #.#.#.#.
+ #.#.#.#. #.#.#.#. #.#.#.#. #.#.#.#.
+ ###.###. ###.###. ###.###. ###.###.
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+0001 - START OF HEADING <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ ###..#.. ###..#.. ###..#.. ###..#..
+ #.#.##.. #.#.##.. #.#.##.. #.#.##..
+ #.#..#.. #.#..#.. #.#..#.. #.#..#..
+ #.#..#.. #.#..#.. #.#..#.. #.#..#..
+ ###.###. ###.###. ###.###. ###.###.
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+0002 - START OF TEXT <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ ###.##.. ###.##.. ###.##.. ###.##..
+ #.#...#. #.#...#. #.#...#. #.#...#.
+ #.#..#.. #.#..#.. #.#..#.. #.#..#..
+ #.#.#... #.#.#... #.#.#... #.#.#...
+ ###.###. ###.###. ###.###. ###.###.
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+0003 - END OF TEXT <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ ###.##.. ###.##.. ###.##.. ###.##..
+ #.#...#. #.#...#. #.#...#. #.#...#.
+ #.#.##.. #.#.##.. #.#.##.. #.#.##..
+ #.#...#. #.#...#. #.#...#. #.#...#.
+ ###.##.. ###.##.. ###.##.. ###.##..
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+0004 - END OF TRANSMISSION <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ ###.#.#. ###.#.#. ###.#.#. ###.#.#.
+ #.#.#.#. #.#.#.#. #.#.#.#. #.#.#.#.
+ #.#.###. #.#.###. #.#.###. #.#.###.
+ #.#...#. #.#...#. #.#...#. #.#...#.
+ ###...#. ###...#. ###...#. ###...#.
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+0005 - ENQUIRY <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ ###.###. ###.###. ###.###. ###.###.
+ #.#.#... #.#.#... #.#.#... #.#.#...
+ #.#.###. #.#.###. #.#.###. #.#.###.
+ #.#...#. #.#...#. #.#...#. #.#...#.
+ ###.###. ###.###. ###.###. ###.###.
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+0006 - ACKNOWLEDGE <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ ###..##. ###..##. ###..##. ###..##.
+ #.#.#... #.#.#... #.#.#... #.#.#...
+ #.#.###. #.#.###. #.#.###. #.#.###.
+ #.#.#.#. #.#.#.#. #.#.#.#. #.#.#.#.
+ ###.###. ###.###. ###.###. ###.###.
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+0007 - BELL <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ ###.###. ###.###. ###.###. ###.###.
+ #.#...#. #.#...#. #.#...#. #.#...#.
+ #.#..#.. #.#..#.. #.#..#.. #.#..#..
+ #.#..#.. #.#..#.. #.#..#.. #.#..#..
+ ###..#.. ###..#.. ###..#.. ###..#..
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+0008 - BACKSPACE <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ ###.###. ###.###. ###.###. ###.###.
+ #.#.#.#. #.#.#.#. #.#.#.#. #.#.#.#.
+ #.#.###. #.#.###. #.#.###. #.#.###.
+ #.#.#.#. #.#.#.#. #.#.#.#. #.#.#.#.
+ ###.###. ###.###. ###.###. ###.###.
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+0009 - CHARACTER TABULATION <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ ###.###. ###.###. ###.###. ###.###.
+ #.#.#.#. #.#.#.#. #.#.#.#. #.#.#.#.
+ #.#.###. #.#.###. #.#.###. #.#.###.
+ #.#...#. #.#...#. #.#...#. #.#...#.
+ ###...#. ###...#. ###...#. ###...#.
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+000A - LINE FEED (LF) <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ ###..#.. ###..#.. ###..#.. ###..#..
+ #.#.#.#. #.#.#.#. #.#.#.#. #.#.#.#.
+ #.#.###. #.#.###. #.#.###. #.#.###.
+ #.#.#.#. #.#.#.#. #.#.#.#. #.#.#.#.
+ ###.#.#. ###.#.#. ###.#.#. ###.#.#.
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+000B - LINE TABULATION <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ ###.##.. ###.##.. ###.##.. ###.##..
+ #.#.#.#. #.#.#.#. #.#.#.#. #.#.#.#.
+ #.#.##.. #.#.##.. #.#.##.. #.#.##..
+ #.#.#.#. #.#.#.#. #.#.#.#. #.#.#.#.
+ ###.##.. ###.##.. ###.##.. ###.##..
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+000C - FORM FEED (FF) <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ ###..#.. ###..#.. ###..#.. ###..#..
+ #.#.#.#. #.#.#.#. #.#.#.#. #.#.#.#.
+ #.#.#... #.#.#... #.#.#... #.#.#...
+ #.#.#.#. #.#.#.#. #.#.#.#. #.#.#.#.
+ ###..#.. ###..#.. ###..#.. ###..#..
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+000D - CARRIAGE RETURN (CR) <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ ###.##.. ###.##.. ###.##.. ###.##..
+ #.#.#.#. #.#.#.#. #.#.#.#. #.#.#.#.
+ #.#.#.#. #.#.#.#. #.#.#.#. #.#.#.#.
+ #.#.#.#. #.#.#.#. #.#.#.#. #.#.#.#.
+ ###.##.. ###.##.. ###.##.. ###.##..
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+000E - SHIFT OUT <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ ###.###. ###.###. ###.###. ###.###.
+ #.#.#... #.#.#... #.#.#... #.#.#...
+ #.#.##.. #.#.##.. #.#.##.. #.#.##..
+ #.#.#... #.#.#... #.#.#... #.#.#...
+ ###.###. ###.###. ###.###. ###.###.
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+000F - SHIFT IN <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ ###.###. ###.###. ###.###. ###.###.
+ #.#.#... #.#.#... #.#.#... #.#.#...
+ #.#.##.. #.#.##.. #.#.##.. #.#.##..
+ #.#.#... #.#.#... #.#.#... #.#.#...
+ ###.#... ###.#... ###.#... ###.#...
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+0010 - DATA LINK ESCAPE <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ .#..###. .#..###. .#..###. .#..###.
+ ##..#.#. ##..#.#. ##..#.#. ##..#.#.
+ .#..#.#. .#..#.#. .#..#.#. .#..#.#.
+ .#..#.#. .#..#.#. .#..#.#. .#..#.#.
+ ###.###. ###.###. ###.###. ###.###.
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+0011 - DEVICE CONTROL ONE <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ .#...#.. .#...#.. .#...#.. .#...#..
+ ##..##.. ##..##.. ##..##.. ##..##..
+ .#...#.. .#...#.. .#...#.. .#...#..
+ .#...#.. .#...#.. .#...#.. .#...#..
+ ###.###. ###.###. ###.###. ###.###.
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+0012 - DEVICE CONTROL TWO <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ .#..##.. .#..##.. .#..##.. .#..##..
+ ##....#. ##....#. ##....#. ##....#.
+ .#...#.. .#...#.. .#...#.. .#...#..
+ .#..#... .#..#... .#..#... .#..#...
+ ###.###. ###.###. ###.###. ###.###.
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+0013 - DEVICE CONTROL THREE <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ .#..##.. .#..##.. .#..##.. .#..##..
+ ##....#. ##....#. ##....#. ##....#.
+ .#..##.. .#..##.. .#..##.. .#..##..
+ .#....#. .#....#. .#....#. .#....#.
+ ###.##.. ###.##.. ###.##.. ###.##..
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+0014 - DEVICE CONTROL FOUR <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ .#..#.#. .#..#.#. .#..#.#. .#..#.#.
+ ##..#.#. ##..#.#. ##..#.#. ##..#.#.
+ .#..###. .#..###. .#..###. .#..###.
+ .#....#. .#....#. .#....#. .#....#.
+ ###...#. ###...#. ###...#. ###...#.
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+0015 - NEGATIVE ACKNOWLEDGE <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ .#..###. .#..###. .#..###. .#..###.
+ ##..#... ##..#... ##..#... ##..#...
+ .#..###. .#..###. .#..###. .#..###.
+ .#....#. .#....#. .#....#. .#....#.
+ ###.###. ###.###. ###.###. ###.###.
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+0016 - SYNCHRONOUS IDLE <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ .#...##. .#...##. .#...##. .#...##.
+ ##..#... ##..#... ##..#... ##..#...
+ .#..###. .#..###. .#..###. .#..###.
+ .#..#.#. .#..#.#. .#..#.#. .#..#.#.
+ ###.###. ###.###. ###.###. ###.###.
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+0017 - END OF TRANSMISSION BLOCK <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ .#..###. .#..###. .#..###. .#..###.
+ ##....#. ##....#. ##....#. ##....#.
+ .#...#.. .#...#.. .#...#.. .#...#..
+ .#...#.. .#...#.. .#...#.. .#...#..
+ ###..#.. ###..#.. ###..#.. ###..#..
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+0018 - CANCEL <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ .#..###. .#..###. .#..###. .#..###.
+ ##..#.#. ##..#.#. ##..#.#. ##..#.#.
+ .#..###. .#..###. .#..###. .#..###.
+ .#..#.#. .#..#.#. .#..#.#. .#..#.#.
+ ###.###. ###.###. ###.###. ###.###.
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+0019 - END OF MEDIUM <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ .#..###. .#..###. .#..###. .#..###.
+ ##..#.#. ##..#.#. ##..#.#. ##..#.#.
+ .#..###. .#..###. .#..###. .#..###.
+ .#....#. .#....#. .#....#. .#....#.
+ ###...#. ###...#. ###...#. ###...#.
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+001A - SUBSTITUTE <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ .#...#.. .#...#.. .#...#.. .#...#..
+ ##..#.#. ##..#.#. ##..#.#. ##..#.#.
+ .#..###. .#..###. .#..###. .#..###.
+ .#..#.#. .#..#.#. .#..#.#. .#..#.#.
+ ###.#.#. ###.#.#. ###.#.#. ###.#.#.
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+001B - ESCAPE <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ .#..##.. .#..##.. .#..##.. .#..##..
+ ##..#.#. ##..#.#. ##..#.#. ##..#.#.
+ .#..##.. .#..##.. .#..##.. .#..##..
+ .#..#.#. .#..#.#. .#..#.#. .#..#.#.
+ ###.##.. ###.##.. ###.##.. ###.##..
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+001C - INFORMATION SEPARATOR FOUR <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ .#...#.. .#...#.. .#...#.. .#...#..
+ ##..#.#. ##..#.#. ##..#.#. ##..#.#.
+ .#..#... .#..#... .#..#... .#..#...
+ .#..#.#. .#..#.#. .#..#.#. .#..#.#.
+ ###..#.. ###..#.. ###..#.. ###..#..
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+001D - INFORMATION SEPARATOR THREE <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ .#..##.. .#..##.. .#..##.. .#..##..
+ ##..#.#. ##..#.#. ##..#.#. ##..#.#.
+ .#..#.#. .#..#.#. .#..#.#. .#..#.#.
+ .#..#.#. .#..#.#. .#..#.#. .#..#.#.
+ ###.##.. ###.##.. ###.##.. ###.##..
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+001E - INFORMATION SEPARATOR TWO <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ .#..###. .#..###. .#..###. .#..###.
+ ##..#... ##..#... ##..#... ##..#...
+ .#..##.. .#..##.. .#..##.. .#..##..
+ .#..#... .#..#... .#..#... .#..#...
+ ###.###. ###.###. ###.###. ###.###.
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+001F - INFORMATION SEPARATOR ONE <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ .#..###. .#..###. .#..###. .#..###.
+ ##..#... ##..#... ##..#... ##..#...
+ .#..##.. .#..##.. .#..##.. .#..##..
+ .#..#... .#..#... .#..#... .#..#...
+ ###.#... ###.#... ###.#... ###.#...
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+0020 - SPACE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0021 - EXCLAMATION MARK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ...##... .....##. ...###.. ....###.
+ ...##... .....##. ...###.. ....###.
+ ...##... .....##. ...###.. ....###.
+ ...##... .....##. ...###.. ....###.
+ ...##... ....##.. ...###.. ...###..
+ ...##... ....##.. ...###.. ...###..
+ ...##... ....##.. ...###.. ...###..
+ ...##... ....##.. ...###.. ...###..
+ ...##... ...##... ........ ........
+ ........ ........ ...###.. ..###...
+ ...##... ...##... ...###.. ..###...
+ ...##... ...##... ...###.. ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0022 - QUOTATION MARK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .##.##.. ...##.## ###.###. .###.###
+ .##.##.. ...##.## ###.###. .###.###
+ .##.##.. ..##.##. ###.###. .###.###
+ .##.##.. ..##.##. ###.###. .###.###
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0023 - NUMBER SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .##.##.. ...##.## .##.##.. ..##.##.
+ .##.##.. ...##.## .##.##.. ..##.##.
+ .##.##.. ...##.## #######. .#######
+ #######. .####### #######. .#######
+ #######. .####### #######. .#######
+ .##.##.. ..##.##. .##.##.. ..##.##.
+ .##.##.. ..##.##. .##.##.. .##.##..
+ #######. ######## #######. #######.
+ #######. ######## #######. #######.
+ .##.##.. .##.##.. #######. #######.
+ .##.##.. .##.##.. .##.##.. .##.##..
+ .##.##.. .##.##.. .##.##.. .##.##..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0024 - DOLLAR SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ...#.... .....#.. ...#.... ....#...
+ .#####.. ..#####. .#####.. ..#####.
+ #######. .####### #######. .#######
+ ##.#.##. .##.#.## ####.##. .####.##
+ ##.#.... .##.#... ####.... .####...
+ ####.... .####... #####... .#####..
+ .#####.. ..####.. .#####.. .#####..
+ ...####. ...####. ..#####. ..#####.
+ ...#.##. ...#.##. ...####. ...####.
+ ##.#.##. ##.#.##. ##.####. ##.####.
+ #######. #######. #######. #######.
+ .#####.. .#####.. .#####.. .#####..
+ ...#.... ..#..... ...#.... ...#....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0025 - PERCENT SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ###..... .###....
+ ##...##. ##...##. ###..##. .###..##
+ ##..###. ##..###. ###.###. .###.###
+ ...###.. ...###.. ...###.. ....###.
+ ..###... ..###... ..###... ..####..
+ .###.... .###.... .###.... .###....
+ ###..##. ###..##. ###.###. ###.###.
+ ##...##. ##...##. ##..###. ##..###.
+ ........ ........ ....###. ....###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0026 - AMPERSAND
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .###.... ...###.. .###.... ...###..
+ #####... ..#####. #####... ..#####.
+ ##.##... ..##.##. #####... .######.
+ ##.##... ..##.##. #####... .#####..
+ #####... ..####.. #####... .#####..
+ .###..#. ..###..# .###.##. ..###.##
+ #######. .####### #######. #######.
+ ##.####. .##.###. #######. #######.
+ ##..##.. ##..##.. ###.##.. ###.##..
+ ##..##.. ##..##.. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .####.#. .####.#. .###.##. .###.#..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0027 - APOSTROPHE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... .....##. ..###... ...###..
+ ...##... .....##. ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0028 - LEFT PARENTHESIS
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ .....##. .....##. .....##. ......##
+ ....###. ....###. ....##.. .....##.
+ ...###.. ...###.. ...###.. ....###.
+ ...##... ..###... ..###... ...###..
+ ..###... ..##.... ..###... ...###..
+ ..##.... .##..... .###.... ..###...
+ ..##.... .##..... .###.... ..###...
+ ..##.... ##...... .###.... .###....
+ ..##.... ##...... .###.... .###....
+ ..###... ##...... .###.... .###....
+ ...##... ##...... ..###... ..###...
+ ...###.. ##...... ..###... ..###...
+ ....###. ###..... ...###.. ...###..
+ .....##. .###.... ....##.. ....##..
+ ........ ..##.... .....##. .....##.
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0029 - RIGHT PARENTHESIS
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ .##..... ...##... .##..... .##.....
+ .###.... ...###.. ..##.... ..##....
+ ..###... ....###. ..###... ..###...
+ ...##... .....##. ...###.. ...###..
+ ...###.. .....##. ...###.. ...###..
+ ....##.. .....##. ....###. ....###.
+ ....##.. .....##. ....###. ....###.
+ ....##.. .....##. ....###. ....###.
+ ....##.. ....##.. ....###. ...###..
+ ...###.. ....##.. ....###. ...###..
+ ...##... ...##... ...###.. ..###...
+ ..###... ..###... ...###.. ..###...
+ .###.... .###.... ..###... .###....
+ .##..... ###..... ..##.... .##.....
+ ........ ##...... .##..... ##......
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+002A - ASTERISK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ...#.... ....#...
+ .##.##.. ..##.##. .#.#.#.. ..#.#.#.
+ .##.##.. ..##.##. #######. .#######
+ ..###... ...###.. .#####.. ..#####.
+ #######. .####### ..###... ...##...
+ #######. #######. .#####.. .#####..
+ ..###... ..###... #######. #######.
+ .##.##.. .##.##.. .#.#.#.. .#.#.#..
+ .##.##.. .##.##.. ...#.... ...#....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+002B - PLUS SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... ........ ........ ........
+ ...##... ...##... ..###... ...###..
+ .######. ...##... ..###... ...###..
+ .######. .######. #######. .######.
+ ...##... ######.. #######. .######.
+ ...##... ..##.... ..###... ..###...
+ ........ ..##.... ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+002C - COMMA
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... ...##... ..###... ..###...
+ ..###... ..###... .####... .####...
+ ..##.... .###.... .###.... .###....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+002D - HYPHEN-MINUS
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .######. .######. ........ ........
+ .######. ######.. #######. #######.
+ ........ ........ #######. #######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+002E - FULL STOP
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+002F - SOLIDUS
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .....##. .....##. ....###. .....###
+ ....###. ....###. ...####. ....####
+ ...###.. ...###.. ..####.. ..####..
+ ..###... ..###... .####... .####...
+ .###.... .###.... ####.... ####....
+ ###..... ###..... ###..... ###.....
+ ##...... ##...... ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0030 - DIGIT ZERO
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .#####.. ...####. ..###... ...###..
+ #######. ..###### .#####.. ..#####.
+ ##...##. ..##..## ###.###. .###.###
+ ##..###. ..##..## ###.###. .###.###
+ ##..###. .##..### ###.###. .###.###
+ ##.#.##. .##.###. ###.###. .###.###
+ ##.#.##. .###.##. ###.###. ###.###.
+ ###..##. ###..##. ###.###. ###.###.
+ ###..##. ##..##.. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ #######. ######.. .#####.. .#####..
+ .#####.. .####... ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0031 - DIGIT ONE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ...##... .....##. ...##... ....##..
+ ..###... ....###. ..###... ...###..
+ .####... ...####. .####... ..####..
+ .####... ..####.. .####... ..####..
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0032 - DIGIT TWO
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .#####.. ...####. .#####.. ..#####.
+ #######. ..###### #######. .#######
+ ##...##. ..##..## ###.###. .###.###
+ .....##. ......## ....###. .....###
+ .....##. .....### ....###. .....###
+ ..#####. ...####. .######. ..#####.
+ .#####.. .#####.. ######.. .#####..
+ ###..... .##..... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ #######. ######.. #######. #######.
+ #######. ######.. #######. #######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0033 - DIGIT THREE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .#####.. ...####. .#####.. ..#####.
+ #######. ..###### #######. .#######
+ ##...##. ..##..## ###.###. .###.###
+ .....##. ......## ....###. .....###
+ .....##. .....##. ....###. .....###
+ ..####.. ...####. ..####.. ...####.
+ ..####.. ...####. ..####.. ..####..
+ .....##. .....##. ....###. ....###.
+ .....##. .....##. ....###. ....###.
+ ##...##. ##..##.. ###.###. ###.###.
+ #######. ######.. #######. #######.
+ .#####.. .####... .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0034 - DIGIT FOUR
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .....#.. .......# .....#.. ......#.
+ ....##.. ......## ....##.. .....##.
+ ...###.. .....### ...###.. ....###.
+ ..####.. ....#### ..####.. ...####.
+ .#####.. ...####. .#####.. ..#####.
+ ###.##.. ..##.##. .##.##.. .###.##.
+ #######. .####### ###.##.. ###.##..
+ #######. .####### #######. #######.
+ ....##.. ....##.. #######. #######.
+ ....##.. ....##.. ...###.. ...###..
+ ....##.. ...##... ...###.. ...###..
+ ....##.. ...##... ...###.. ...###..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0035 - DIGIT FIVE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. ...##### #######. .#######
+ #######. ...##### #######. .#######
+ ##...... ..##.... ###..... .###....
+ ##...... ..##.... ###..... .###....
+ ##...... .#####.. ######.. .#####..
+ ######.. .######. #######. .######.
+ #######. .....##. ....###. ....###.
+ .....##. .....##. ....###. ....###.
+ .....##. .....##. ....###. ....###.
+ ##...##. ##..###. ###.###. ###.###.
+ #######. ######.. #######. #######.
+ .#####.. .####... .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0036 - DIGIT SIX
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..####.. ....#### .#####.. ..#####.
+ .#####.. ...##### ######.. .######.
+ ###..... ..###... ###..... .###....
+ ##...... ..##.... ###..... .###....
+ ##...... .##..... ######.. .#####..
+ ######.. .#####.. #######. .######.
+ #######. .######. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .#####.. .#####.. .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0037 - DIGIT SEVEN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. ..###### #######. .#######
+ #######. .####### #######. .#######
+ ##...##. .##...## ....###. .....###
+ ....###. ......## ....###. .....###
+ ....##.. .....##. ...###.. ....###.
+ ...###.. .....##. ...###.. ....###.
+ ...##... ....##.. ...###.. ...###..
+ ..###... ....##.. ..###... ..###...
+ ..##.... ...##... ..###... ..###...
+ ..##.... ...##... ..###... ..###...
+ ..##.... ..##.... ..###... ..###...
+ ..##.... ..##.... ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0038 - DIGIT EIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .#####.. ...####. .#####.. ..#####.
+ #######. ..###### #######. .#######
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## #######. .#######
+ .#####.. ...####. .#####.. ..#####.
+ .#####.. .#####.. #######. .######.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .#####.. .#####.. .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0039 - DIGIT NINE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .#####.. ...####. .#####.. ..#####.
+ #######. ..###### #######. .#######
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.###
+ #######. .######. #######. .#######
+ .######. ..#####. .######. ..#####.
+ .....##. .....##. ....###. ....###.
+ .....##. ....##.. ....###. ....###.
+ ....###. ...###.. ....###. ....###.
+ .#####.. #####... .#####.. .#####..
+ .####... ####.... .####... .####...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+003A - COLON
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... ........ ........ ........
+ ...##... ...##... ..###... ..###...
+ ........ ...##... ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+003B - SEMICOLON
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... ........ ...##... ...##...
+ ...##... ...##... ..###... ..###...
+ ..###... ..###... ..###... ..###...
+ ..##.... ..##.... ..##.... ..##....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+003C - LESS-THAN SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .....##. .....##. ........ ........
+ ....###. ....###. .....##. ......##
+ ...###.. ...###.. ....###. .....###
+ ..###... ..###... ...###.. ....###.
+ .###.... .###.... ..###... ...###..
+ .###.... .###.... .###.... .###....
+ ..###... .###.... .###.... .###....
+ ...###.. ..###... ..###... ..###...
+ ....###. ...###.. ...###.. ...###..
+ .....##. ....##.. ....###. ....###.
+ ........ ........ .....##. .....##.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+003D - EQUALS SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .######. ..#####. ........ ........
+ .######. .#####.. #######. .#######
+ ........ ........ #######. .#######
+ ........ ........ ........ ........
+ .######. .#####.. ........ ........
+ .######. #####... #######. #######.
+ ........ ........ #######. #######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+003E - GREATER-THAN SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .##..... ...##... ........ ........
+ .###.... ...##... .##..... ..##....
+ ..###... ....##.. .###.... ..###...
+ ...###.. ....##.. ..###... ...###..
+ ....###. .....##. ...###.. ....###.
+ ....###. ....###. ....###. ....###.
+ ...###.. ...###.. ....###. ....###.
+ ..###... ..###... ...###.. ...###..
+ .###.... .###.... ..###... ..###...
+ .##..... .##..... .###.... .###....
+ ........ ........ .##..... .##.....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+003F - QUESTION MARK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .#####.. ...####. .#####.. ..#####.
+ #######. ..###### #######. .#######
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ....###. .....###
+ .....##. ......## ....###. .....###
+ ...####. .....### ..#####. ...####.
+ ..####.. ....###. .#####.. .#####..
+ ..##.... ...###.. .###.... .###....
+ ..##.... ...##... ........ ........
+ ........ ........ .###.... .###....
+ ..##.... ..##.... .###.... .###....
+ ..##.... ..##.... ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0040 - COMMERCIAL AT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .#####.. ...####. .#####.. ..#####.
+ #######. ..###### #######. .#######
+ ##...##. ..##..## ###.###. .###.###
+ ##..###. .##...## ###.###. .###.###
+ ##.####. .##.#### ###.###. .###.###
+ ##.#.##. .##.#.## #######. .#######
+ ##.#.##. .##.#.## #######. #######.
+ ##.####. ##..#### ###.##.. ###.##..
+ ##..##.. ##..###. ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ ######.. ######.. ######.. ######..
+ .#####.. .#####.. .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0041 - LATIN CAPITAL LETTER A
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .#####.. ...####. .#####.. ..#####.
+ #######. ..###### #######. .#######
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. .##..##. ###.###. .###.###
+ #######. .######. ###.###. .###.##.
+ #######. .######. #######. #######.
+ ##...##. .##..##. #######. #######.
+ ##...##. ##..##.. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0042 - LATIN CAPITAL LETTER B
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ######.. ..#####. ######.. .######.
+ #######. ..###### #######. .#######
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.###
+ ######.. .######. ######.. .######.
+ ######.. .#####.. ######.. ######..
+ ##...##. .##..##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ ######.. ######.. ######.. ######..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0043 - LATIN CAPITAL LETTER C
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .#####.. ...####. .#####.. ..#####.
+ #######. ..###### #######. .#######
+ ##...##. ..##..## ###.###. .###.###
+ ##...... ..##.... ###.###. .###.###
+ ##...... .##..... ###..... .###....
+ ##...... .##..... ###..... .###....
+ ##...... .##..... ###..... ###.....
+ ##...... .##..... ###..... ###.....
+ ##...... ##...... ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .#####.. .#####.. .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0044 - LATIN CAPITAL LETTER D
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #####... ..#####. #####... .#####..
+ ######.. ..###### ######.. .######.
+ ##..###. ..##..## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.##.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##....## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##..###. ##..###. ###.###. ###.###.
+ ######.. ######.. ######.. ######..
+ #####... #####... #####... #####...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0045 - LATIN CAPITAL LETTER E
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. ..###### #######. .#######
+ #######. ..###### #######. .#######
+ ##...... ..##.... ###..... .###....
+ ##...... ..##.... ###..... .###....
+ ##...... .##..... ###..... .###....
+ #####... .#####.. #####... .#####..
+ #####... .#####.. #####... #####...
+ ##...... .##..... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ #######. #######. #######. #######.
+ #######. #######. #######. #######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0046 - LATIN CAPITAL LETTER F
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. ..###### #######. .#######
+ #######. ..###### #######. .#######
+ ##...... ..##.... ###..... .###....
+ ##...... ..##.... ###..... .###....
+ ##...... .##..... ###..... .###....
+ #####... .#####.. #####... .#####..
+ #####... .#####.. #####... #####...
+ ##...... .##..... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0047 - LATIN CAPITAL LETTER G
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .#####.. ...####. .#####.. ..#####.
+ #######. ..###### #######. .#######
+ ##...##. ..##..## ###.###. .###.###
+ ##...... ..##.... ###.###. .###.###
+ ##...... .##..... ###..... .###....
+ ##.####. .##..... ###..... .###....
+ ##.####. .##.###. #######. #######.
+ ##...##. .##.###. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##..###. ###.###. ###.###.
+ #######. ######.. #######. #######.
+ .#####.. .####... .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0048 - LATIN CAPITAL LETTER H
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##..##. ###.###. .###.###
+ #######. .######. #######. .######.
+ #######. .######. #######. #######.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0049 - LATIN CAPITAL LETTER I
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .######. ..###### #######. .#######
+ .######. ..###### #######. .#######
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ...##... ...##... ..###... ...###..
+ ...##... ...##... ..###... ...###..
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ .######. ######.. #######. #######.
+ .######. ######.. #######. #######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+004A - LATIN CAPITAL LETTER J
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ....##.. ......## ....###. .....###
+ ....##.. ......## ....###. .....###
+ ....##.. ......## ....###. .....###
+ ....##.. ......## ....###. .....###
+ ....##.. .....##. ....###. .....###
+ ....##.. .....##. ....###. .....##.
+ ....##.. .....##. ....###. ....###.
+ ....##.. .....##. ....###. ....###.
+ ....##.. ....##.. ###.###. ###.###.
+ ##..##.. ##..##.. ###.###. ###.###.
+ ######.. ######.. #######. #######.
+ .####... .####... .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+004B - LATIN CAPITAL LETTER K
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ##...... ..##.... ###..... .###....
+ ##...##. ..##.... ###..##. .###....
+ ##..###. ..##..## ###.###. .###..#.
+ ##.###.. ..##.##. #######. .###.###
+ #####... .#####.. ######.. .#######
+ ####.... .####... #####... .######.
+ ###..... .###.... ####.... #####...
+ ####.... .####... #####... #####...
+ #####... #####... ######.. ######..
+ ##.###.. ##.###.. #######. #######.
+ ##..###. ##..###. ###.###. ###.###.
+ ##...##. ##...##. ###..##. ###..##.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+004C - LATIN CAPITAL LETTER L
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ##...... ..##.... ###..... .###....
+ ##...... ..##.... ###..... .###....
+ ##...... ..##.... ###..... .###....
+ ##...... ..##.... ###..... .###....
+ ##...... .##..... ###..... .###....
+ ##...... .##..... ###..... .###....
+ ##...... .##..... ###..... ###.....
+ ##...... .##..... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ #######. #######. #######. #######.
+ #######. #######. #######. #######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+004D - LATIN CAPITAL LETTER M
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ##...##. ..##..## ##...##. .##...##
+ ##...##. ..##..## ###.###. .###.###
+ ###.###. ..###### #######. .#######
+ #######. ..###### #######. .#######
+ #######. .####### #######. .#######
+ #######. .##.#.## #######. .######.
+ ##.#.##. .##..##. ###.###. ###.###.
+ ##.#.##. .##..##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+004E - LATIN CAPITAL LETTER N
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ##...##. ..##..## ##..###. .##..###
+ ##...##. ..##..## ###.###. .###.###
+ ###..##. ..###.## ###.###. .###.###
+ ###..##. ..###.## #######. .#######
+ ####.##. .####.## #######. .#######
+ ####.##. .######. #######. .######.
+ ##.####. .##.###. #######. #######.
+ ##.####. .##.###. #######. #######.
+ ##..###. ##..###. #######. #######.
+ ##..###. ##..##.. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ##...##. ##..##.. ###..##. ###..##.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+004F - LATIN CAPITAL LETTER O
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .#####.. ...####. .#####.. ..#####.
+ #######. ..###### #######. .#######
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##..##. ###.###. .###.##.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ #######. ######.. #######. #######.
+ .#####.. .####... .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0050 - LATIN CAPITAL LETTER P
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ######.. ..#####. ######.. .######.
+ #######. ..###### #######. .#######
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. .##..### ###.###. .###.###
+ #######. .######. ###.###. .###.###
+ ######.. .#####.. #######. #######.
+ ##...... .##..... ######.. ######..
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0051 - LATIN CAPITAL LETTER Q
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .#####.. ...####. .#####.. ..#####.
+ #######. ..###### #######. .#######
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##..##. ###.###. .###.##.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##.#.##. ####.##. #######. #######.
+ ##.####. ##.###.. #######. #######.
+ #######. #####... #######. #######.
+ .#####.. .#####.. .######. .######.
+ .....##. ....##.. .....##. .....##.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0052 - LATIN CAPITAL LETTER R
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ######.. ..#####. ######.. .######.
+ #######. ..###### #######. .#######
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.###
+ ######.. .######. #######. .######.
+ ######.. .#####.. ######.. ######..
+ ##...##. .##.###. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0053 - LATIN CAPITAL LETTER S
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .#####.. ...####. .#####.. ..#####.
+ #######. ..###### #######. .#######
+ ##...##. ..##..## ###.###. .###.###
+ ##...... .##..... ###..... .###....
+ ##...... .##..... ###..... .###....
+ ######.. .#####.. ######.. .#####..
+ .######. ..#####. .######. ..#####.
+ .....##. .....##. ....###. ....###.
+ .....##. .....##. ....###. ....###.
+ ##...##. ##..###. ###.###. ###.###.
+ #######. ######.. #######. #######.
+ .#####.. .####... .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0054 - LATIN CAPITAL LETTER T
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .######. .####### #######. .#######
+ .######. .####### #######. .#######
+ ...##... ...##... ..###... ...###..
+ ...##... ...##... ..###... ...###..
+ ...##... ..##.... ..###... ...###..
+ ...##... ..##.... ..###... ...###..
+ ...##... ..##.... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ ...##... .##..... ..###... ..###...
+ ...##... .##..... ..###... ..###...
+ ...##... .##..... ..###... ..###...
+ ...##... .##..... ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0055 - LATIN CAPITAL LETTER U
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##..##. ###.###. .###.##.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ #######. ######.. #######. #######.
+ .#####.. .#####.. .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0056 - LATIN CAPITAL LETTER V
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.##.
+ ###.###. .##..##. ###.###. ###.###.
+ .##.##.. .##..##. .##.##.. .##.##..
+ .#####.. .##.##.. .#####.. .#####..
+ ..###... ..###... ..###... ..###...
+ ..###... ..###... ..###... ..###...
+ ...#.... ...#.... ...#.... ...#....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0057 - LATIN CAPITAL LETTER W
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.##.
+ ##.#.##. .##.#.## ###.###. ###.###.
+ ##.#.##. .##.#.## #######. #######.
+ #######. #######. #######. #######.
+ #######. #######. #######. #######.
+ ###.###. ###.###. ###.###. ###.###.
+ .#...#.. .#...#.. .#...#.. .#...#..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0058 - LATIN CAPITAL LETTER X
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.###
+ ###.###. .###.### ###.###. .###.###
+ .#####.. ..#####. .#####.. ..#####.
+ ..###... ...###.. ..###... ...###..
+ ..###... ..###... ..###... ..###...
+ .#####.. .#####.. .#####.. .#####..
+ ###.###. ###.###. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0059 - LATIN CAPITAL LETTER Y
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ##...##. .##..##. ###.###. .###.###
+ ##...##. .##..##. ###.###. .###.###
+ ##...##. .##..##. ###.###. .###.###
+ ##...##. .##..##. ###.###. .###.###
+ ###.###. ..####.. ###.###. .###.###
+ .#####.. ..####.. .#####.. ..#####.
+ ..###... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ ...##... .##..... ..###... ..###...
+ ...##... .##..... ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+005A - LATIN CAPITAL LETTER Z
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ #######. .####### #######. .#######
+ ....###. ......## ....###. .....###
+ ....##.. .....### ....###. .....###
+ ...###.. ....###. ...###.. ....###.
+ ...##... ....##.. ..###... ...###..
+ ..###... ...##... ..###... ..###...
+ ..##.... ..###... .###.... .###....
+ .###.... .###.... ###..... ###.....
+ .##..... ###..... ###..... ###.....
+ #######. #######. #######. #######.
+ #######. #######. #######. #######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+005B - LEFT SQUARE BRACKET
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..#####. ....#### ..#####. ...#####
+ ..#####. ....#### ..#####. ...#####
+ ..##.... ....##.. ..###... ...###..
+ ..##.... ....##.. ..###... ...###..
+ ..##.... ...##... ..###... ...###..
+ ..##.... ...##... ..###... ...###..
+ ..##.... ...##... ..###... ..###...
+ ..##.... ...##... ..###... ..###...
+ ..##.... ..##.... ..###... ..###...
+ ..##.... ..##.... ..###... ..###...
+ ..#####. ..#####. ..#####. ..#####.
+ ..#####. ..#####. ..#####. ..#####.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+005C - REVERSE SOLIDUS
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ .#...... ..#.....
+ ##...... ##...... ###..... .###....
+ ###..... ###..... ####.... .####...
+ .###.... .###.... .####... ..###...
+ ..###... ..###... ..####.. ...###..
+ ...###.. ...###.. ...####. ...####.
+ ....###. ....###. ....###. ....###.
+ .....##. .....##. .....#.. .....#..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+005D - RIGHT SQUARE BRACKET
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .#####.. ...##### ######.. .######.
+ .#####.. ...##### ######.. .######.
+ ....##.. ......## ...###.. ....###.
+ ....##.. ......## ...###.. ....###.
+ ....##.. .....##. ...###.. ....###.
+ ....##.. .....##. ...###.. ....###.
+ ....##.. .....##. ...###.. ...###..
+ ....##.. .....##. ...###.. ...###..
+ ....##.. ....##.. ...###.. ...###..
+ ....##.. ....##.. ...###.. ...###..
+ .#####.. .#####.. ######.. ######..
+ .#####.. .#####.. ######.. ######..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+005E - CIRCUMFLEX ACCENT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ...#.... .....#.. ...#.... ....#...
+ ..###... ....###. ..###... ...###..
+ .#####.. ...##### .#####.. ..#####.
+ ###.###. ..###.## ###.###. .###.###
+ ##...##. .##...## ##...##. .##...##
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+005F - LOW LINE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ######## #######. ######## ########
+ ######## #######. ######## ########
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0060 - GRAVE ACCENT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ..##.... ........ ........ ........
+ ..##.... ....##.. ..##.... ...##...
+ ...##... ....###. ..###... ...###..
+ ....#... ....##.. ...##... ....##..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0061 - LATIN SMALL LETTER A
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .#####.. ..####.. .#####.. ..####..
+ .######. ..#####. .######. ..#####.
+ .....##. .....##. ....###. ....###.
+ .######. .######. .######. ..#####.
+ #######. ######.. #######. .######.
+ ##...##. ##..##.. ###.###. ###.###.
+ #######. ######.. #######. #######.
+ .######. .#####.. .######. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0062 - LATIN SMALL LETTER B
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ##...... ...##... ###..... ..###...
+ ##...... ...##... ###..... ..###...
+ ##...... ..##.... ###..... ..###...
+ ##...... ..##.... ###..... .###....
+ ######.. ..#####. ######.. .#####..
+ #######. .####### #######. .######.
+ ##...##. .##...## ###.###. .##.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. ######..
+ ######.. ######.. ######.. #####...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0063 - LATIN SMALL LETTER C
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .#####.. ..####.. .#####.. ..####..
+ #######. .######. #######. .######.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ ##...##. ##..##.. ###.###. ###.###.
+ #######. ######.. #######. #######.
+ .#####.. .####... .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0064 - LATIN SMALL LETTER D
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .....##. ......## ....###. .....###
+ .....##. ......## ....###. .....###
+ .....##. ......## ....###. .....###
+ .....##. .....##. ....###. .....###
+ .######. ..#####. .######. ..######
+ #######. .######. #######. .######.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ #######. ######.. #######. #######.
+ .######. .#####.. .######. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0065 - LATIN SMALL LETTER E
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .#####.. ..####.. .#####.. ..####..
+ #######. .######. #######. .######.
+ ##...##. .##..##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ #######. ######.. #######. ######..
+ ##...... ##...... ###..... ###.....
+ #######. ######.. #######. ######..
+ .######. .#####.. .######. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0066 - LATIN SMALL LETTER F
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ...####. .....### ..#####. ...#####
+ ..#####. ....#### .######. ..######
+ ..##.... ....##.. .###.... ..###...
+ ..##.... ...##... .###.... ..###...
+ ..##.... .######. .###.... .###....
+ .####... .######. #####... .#####..
+ .####... ..##.... #####... .#####..
+ ..##.... ..##.... .###.... .###....
+ ..##.... ..##.... .###.... ###.....
+ ..##.... .##..... .###.... ###.....
+ ..##.... .##..... .###.... ###.....
+ ..##.... .##..... .###.... ###.....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0067 - LATIN SMALL LETTER G
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .######. ..###### .######. ..#####.
+ #######. .####### #######. .######.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .######. .######. .######. .#####..
+ .....##. ....##.. ....###. ...###..
+ .######. ######.. .######. ######..
+ .#####.. #####... .#####.. #####...
+-----------------------------------------------------
+U+0068 - LATIN SMALL LETTER H
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ##...... ..##.... ###..... .###....
+ ##...... ..##.... ###..... .###....
+ ##...... ..##.... ###..... .###....
+ ##.###.. .##.###. ######.. .#####..
+ #######. .####### #######. .######.
+ ###..##. .###..## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0069 - LATIN SMALL LETTER I
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... .....##. ..###... ....###.
+ ...##... .....##. ..###... ....###.
+ ........ ........ ........ ........
+ ..###... ...###.. .####... ...####.
+ ..###... ..####.. .####... ..#####.
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ..####.. .#####.. .#####.. .#####..
+ ..####.. .#####.. .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+006A - LATIN SMALL LETTER J
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ....##.. ......## ...###.. ....###.
+ ....##.. ......## ...###.. ....###.
+ ........ ........ ........ ........
+ ...###.. ....###. ..####.. ...####.
+ ...###.. ...####. ..####.. ..#####.
+ ....##.. .....##. ...###.. ....###.
+ ....##.. .....##. ...###.. ...###..
+ ....##.. ....##.. ...###.. ...###..
+ ....##.. ....##.. ...###.. ...###..
+ ....##.. ....##.. ...###.. ...###..
+ ....##.. ....##.. ...###.. ..###...
+ ....##.. ...##... ...###.. ..###...
+ .#####.. #####... .#####.. #####...
+ .####... ####.... .####... ####....
+-----------------------------------------------------
+U+006B - LATIN SMALL LETTER K
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ##...... ..##.... ###..... ..###...
+ ##...... ..##.... ###..... ..###...
+ ##...... ..##.... ###..... ..###...
+ ##...... ..##..## ###..##. ..###.#.
+ ##...##. .##..### ###.###. .#######
+ ##..###. .##.###. #######. .######.
+ ##.###.. .#####.. ######.. .#####..
+ #####... .#####.. #####... .###....
+ #####... ##.###.. ######.. #####...
+ ##.###.. ##..###. #######. ######..
+ ##..###. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###..##. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+006C - LATIN SMALL LETTER L
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..###... ....###. .####... ..####..
+ ..###... ....###. .####... ..####..
+ ...##... .....##. ..###... ...###..
+ ...##... .....##. ..###... ...###..
+ ...##... ....##.. ..###... ..###...
+ ...##... ....##.. ..###... ..###...
+ ...##... ....##.. ..###... ..###...
+ ...##... ....##.. ..###... ..###...
+ ...##... ...##... ..###... .###....
+ ...##... ...##... ..###... .###....
+ ...##... ...##... ..###... .###....
+ ...##... ...##... ..###... .###....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+006D - LATIN SMALL LETTER M
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ###.##.. .###.##. ###.##.. .###.#..
+ #######. .####### #######. .######.
+ #######. .####### #######. #######.
+ ##.#.##. .##.#.## #######. #######.
+ ##.#.##. ##.#.##. #######. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+006E - LATIN SMALL LETTER N
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ##.###.. .##.##.. ######.. .#####..
+ #######. .######. #######. .######.
+ ###..##. .###.##. ###.###. ###.###.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+006F - LATIN SMALL LETTER O
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .#####.. ..####.. .#####.. ..####..
+ #######. .######. #######. .######.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ #######. ######.. #######. ######..
+ .#####.. .####... .#####.. .####...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0070 - LATIN SMALL LETTER P
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ######.. ..#####. ######.. .#####..
+ #######. ..###### #######. .######.
+ ##...##. ..##..## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...##. .##..##. ###.###. ###.###.
+ #######. #######. #######. ######..
+ ######.. ######.. ######.. #####...
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+-----------------------------------------------------
+U+0071 - LATIN SMALL LETTER Q
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .######. ..###### .######. ..#####.
+ #######. .####### #######. .######.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. ######..
+ .######. .#####.. .######. .#####..
+ .....##. ....##.. ....###. ...###..
+ .....### ....###. ....#### ...####.
+ .....### ....###. ....#### ...####.
+-----------------------------------------------------
+U+0072 - LATIN SMALL LETTER R
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ##.####. .##.#### ##.####. .###.##.
+ #######. .####### #######. .######.
+ ###..... .###.... ###..... .###....
+ ##...... .##..... ###..... .###....
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0073 - LATIN SMALL LETTER S
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .######. ..###### .######. ...#####
+ #######. .####### #######. ..#####.
+ ##...... .##..... ###..... .###....
+ ######.. .#####.. ######.. .#####..
+ .#####.. ..#####. .######. ..#####.
+ .....##. .....##. ....###. ....###.
+ #######. #######. #######. .#####..
+ ######.. ######.. ######.. #####...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0074 - LATIN SMALL LETTER T
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ...#.... .....##. ...#.... ..###...
+ ..##.... .....##. ..##.... ..###...
+ ..##.... ....##.. .###.... ..###...
+ ..##.... ....##.. .###.... .###....
+ .#####.. ..###### ######.. .#####..
+ ######.. ..###### ######.. .#####..
+ ..##.... ...##... .###.... .###....
+ ..##.... ...##... .###.... ###.....
+ ..##.... ..##.... .###.... ###.....
+ ..##.... ..##.... .###.... ###.....
+ ..#####. ..#####. .######. ######..
+ ...####. ...###.. ..#####. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0075 - LATIN SMALL LETTER U
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.##.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...##. .##..##. ###.###. ###.###.
+ ##..###. ##..##.. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .###.##. .###.##. .######. .######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0076 - LATIN SMALL LETTER V
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ##...##. .##..##. ###.###. .###.###
+ ##...##. .##..##. ###.###. .###.##.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ###.###. ##..##.. ###.###. ###.###.
+ .#####.. #####... .#####.. .#####..
+ ..###... .###.... ..###... ..###...
+ ...#.... ..#..... ...#.... ...#....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0077 - LATIN SMALL LETTER W
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.##.
+ ##...##. .##...## ###.###. ###.###.
+ ##.#.##. .##.#.## #######. #######.
+ ##.#.##. ##.####. #######. #######.
+ #######. #######. #######. #######.
+ #######. #######. ###.###. ###.###.
+ .##.##.. .##.##.. .#...#.. .#...#..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0078 - LATIN SMALL LETTER X
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.##.
+ ###.###. .###.### ###.###. .######.
+ .#####.. ..#####. .#####.. ..###...
+ .#####.. .#####.. .#####.. .#####..
+ ###.###. ###.###. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0079 - LATIN SMALL LETTER Y
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.##.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. #######. #######.
+ #######. #######. .######. .######.
+ .######. .######. ....###. ...###..
+ .....##. ....##.. ....###. ...###..
+ #######. ######.. #######. ######..
+ ######.. #####... ######.. #####...
+-----------------------------------------------------
+U+007A - LATIN SMALL LETTER Z
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ #######. .####### #######. .######.
+ ....###. .....### ...####. ...####.
+ ..####.. ...####. ..####.. ..####..
+ .####... .####... .####... .####...
+ ###..... ###..... ####.... ####....
+ #######. #######. #######. #######.
+ #######. #######. #######. #######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+007B - LEFT CURLY BRACKET
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ....###. .....### ...####. ....####
+ ...####. ....###. ..#####. ...#####
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ...##... ...##... ..###... ...###..
+ .###.... .###.... ####.... .####...
+ .###.... .###.... ####.... ####....
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ ...####. ..###... ..#####. ..#####.
+ ....###. ...###.. ...####. ...####.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+007C - VERTICAL LINE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##... .....##. ..###... ...###..
+ ...##... .....##. ..###... ...###..
+ ...##... .....##. ..###... ...###..
+ ...##... .....##. ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+007D - RIGHT CURLY BRACKET
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .###.... ..###... ####.... .####...
+ .####... ...###.. #####... .#####..
+ ...##... ....##.. ..###... ...###..
+ ...##... ...##... ..###... ...###..
+ ...##... ...##... ..###... ...###..
+ ....###. ....###. ...####. ....####
+ ....###. ....###. ...####. ...####.
+ ...##... ...##... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ .####... .###.... #####... #####...
+ .###.... ###..... ####.... ####....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+007E - TILDE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .###.##. ...###.# .##..##. ..##..##
+ #######. ..###### #######. .#######
+ ##.###.. ..##.### #######. .#######
+ ........ ........ ##..##.. .##..##.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+007F - DELETE <CONTROL>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ ........ ........ ........ ........
+ ###.###. .###.### ###.###. .###.###
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ #.#.#.#. .#.#.#.# #.#.#.#. .#.#.#.#
+ ###.###. .###.### ###.###. .###.###
+ ........ ........ ........ ........
+ ###.###. ###.###. ###.###. ###.###.
+ ..#.#... ..#.#... ..#.#... ..#.#...
+ .#..##.. .#..##.. .#..##.. .#..##..
+ .#..#... .#..#... .#..#... .#..#...
+ .#..#... .#..#... .#..#... .#..#...
+ ........ ........ ........ ........
+ #######. #######. #######. #######.
+-----------------------------------------------------
+U+00A0 - NO-BREAK SPACE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00A1 - INVERTED EXCLAMATION MARK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ........ ........ ........ ........
+ ...##... ....##.. ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00A2 - CENT SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...#.... .....#.. ...#.... ....#...
+ ...#.... .....#.. ...#.... ....#...
+ .#####.. ..#####. .#####.. ..#####.
+ #######. .####### #######. .#######
+ ##.#.##. .##.#.## ##.#.##. ##.#.##.
+ ##.#.... .##.#... ##.#.... ##.#....
+ ##.#.... ##.#.... ##.#.... ##.#....
+ ##.#.##. ##.#.##. ##.#.##. ##.#.##.
+ #######. #######. #######. #######.
+ .#####.. .#####.. .#####.. .#####..
+ ...#.... ..#..... ...#.... ...#....
+ ...#.... ..#..... ...#.... ...#....
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00A3 - POUND SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..####.. ....#### ..####.. ...####.
+ .######. ...##### .######. ..######
+ .##..##. ...##..# .###.##. ..###.##
+ .##..... ...##... .###.... ..###...
+ .##..... ..##.... ######.. .######.
+ #####... .#####.. ######.. .######.
+ #####... .#####.. ######.. ######..
+ .##..... ..##.... .###.... .###....
+ .##..... .##..... .###.##. .###.##.
+ ###..##. ###..##. #######. #######.
+ #######. #######. #######. #######.
+ ##.###.. ##.###.. ##.###.. ##.###..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00A4 - CURRENCY SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .##..##. ...##..# ###.###. .###.###
+ .##..##. ..##..## ###.###. .###.###
+ ..####.. ...####. .#####.. ..#####.
+ .######. ..###### #######. #######.
+ .##..##. ..##..## #######. #######.
+ .##..##. .##..##. #######. #######.
+ .######. .######. #######. #######.
+ ..####.. ..####.. .#####.. .#####..
+ .##..##. .##..##. ###.###. ###.###.
+ .##..##. ##..##.. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00A5 - YEN SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .##..##. ...##..# ###.###. .###.###
+ .##..##. ...##..# ###.###. .###.###
+ .##..##. ...##..# ###.###. .###.###
+ ..####.. ...####. .#####.. ..#####.
+ ...##... ....##.. ..###... ...###..
+ .######. ..###### #######. #######.
+ ...##... ....##.. ..###... ..###...
+ .######. .######. #######. #######.
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00A6 - BROKEN BAR
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... .....##. ..###... ...###..
+ ...##... .....##. ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00A7 - SECTION SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..####.. .....### ..####.. ...####.
+ .#####.. ....###. .#####.. ..#####.
+ .##..... ...##... .#####.. ..#####.
+ .##..... ...##... .###.... ..###...
+ ..####.. ..####.. ..####.. ...####.
+ .######. .######. .######. ..######
+ .##..##. .##..##. .##..##. .##..##.
+ .######. .######. .######. .######.
+ ..####.. ..####.. ..####.. ..####..
+ .....##. ...##... ....###. ....###.
+ .....##. ...##... ..#####. ..#####.
+ ..#####. .###.... ..#####. ..#####.
+ ..####.. ###..... ..####.. ..####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00A8 - DIAERESIS
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ###.###. .###.###
+ .##..##. ..##..## ###.###. .###.###
+ .##..##. .##..##. ###.###. .###.###
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00A9 - COPYRIGHT SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..####.. ....###. ..####.. ...####.
+ .######. ...##### .######. ..######
+ ##....## ..#....# ##....## .##....#
+ #..##..# ..#....# #..##..# .#..##.#
+ #.####.# .#..##.# #.####.# .#.###.#
+ #.#..#.# .#.#...# #.#..#.# .#.#...#
+ #.#....# .#.#...# #.#....# #.#....#
+ #.#..#.# #..#...# #.#..#.# #.#..#.#
+ #.####.# #.#....# #.####.# #.####.#
+ #..##..# #..##.#. #..##..# #..##..#
+ ##....## #.....#. ##....## ##....##
+ .######. .#####.. .######. .######.
+ ..####.. ..###... ..####.. ..####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00AA - FEMININE ORDINAL INDICATOR
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .###.... ...###.. .####... ..####..
+ ....#... ......#. ....##.. .....##.
+ .####... ...####. .#####.. ..#####.
+ #...#... ..#...#. ##..##.. .##..##.
+ .####... ..####.. .#####.. ..#####.
+ ........ ........ ........ ........
+ #####... .#####.. ######.. ######..
+ #####... .#####.. ######.. ######..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00AB - LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ..##.##. ...##.## ..#####. ..#####.
+ .##.##.. ..##.##. .#####.. .#####..
+ ##.##... ##.##... #####... #####...
+ ##.##... ##.##... #####... #####...
+ .##.##.. .##.##.. .#####.. .#####..
+ ..##.##. ..##.##. ..#####. ..#####.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00AC - NOT SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .######. ...####. .######. ..######
+ .######. ..#####. .######. ..######
+ .....##. .....##. .######. ..######
+ ......#. ....##.. .....##. ......##
+ ........ ........ ......#. .......#
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00AD - SOFT HYPHEN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .######. ..###### .######. .######.
+ ........ ........ .######. .######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00AE - REGISTERED SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..####.. ....###. ..####.. ...####.
+ .######. ...##### .######. ..######
+ ##....## ..#....# ##....## .##....#
+ #.###..# .#..#..# #.###..# .#.##..#
+ #.####.# .#.#.#.# #.####.# .#.###.#
+ #.#..#.# .#.#.#.# #.#..#.# .#.#.#.#
+ #.###..# .#.##..# #.###..# #.###..#
+ #.###..# #..##..# #.###..# #.###..#
+ #.#..#.# #.#..#.# #.#..#.# #.#..#.#
+ #.#..#.# #.#..#.# #.#..#.# #.#..#.#
+ ##....## #.....#. ##....## ##....##
+ .######. .######. .######. .######.
+ ..####.. .####... ..####.. ..####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00AF - MACRON
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .######. ...##### #######. .#######
+ ........ ........ #######. .#######
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00B0 - DEGREE SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .####... ...####. .####... ..####..
+ ######.. ..###### ######.. .######.
+ ##..##.. ..##..## ##..##.. .##..##.
+ ######.. ..###### ######.. .######.
+ .####... ..####.. .####... ..####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00B1 - PLUS-MINUS SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ..###... ...###..
+ ...##... .....##. ..###... ...###..
+ ...##... .....##. #######. .#######
+ .######. ..###### #######. .#######
+ .######. ..###### #######. .#######
+ ...##... ....##.. ..###... ..###...
+ ...##... ....##.. ..###... ..###...
+ ........ ........ ........ ........
+ .######. .######. #######. #######.
+ .######. .######. #######. #######.
+ ........ ........ #######. #######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00B2 - SUPERSCRIPT TWO
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ####.... ..####.. ####.... .####...
+ #####... ..#####. #####... .#####..
+ ...##... .....##. ...##... ....##..
+ .####... ..####.. .####... ..####..
+ ####.... .####... ####.... .####...
+ ##...... .##..... ##...... ##......
+ #####... .#####.. #####... #####...
+ #####... .#####.. #####... #####...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00B3 - SUPERSCRIPT THREE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ####.... ..####.. ####.... .####...
+ #####... ..#####. #####... .#####..
+ ...##... .....##. ...##... ....##..
+ ..##.... ...##... ..##.... ...##...
+ ...##... ....##.. ...##... ....##..
+ #####... .#####.. #####... #####...
+ ####.... .####... ####.... ####....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00B4 - ACUTE ACCENT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... .....##. ..###... ...###..
+ ..##.... ....##.. .###.... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00B5 - MICRO SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .##..##. ..##..## ###.###. .###.###
+ .##..##. ..##..## ###.###. ###.###.
+ .##..##. ..##..## ###.###. ###.###.
+ .##..##. .##..##. ###.###. ###.###.
+ .##..##. .##..##. ###.###. ###.###.
+ .######. .######. #######. #######.
+ .#####.. .#####.. ######.. ######..
+ .##..... ##...... ###..... ###.....
+ .##..... ##...... ###..... ###.....
+ ##...... #....... ##...... ##......
+-----------------------------------------------------
+U+00B6 - PILCROW SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .####### ..###### .####### ..######
+ ##.##.## .##.#### ##.##.## .##.##.#
+ ##.##.## ##.##.## ##.##.## .##.##.#
+ ##.##.## ##.##.## ##.##.## .##.##.#
+ .####.## .####.## .####.## .####.#.
+ ...##.## ...##.## ...##.## ..##.##.
+ ...##.## ..##.##. ...##.## ..##.##.
+ ...##.## ..##.##. ...##.## ..##.##.
+ ...##.## ..##.##. ...##.## ..##.##.
+ ...##.## ..##.##. ...##.## ..##.##.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00B7 - MIDDLE DOT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ..###... ...###..
+ ...##... ....##.. ..###... ..###...
+ ...##... ....##.. ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00B8 - CEDILLA
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... ...##... ...##... ...##...
+ ...###.. ...###.. ...###.. ...###..
+ ....##.. ....##.. ....##.. ....##..
+ ...###.. ...###.. ...###.. ...###..
+ ...##... ..##.... ...##... ...##...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00B9 - SUPERSCRIPT ONE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .##..... ...##... .##..... ..##....
+ ###..... ..###... ###..... .###....
+ .##..... ...##... .##..... ..##....
+ .##..... ..##.... .##..... ..##....
+ .##..... ..##.... .##..... ..##....
+ ####.... .####... ####.... ####....
+ ####.... .####... ####.... ####....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00BA - MASCULINE ORDINAL INDICATOR
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .###.... ....##.. .###.... ..###...
+ #####... ...####. #####... .#####..
+ #...#... ..#...#. #...#... .#...#..
+ #####... ..####.. #####... .#####..
+ .###.... ...##... .###.... ..###...
+ ........ ........ ........ ........
+ #####... ..####.. #####... #####...
+ #####... .####... #####... #####...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00BB - RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ##.##... .##.##.. ##.##... ##.##...
+ .##.##.. ..##.##. .##.##.. .##.##..
+ ..##.##. ..##.##. ..##.##. ..##.##.
+ ..##.##. ..##.##. ..##.##. ..##.##.
+ .##.##.. .##.##.. .##.##.. .##.##..
+ ##.##... ##.##... ##.##... ##.##...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00BC - VULGAR FRACTION ONE QUARTER
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .#...... ...#.... .##..... ..##....
+ ##...... ..##.... ###..... .###....
+ .#....#. ...#.... .##...#. ..##...#
+ .#...##. ..#...## .##..##. ..##..##
+ ###.##.. .###.##. #######. .#######
+ ...##... ....##.. ...###.. ...###..
+ ..##.... ...##... ..###... ..###...
+ .##..#.. .##..#.. .###.##. .###.##.
+ ##..##.. ##..##.. ###.###. ###.###.
+ #..#.#.. #..#.#.. ##.#.##. ##.#.##.
+ ..#####. ..#####. ..#####. ..#####.
+ .....#.. ....#... ..#####. ..#####.
+ .....#.. ....#... .....##. .....##.
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00BD - VULGAR FRACTION ONE HALF
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .#...... ...#.... .##..... ..##....
+ ##...... ..##.... ###..... .###....
+ .#....#. ...#.... .##...#. ..##...#
+ .#...##. ..#...## .##..##. ..##..##
+ ###.##.. .###.##. #######. .#######
+ ...##... ....##.. ...###.. ...###..
+ ..##.... ...##... ..###... ..###...
+ .##..... .##..... .###.... .###....
+ ##.###.. ##.###.. ######.. ######..
+ #.....#. #.....#. ##...##. ##...##.
+ ....##.. ...###.. ....##.. ....##..
+ ...#.... ..#..... ...##... ...##...
+ ...####. ..####.. ...####. ...####.
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00BE - VULGAR FRACTION THREE QUARTERS
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ###..... ..###... ###..... .###....
+ ...#.... .....#.. ..##.... ...##...
+ .##...#. ...##... .##...#. ..##...#
+ ...#.##. ....#.## ..##.##. ...##.##
+ ###.##.. .###.##. ###.###. .###.###
+ ...##... ....##.. ...###.. ...###..
+ ..##.... ...##... ..###.#. ..###.#.
+ .##..#.. .##..#.. .###.##. .###.##.
+ ##..##.. ##..##.. ###.###. ###.###.
+ #..#.##. #..#.##. ##.#.##. ##.#.##.
+ ..#####. ..#####. ..#####. ..#####.
+ .....#.. ....#... ..#####. ..#####.
+ .....#.. ....#... .....##. .....##.
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00BF - INVERTED QUESTION MARK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ...###.. ....###.
+ ...##... .....##. ...###.. ....###.
+ ...##... .....##. ...###.. ....###.
+ ........ ........ ........ ........
+ ...##... ....##.. ...###.. ....###.
+ ...##... ....##.. ...###.. ...###..
+ .####... ..####.. .#####.. .#####..
+ ####.... .###.... #####... #####...
+ ##...... ##...... ###..... ###.....
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. ######.. #######. #######.
+ .#####.. .####... .#####.. .#####..
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00C0 - LATIN CAPITAL LETTER A WITH GRAVE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .##..... ...##... ###..... .###....
+ ..##.... ....##.. .###.... ..###...
+ ........ ........ ........ ........
+ ...#.... .....#.. ...#.... ....#...
+ ..###... ...###.. ..###... ...###..
+ .##.##.. ..##.##. .#####.. ..#####.
+ ##...##. .##...## ###.###. ###.###.
+ #######. .####### #######. #######.
+ #######. #######. #######. #######.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00C1 - LATIN CAPITAL LETTER A WITH ACUTE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ....##.. ......## ....###. .....###
+ ...##... .....##. ...###.. ....###.
+ ........ ........ ........ ........
+ ...#.... .....#.. ...#.... ....#...
+ ..###... ...###.. ..###... ...###..
+ .##.##.. ..##.##. .#####.. ..#####.
+ ##...##. .##...## ###.###. ###.###.
+ #######. .####### #######. #######.
+ #######. #######. #######. #######.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00C2 - LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..###... ....###. ..###... ...###..
+ .##.##.. ...##.## .##.##.. ..##.##.
+ .#...#.. ...#...# ##...##. .##...##
+ ...#.... .....#.. ...#.... ....#...
+ ..###... ...###.. ..###... ...###..
+ .##.##.. ..##.##. .#####.. ..#####.
+ ##...##. .##...## ###.###. ###.###.
+ #######. .####### #######. #######.
+ #######. #######. #######. #######.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00C3 - LATIN CAPITAL LETTER A WITH TILDE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .###.##. ...###.# .###.##. ..###.##
+ ##.###.. ..##.### ##.###.. .##.###.
+ ........ ........ ........ ........
+ ...#.... .....#.. ...#.... ....#...
+ ..###... ...###.. ..###... ...###..
+ .##.##.. ..##.##. .#####.. ..#####.
+ ##...##. .##...## ###.###. ###.###.
+ #######. .####### #######. #######.
+ #######. #######. #######. #######.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00C4 - LATIN CAPITAL LETTER A WITH DIAERESIS
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ .##.##.. ........ ........ ........
+ .##.##.. ...##.## ###.###. .###.###
+ ........ ...##.## ###.###. .###.###
+ ...#.... .....#.. ...#.... ....#...
+ ..###... ....###. ..###... ...###..
+ .##.##.. ..##.##. .#####.. ..#####.
+ ##...##. .##...## ###.###. .###.##.
+ #######. .####### #######. #######.
+ #######. .####### #######. #######.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00C5 - LATIN CAPITAL LETTER A WITH RING ABOVE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..###... ....###. ..###... ...###..
+ .#...#.. ...#...# .##.##.. ..##.##.
+ ..###... ....###. ..###... ...###..
+ ..###... ....###. ..###... ...###..
+ .##.##.. ..##.##. .#####.. ..#####.
+ ##...##. .##...## ###.###. .###.##.
+ #######. .####### #######. #######.
+ #######. .####### #######. #######.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00C6 - LATIN CAPITAL LETTER AE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ...##### .....### ...##### ....####
+ ..###### ....#### ..###### ...#####
+ .#####.. ...##### .####### ..######
+ ###.##.. ..###.## #######. .#######
+ ##..##.. .##..##. ###.###. .###.###
+ #######. .####### ######## .#######
+ #######. .####### ######## ########
+ ##..##.. .##..##. #######. #######.
+ ##..##.. ##..##.. ###.###. ###.###.
+ ##..##.. ##..##.. ###.#### ###.####
+ ##..#### ##..#### ###.#### ###.####
+ ##..#### ##..#### ###.#### ###.####
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00C7 - LATIN CAPITAL LETTER C WITH CEDILLA
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .#####.. ...####. .#####.. ..#####.
+ #######. ..###### #######. .#######
+ ##...##. ..##..## ###.###. .###.###
+ ##...... ..##.... ###..... .###....
+ ##...... .##..... ###..... .###....
+ ##...... .##..... ###..... .###....
+ ##...... .##..... ###..... ###.....
+ ##...... .##..... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .#####.. .#####.. .#####.. .#####..
+ ....###. ...###.. ....###. ....###.
+ .##..##. ##..##.. .##.###. .##.###.
+ ..####.. .####... .#####.. .#####..
+-----------------------------------------------------
+U+00C8 - LATIN CAPITAL LETTER E WITH GRAVE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..##.... ....##.. .###.... ..###...
+ ...##... .....##. ..###... ...###..
+ ........ ........ ........ ........
+ #######. ..###### #######. .#######
+ #######. .####### #######. .#######
+ ##...... .##..... ###..... .###....
+ ####.... .####... ###..... ###.....
+ ####.... .####... #####... #####...
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ #######. #######. #######. #######.
+ #######. #######. #######. #######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00C9 - LATIN CAPITAL LETTER E WITH ACUTE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ....##.. ......## ...###.. ....###.
+ ...##... .....##. ..###... ...###..
+ ........ ........ ........ ........
+ #######. ..###### #######. .#######
+ #######. .####### #######. .#######
+ ##...... .##..... ###..... .###....
+ ####.... .####... ###..... ###.....
+ ####.... .####... #####... #####...
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ #######. #######. #######. #######.
+ #######. #######. #######. #######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00CA - LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..###... ....###. .#####.. ..#####.
+ .##.##.. ...##.## ###.###. .###.###
+ ........ ........ ........ ........
+ #######. ..###### #######. .#######
+ #######. .####### #######. .#######
+ ##...... .##..... ###..... .###....
+ ####.... .####... ###..... ###.....
+ ####.... .####... #####... #####...
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ #######. #######. #######. #######.
+ #######. #######. #######. #######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00CB - LATIN CAPITAL LETTER E WITH DIAERESIS
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ .##.##.. ...##.## ###.###. .###.###
+ .##.##.. ...##.## ###.###. .###.###
+ ........ ........ ........ ........
+ #######. ..###### #######. .#######
+ #######. ..###### #######. .#######
+ ##...... .##..... ###..... .###....
+ ##...... .##..... ###..... .###....
+ ####.... .####... #####... #####...
+ ####.... .####... #####... #####...
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ #######. #######. #######. #######.
+ #######. #######. #######. #######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00CC - LATIN CAPITAL LETTER I WITH GRAVE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..##.... ....##.. .###.... ..###...
+ ...##... .....##. ..###... ...###..
+ ........ ........ ........ ........
+ ...##... ...##### ..###... ...###..
+ ...##... ...##### ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ..###...
+ ...##... ....##.. ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... .#####.. ..###... ..###...
+ ...##... .#####.. ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00CD - LATIN CAPITAL LETTER I WITH ACUTE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ....##.. ......## ...###.. ....###.
+ ...##... .....##. ..###... ...###..
+ ........ ........ ........ ........
+ ...##... ...##### ..###... ...###..
+ ...##... ...##### ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ..###...
+ ...##... ....##.. ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... .#####.. ..###... ..###...
+ ...##... .#####.. ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00CE - LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ...##... .....##. ..###... ...###..
+ ..#..#.. ....#..# .##.##.. ..##.##.
+ ...##... ...##### ..###... ...###..
+ ...##... ...##### ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ..###...
+ ...##... ....##.. ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... .#####.. ..###... ..###...
+ ...##... .#####.. ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00CF - LATIN CAPITAL LETTER I WITH DIAERESIS
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .##..##. ...##.## ###.###. .###.###
+ .##..##. ...##.## ###.###. .###.###
+ ........ ........ ........ ........
+ ...##... ...##### ..###... ...###..
+ ...##... ...##### ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ..###...
+ ...##... ....##.. ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... .#####.. ..###... ..###...
+ ...##... .#####.. ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00D0 - LATIN CAPITAL LETTER ETH
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .####... ...####. #####... .#####..
+ .#####.. ...##### ######.. .######.
+ .##.###. ...##.## ###.###. .###.###
+ .##..##. ..##..## ###.###. .###.###
+ .##..##. ..##..## ###.###. .###.##.
+ ####.##. .####.## #######. #######.
+ .##..##. ..##..## ###.###. ###.###.
+ .##..##. .##..##. ###.###. ###.###.
+ .##.###. .##.###. ###.###. ###.###.
+ .#####.. .#####.. ######.. ######..
+ .####... .####... #####... #####...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00D1 - LATIN CAPITAL LETTER N WITH TILDE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .###.##. ...###.# .###.##. ..###.##
+ ##.###.. ..##.### ##.###.. .##.###.
+ ........ ........ ........ ........
+ ##...##. ..##...# ###.###. .###.###
+ ##...##. .##...## ###.###. .###.###
+ ###..##. .###..## ###.###. .###.##.
+ ####.##. .####.## ####.##. ####.##.
+ #######. .####### #######. #######.
+ ##.####. ##.####. ##.####. ##.####.
+ ##..###. ##..###. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00D2 - LATIN CAPITAL LETTER O WITH GRAVE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..##.... ....##.. .###.... ..###...
+ ...##... .....##. ..###... ...###..
+ ........ ........ ........ ........
+ .#####.. ..#####. .#####.. ..#####.
+ #######. .####### #######. .#######
+ ##...##. .##...## ###.###. .###.##.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .#####.. .#####.. .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00D3 - LATIN CAPITAL LETTER O WITH ACUTE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ....##.. ......## ...###.. ....###.
+ ...##... .....##. ..###... ...###..
+ ........ ........ ........ ........
+ .#####.. ..#####. .#####.. ..#####.
+ #######. .####### #######. .#######
+ ##...##. .##...## ###.###. .###.##.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .#####.. .#####.. .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00D4 - LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..###... ....###. .#####.. ..#####.
+ .##.##.. ...##.## ###.###. .###.###
+ ........ ........ ........ ........
+ .#####.. ..#####. .#####.. ..#####.
+ #######. .####### #######. .#######
+ ##...##. .##...## ###.###. .###.##.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .#####.. .#####.. .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00D5 - LATIN CAPITAL LETTER O WITH TILDE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .###.##. ...###.# .###.##. ..###.##
+ ##.###.. ..##.### ##.###.. .##.###.
+ ........ ........ ........ ........
+ .#####.. ..#####. .#####.. ..#####.
+ #######. .####### #######. .#######
+ ##...##. .##...## ###.###. .###.##.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .#####.. .#####.. .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00D6 - LATIN CAPITAL LETTER O WITH DIAERESIS
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ###.###. .###.###
+ .##.##.. ...##.## ###.###. .###.###
+ ........ ...##.## ........ ........
+ .#####.. ........ .#####.. ..#####.
+ #######. ..#####. #######. .#######
+ ##...##. .####### ###.###. .###.###
+ ##...##. .##...## ###.###. .###.##.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .#####.. .#####.. .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00D7 - MULTIPLICATION SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ##...##. .##...## ##...##. .##...##
+ ###.###. .###.### ###.###. .###.##.
+ .#####.. ..#####. .#####.. .#####..
+ ..###... ...###.. ..###... ..###...
+ ..###... ..###... ..###... ..###...
+ .#####.. .#####.. .#####.. .#####..
+ ###.###. ###.###. ###.###. ###.###.
+ ##...##. ##...##. ##...##. ##...##.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00D8 - LATIN CAPITAL LETTER O WITH STROKE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .######. ...###.# .####.#. ..####.#
+ #######. ..#####. ######.. .######.
+ ##...##. ..##.### ###.###. .###.###
+ ##...##. .##.#.## ###.###. .###.###
+ ##..###. .##.#.## ###.###. .###.###
+ ##..###. .##.#.## #######. .######.
+ ##.#.##. ##.#.##. #######. #######.
+ ##.#.##. ##.#.##. #######. #######.
+ ###..##. ##.#.##. ###.###. ###.###.
+ ###..##. ###.###. ###.###. ###.###.
+ #######. .#####.. #######. #######.
+ .#####.. #.###... .#####.. .#####..
+ #....... ........ #....... #.......
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00D9 - LATIN CAPITAL LETTER U WITH GRAVE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..##.... ....##.. .###.... ..###...
+ ...##... .....##. ..###... ...###..
+ ........ ........ ........ ........
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.##.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##..###. ###.###. ###.###.
+ #######. ######.. #######. #######.
+ .#####.. .####... .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00DA - LATIN CAPITAL LETTER U WITH ACUTE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ....##.. ......## ...###.. ....###.
+ ...##... .....##. ..###... ...###..
+ ........ ........ ........ ........
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.##.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##..###. ###.###. ###.###.
+ #######. ######.. #######. #######.
+ .#####.. .####... .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00DB - LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..###... ....###. .#####.. ..#####.
+ .##.##.. ...##.## ###.###. .###.###
+ ........ ........ ........ ........
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.##.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##..###. ###.###. ###.###.
+ #######. ######.. #######. #######.
+ .#####.. .####... .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00DC - LATIN CAPITAL LETTER U WITH DIAERESIS
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ .##.##.. ...##.## ###.###. .###.###
+ .##.##.. ...##.## ###.###. .###.###
+ ........ ........ ........ ........
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.##.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##..###. ###.###. ###.###.
+ #######. ######.. #######. #######.
+ .#####.. .####... .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00DD - LATIN CAPITAL LETTER Y WITH ACUTE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ....##.. .....##. ...###.. ....###.
+ ...##... ....##.. ..###... ...###..
+ ........ ........ ........ ........
+ .##..##. ..##..## ###.###. .###.###
+ .##..##. ..##..## ###.###. .###.###
+ .##..##. .##..##. ###.###. .###.##.
+ .######. .##.###. ###.###. ###.###.
+ ..####.. .#####.. .#####.. .#####..
+ ...##... ..###... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ ...##... .##..... ..###... ..###...
+ ...##... .##..... ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00DE - LATIN CAPITAL LETTER THORN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .##..... ...##... ###..... .###....
+ .##..... ...##... ###..... .###....
+ .#####.. ...##### ######.. .######.
+ .######. ..###### #######. .#######
+ .##..##. ..##..## ###.###. .###.##.
+ .##..##. ..##..## ###.###. ###.###.
+ .######. ..###### ###.###. ###.###.
+ .#####.. .#####.. #######. #######.
+ .##..... .##..... ######.. ######..
+ .##..... .##..... ###..... ###.....
+ .##..... .##..... ###..... ###.....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00DF - LATIN SMALL LETTER SHARP S
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..####.. ....###. .#####.. ..#####.
+ .######. ...##### #######. .#######
+ .##..##. ...##.## ###.###. .###.###
+ .##..##. ...##.## ###.###. .###.###
+ .##..##. ..##..## ###.###. .###.###
+ .######. ..###### #######. .######.
+ .#####.. ..#####. ######.. ######..
+ .##..##. ..##..## ###.###. ###.###.
+ .##..##. .##..##. ###.###. ###.###.
+ .##..##. .##..##. ###.###. ###.###.
+ .######. .######. #######. #######.
+ .#####.. .#####.. ######.. ######..
+ ###..... ##...... ###..... ###.....
+ ##...... #....... ##...... ##......
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00E0 - LATIN SMALL LETTER A WITH GRAVE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ..##.... ....##.. .###.... .###....
+ ...##... .....##. ..###... ..###...
+ ........ ........ ........ ........
+ .######. ..###### .#####.. ..####..
+ #######. .####### .######. ..#####.
+ ##...##. .##...## ....###. ....###.
+ ##...##. .##...## .######. ..#####.
+ ##..###. ##..###. #######. .######.
+ ##..###. ##..###. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .###.##. .###.##. .######. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00E1 - LATIN SMALL LETTER A WITH ACUTE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... .....##. ...###.. ...###..
+ ..##.... ....##.. ..###... ..###...
+ ........ ........ ........ ........
+ .######. ..###### .#####.. ..####..
+ #######. .####### .######. ..#####.
+ ##...##. .##...## ....###. ....###.
+ ##...##. .##...## .######. ..#####.
+ ##...##. ##...##. #######. .######.
+ ##..###. ##..###. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .###.##. .###.##. .######. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00E2 - LATIN SMALL LETTER A WITH CIRCUMFLEX
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ...#.... .....#.. ..###... ..###...
+ ..###... ....###. .#####.. .#####..
+ .##.##.. ...##.## ###.###. ###.###.
+ ........ ........ ........ ........
+ .######. ..###### .#####.. ..####..
+ #######. .####### .######. ..#####.
+ ##...##. .##...## ....###. ....###.
+ ##...##. .##...## .######. ..#####.
+ ##...##. ##...##. #######. .######.
+ ##..###. ##..###. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .###.##. .###.##. .######. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00E3 - LATIN SMALL LETTER A WITH TILDE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .###.##. ...###.# .###.##. .###.##.
+ ##.###.. ..##.### ##.###.. ##.###..
+ ........ ........ ........ ........
+ .######. ..###### .#####.. ..####..
+ #######. .####### .######. ..#####.
+ ##...##. .##...## ....###. ....###.
+ ##...##. .##...## .######. ..#####.
+ ##...##. ##...##. #######. .######.
+ ##..###. ##..###. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .###.##. .###.##. .######. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00E4 - LATIN SMALL LETTER A WITH DIAERESIS
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .##.##.. ...##.## ###.###. ###.###.
+ .##.##.. ...##.## ###.###. ###.###.
+ ........ ........ ........ ........
+ .######. ..###### .#####.. ..####..
+ #######. .####### .######. ..#####.
+ ##...##. .##...## ....###. ....###.
+ ##...##. .##...## .######. ..#####.
+ ##...##. ##...##. #######. .######.
+ ##..###. ##..###. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .###.##. .###.##. .######. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00E5 - LATIN SMALL LETTER A WITH RING ABOVE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..###... ....###. ..###... ..###...
+ .##.##.. ...##.## .##.##.. .##.##..
+ ..###... ....###. ..###... ..###...
+ ........ ........ ........ ........
+ .######. ..#####. .#####.. ..####..
+ #######. .####### .######. ..#####.
+ ##...##. .##...## ....###. ....###.
+ ##...##. .##...## .######. ..#####.
+ ##...##. ##...##. #######. .######.
+ ##..###. ##..###. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .###.##. .###.##. .######. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00E6 - LATIN SMALL LETTER AE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ .###.#.. ..###.#.
+ .###.#.. ..###.#. .######. ..######
+ .######. ..###### .######. ..######
+ ...##.#. ....##.# ...##.#. ...##.#.
+ ..#####. ...##### .######. .######.
+ .######. .######. #######. #######.
+ ##.##... ##.##... ##.##... ##.##...
+ #######. #######. #######. #######.
+ .#####.. .#####.. .######. .######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00E7 - LATIN SMALL LETTER C WITH CEDILLA
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .#####.. ..#####. .#####.. ..#####.
+ #######. .####### #######. #######.
+ ##...##. .##...## ###.###. ###.###.
+ ##...... ##...... ###..... ###.....
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .#####.. .#####.. .#####.. .#####..
+ ...##... ..##.... ...###.. ...###..
+ .#####.. #####... .######. .######.
+ .####... ####.... .#####.. .#####..
+-----------------------------------------------------
+U+00E8 - LATIN SMALL LETTER E WITH GRAVE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ..##.... ....##.. .###.... ..###...
+ ...##... .....##. ..###... ...###..
+ ........ ........ ........ ........
+ .#####.. ..#####. .#####.. ..#####.
+ #######. .####### #######. .#######
+ ##...##. .##...## ###.###. ###.###.
+ #######. .####### #######. #######.
+ #######. #######. #######. #######.
+ ##...... ##...... ###..... ###.....
+ #######. #######. #######. #######.
+ .######. .######. .######. .######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00E9 - LATIN SMALL LETTER E WITH ACUTE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... .....##. ..###... ...###..
+ ..##.... ....##.. .###.... ..###...
+ ........ ........ ........ ........
+ .#####.. ..#####. .#####.. ..#####.
+ #######. .####### #######. .#######
+ ##...##. .##...## ###.###. ###.###.
+ #######. .####### #######. #######.
+ #######. #######. #######. #######.
+ ##...... ##...... ###..... ###.....
+ #######. #######. #######. #######.
+ .######. .######. .######. .######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0118 - LATIN CAPITAL LETTER E WITH OGONEK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ #######. ..###### #######. .#######
+ #######. ..###### #######. .#######
+ ##...... ..##.... ###..... .###....
+ ##...... ..##.... ###..... .###....
+ ##...... .##..... ###..... .###....
+ #####... .#####.. #####... .#####..
+ #####... .#####.. #####... #####...
+ ##...... .##..... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ #######. #######. #######. #######.
+ #######. #######. #######. #######.
+ ....##.. ...##... ....###. ...###..
+ ...##... .###.... ..###... .###....
+ ....###. ..###... ...####. .####...
+-----------------------------------------------------
+U+0119 - LATIN SMALL LETTER E WITH OGONEK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .#####.. ..####.. .#####.. ..####..
+ #######. .######. #######. .######.
+ ##...##. .##..##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ #######. ######.. #######. ######..
+ ##...... ##...... ###..... ###.....
+ #######. ######.. #######. ######..
+ .######. .#####.. .######. .#####..
+ ....##.. ...##... ....###. ...###..
+ ...##... .###.... ..###... .###....
+ ....###. ..###... ...####. .####...
+-----------------------------------------------------
+U+00EA - LATIN SMALL LETTER E WITH CIRCUMFLEX
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ...#.... .....#.. ..###... ...###..
+ ..###... ....###. .#####.. ..#####.
+ .##.##.. ...##.## ###.###. .###.###
+ ........ ........ ........ ........
+ .#####.. ..#####. .#####.. ..#####.
+ #######. .####### #######. .#######
+ ##...##. .##...## ###.###. ###.###.
+ #######. .####### #######. #######.
+ #######. #######. #######. #######.
+ ##...... ##...... ###..... ###.....
+ #######. #######. #######. #######.
+ .######. .######. .######. .######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00EB - LATIN SMALL LETTER E WITH DIAERESIS
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .##.##.. ...##.## ###.###. .###.###
+ .##.##.. ...##.## ###.###. .###.###
+ ........ ........ ........ ........
+ .#####.. ..#####. .#####.. ..#####.
+ #######. .####### #######. .#######
+ ##...##. .##...## ###.###. ###.###.
+ #######. .####### #######. #######.
+ #######. #######. #######. #######.
+ ##...... ##...... ###..... ###.....
+ #######. #######. #######. #######.
+ .######. .######. .######. .######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00EC - LATIN SMALL LETTER I WITH GRAVE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ..##.... ....##.. .###.... ..###...
+ ...##... .....##. ..###... ...###..
+ ........ ........ ........ ........
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ..###...
+ ...##... ....##.. ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00ED - LATIN SMALL LETTER I WITH ACUTE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ....##.. ......## ...###.. ....###.
+ ...##... .....##. ..###... ...###..
+ ........ ........ ........ ........
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ..###...
+ ...##... ....##.. ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00EE - LATIN SMALL LETTER I WITH CIRCUMFLEX
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ...##... .....##. ..###... ...###..
+ ..####.. ....#### .#####.. ..#####.
+ .##..##. ...##..# ###.###. .###.###
+ ........ ........ ........ ........
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ..###...
+ ...##... ....##.. ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00EF - LATIN SMALL LETTER I WITH DIAERESIS
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .##..##. ...##.## ###.###. .###.###
+ .##..##. ...##.## ###.###. .###.###
+ ........ ........ ........ ........
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ..###...
+ ...##... ....##.. ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00F0 - LATIN SMALL LETTER ETH
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .##.##.. ...##.## ###.##.. .###.##.
+ .#####.. ...##### .#####.. ..#####.
+ #####... ..#####. #####... .#####..
+ ##.###.. ..##.### ######.. .######.
+ .#####.. ..#####. .######. ..######
+ #######. .####### #######. .######.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .#####.. .#####.. .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00F1 - LATIN SMALL LETTER N WITH TILDE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .###.##. ...###.# .###.##. ..###.##
+ #######. ..###### #######. .#######
+ ##.###.. ..##.### ##.###.. .##.###.
+ ........ ........ ........ ........
+ ######.. .######. ######.. .######.
+ #######. .####### #######. .#######
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00F2 - LATIN SMALL LETTER O WITH GRAVE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .##..... ...##... ###..... .###....
+ ..##.... ....##.. .###.... ..###...
+ ........ ........ ........ ........
+ .#####.. ..#####. .#####.. ..####..
+ #######. .####### #######. .######.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. ######..
+ .#####.. .#####.. .#####.. .####...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00F3 - LATIN SMALL LETTER O WITH ACUTE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... .....##. ..###... ...###..
+ ..##.... ....##.. .###.... ..###...
+ ........ ........ ........ ........
+ .#####.. ..#####. .#####.. ..####..
+ #######. .####### #######. .######.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. ######..
+ .#####.. .#####.. .#####.. .####...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00F4 - LATIN SMALL LETTER O WITH CIRCUMFLEX
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ...#.... .....#.. ..###... ...###..
+ ..###... ....###. .#####.. ..#####.
+ .##.##.. ...##.## ###.###. .###.###
+ ........ ........ ........ ........
+ .#####.. ..#####. .#####.. ..####..
+ #######. .####### #######. .######.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. ######..
+ .#####.. .#####.. .#####.. .####...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00F5 - LATIN SMALL LETTER O WITH TILDE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .###.##. ...###.# .###.##. ..###.##
+ #######. ..###### #######. .#######
+ ##.###.. ..##.### ##.###.. .##.###.
+ ........ ........ ........ ........
+ .#####.. ..#####. .#####.. ..####..
+ #######. .####### #######. .######.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. ######..
+ .#####.. .#####.. .#####.. .####...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00F6 - LATIN SMALL LETTER O WITH DIAERESIS
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .##.##.. ...##.## ###.###. .###.###
+ .##.##.. ...##.## ###.###. .###.###
+ ........ ........ ........ ........
+ .#####.. ..#####. .#####.. ..####..
+ #######. .####### #######. .######.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. ######..
+ .#####.. .#####.. .#####.. .####...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00F7 - DIVISION SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ........ ........ ........ ........
+ .######. ..###### #######. #######.
+ .######. .######. #######. #######.
+ ........ ........ ........ ........
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00F8 - LATIN SMALL LETTER O WITH STROKE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ......#. ........ ......#. .......#
+ .#####.. ..#####. .#####.. ..#####.
+ #######. .####### #######. .######.
+ ##..###. .##..### ###.###. ###.###.
+ ##.#.##. .##.#.## ###.###. ###.###.
+ ##.#.##. ##.#.##. ###.###. ###.###.
+ ###..##. ###..##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .#####.. .#####.. .#####.. .#####..
+ #....... ........ #....... #.......
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00F9 - LATIN SMALL LETTER U WITH GRAVE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .##..... ...##... ###..... .###....
+ ..##.... ....##.. .###.... ..###...
+ ........ ........ ........ ........
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.##.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .######. .######. .######. .######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00FA - LATIN SMALL LETTER U WITH ACUTE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... .....##. ..###... ...###..
+ ..##.... ....##.. .###.... ..###...
+ ........ ........ ........ ........
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.##.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .######. .######. .######. .######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00FB - LATIN SMALL LETTER U WITH CIRCUMFLEX
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ...#.... .....#.. ..###... ...###..
+ ..###... ....###. .#####.. ..#####.
+ .##.##.. ...##.## ###.###. .###.###
+ ........ ........ ........ ........
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.##.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .######. .######. .######. .######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00FC - LATIN SMALL LETTER U WITH DIAERESIS
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .##.##.. ...##.## ###.###. .###.###
+ .##.##.. ...##.## ###.###. .###.###
+ ........ ........ ........ ........
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.##.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .######. .######. .######. .######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+00FD - LATIN SMALL LETTER Y WITH ACUTE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ....##.. ......## ...###.. ....###.
+ ...##... .....##. ..###... ...###..
+ ........ ........ ........ ........
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.##.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .######. .######. .######. .######.
+ .....##. ....##.. ....###. ....###.
+ ######.. #####... #######. #######.
+ #####... ####.... ######.. ######..
+-----------------------------------------------------
+U+00FE - LATIN SMALL LETTER THORN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .##..... ...##... ###..... .###....
+ .##..... ...##... ###..... .###....
+ .##..... ...##... ######.. .######.
+ .#####.. ..#####. #######. .#######
+ .######. ..###### ###.###. .###.##.
+ .##..##. ..##..## ###.###. ###.###.
+ .##..##. ..##..## ###.###. ###.###.
+ .##..##. .##..##. ###.###. ###.###.
+ .##..##. .##..##. ###.###. ###.###.
+ .######. .######. ###.###. ###.###.
+ .#####.. .#####.. #######. #######.
+ .##..... ##...... ######.. ######..
+ .##..... ##...... ###..... ###.....
+ .##..... ##...... ###..... ###.....
+-----------------------------------------------------
+U+00FF - LATIN SMALL LETTER Y WITH DIAERESIS
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .##.##.. ........ ###.###. .###.###
+ .##.##.. ...##.## ###.###. .###.###
+ ........ ........ ........ ........
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.##.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .######. .######. .######. .######.
+ .....##. ....##.. ....###. ....###.
+ #######. #####... #######. #######.
+ ######.. ####.... ######.. ######..
+-----------------------------------------------------
+U+0102 - LATIN CAPITAL LETTER A WITH BREVE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ##...##. .##...## ###.###. .###.###
+ #######. .######. #######. .######.
+ ........ ........ ........ ........
+ ...#.... .....#.. ...#.... ....#...
+ ..###... ...###.. ..###... ...###..
+ .##.##.. ..##.##. .#####.. ..#####.
+ ##...##. .##...## ###.###. ###.###.
+ #######. .####### #######. #######.
+ #######. #######. #######. #######.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0103 - LATIN SMALL LETTER A WITH BREVE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##..##. ###.###. .#######
+ .#####.. ..####.. .#####.. ..####..
+ ........ ........ ........ ........
+ .######. ..###### .#####.. ..####..
+ #######. .####### .######. ..#####.
+ ##...##. .##...## ....###. ....###.
+ ##...##. .##...## .######. ..#####.
+ ##...##. ##...##. #######. .######.
+ ##..###. ##..###. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .###.##. .###.##. .######. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0104 - LATIN CAPITAL LETTER A WITH OGONEK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .#####.. ...####. .#####.. ..#####.
+ #######. ..###### #######. .#######
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. ..##..## ###.###. .###.###
+ ##...##. .##..##. ###.###. .###.###
+ #######. .######. ###.###. .###.##.
+ #######. .######. #######. #######.
+ ##...##. .##..##. #######. #######.
+ ##...##. ##..##.. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ##...##. ##..##.. ###.###. ###.###.
+ ....##.. ...##... ....###. ...###..
+ ...##... .###.... ..###... .###....
+ ....###. ..###... ...####. .####...
+-----------------------------------------------------
+U+0105 - LATIN SMALL LETTER A WITH OGONEK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .######. ..###### .#####.. ..####..
+ #######. .####### .######. ..#####.
+ ##...##. .##...## ....###. ....###.
+ ##...##. .##...## .######. ..#####.
+ ##...##. ##...##. #######. .######.
+ ##..###. ##..###. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .###.##. .###.##. .######. .#####..
+ ....##.. ...##... ....###. ...###..
+ ...##... .###.... ..###... .###....
+ ....###. ..###... ...####. .####...
+-----------------------------------------------------
+U+0106 - LATIN CAPITAL LETTER C WITH ACUTE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ....##.. ......## ...###.. ....###.
+ ...##... .....##. ..###... ...###..
+ ........ ........ ........ ........
+ .#####.. ...####. .#####.. ..#####.
+ #######. ..###### #######. .#######
+ ##...##. ..##..## ###.###. .###.###
+ ##...... .##..... ###.###. .###.###
+ ##...... .##..... ###..... .###....
+ ##...... .##..... ###..... ###.....
+ ##...... .##..... ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .#####.. .#####.. .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0107 - LATIN SMALL LETTER C WITH ACUTE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ....##.. ......## ...###.. ....###.
+ ...##... .....##. ..###... ...###..
+ ........ ........ ........ ........
+ .#####.. ..####.. .#####.. ..####..
+ #######. .######. #######. .######.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ ##...##. ##..##.. ###.###. ###.###.
+ #######. ######.. #######. #######.
+ .#####.. .####... .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+010C - LATIN CAPITAL LETTER C WITH CARON
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ##...##. .##...## ###.###. .###.###
+ .#####.. ..#####. .#####.. ..#####.
+ ........ ........ ........ ........
+ .#####.. ...####. .#####.. ..#####.
+ #######. ..###### #######. .#######
+ ##...##. ..##..## ###.###. .###.###
+ ##...... .##..... ###.###. .###.###
+ ##...... .##..... ###..... .###....
+ ##...... .##..... ###..... ###.....
+ ##...... .##..... ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ #######. #######. #######. #######.
+ .#####.. .#####.. .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0141 - LATIN CAPITAL LETTER L WITH STROKE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .##..... ...##... .###.... ..###...
+ .##..... ...##... .###.... ..###...
+ .##..... ...##... .###.... ..###.#.
+ .##.#... ...##.#. .###.##. ..#####.
+ .####... ..#####. .######. ..####..
+ .###.... ..####.. .#####.. ..###...
+ ###..... .###.... ####.... ####....
+ ###..... .###.... ####.... ####....
+ .##..... .##..... .###.... .###....
+ .##..... .##..... .###.... .###....
+ .######. .######. .######. .######.
+ .######. .######. .######. .######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0142 - LATIN SMALL LETTER L WITH STROKE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..###... ....###. .####... ..####..
+ ..###... ....###. .####... ..####..
+ ...##... .....##. ..###... ...###.#
+ ...##.#. .....### ..#####. ...#####
+ ...####. ....#### ..#####. ..#####.
+ ..####.. ...####. .#####.. .#####..
+ .####... ..####.. .####... #####...
+ .#.##... ..#.##.. .####... #.###...
+ ...##... ...##... ..###... .###....
+ ...##... ...##... ..###... .###....
+ ...##... ...##... ..###... .###....
+ ...##... ...##... ..###... .###....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0143 - LATIN CAPITAL LETTER N WITH ACUTE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ....##.. ......## ...###.. ....###.
+ ...##... .....##. ..###... ...###..
+ ........ ........ ........ ........
+ ##...##. ..##...# ###.###. .###.###
+ ##...##. .##...## ###.###. .###.###
+ ###..##. .###..## ###.###. .###.##.
+ ####.##. .####.## ####.##. ####.##.
+ #######. .####### #######. #######.
+ ##.####. ##.####. ##.####. ##.####.
+ ##..###. ##..###. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0144 - LATIN SMALL LETTER N WITH ACUTE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ....##.. ......## ...###.. ....###.
+ ...##... .....##. ..###... ...###..
+ ........ ........ ........ ........
+ ######.. .######. ######.. .######.
+ #######. .####### #######. .#######
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+010D - LATIN SMALL LETTER C WITH CARON
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ##...##. .##...## ###.###. .###.###
+ .##.##.. ..##.##. .#####.. ..#####.
+ ..###... ...###.. ..###... ...###..
+ ........ ........ ........ ........
+ .#####.. ..####.. .#####.. ..####..
+ #######. .######. #######. .######.
+ ##...##. .##..##. ###.###. ###.###.
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ ##...##. ##..##.. ###.###. ###.###.
+ #######. ######.. #######. #######.
+ .#####.. .####... .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0152 - LATIN CAPITAL LIGATURE OE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .####### ...##### .####### ..######
+ ######## ..###### ######## .#######
+ ##..##.. ..##..## ###.###. .###.###
+ ##..##.. ..##..## ###.###. .###.###
+ ##..##.. .##..##. ###.###. .###.###
+ ##..#### .##..### ###.#### .###.###
+ ##..#### .##..### ###.#### ###.####
+ ##..##.. .##..##. ###.###. ###.###.
+ ##..##.. ##..##.. ###.###. ###.###.
+ ##..##.. ##..##.. ###.###. ###.###.
+ ######## ######## ######## ########
+ .####### .####### .####### .#######
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0153 - LATIN SMALL LIGATURE OE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .##.##.. ..##.##. .##.##.. ..##.##.
+ #######. .####### #######. .#######
+ ##.##.#. .##.##.# #####.#. #####.#.
+ ##.####. .##.#### ##.####. ##.####.
+ ##.####. ##.####. ##.####. ##.####.
+ ##.##... ##.##... ######.. ######..
+ #######. #######. #######. #######.
+ .##.###. .##.###. .##.###. .##.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+015A - LATIN CAPITAL LETTER S WITH ACUTE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ....##.. ......## ...###.. ....###.
+ ...##... .....##. ..###... ...###..
+ ........ ........ ........ ........
+ .#####.. ...####. .#####.. ..#####.
+ #######. ..###### #######. .#######
+ ##...##. ..##..## ###.###. .###.###
+ ##...... .##..... ###..... .###....
+ ######.. .#####.. ######.. .#####..
+ .######. ..#####. .######. ..#####.
+ .....##. .....##. ....###. ....###.
+ ##...##. ##..###. ###.###. ###.###.
+ #######. ######.. #######. #######.
+ .#####.. .####... .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+015B - LATIN SMALL LETTER S WITH ACUTE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... .....##. ...###.. ...###..
+ ..##.... ....##.. ..###... ..###...
+ ........ ........ ........ ........
+ .######. ..###### .######. ...#####
+ #######. .####### #######. ..#####.
+ ##...... .##..... ###..... .###....
+ ######.. .#####.. ######.. .#####..
+ .#####.. ..#####. .######. ..#####.
+ .....##. .....##. ....###. ....###.
+ #######. #######. #######. .#####..
+ ######.. ######.. ######.. #####...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0160 LATIN CAPITAL LETTER S WITH CARON
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ##...##. .##...## ###.###. .###.###
+ .#####.. ..#####. .#####.. ..#####.
+ ........ ........ ........ ........
+ .#####.. ...####. .#####.. ..#####.
+ #######. ..###### #######. .#######
+ ##...##. ..##..## ###.###. .###.###
+ ##...... .##..... ###..... .###....
+ ######.. .#####.. ######.. .#####..
+ .######. ..#####. .######. ..#####.
+ .....##. .....##. ....###. ....###.
+ ##...##. ##..###. ###.###. ###.###.
+ #######. ######.. #######. #######.
+ .#####.. .####... .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0161 - LATIN SMALL LETTER S WITH CARON
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ##...##. .##...## ###.###. .###.###
+ .##.##.. ..##.##. .#####.. ..#####.
+ ..###... ...###.. ..###... ...###..
+ ........ ........ ........ ........
+ .######. ..###### .######. ...#####
+ #######. .####### #######. ..#####.
+ ##...... .##..... ###..... .###....
+ ######.. .#####.. ######.. .#####..
+ .#####.. ..#####. .######. ..#####.
+ .....##. .....##. ....###. ....###.
+ #######. #######. #######. .#####..
+ ######.. ######.. ######.. #####...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0174 - LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..###... ........ ........ ........
+ .##.##.. ....###. .#####.. ..#####.
+ ##...##. ...##.## ###.###. .###.###
+ ........ ........ ........ ........
+ ##...##. ..##...# ###.###. .###.###
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##...## ###.###. ###.###.
+ ##.#.##. .##.#.## #######. #######.
+ ##.#.##. ##.#.##. #######. #######.
+ #######. #######. #######. #######.
+ ###.###. ###.###. ###.###. ###.###.
+ .#...#.. .#...#.. .#...#.. .#...#..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0175 - LATIN SMALL LETTER W WITH CIRCUMFLEX
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ...#.... ....#...
+ ...#.... .....#.. ..###... ...###..
+ ..###... ....###. .#####.. ..#####.
+ .##.##.. ...##.## ###.###. .###.###
+ ........ ........ ........ ........
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##.#.##. ##.#.##. #######. #######.
+ ##.#.##. ##.#.##. #######. #######.
+ #######. #######. #######. #######.
+ .##.##.. .##.##.. .##.##.. .##.##..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0176 - LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##... ........ ........ ........
+ ..####.. ....#### .#####.. ..#####.
+ .##..##. ...##..# ###.###. .###.###
+ ........ ........ ........ ........
+ .##..##. ...##.## ###.###. .###.###
+ .##..##. ..##..## ###.###. .###.###
+ .##..##. ..##..## ###.###. .###.###
+ ..####.. ...####. .#####.. .#####..
+ ...##... ....##.. ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0177 - LATIN SMALL LETTER Y WITH CIRCUMFLEX
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ...#.... ....#...
+ ...#.... .....#.. ..###... ...###..
+ ..###... ....###. .#####.. ..#####.
+ .##.##.. ...##.## ###.###. .###.###
+ ........ ........ ........ ........
+ ##...##. .##...## ###.###. .###.###
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. .##...## ###.###. ###.###.
+ ##...##. ##...##. ###.###. ###.###.
+ ##...##. ##...##. #######. #######.
+ #######. ##...##. #######. #######.
+ .######. .######. .######. .######.
+ .....##. ....##.. .....##. .....##.
+ #######. #####... #######. #######.
+ ######.. ####.... ######.. ######..
+-----------------------------------------------------
+U+0178 - LATIN CAPITAL LETTER Y WITH DIAERESIS
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .##.##.. ..##..## ###.###. ..###.##
+ ........ ........ ........ ........
+ ##...##. .##..##. ###.###. .###.###
+ ##...##. .##..##. ###.###. .###.###
+ ##...##. .##..##. ###.###. .###.###
+ ###.###. ..####.. ###.###. .###.###
+ .#####.. ..####.. .#####.. ..#####.
+ ..###... ...##... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ ...##... .##..... ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0179 - LATIN CAPITAL LETTER Z WITH ACUTE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ....##.. ......## ...###.. ....###.
+ ...##... .....##. ..###... ...###..
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ #######. .####### #######. .#######
+ .....##. ......## ....###. .....###
+ ....##.. .....### ...####. ....###.
+ ...##... ....###. ..####.. ...###..
+ ..##.... ...##... .####... ..###...
+ .##..... .###.... ####.... .###....
+ ##...... ###..... ###..... ###.....
+ #######. #######. #######. #######.
+ #######. #######. #######. #######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+017A - LATIN SMALL LETTER Z WITH ACUTE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... .....##. ...###.. ...###..
+ ..##.... ....##.. ..###... ..###...
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ #######. .####### #######. .######.
+ ....###. .....### ...####. ...####.
+ ..####.. ...####. ..####.. ..####..
+ .####... .####... .####... .####...
+ ###..... ###..... ####.... ####....
+ #######. #######. #######. #######.
+ #######. #######. #######. #######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+017B - LATIN CAPITAL LETTER Z WITH DOT ABOVE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##... ....##.. ...##... ....###.
+ ...##... ....##.. ...##... ....###.
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ #######. .####### #######. .#######
+ .....##. ......## ....###. .....###
+ ....##.. .....### ...####. ....###.
+ ...##... ....###. ..####.. ...###..
+ ..##.... ...##... .####... ..###...
+ .##..... .###.... ####.... .###....
+ ##...... ###..... ###..... ###.....
+ #######. #######. #######. #######.
+ #######. #######. #######. #######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+017C - LATIN SMALL LETTER Z WITH DOT ABOVE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... ....##.. ...##... ....###.
+ ...##... ....##.. ...##... ....###.
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ #######. .####### #######. .######.
+ ....###. .....### ...####. ...####.
+ ..####.. ...####. ..####.. ..####..
+ .####... .####... .####... .####...
+ ###..... ###..... ####.... ####....
+ #######. #######. #######. #######.
+ #######. #######. #######. #######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+017D - LATIN CAPITAL LETTER Z WITH CARON
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ##...##. .##...## ###.###. .###.###
+ .#####.. ..#####. .#####.. ..#####.
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ #######. .####### #######. .#######
+ .....##. ......## ....###. .....###
+ ....##.. .....### ...####. ....###.
+ ...##... ....###. ..####.. ...###..
+ ..##.... ...##... .####... ..###...
+ .##..... .###.... ####.... .###....
+ ##...... ###..... ###..... ###.....
+ #######. #######. #######. #######.
+ #######. #######. #######. #######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+017E - LATIN SMALL LETTER Z WITH CARON
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ##...##. .##...## ###.###. .###.###
+ .##.##.. ..##.##. .#####.. ..#####.
+ ..###... ...###.. ..###... ...###..
+ ........ ........ ........ ........
+ #######. .####### #######. .#######
+ #######. .####### #######. .######.
+ ....###. .....### ...####. ...####.
+ ..####.. ...####. ..####.. ..####..
+ .####... .####... .####... .####...
+ ###..... ###..... ####.... ####....
+ #######. #######. #######. #######.
+ #######. #######. #######. #######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+0192 - LATIN SMALL LETTER F WITH HOOK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ...####. .....### ..#####. ...#####
+ ..#####. ....#### .######. ..######
+ ..##.... ....##.. .###.... ..###...
+ ..##.... ...##... .###.... ..###...
+ ..##.... .######. .###.... .###....
+ .####... .######. #####... .#####..
+ .####... ..##.... #####... .#####..
+ ..##.... ..##.... .###.... .###....
+ ..##.... ..##.... .###.... ###.....
+ ..##.... .##..... .###.... ###.....
+ ..##.... .##..... .###.... ###.....
+ ..##.... .##..... .###.... ###.....
+ ####.... ##...... ####.... ##......
+ .##..... #....... ###..... ##......
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+02C6 - MODIFIER LETTER CIRCUMFLEX ACCENT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ .#####.. ..#####. .#####.. ..#####.
+ ##...##. .##...## ###.###. .###.###
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+02DC - SMALL TILDE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..##..#. ...##..# .####.## ..###.##
+ .#..##.. ..#..##. ##.####. .##.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+1EC6 - LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..###... ....###. .#####.. ..#####.
+ .##.##.. ...##.## ###.###. .###.###
+ ........ ........ ........ ........
+ #######. ..###### #######. .#######
+ #######. .####### #######. .#######
+ ##...... .##..... ###..... .###....
+ ####.... .####... ###..... ###.....
+ ####.... .####... #####... #####...
+ ##...... ##...... ###..... ###.....
+ ##...... ##...... ###..... ###.....
+ #######. #######. #######. #######.
+ #######. #######. #######. #######.
+ ........ ........ ........ ........
+ ...##... ..##.... ...##... ..###...
+ ...##... ..##.... ...##... ..###...
+-----------------------------------------------------
+U+1EC7 - LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ...#.... .....#.. ..###... ...###..
+ ..###... ....###. .#####.. ..#####.
+ .##.##.. ...##.## ###.###. .###.###
+ ........ ........ ........ ........
+ .#####.. ..#####. .#####.. ..#####.
+ #######. .####### #######. .#######
+ ##...##. .##...## ###.###. ###.###.
+ #######. .####### #######. #######.
+ #######. #######. #######. #######.
+ ##...... ##...... ###..... ###.....
+ #######. #######. #######. #######.
+ .######. .######. .######. .######.
+ ........ ........ ........ ........
+ ...##... ..##.... ...##... ..###...
+ ...##... ..##.... ...##... ..###...
+-----------------------------------------------------
+U+2013 - EN DASH
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ..####.. ...####. ..####.. ..####..
+ ........ ........ ..####.. ..####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+2014 - EM DASH
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ #######. .####### #######. #######.
+ ........ ........ #######. #######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+2018 - LEFT SINGLE QUOTATION MARK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...#.... .....#.. ...##... ....##..
+ ..#..... ....#... ..##.... ...##...
+ ..##.... ...#.... ..##.... ...##...
+ ..##.... ...##... ..##.... ...##...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+2019 - RIGHT SINGLE QUOTATION MARK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ..##.... ....##.. ..##.... ...##...
+ ..##.... .....#.. ..##.... ...##...
+ ...#.... ....#... ..##.... ...##...
+ ..#..... ...#.... .##..... ..##....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+201A - SINGLE LOW-9 QUOTATION MARK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ....#... ...#.... ...##... ..##....
+ ...#.... ..#..... ..##.... .##.....
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+201C - LEFT DOUBLE QUOTATION MARK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ..#..#.. ....#..# ..##.##. ...##.##
+ .#..#... ...#..#. .##.##.. ..##.##.
+ .##.##.. ...##.## .##.##.. ..##.##.
+ .##.##.. ..##.##. .##.##.. ..##.##.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+201D - RIGHT DOUBLE QUOTATION MARK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ..##.##. ...##.## ..##.##. ...##.##
+ ..##.##. ...##.## ..##.##. ...##.##
+ ...#..#. ....#..# ..##.##. ...##.##
+ ..#..#.. ...#..#. .##.##.. ..##.##.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+201E - DOUBLE LOW-9 QUATATION MARK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .##..##. .##..##. ###.###. ###.###.
+ .##..##. .##..##. ###.###. ###.###.
+ ..#...#. .#...#.. .##..##. ##..##..
+ .#...#.. #...#... ##..##.. #..##...
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+2020 - DAGGER
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ...##... .....##. ..###... ...###..
+ ...##... .....##. ..###... ...###..
+ ...##... .....##. ..###... ...###..
+ .######. ...##### ..###... ...###..
+ .######. ..###### #######. .#######
+ ...##... ....##.. #######. .#######
+ ...##... ....##.. ..###... ..###...
+ ...##... ....##.. ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+2021 - DOUBLE DAGGER
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ...##... .....##. ..###... ...###..
+ ...##... .....##. ..###... ...###..
+ ...##... .....##. ..###... ...###..
+ .######. ...##### #######. .#######
+ .######. ..###### #######. .#######
+ ...##... ....##.. ..###... ...###..
+ .######. ..###### #######. #######.
+ .######. ..###### #######. #######.
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ...##... ..##.... ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+2022 - BULLET
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ..####.. ...####. ..####.. ...####.
+ .######. ..###### .######. .######.
+ .######. ..###### .######. .######.
+ .######. .######. .######. .######.
+ .######. .######. .######. .######.
+ ..####.. ..####.. ..####.. ..####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+2023 - TRIANGULAR BULLET
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .##..... ...##... ........ ..##....
+ .###.... ...##... .##..... ..###...
+ .####... ...###.. .###.... ..####..
+ .#####.. ..####.. .####... ..#####.
+ .######. ..#####. .#####.. ..######
+ .######. ..#####. .######. .#######
+ .#####.. ..####.. .######. .######.
+ .####... .####... .#####.. .#####..
+ .###.... .###.... .####... .####...
+ .##..... .##..... .###.... .###....
+ ........ ........ .##..... .##.....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+2026 - HORIZONTAL ELLIPSIS
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ##.##.## ##.##.##
+ ##.##.## ##.##.## ##.##.## ##.##.##
+ ##.##.## ##.##.## ##.##.## ##.##.##
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+2030 - PER MILLE SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ##....#. .##....# ##...##. .##...##
+ ##...##. .##...## ##..###. .##..###
+ ....##.. .....##. ...###.. ...###..
+ ...##... ....##.. ..###... ..###...
+ ..##.... ..##.... .###.... .###....
+ .##..... .##..... ###..... ###.....
+ ##.##.## ##.##.## ##.##.## ##.##.##
+ #..##.## #..##.## ...##.## ...##.##
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+2031 - PER TEN THOUSAND SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ##....#. .##....# ##...##. .##...##
+ ##...##. .##...## ##..###. .##..###
+ ....##.. .....##. ...###.. ...###..
+ ...##... ....##.. ..###... ..###...
+ ..##.... ..##.... .###.... .###....
+ .##..... .##..... ###..... ###.....
+ ##.#.#.# ##.#.#.# ##.#.#.# ##.#.#.#
+ #..#.#.# #..#.#.# ...#.#.# ...#.#.#
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+2039 - SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ .....##. ......##
+ ....##.. .....##. ....###. .....###
+ ...###.. ....###. ...###.. ...###..
+ ..###... ...###.. ..###... ..###...
+ ..##.... ..##.... .###.... .###....
+ ..###... ..###... ..###... ..###...
+ ...###.. ...###.. ...###.. ...###..
+ ....##.. ....##.. ....###. ....###.
+ ........ ........ .....##. .....##.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+203A - SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ .##..... ..##....
+ ..##.... ...##... .###.... ..###...
+ ..###... ...###.. ..###... ..###...
+ ...###.. ....###. ...###.. ...###..
+ ....##.. ....##.. ....###. ....###.
+ ...###.. ...###.. ...###.. ...###..
+ ..###... ..###... ..###... ..###...
+ ..##.... ..##.... .###.... .###....
+ ........ ........ .##..... .##.....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+20AC - EURO SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ...##... .....##. ..###... .....##.
+ ..####.. ....#### .#####.. ...#####
+ .##..##. ...##.## ###.###. ..###.##
+ .##..... ...##... ###..... .###....
+ ######.. .######. ######.. #######.
+ .##..... ..##.... ###..... .###....
+ #####... .#####.. #####... #####...
+ .##..... .##..... ###..... ###.....
+ .##..... .##..... ###..... ###.....
+ .##..##. .##.##.. ###.###. ###.###.
+ ..####.. ..####.. .#####.. ######..
+ ...##... ..##.... ..###... .###....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+2122 - TRADE MARK SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ####...# #####.## ####...# .####..#
+ #####.## ######## #####.## .#######
+ .#.##### .#.#.#.# .#.##### ..#.####
+ .#.#.#.# #.#...#. .#.#.#.# ..#.#..#
+ .#.#...# #.#...#. .#.#...# ..#.#..#
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+2190 - LEFTWARDS ARROW
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... ........ ........ ........
+ ..##.... .....#.. ...##... ....##..
+ .##..... ...##... ..##.... ...##...
+ #######. ..##.... .######. ..######
+ #######. .####### #######. #######.
+ .##..... .####### .######. .######.
+ ..##.... .##..... ..##.... ..##....
+ ...##... ..##.... ...##... ...##...
+ ........ ...##... ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+2191 - UPWARDS ARROW
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##... ....##.. ...#.... ....#...
+ ..####.. ...####. ..###... ...###..
+ .######. ..#####. .#####.. .#####..
+ ##.##.## .#..##.# #######. #######.
+ #..##..# #..##..# #.###.#. #.###.#.
+ ...##... ...##... ..###... ..###...
+ ...##... ...##... ..###... ..###...
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+2192 - RIGHTWARDS ARROW
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ..##.... ........ ........ ........
+ ...##... ....##.. ..##.... ...##...
+ ....##.. ....##.. ...##... ....##..
+ #######. .....##. ######.. .######.
+ #######. .####### #######. #######.
+ ....##.. .####### ######.. ######..
+ ...##... ....##.. ...##... ...##...
+ ..##.... ...##... ..##.... ..##....
+ ........ ..##.... ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+2193 - DOWNWARDS ARROW
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ ...##... ....##.. ..###... ...###..
+ #..##..# .#..##.. #.###.#. #.###.#.
+ ##.##.## .##.##.# #######. #######.
+ .######. .######. .#####.. .#####..
+ ..####.. ..####.. ..###... ..###...
+ ...##... ...##... ...#.... ...#....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+21E6 - LEFTWARDS WHITE ARROW
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...#.... ....##.. ...#.... ....#...
+ ..##.... ...##... ..##.... ...##...
+ .######. ..###### .######. ..#####.
+ #######. .####### #######. #######.
+ ##...##. .##...## #######. #######.
+ #######. #######. #######. #######.
+ .######. .######. .######. .######.
+ ..##.... ..##.... ..##.... ..##....
+ ...#.... ...#.... ...#.... ...#....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+21E7 - UPWARDS WHITE ARROW
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...#.... ....#... ...#.... ....#...
+ ..###... ...###.. ..###... ...###..
+ .##.##.. ..##.##. .#####.. ..#####.
+ ##...##. .##...#. #######. .######.
+ ###.###. ##....## #######. #######.
+ ###.###. ###.#### #######. #######.
+ ..#.#... .##.##.. .#####.. .#####..
+ ..#.#... ##.##... .#####.. .#####..
+ ..###... #####... .#####.. .#####..
+ ..###... #####... .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+21E8 - RIGHTWARDS WHITE ARROW
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...#.... .....#.. ...#.... ....#...
+ ...##... ....##.. ...##... ....##..
+ ######.. .######. ######.. .######.
+ #######. .####### #######. #######.
+ ##...##. .##...## #######. #######.
+ #######. #######. #######. #######.
+ ######.. ######.. ######.. ######..
+ ...##... ...##... ...##... ...##...
+ ...#.... ...#.... ...#.... ...#....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+21E9 - DOWNWARDS WHITE ARROW
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .#####.. ...##### .#####.. ..#####.
+ .#####.. ...##### .#####.. ..#####.
+ .##.##.. ...##.## .#####.. ..#####.
+ .##.##.. ..##.##. .#####.. .#####..
+ ###.###. ..##.##. #######. #######.
+ ###.###. ###...## #######. #######.
+ ##...##. ##...##. #######. #######.
+ .##.##.. .##.##.. .#####.. .#####..
+ ..###... ..###... ..###... ..###...
+ ...#.... ..#..... ...#.... ...#....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+2212 - MINUS SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .#####.. ..#####. .#####.. .#####..
+ ........ ........ .#####.. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+23CE - RETURN SYMBOL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ...##.## ........ .....### ......##
+ ..##..## ....#... ...#.### ....#.##
+ .##...## ...##.## ..##.### ...##.##
+ ######## ..##..## .####### ..######
+ #######. .####### ######## ########
+ .##..... .####### .######. .######.
+ ..##.... .##..... ..##.... ..##....
+ ...##... ..##.... ...#.... ...#....
+ ........ ...##... ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+240C - SYMBOL FOR FORM FEED
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ####.... ..####.. ####.... .####...
+ ####.... ..####.. ####.... .####...
+ ##..#### .##..### ##..#### .##..###
+ ###.#### .###.### ###.#### .###.###
+ ###.##.. .###.##. ###.##.. .###.##.
+ ##..###. ##...### ##..###. ##..###.
+ ##..###. ##..#### ##..###. ##..###.
+ ##..##.. ##..##.. ##..##.. ##..##..
+ ....##.. ....##.. ....##.. ....##..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+2500 - BOX DRAWINGS LIGHT HORIZONTAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ########
+ ########
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2501 - BOX DRAWINGS HEAVY HORIZONTAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ########
+ ########
+ ########
+ ########
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2502 - BOX DRAWINGS LIGHT VERTICAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+2503 - BOX DRAWINGS HEAVY VERTICAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+2504 - BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ #.#..#.#
+ #.#..#.#
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2505 - BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ #.#..#.#
+ #.#..#.#
+ #.#..#.#
+ #.#..#.#
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2506 - BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ........
+ ........
+ ...##...
+ ...##...
+ ...##...
+ ........
+ ........
+ ...##...
+ ...##...
+ ...##...
+ ........
+ ........
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+2507 - BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ........
+ ........
+ ..####..
+ ..####..
+ ..####..
+ ........
+ ........
+ ..####..
+ ..####..
+ ..####..
+ ........
+ ........
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+2508 - BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ #.#.#.#.
+ #.#.#.#.
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2509 - BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ #.#.#.#.
+ #.#.#.#.
+ #.#.#.#.
+ #.#.#.#.
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+250A - BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ...##...
+ ...##...
+ ........
+ ........
+ ...##...
+ ...##...
+ ........
+ ........
+ ...##...
+ ...##...
+ ........
+ ........
+ ...##...
+ ...##...
+ ........
+-----------------------------------------------------
+U+250B - BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ..####..
+ ..####..
+ ........
+ ........
+ ..####..
+ ..####..
+ ........
+ ........
+ ..####..
+ ..####..
+ ........
+ ........
+ ..####..
+ ..####..
+ ........
+-----------------------------------------------------
+U+250C - BOX DRAWINGS LIGHT DOWN AND RIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ...#####
+ ...#####
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+250D - BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ...#####
+ ...#####
+ ...#####
+ ...#####
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+250E - BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ..######
+ ..######
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+250F - BOX DRAWINGS HEAVY DOWN AND RIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ..######
+ ..######
+ ..######
+ ..######
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+2510 - BOX DRAWINGS LIGHT DOWN AND LEFT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ #####...
+ #####...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+2511 - BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ #####...
+ #####...
+ #####...
+ #####...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+2512 - BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ######..
+ ######..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+2513 - BOX DRAWINGS HEAVY DOWN AND LEFT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ######..
+ ######..
+ ######..
+ ######..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+2514 - BOX DRAWINGS LIGHT UP AND RIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...#####
+ ...#####
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2515 - BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...#####
+ ...#####
+ ...#####
+ ...#####
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2516 - BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..######
+ ..######
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2517 - BOX DRAWINGS HEAVY UP AND RIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..######
+ ..######
+ ..######
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2518 - BOX DRAWINGS LIGHT UP AND LEFT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ #####...
+ #####...
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2519 - BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ #####...
+ #####...
+ #####...
+ #####...
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+251A - BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ######..
+ ######..
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+251B - BOX DRAWINGS HEAVY UP AND LEFT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ######..
+ ######..
+ ######..
+ ######..
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+251C - BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...#####
+ ...#####
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+251D - BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...#####
+ ...#####
+ ...#####
+ ...#####
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+251E - BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..######
+ ..######
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+251F - BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ..######
+ ..######
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+2520 - BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..######
+ ..######
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+2521 - BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..######
+ ..######
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+2522 - BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ..######
+ ..######
+ ..######
+ ..######
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+2523 - BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..######
+ ..######
+ ..######
+ ..######
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+2524 - BOX DRAWINGS LIGHT VERTICAL AND LEFT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ #####...
+ #####...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+2525 - BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ #####...
+ #####...
+ #####...
+ #####...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+2526 - BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ######..
+ ######..
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+2527 - BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ######..
+ ######..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+2528 - BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ######..
+ ######..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+2529 - BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ######..
+ ######..
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+252A - BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ######..
+ ######..
+ ######..
+ ######..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+252B - BOX DRAWINGS HEAVY VERTICAL AND LEFT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ######..
+ ######..
+ ######..
+ ######..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+252C - BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ########
+ ########
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+252D - BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ #####...
+ ########
+ ########
+ #####...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+252E - BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ...#####
+ ########
+ ########
+ ...#####
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+252F - BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ########
+ ########
+ ########
+ ########
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+2530 - BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ########
+ ########
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+2531 - BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ######..
+ ########
+ ########
+ ######..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+2532 - BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ..######
+ ########
+ ########
+ ..######
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+2533 - BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ########
+ ########
+ ########
+ ########
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+2534 - BOX DRAWINGS LIGHT UP AND HORIZONTAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ########
+ ########
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2535 - BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ #####...
+ ########
+ ########
+ #####...
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2536 - BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...#####
+ ########
+ ########
+ ...#####
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2537 - BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ########
+ ########
+ ########
+ ########
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2538 - BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ########
+ ########
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2539 - BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ######..
+ ########
+ ########
+ ######..
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+253A - BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..######
+ ########
+ ########
+ ..######
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+253B - BOX DRAWINGS HEAVY UP AND HORIZONTAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ########
+ ########
+ ########
+ ########
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+253C - BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ########
+ ########
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+253D - BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ #####...
+ ########
+ ########
+ #####...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+253E - BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...#####
+ ########
+ ########
+ ...#####
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+253F - BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ########
+ ########
+ ########
+ ########
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+2540 - BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ########
+ ########
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+2541 - BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ########
+ ########
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+2542 - BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ########
+ ########
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+2543 - BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ######..
+ ########
+ ########
+ ######..
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+2544 - BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..######
+ ########
+ ########
+ ..######
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+2545 - BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ######..
+ ########
+ ########
+ ######..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+2546 - BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ..######
+ ########
+ ########
+ ..######
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+2547 - BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ########
+ ########
+ ########
+ ########
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+2548 - BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ########
+ ########
+ ########
+ ########
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+2549 - BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ######..
+ ########
+ ########
+ ######..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+254A - BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..######
+ ########
+ ########
+ ..######
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+254B - BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ########
+ ########
+ ########
+ ########
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+254C - BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ .##..##.
+ .##..##.
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+254D - BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ .##..##.
+ .##..##.
+ .##..##.
+ .##..##.
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+254E - BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ........
+ ........
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ........
+ ........
+-----------------------------------------------------
+U+254F - BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ........
+ ........
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ........
+ ........
+-----------------------------------------------------
+U+2550 - BOX DRAWINGS DOUBLE HORIZONTAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ########
+ ........
+ ........
+ ########
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2551 - BOX DRAWINGS DOUBLE VERTICAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+-----------------------------------------------------
+U+2552 - BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ...#####
+ ...##...
+ ...##...
+ ...#####
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+2553 - BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ..######
+ ..######
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+-----------------------------------------------------
+U+2554 - BOX DRAWINGS DOUBLE DOWN AND RIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ..######
+ ..#.....
+ ..#.....
+ ..#..###
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+-----------------------------------------------------
+U+2555 - BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ #####...
+ ...##...
+ ...##...
+ #####...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+2556 - BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ######..
+ ######..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+-----------------------------------------------------
+U+2557 - BOX DRAWINGS DOUBLE DOWN AND LEFT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ######..
+ .....#..
+ .....#..
+ ###..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+-----------------------------------------------------
+U+2558 - BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...#####
+ ...##...
+ ...##...
+ ...#####
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2559 - BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..######
+ ..######
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+255A - BOX DRAWINGS DOUBLE UP AND RIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..###
+ ..#.....
+ ..#.....
+ ..######
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+255B - BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ #####...
+ ...##...
+ ...##...
+ #####...
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+255C - BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ######..
+ ######..
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+255D - BOX DRAWINGS DOUBLE UP AND LEFT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ###..#..
+ .....#..
+ .....#..
+ ######..
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+255E - BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...#####
+ ...##...
+ ...##...
+ ...#####
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+255F - BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..###
+ ..#..###
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+-----------------------------------------------------
+U+2560 - BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..###
+ ..#.....
+ ..#.....
+ ..#..###
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+-----------------------------------------------------
+U+2561 - BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ #####...
+ ...##...
+ ...##...
+ #####...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+2562 - BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ###..#..
+ ###..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+-----------------------------------------------------
+U+2563 - BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ###..#..
+ .....#..
+ .....#..
+ ###..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+-----------------------------------------------------
+U+2564 - BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ########
+ ........
+ ........
+ ########
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+2565 - BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ########
+ ########
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+-----------------------------------------------------
+U+2566 - BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ########
+ ........
+ ........
+ ###..###
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+-----------------------------------------------------
+U+2567 - BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ########
+ ........
+ ........
+ ########
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2568 - BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ########
+ ########
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2569 - BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ###..###
+ ........
+ ........
+ ########
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+256A - BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ########
+ ...##...
+ ...##...
+ ########
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+256B - BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ########
+ ########
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+-----------------------------------------------------
+U+256C - BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ###..###
+ ........
+ ........
+ ###..###
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+-----------------------------------------------------
+U+256D - BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ......##
+ ....####
+ ....##..
+ ....##..
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+256E - BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ##......
+ ####....
+ ..##....
+ ..##....
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+256F - BOX DRAWINGS LIGHT ARC UP AND LEFT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ..##....
+ ..##....
+ ####....
+ ##......
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2570 - BOX DRAWINGS LIGHT ARC UP AND RIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ....##..
+ ....##..
+ ....####
+ ......##
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2571 - BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ .......#
+ ......##
+ ......##
+ .....##.
+ .....##.
+ ....##..
+ ....##..
+ ...##...
+ ...##...
+ ..##....
+ ..##....
+ .##.....
+ .##.....
+ ##......
+ ##......
+ #.......
+-----------------------------------------------------
+U+2572 - BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ #.......
+ ##......
+ ##......
+ .##.....
+ .##.....
+ ..##....
+ ..##....
+ ...##...
+ ...##...
+ ....##..
+ ....##..
+ .....##.
+ .....##.
+ ......##
+ ......##
+ .......#
+-----------------------------------------------------
+U+2573 - BOX DRAWINGS LIGHT DIAGONAL CROSS
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ #......#
+ ##....##
+ ##....##
+ .##..##.
+ .##..##.
+ ..####..
+ ..####..
+ ...##...
+ ...##...
+ ..####..
+ ..####..
+ .##..##.
+ .##..##.
+ ##....##
+ ##....##
+ #......#
+-----------------------------------------------------
+U+2574 - BOX DRAWINGS LIGHT LEFT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ####....
+ ####....
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2575 - BOX DRAWINGS LIGHT UP
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2576 - BOX DRAWINGS LIGHT RIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ....####
+ ....####
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2577 - BOX DRAWINGS LIGHT DOWN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+2578 - BOX DRAWINGS HEAVY LEFT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ####....
+ ####....
+ ####....
+ ####....
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2579 - BOX DRAWINGS HEAVY UP
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+257A - BOX DRAWINGS HEAVY RIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ....####
+ ....####
+ ....####
+ ....####
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+257B - BOX DRAWINGS HEAVY DOWN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+257C - BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ....####
+ ########
+ ########
+ ....####
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+257D - BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+-----------------------------------------------------
+U+257E - BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ####....
+ ########
+ ########
+ ####....
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+257F - BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ..####..
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+ ...##...
+-----------------------------------------------------
+U+2580 - UPPER HALF BLOCK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2581 - LOWER ONE EIGHTH BLOCK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ########
+ ########
+-----------------------------------------------------
+U+2582 - LOWER ONE QUARTER BLOCK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ########
+ ########
+ ########
+ ########
+-----------------------------------------------------
+U+2583 - LOWER THREE EIGHTHS BLOCK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+-----------------------------------------------------
+U+2584 - LOWER HALF BLOCK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+-----------------------------------------------------
+U+2585 - LOWER FIVE EIGHTHS BLOCK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+-----------------------------------------------------
+U+2586 - LOWER THREE QUARTERS BLOCK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+-----------------------------------------------------
+U+2587 - LOWER SEVEN EIGHTHS BLOCK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+-----------------------------------------------------
+U+2588 - FULL BLOCK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+-----------------------------------------------------
+U+2589 - LEFT SEVEN EIGHTHS BLOCK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ #######.
+ #######.
+ #######.
+ #######.
+ #######.
+ #######.
+ #######.
+ #######.
+ #######.
+ #######.
+ #######.
+ #######.
+ #######.
+ #######.
+ #######.
+ #######.
+-----------------------------------------------------
+U+258A - LEFT THREE QUARTERS BLOCK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ######..
+ ######..
+ ######..
+ ######..
+ ######..
+ ######..
+ ######..
+ ######..
+ ######..
+ ######..
+ ######..
+ ######..
+ ######..
+ ######..
+ ######..
+ ######..
+-----------------------------------------------------
+U+258B - LEFT FIVE EIGHTHS BLOCK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ #####...
+ #####...
+ #####...
+ #####...
+ #####...
+ #####...
+ #####...
+ #####...
+ #####...
+ #####...
+ #####...
+ #####...
+ #####...
+ #####...
+ #####...
+ #####...
+-----------------------------------------------------
+U+258C - LEFT HALF BLOCK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+-----------------------------------------------------
+U+258D - LEFT THREE EIGHTHS BLOCK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ###.....
+ ###.....
+ ###.....
+ ###.....
+ ###.....
+ ###.....
+ ###.....
+ ###.....
+ ###.....
+ ###.....
+ ###.....
+ ###.....
+ ###.....
+ ###.....
+ ###.....
+ ###.....
+-----------------------------------------------------
+U+258E - LEFT ONE QUARTER BLOCK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ##......
+ ##......
+ ##......
+ ##......
+ ##......
+ ##......
+ ##......
+ ##......
+ ##......
+ ##......
+ ##......
+ ##......
+ ##......
+ ##......
+ ##......
+ ##......
+-----------------------------------------------------
+U+258F - LEFT ONE EIGHTH BLOCK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ #.......
+ #.......
+ #.......
+ #.......
+ #.......
+ #.......
+ #.......
+ #.......
+ #.......
+ #.......
+ #.......
+ #.......
+ #.......
+ #.......
+ #.......
+ #.......
+-----------------------------------------------------
+U+2590 - RIGHT HALF BLOCK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+-----------------------------------------------------
+U+2591 - LIGHT SHADE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ..#...#.
+ #...#...
+ ..#...#.
+ #...#...
+ ..#...#.
+ #...#...
+ ..#...#.
+ #...#...
+ ..#...#.
+ #...#...
+ ..#...#.
+ #...#...
+ ..#...#.
+ #...#...
+ ..#...#.
+ #...#...
+-----------------------------------------------------
+U+2592 - MEDIUM SHADE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ .#.#.#.#
+ #.#.#.#.
+ .#.#.#.#
+ #.#.#.#.
+ .#.#.#.#
+ #.#.#.#.
+ .#.#.#.#
+ #.#.#.#.
+ .#.#.#.#
+ #.#.#.#.
+ .#.#.#.#
+ #.#.#.#.
+ .#.#.#.#
+ #.#.#.#.
+ .#.#.#.#
+ #.#.#.#.
+-----------------------------------------------------
+U+2593 - DARK SHADE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ##.###.#
+ .###.###
+ ##.###.#
+ .###.###
+ ##.###.#
+ .###.###
+ ##.###.#
+ .###.###
+ ##.###.#
+ .###.###
+ ##.###.#
+ .###.###
+ ##.###.#
+ .###.###
+ ##.###.#
+ .###.###
+-----------------------------------------------------
+U+2594 - UPPER ONE EIGHTH BLOCK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ########
+ ########
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2595 - RIGHT ONE EIGHTH BLOCK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ .......#
+ .......#
+ .......#
+ .......#
+ .......#
+ .......#
+ .......#
+ .......#
+ .......#
+ .......#
+ .......#
+ .......#
+ .......#
+ .......#
+ .......#
+ .......#
+-----------------------------------------------------
+U+2596 - QUADRANT LOWER LEFT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+-----------------------------------------------------
+U+2597 - QUADRANT LOWER RIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+-----------------------------------------------------
+U+2598 - QUADRANT UPPER LEFT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2599 - QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+-----------------------------------------------------
+U+259A - QUADRANT UPPER LEFT AND LOWER RIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+-----------------------------------------------------
+U+259B - QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+-----------------------------------------------------
+U+259C - QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+-----------------------------------------------------
+U+259D - QUADRANT UPPER RIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+259E - QUADRANT UPPER RIGHT AND LOWER LEFT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+ ####....
+-----------------------------------------------------
+U+259F - QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ....####
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+ ########
+-----------------------------------------------------
+U+25F0 - WHITE SQUARE WITH UPPER LEFT QUADRANT
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ #######. ..###### #######. .#######
+ #######. ..##.### #######. .#######
+ ##.#.##. ..##.### ##.#.##. .##.#.##
+ ##.#.##. .##.#.## ##.#.##. .##.#.##
+ ##.#.##. .##.#.## ##.#.##. .##.#.#.
+ ####.##. .####.## ####.##. ####.##.
+ ####.##. .####.## ####.##. ####.##.
+ ##...##. ##...##. ##...##. ##...##.
+ ##...##. ##...##. ##...##. ##...##.
+ ##...##. ##...##. ##...##. ##...##.
+ #######. #######. #######. #######.
+ #######. ######.. #######. #######.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+25AA - BLACK SMALL SQUARE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ..####.. ...####. ..#####. ..#####.
+ ..####.. ...####. ..#####. ..#####.
+ ..####.. ..####.. ..#####. .#####..
+ ..####.. ..####.. ..#####. .#####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+25B2 - BLACK UP-POINTING TRIANGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ...#....
+ ...#....
+ ..###...
+ ..###...
+ .#####..
+ .#####..
+ #######.
+ #######.
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+25B3 - WHITE UP-POINTING TRIANGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ...#....
+ ...#....
+ ..###...
+ ..#.#...
+ .##.##..
+ .#...#..
+ ##...##.
+ #######.
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+25B4 - BLACK UP-POINTING SMALL TRIANGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ...#....
+ ...#....
+ ..###...
+ ..###...
+ .#####..
+ .#####..
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+25B5 - WHITE UP-POINTING SMALL TRIANGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ ...#....
+ ...#....
+ ..###...
+ ..#.#...
+ .##.##..
+ .#####..
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+25B6 - BLACK RIGHT-POINTING TRIANGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ #.......
+ ###.....
+ #####...
+ #######.
+ #######.
+ #####...
+ ###.....
+ #.......
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+25B7 - WHITE RIGHT-POINTING TRIANGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ #.......
+ ###.....
+ #.###...
+ #....##.
+ #....##.
+ #.###...
+ ###.....
+ #.......
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+25B8 - BLACK RIGHT-POINTING SMALL TRIANGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ .#......
+ .###....
+ .#####..
+ .#####..
+ .###....
+ .#......
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+25B9 - WHITE RIGHT-POINTING SMALL TRIANGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ .#......
+ .###....
+ .#..##..
+ .#..##..
+ .###....
+ .#......
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+25BA - BLACK RIGHT-POINTING POINTER
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ #.......
+ ###.....
+ #####...
+ #######.
+ #######.
+ #####...
+ ###.....
+ #.......
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+25BB - WHITE RIGHT-POINTING POINTER
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ #.......
+ ###.....
+ #.###...
+ #....##.
+ #....##.
+ #.###...
+ ###.....
+ #.......
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+25BC - BLACK DOWN-POINTING TRIANGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ #######.
+ #######.
+ .#####..
+ .#####..
+ ..###...
+ ..###...
+ ...#....
+ ...#....
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+25BD - WHITE DOWN-POINTING TRIANGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ #######.
+ ##...##.
+ .#...#..
+ .##.##..
+ ..#.#...
+ ..###...
+ ...#....
+ ...#....
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+25BE - BLACK DOWN-POINTING SMALL TRIANGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ .#####..
+ .#####..
+ ..###...
+ ..###...
+ ...#....
+ ...#....
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+25BF - WHITE DOWN-POINTING SMALL TRIANGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ .#####..
+ .##.##..
+ ..#.#...
+ ..###...
+ ...#....
+ ...#....
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+25C0 - BLACK LEFT-POINTING TRIANGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ......#.
+ ....###.
+ ..#####.
+ #######.
+ #######.
+ ..#####.
+ ....###.
+ ......#.
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+25C1 - WHITE LEFT-POINTING TRIANGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ......#.
+ ....###.
+ ..###.#.
+ ##....#.
+ ##....#.
+ ..###.#.
+ ....###.
+ ......#.
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+25C2 - BLACK LEFT-POINTING SMALL TRIANGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ .....#..
+ ...###..
+ .#####..
+ .#####..
+ ...###..
+ .....#..
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+25C3 - WHITE LEFT-POINTING SMALL TRIANGLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ .....#..
+ ...###..
+ .##..#..
+ .##..#..
+ ...###..
+ .....#..
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+25C4 - BLACK LEFT-POINTING POINTER
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ......#.
+ ....###.
+ ..#####.
+ #######.
+ #######.
+ ..#####.
+ ....###.
+ ......#.
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+25C5 - WHITE LEFT-POINTING POINTER
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ......#.
+ ....###.
+ ..###.#.
+ ##....#.
+ ##....#.
+ ..###.#.
+ ....###.
+ ......#.
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+25CB - WHITE CIRCLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ..####.. ...####. ..####.. ...####.
+ .######. ..###### .######. .######.
+ .##..##. ..##..## .##..##. .###..#.
+ .##..##. .##..##. .##..##. .##..##.
+ .######. .######. .######. .######.
+ ..####.. ..####.. ..####.. ..####..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+2603 - SNOWMAN
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ..###...
+ .#####..
+ ..#.#...
+ .#...#..
+ ..#.#...
+ .#.#.#..
+ #.....#.
+ #.....#.
+ #.....#.
+ #.....#.
+ .#...#..
+ ..###...
+ ........
+ ........
+-----------------------------------------------------
+U+263A - WHITE SMILING FACE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ..###...
+ .#...#..
+ #.....#.
+ #.#.#.#.
+ #.....#.
+ #.###.#.
+ #..#..#.
+ .#...#..
+ ..###...
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+263B - BLACK SMILING FACE
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ..###...
+ .#####..
+ #######.
+ ##.#.##.
+ #######.
+ #.###.#.
+ ##...##.
+ .#####..
+ ..###...
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+2713 - CHECK MARK
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .....##. .......# .....##. ......##
+ .....##. .......# ....###. .....###
+ ....##.. ......## ....###. .....###
+ ....##.. .....##. ...###.. ....###.
+ ....##.. .....##. ...###.. ....###.
+ ...##... ....##.. ..###... ..###...
+ ...##... ....##.. #####... #####...
+ ##.##... ##.##... #####... #####...
+ ####.... ####.... ####.... ####....
+ .###.... .###.... .###.... .###....
+ ..#..... ..#..... ..#..... ..#.....
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+2717 - BALLOT X
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ .##.##.. ...##.#. .##.##.. ..##.##.
+ #######. ..###### #######. .#######
+ ##.#.##. .##.#.## ##.#.##. .##.#.##
+ ##...##. .##...## ###.###. .###.###
+ .##.##.. ..##.##. .##.##.. .##.##..
+ .##.##.. ..####.. .##.##.. .##.##..
+ .##.##.. .##.##.. .##.##.. .##.##..
+ ##...##. ##...##. ###.###. ###.###.
+ ##.#.##. ##.#.##. ##.#.##. ##.#.##.
+ #######. #######. #######. #######.
+ .##.##.. .##.##.. .##.##.. .##.##..
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+2721 - STAR OF DAVID
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ...#....
+ ...#....
+ ..#.#...
+ #######.
+ .##.##..
+ .##.##..
+ #######.
+ ..#.#...
+ ...#....
+ ...#....
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+3007 - IDEOGRAPHIC NUMBER ZERO
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ..###...
+ .#...#..
+ .#...#..
+ #.....#.
+ #.....#.
+ #.....#.
+ #.....#.
+ .#...#..
+ .#...#..
+ ..###...
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+4E00 - <CJK Ideograph, First>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ........
+ ........
+ ........
+ ........
+ #######.
+ #######.
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+4E03 - <CJK Ideograph, Seventh>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ..#.....
+ ..#.....
+ ..#...#.
+ ..####..
+ ###.....
+ ..#.....
+ ..#.....
+ ..#...#.
+ ..#...#.
+ ..####..
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+4E07 - <CJK Ideograph, Ten Thousanth>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ #######.
+ ..#.....
+ ..#.....
+ ..####..
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ .#...#..
+ .#...#..
+ #..##...
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+4E09 - <CJK Ideograph, Third>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ .#####..
+ .#####..
+ ........
+ ........
+ ..###...
+ ..###...
+ ........
+ ........
+ #######.
+ #######.
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+4E5D - <CJK Ideograph, Ninth>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ..#.....
+ ..#.....
+ ######..
+ ..#..#..
+ ..#.#...
+ ..#.#...
+ ..#.#...
+ .#..#.#.
+ .#..#.#.
+ #...##..
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+4E8C - <CJK Ideograph, Second>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ .#####..
+ .#####..
+ ........
+ ........
+ ........
+ ........
+ ........
+ ........
+ #######.
+ #######.
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+4E94 - <CJK Ideograph, Fifth>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ #######.
+ ....#...
+ ...#....
+ ...#....
+ .######.
+ ...#..#.
+ ..#..#..
+ ..#..#..
+ ..#..#..
+ #######.
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+4EBF - <Hundred million, many>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ..#.###.
+ ..#...#.
+ .#...#..
+ .#...#..
+ ##..#...
+ .#..#...
+ .#.#....
+ .#.#..#.
+ .#.####.
+ .#......
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+516B - <CJK Ideograph, Eighth>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ...##...
+ ..#.#...
+ ..#.#...
+ ..#.#...
+ .#...#..
+ .#...#..
+ .#...#..
+ .#...#..
+ .#...#..
+ #.....#.
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+516D - <CJK Ideograph, Sixth>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ...#....
+ ...#....
+ ...#....
+ #######.
+ ........
+ ..#.#...
+ ..#..#..
+ ..#..#..
+ .#....#.
+ #.....#.
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+5341 - <CJK Ideograph, Tenth>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ...#....
+ ...#....
+ ...#....
+ ...#....
+ #######.
+ ...#....
+ ...#....
+ ...#....
+ ...#....
+ ...#....
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+5343 - <CJK Ideograph, Thousandth>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ....###.
+ ####....
+ ...#....
+ ...#....
+ #######.
+ ...#....
+ ...#....
+ ...#....
+ ...#....
+ ...#....
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+56DB - <CJK Ideograph, Fourth>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ #######.
+ #######.
+ #.#.#.#.
+ #.#.#.#.
+ #.#.#.#.
+ ##..###.
+ ##....#.
+ #.....#.
+ #######.
+ #.....#.
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+767E - <CJK Ideograph, Hundredth>
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ #######.
+ ...#....
+ .#####..
+ .#...#..
+ .#...#..
+ .#####..
+ .#...#..
+ .#...#..
+ .#####..
+ .#...#..
+ ........
+ ........
+ ........
+ ........
+ ........
+-----------------------------------------------------
+U+FB01 - LATIN SMALL LIGATURE FI
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..####.. ....###. .#####.. ..#####.
+ .######. ...##### #######. .#######
+ .##..##. ...##.## ###.###. .###.###
+ .##..##. ...##.## ###.###. .###.###
+ .##..... ..##.... ###..... .###....
+ #######. .####### #######. .#######
+ #######. .####### #######. #######.
+ .##..##. ..##..## ###.###. ###.###.
+ .##..##. .##..##. ###.###. ###.###.
+ .##..##. .##..##. ###.###. ###.###.
+ .##..##. .##..##. ###.###. ###.###.
+ .##..##. .##..##. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+FB02 - LATIN SMALL LIGATURE FL
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........ ........ ........ ........
+ ..#####. ...##### .######. ..######
+ .######. ..###### #######. .#######
+ .##..##. ..##..## ###.###. .###.###
+ .##..##. ..##.##. ###.###. .###.###
+ .##..##. .##..##. ###.###. .###.###
+ ####.##. ####.##. #######. .#######
+ ####.##. ####.##. #######. #######.
+ .##..##. .##..##. ###.###. ###.###.
+ .##..##. ##..##.. ###.###. ###.###.
+ .##..##. ##..##.. ###.###. ###.###.
+ .##..##. ##..##.. ###.###. ###.###.
+ .##..##. ##..##.. ###.###. ###.###.
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+ ........ ........ ........ ........
+-----------------------------------------------------
+U+FFFC - OBJECT REPLACEMENT CHARACTER
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ #..##..#
+ ..#..#..
+ #.#..#.#
+ ...##...
+ #......#
+ ..###...
+ #.#..#.#
+ ..###...
+ #.#..#.#
+ ..###...
+ #......#
+ ..####..
+ #...#..#
+ ....#...
+ #.#.#..#
+ ...#....
+-----------------------------------------------------
+U+FFFD - REPLACEMENT CHARACTER
+- - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ........
+ ...#....
+ ..###...
+ ..###...
+ .##.##..
+ .#.#.#..
+ ####.##.
+ ###.###.
+ .##.##..
+ .#####..
+ ..#.#...
+ ..###...
+ ...#....
+ ........
+ ........
+ ........
+-----------------------------------------------------
diff --git a/framebuffer/schedule.c b/framebuffer/schedule.c
index 43f531838..151b6f99f 100644
--- a/framebuffer/schedule.c
+++ b/framebuffer/schedule.c
@@ -20,10 +20,15 @@
#include <time.h>
#include <stdlib.h>
-#include "utils/schedule.h"
+#include "utils/log.h"
+
#include "framebuffer/schedule.h"
-#include "utils/log.h"
+#ifdef DEBUG_SCHEDULER
+#define SRLOG(x) LOG(x)
+#else
+#define SRLOG(x)
+#endif
/* linked list of scheduled callbacks */
static struct nscallback *schedule_list = NULL;
@@ -39,39 +44,6 @@ struct nscallback
void *p;
};
-
-/**
- * Schedule a callback.
- *
- * \param tival interval before the callback should be made / cs
- * \param callback callback function
- * \param p user parameter, passed to callback function
- *
- * The callback function will be called as soon as possible after t cs have
- * passed.
- */
-
-void schedule(int cs_ival, void (*callback)(void *p), void *p)
-{
- struct nscallback *nscb;
- struct timeval tv;
-
- tv.tv_sec = cs_ival / 100; /* cs to seconds */
- tv.tv_usec = (cs_ival % 100) * 10000; /* remainder to microseconds */
-
- nscb = calloc(1, sizeof(struct nscallback));
-
- gettimeofday(&nscb->tv, NULL);
- timeradd(&nscb->tv, &tv, &nscb->tv);
-
- nscb->callback = callback;
- nscb->p = p;
-
- /* add to list front */
- nscb->next = schedule_list;
- schedule_list = nscb;
-}
-
/**
* Unschedule a callback.
*
@@ -80,17 +52,18 @@ void schedule(int cs_ival, void (*callback)(void *p), void *p)
*
* All scheduled callbacks matching both callback and p are removed.
*/
-
-void schedule_remove(void (*callback)(void *p), void *p)
+static nserror schedule_remove(void (*callback)(void *p), void *p)
{
struct nscallback *cur_nscb;
struct nscallback *prev_nscb;
struct nscallback *unlnk_nscb;
- if (schedule_list == NULL)
- return;
+ /* check there is something on the list to remove */
+ if (schedule_list == NULL) {
+ return NSERROR_OK;
+ }
- LOG(("removing %p, %p", callback, p));
+ SRLOG(("removing %p, %p", callback, p));
cur_nscb = schedule_list;
prev_nscb = NULL;
@@ -100,7 +73,7 @@ void schedule_remove(void (*callback)(void *p), void *p)
(cur_nscb->p == p)) {
/* item to remove */
- LOG(("callback entry %p removing %p(%p)",
+ SRLOG(("callback entry %p removing %p(%p)",
cur_nscb, cur_nscb->callback, cur_nscb->p));
/* remove callback */
@@ -119,16 +92,45 @@ void schedule_remove(void (*callback)(void *p), void *p)
cur_nscb = prev_nscb->next;
}
}
+
+ return NSERROR_OK;
}
-/**
- * Process scheduled callbacks up to current time.
- *
- * @return The number of milliseconds untill the next scheduled event
- * or -1 for no event.
- */
-int
-schedule_run(void)
+/* exported function documented in framebuffer/schedule.h */
+nserror framebuffer_schedule(int tival, void (*callback)(void *p), void *p)
+{
+ struct nscallback *nscb;
+ struct timeval tv;
+ nserror ret;
+
+ /* ensure uniqueness of the callback and context */
+ ret = schedule_remove(callback, p);
+ if ((tival < 0) || (ret != NSERROR_OK)) {
+ return ret;
+ }
+
+ SRLOG(("Adding %p(%p) in %d", callback, p, tival));
+
+ tv.tv_sec = tival / 1000; /* miliseconds to seconds */
+ tv.tv_usec = (tival % 1000) * 1000; /* remainder to microseconds */
+
+ nscb = calloc(1, sizeof(struct nscallback));
+
+ gettimeofday(&nscb->tv, NULL);
+ timeradd(&nscb->tv, &tv, &nscb->tv);
+
+ nscb->callback = callback;
+ nscb->p = p;
+
+ /* add to list front */
+ nscb->next = schedule_list;
+ schedule_list = nscb;
+
+ return NSERROR_OK;
+}
+
+/* exported function documented in framebuffer/schedule.h */
+int schedule_run(void)
{
struct timeval tv;
struct timeval nexttime;
@@ -188,7 +190,8 @@ schedule_run(void)
/* make rettime relative to now */
timersub(&nexttime, &tv, &rettime);
- /*LOG(("returning time to next event as %ldms",(rettime.tv_sec * 1000) + (rettime.tv_usec / 1000))); */
+ SRLOG(("returning time to next event as %ldms",(rettime.tv_sec * 1000) + (rettime.tv_usec / 1000)));
+
/* return next event time in milliseconds (24days max wait) */
return (rettime.tv_sec * 1000) + (rettime.tv_usec / 1000);
}
diff --git a/framebuffer/schedule.h b/framebuffer/schedule.h
index 2c9b55f82..4e94da68e 100644
--- a/framebuffer/schedule.h
+++ b/framebuffer/schedule.h
@@ -19,7 +19,27 @@
#ifndef FRAMEBUFFER_SCHEDULE_H
#define FRAMEBUFFER_SCHEDULE_H
+/**
+ * Schedule a callback.
+ *
+ * \param tival interval before the callback should be made in ms
+ * \param callback callback function
+ * \param p user parameter, passed to callback function
+ *
+ * The callback function will be called as soon as possible after t ms have
+ * passed.
+ */
+
+nserror framebuffer_schedule(int tival, void (*callback)(void *p), void *p);
+
+/**
+ * Process scheduled callbacks up to current time.
+ *
+ * @return The number of milliseconds untill the next scheduled event
+ * or -1 for no event.
+ */
int schedule_run(void);
+
void list_schedule(void);
#endif
diff --git a/framebuffer/thumbnail.c b/framebuffer/thumbnail.c
index 53ff33609..0573e0758 100644
--- a/framebuffer/thumbnail.c
+++ b/framebuffer/thumbnail.c
@@ -22,8 +22,10 @@
#include <libnsfb_plot.h>
#include "utils/log.h"
+#include "utils/utils.h"
#include "desktop/thumbnail.h"
#include "content/urldb.h"
+#include "content/content.h"
#include "framebuffer/gui.h"
#include "framebuffer/fbtk.h"
diff --git a/gtk/Makefile.defaults b/gtk/Makefile.defaults
index 23d4c1749..b7382e71b 100644
--- a/gtk/Makefile.defaults
+++ b/gtk/Makefile.defaults
@@ -2,33 +2,42 @@
# GTK-specific options
# ----------------------------------------------------------------------------
- # Where to search for NetSurf's resources after looking in ~/.netsurf and
- # $NETSURFRES. It must have a trailing /
- NETSURF_GTK_RESOURCES := $(PREFIX)/share/netsurf/
+# Where to search for NetSurf's resources after looking in ~/.netsurf and
+# $NETSURFRES. It must have a trailing /
+NETSURF_GTK_RESOURCES := $(PREFIX)/share/netsurf/
- # Where to install the netsurf binary
- NETSURF_GTK_BIN := $(PREFIX)/bin/
+# Where to install the netsurf binary
+NETSURF_GTK_BIN := $(PREFIX)/bin/
- # Enable NetSurf's use of librsvg in conjunction with Cairo to display SVGs
- # Valid options: YES, NO, AUTO
- NETSURF_USE_RSVG := AUTO
+# Enable NetSurf's use of librsvg in conjunction with Cairo to display SVGs
+# Valid options: YES, NO, AUTO
+NETSURF_USE_RSVG := AUTO
- # Enable NetSurf's use of libsvgtiny for displaying SVGs
- # Valid options: YES, NO, AUTO
- NETSURF_USE_NSSVG := AUTO
+# Enable NetSurf's use of libsvgtiny for displaying SVGs
+# Valid options: YES, NO, AUTO
+NETSURF_USE_NSSVG := AUTO
- # Enable NetSurf's use of librosprite for displaying RISC OS Sprites
- # Valid options: YES, NO, AUTO
- NETSURF_USE_ROSPRITE := AUTO
+# Enable NetSurf's use of librosprite for displaying RISC OS Sprites
+# Valid options: YES, NO, AUTO
+NETSURF_USE_ROSPRITE := AUTO
- # Configuration overrides for Mac OS X
- ifeq ($(HOST),macosx)
+# Enable building the source object cache filesystem based backing store.
+NETSURF_FS_BACKING_STORE := YES
+
+# Configuration overrides for Mac OS X
+ifeq ($(HOST),macosx)
+ NETSURF_USE_LIBICONV_PLUG := NO
+ NETSURF_USE_HARU_PDF := NO
+endif
+
+# Configuration overrides for OpenBSD
+ifeq ($(HOST),OpenBSD)
NETSURF_USE_LIBICONV_PLUG := NO
NETSURF_USE_HARU_PDF := NO
- endif
+endif
- # Set default GTK version to build for (2 or 3)
- NETSURF_GTK_MAJOR := 2
+# Set default GTK version to build for (2 or 3)
+NETSURF_GTK_MAJOR := 2
- # Optimisation levels
- CFLAGS += -O2
+# Optimisation levels
+CFLAGS += -O2
diff --git a/gtk/Makefile.target b/gtk/Makefile.target
index ae67fd7f4..05865ff74 100644
--- a/gtk/Makefile.target
+++ b/gtk/Makefile.target
@@ -44,14 +44,13 @@ GTKDEPFLAGS := -DG_DISABLE_SINGLE_INCLUDES \
# libsexy currently means we cannot enable this
# -DGDK_DISABLE_DEPRECATED
-GTKCFLAGS := -std=c99 -Dgtk -Dnsgtk \
+GTKCFLAGS := -std=c99 -Dgtk -Dnsgtk -g \
$(GTKDEPFLAGS) \
-D_BSD_SOURCE \
-D_XOPEN_SOURCE=600 \
- -D_POSIX_C_SOURCE=200112L \
+ -D_POSIX_C_SOURCE=200809L \
-D_NETBSD_SOURCE \
- -DGTK_RESPATH=\"$(NETSURF_GTK_RESOURCES)\" \
- $(WARNFLAGS) -g
+ -DGTK_RESPATH=\"$(NETSURF_GTK_RESOURCES)\"
# non optional pkg-configed libs
$(eval $(call pkg_config_find_and_add,libcss,CSS))
@@ -62,8 +61,6 @@ $(eval $(call pkg_config_find_and_add,libcurl,Curl ))
$(eval $(call pkg_config_find_and_add,gtk+-$(NETSURF_GTK_MAJOR).0,GTK-$(NETSURF_GTK_MAJOR)))
$(eval $(call pkg_config_find_and_add,gthread-2.0,GThread2))
$(eval $(call pkg_config_find_and_add,gmodule-2.0,GModule2))
-$(eval $(call pkg_config_find_and_add,lcms,lcms))
-
CFLAGS += $(GTKCFLAGS)
LDFLAGS += -lm
@@ -109,10 +106,10 @@ $(eval $(foreach V,$(filter GTK_IMAGE_%,$(.VARIABLES)),$(call convert_image,$($(
# S_GTK are sources purely for the GTK build
S_GTK := font_pango.c bitmap.c gui.c schedule.c thumbnail.c plotters.c \
treeview.c scaffolding.c gdk.c completion.c login.c throbber.c \
- selection.c history.c window.c filetype.c download.c menu.c \
+ selection.c history.c window.c fetch.c download.c menu.c \
print.c search.c tabs.c theme.c toolbar.c gettext.c \
- compat.c cookies.c hotlist.c \
- $(addprefix dialogs/,preferences.c about.c source.c)
+ compat.c cookies.c hotlist.c viewdata.c viewsource.c \
+ $(addprefix dialogs/,preferences.c about.c)
S_GTK := $(addprefix gtk/,$(S_GTK)) $(addprefix utils/,container.c)
# code in utils/container.ch is non-universal it seems
@@ -127,28 +124,31 @@ EXETARGET := nsgtk
# Install target
# ----------------------------------------------------------------------------
-GTK_RESOURCES_LIST := adblock.css arrow_down_8x32.png ca-bundle.txt default.css \
- default.ico favicon.png gtkdefault.css internal.css \
- languages license netsurf.png netsurf.xpm \
- netsurf-16x16.xpm quirks.css themelist toolbarIndices \
- SearchEngines
-GTK_RESOURCES_LIST := $(addprefix gtk/res/, $(GTK_RESOURCES_LIST)) \
- $(wildcard gtk/res/*.gtk*.ui)
+GTK_RESOURCES_LIST := \
+ languages themelist SearchEngines toolbarIndices ca-bundle.txt \
+ default.css adblock.css quirks.css internal.css gtkdefault.css \
+ credits.html licence.html welcome.html Messages \
+ default.ico favicon.png netsurf.png netsurf.xpm netsurf-16x16.xpm \
+ arrow_down_8x32.png
+
+GTK_RESOURCES_LIST := \
+ $(addprefix gtk/res/, $(GTK_RESOURCES_LIST)) \
+ $(wildcard gtk/res/*.gtk$(NETSURF_GTK_MAJOR).ui)
# translations with more than just Messages files
GTK_TRANSLATIONS_HTML := de en fr it ja nl
install-gtk:
- $(Q)mkdir -p $(DESTDIR)$(NETSURF_GTK_RESOURCES)throbber
- $(Q)mkdir -p $(DESTDIR)$(NETSURF_GTK_RESOURCES)icons
$(Q)mkdir -p $(DESTDIR)$(NETSURF_GTK_BIN)
$(Q)install nsgtk $(DESTDIR)$(NETSURF_GTK_BIN)netsurf
- $(Q)install -m 0644 $(GTK_RESOURCES_LIST) $(DESTDIR)$(NETSURF_GTK_RESOURCES)
+ $(Q)mkdir -p $(DESTDIR)$(NETSURF_GTK_RESOURCES)icons
$(Q)install -m 0644 gtk/res/icons/*.png $(DESTDIR)$(NETSURF_GTK_RESOURCES)/icons
+ $(Q)mkdir -p $(DESTDIR)$(NETSURF_GTK_RESOURCES)throbber
$(Q)install -m 0644 gtk/res/throbber/*.png $(DESTDIR)$(NETSURF_GTK_RESOURCES)/throbber
$(Q)tar -c -h -C gtk/res -f - themes | tar -xv -C $(DESTDIR)$(NETSURF_GTK_RESOURCES) -f -
- $(Q)tar -c -h -C gtk/res -f - C $(GTK_TRANSLATIONS_HTML) | tar -xv -C $(DESTDIR)$(NETSURF_GTK_RESOURCES) -f -
+ $(Q)tar -c -h -C gtk/res -f - $(GTK_TRANSLATIONS_HTML) | tar -xv -C $(DESTDIR)$(NETSURF_GTK_RESOURCES) -f -
$(call split_install_messages, gtk, $(DESTDIR)$(NETSURF_GTK_RESOURCES))
+ $(Q)install -m 0644 $(GTK_RESOURCES_LIST) $(DESTDIR)$(NETSURF_GTK_RESOURCES)
# ----------------------------------------------------------------------------
# Package target
diff --git a/gtk/bitmap.c b/gtk/bitmap.c
index 96e9edaee..3ae211497 100644
--- a/gtk/bitmap.c
+++ b/gtk/bitmap.c
@@ -187,48 +187,76 @@ unsigned char *bitmap_get_buffer(void *vbitmap)
struct bitmap *gbitmap = (struct bitmap *)vbitmap;
int pixel_loop;
int pixel_count;
- uint32_t *pixels;
- uint32_t pixel;
+ uint8_t *pixels;
+ uint32_t t, r, g, b;
cairo_format_t fmt;
assert(gbitmap);
cairo_surface_flush(gbitmap->surface);
- pixels = (uint32_t *)cairo_image_surface_get_data(gbitmap->surface);
+ pixels = cairo_image_surface_get_data(gbitmap->surface);
if (!gbitmap->converted)
- return (unsigned char *) pixels;
+ return pixels;
fmt = cairo_image_surface_get_format(gbitmap->surface);
pixel_count = cairo_image_surface_get_width(gbitmap->surface) *
cairo_image_surface_get_height(gbitmap->surface);
if (fmt == CAIRO_FORMAT_RGB24) {
+ /* Opaque image */
for (pixel_loop=0; pixel_loop < pixel_count; pixel_loop++) {
- pixel = pixels[pixel_loop];
- pixels[pixel_loop] = (pixel & 0xff00ff00) |
- ((pixel & 0xff) << 16) |
- ((pixel & 0xff0000) >> 16);
+ /* Cairo surface is ARGB, written in native endian */
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ b = pixels[4 * pixel_loop + 0];
+ g = pixels[4 * pixel_loop + 1];
+ r = pixels[4 * pixel_loop + 2];
+ t = pixels[4 * pixel_loop + 3];
+#else
+ t = pixels[4 * pixel_loop + 0];
+ r = pixels[4 * pixel_loop + 1];
+ g = pixels[4 * pixel_loop + 2];
+ b = pixels[4 * pixel_loop + 3];
+#endif
+
+ /* Core bitmaps always have a component order of rgba,
+ * regardless of system endianness */
+ pixels[4 * pixel_loop + 0] = r;
+ pixels[4 * pixel_loop + 1] = g;
+ pixels[4 * pixel_loop + 2] = b;
+ pixels[4 * pixel_loop + 3] = t;
}
} else {
- uint32_t t, r, g, b;
+ /* Alpha image: de-multiply alpha */
for (pixel_loop=0; pixel_loop < pixel_count; pixel_loop++) {
- pixel = pixels[pixel_loop];
- t = (pixel & 0xff000000) >> 24;
- if (t == 0) {
- pixels[pixel_loop] = 0;
- } else {
- r = ((pixel & 0xff0000) >> 8) / t;
- g = ((pixel & 0xff00)) / t;
- b = ((pixel & 0xff) << 8) / t;
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ b = pixels[4 * pixel_loop + 0];
+ g = pixels[4 * pixel_loop + 1];
+ r = pixels[4 * pixel_loop + 2];
+ t = pixels[4 * pixel_loop + 3];
+#else
+ t = pixels[4 * pixel_loop + 0];
+ r = pixels[4 * pixel_loop + 1];
+ g = pixels[4 * pixel_loop + 2];
+ b = pixels[4 * pixel_loop + 3];
+#endif
+
+ if (t != 0) {
+ r = (r << 8) / t;
+ g = (g << 8) / t;
+ b = (b << 8) / t;
r = (r > 255) ? 255 : r;
g = (g > 255) ? 255 : g;
b = (b > 255) ? 255 : b;
-
- pixels[pixel_loop] = (t << 24) |
- (r) | (g << 8) | (b << 16);
+ } else {
+ r = g = b = 0;
}
+
+ pixels[4 * pixel_loop + 0] = r;
+ pixels[4 * pixel_loop + 1] = g;
+ pixels[4 * pixel_loop + 2] = b;
+ pixels[4 * pixel_loop + 3] = t;
}
}
@@ -319,8 +347,8 @@ void bitmap_modified(void *vbitmap) {
struct bitmap *gbitmap = (struct bitmap *)vbitmap;
int pixel_loop;
int pixel_count;
- uint32_t *pixels;
- uint32_t pixel;
+ uint8_t *pixels;
+ uint32_t t, r, g, b;
cairo_format_t fmt;
assert(gbitmap);
@@ -329,7 +357,7 @@ void bitmap_modified(void *vbitmap) {
pixel_count = cairo_image_surface_get_width(gbitmap->surface) *
cairo_image_surface_get_height(gbitmap->surface);
- pixels = (uint32_t *)cairo_image_surface_get_data(gbitmap->surface);
+ pixels = cairo_image_surface_get_data(gbitmap->surface);
if (gbitmap->converted) {
cairo_surface_mark_dirty(gbitmap->surface);
@@ -337,30 +365,55 @@ void bitmap_modified(void *vbitmap) {
}
if (fmt == CAIRO_FORMAT_RGB24) {
+ /* Opaque image */
for (pixel_loop=0; pixel_loop < pixel_count; pixel_loop++) {
- pixel = pixels[pixel_loop];
- pixels[pixel_loop] = (pixel & 0xff00ff00) |
- ((pixel & 0xff) << 16) |
- ((pixel & 0xff0000) >> 16);
+ /* Core bitmaps always have a component order of rgba,
+ * regardless of system endianness */
+ r = pixels[4 * pixel_loop + 0];
+ g = pixels[4 * pixel_loop + 1];
+ b = pixels[4 * pixel_loop + 2];
+ t = pixels[4 * pixel_loop + 3];
+
+ /* Cairo surface is ARGB, written in native endian */
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ pixels[4 * pixel_loop + 0] = b;
+ pixels[4 * pixel_loop + 1] = g;
+ pixels[4 * pixel_loop + 2] = r;
+ pixels[4 * pixel_loop + 3] = t;
+#else
+ pixels[4 * pixel_loop + 0] = t;
+ pixels[4 * pixel_loop + 1] = r;
+ pixels[4 * pixel_loop + 2] = g;
+ pixels[4 * pixel_loop + 3] = b;
+#endif
}
} else {
- uint8_t t, r, g, b;
+ /* Alpha image: pre-multiply alpha */
for (pixel_loop=0; pixel_loop < pixel_count; pixel_loop++) {
- pixel = pixels[pixel_loop];
- t = (pixel & 0xff000000) >> 24;
- if (t == 0) {
- pixels[pixel_loop] = 0;
+ r = pixels[4 * pixel_loop + 0];
+ g = pixels[4 * pixel_loop + 1];
+ b = pixels[4 * pixel_loop + 2];
+ t = pixels[4 * pixel_loop + 3];
+
+ if (t != 0) {
+ r = ((r * (t + 1)) >> 8) & 0xff;
+ g = ((g * (t + 1)) >> 8) & 0xff;
+ b = ((b * (t + 1)) >> 8) & 0xff;
} else {
- r = (pixel & 0xff0000) >> 16;
- g = (pixel & 0xff00) >> 8;
- b = pixel & 0xff;
-
- pixels[pixel_loop] = (t << 24) |
- ((r * t) >> 8) |
- ((g * t) >> 8) << 8 |
- ((b * t) >> 8) << 16;
-
+ r = g = b = 0;
}
+
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ pixels[4 * pixel_loop + 0] = b;
+ pixels[4 * pixel_loop + 1] = g;
+ pixels[4 * pixel_loop + 2] = r;
+ pixels[4 * pixel_loop + 3] = t;
+#else
+ pixels[4 * pixel_loop + 0] = t;
+ pixels[4 * pixel_loop + 1] = r;
+ pixels[4 * pixel_loop + 2] = g;
+ pixels[4 * pixel_loop + 3] = b;
+#endif
}
}
diff --git a/gtk/compat.h b/gtk/compat.h
index b8c91d914..ee2ebb293 100644
--- a/gtk/compat.h
+++ b/gtk/compat.h
@@ -23,6 +23,8 @@
#ifndef NETSURF_GTK_COMPAT_H_
#define NETSURF_GTK_COMPAT_H_
+#include <stdint.h>
+
#include <gtk/gtk.h>
void nsgtk_widget_set_can_focus(GtkWidget *widget, gboolean can_focus);
diff --git a/gtk/dialogs/about.c b/gtk/dialogs/about.c
index 3ebb4c078..a86bfe70f 100644
--- a/gtk/dialogs/about.c
+++ b/gtk/dialogs/about.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2008 Mike Lester <element3260@gmail.com>
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -16,63 +16,56 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+/**
+ * \file gtk/dialogs/about.c
+ *
+ * Implementation of gtk about dialog.
+ */
+
#include <stdint.h>
+#include "utils/utils.h"
+#include "utils/messages.h"
+#include "utils/nsoption.h"
+#include "desktop/browser.h"
+
#include "gtk/compat.h"
#include "gtk/gui.h"
#include "gtk/dialogs/about.h"
-#include "desktop/browser.h"
-
+/**
+ * About dialog information button click.
+ *
+ * \param button The button widget that was clicked
+ * \param data The text of the url to open
+ */
static void
-nsgtk_about_dialog_credits(GtkWidget *button, gpointer data)
+nsgtk_about_dialog_info(GtkWidget *button, gpointer data)
{
- struct browser_window *bw = data;
nsurl *url;
+ nserror ret;
+ const char *url_text = data;
+ enum browser_window_create_flags flags = BW_CREATE_HISTORY;
- if (nsurl_create("about:credits", &url) != NSERROR_OK) {
- warn_user("NoMemory", 0);
- } else {
- browser_window_navigate(bw,
- url,
- NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
- NULL,
- NULL,
- NULL);
- nsurl_unref(url);
+ if (nsoption_bool(show_single_tab) == true) {
+ flags |= BW_CREATE_TAB;
}
- gtk_widget_destroy(gtk_widget_get_toplevel(button));
-}
-
-static void
-nsgtk_about_dialog_licence(GtkWidget *button, gpointer data)
-{
- struct browser_window *bw = data;
- nsurl *url;
-
- if (nsurl_create("about:licence", &url) != NSERROR_OK) {
- warn_user("NoMemory", 0);
- } else {
- browser_window_navigate(bw,
- url,
- NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
- NULL,
- NULL,
- NULL);
+ ret = nsurl_create(url_text, &url);
+ if (ret == NSERROR_OK) {
+ ret = browser_window_create(flags, url, NULL, NULL, NULL);
nsurl_unref(url);
}
+ if (ret != NSERROR_OK) {
+ warn_user(messages_get_errorcode(ret), 0);
+ }
+
+ /* close about dialog */
gtk_widget_destroy(gtk_widget_get_toplevel(button));
}
-void nsgtk_about_dialog_init(GtkWindow *parent,
- struct browser_window *bw,
- const char *version)
+void nsgtk_about_dialog_init(GtkWindow *parent, const char *version)
{
GtkWidget *dialog, *vbox, *button, *image, *label;
gchar *name_string;
@@ -90,7 +83,7 @@ void nsgtk_about_dialog_init(GtkWindow *parent,
vbox = nsgtk_vbox_new(FALSE, 8);
gtk_box_pack_start(GTK_BOX(nsgtk_dialog_get_content_area(GTK_DIALOG(dialog))), vbox, TRUE, TRUE, 0);
-
+
if (pixbufs != NULL) {
GtkIconSet *icon_set = gtk_icon_set_new_from_pixbuf(GDK_PIXBUF(g_list_nth_data(pixbufs, 0)));
@@ -104,7 +97,7 @@ void nsgtk_about_dialog_init(GtkWindow *parent,
gtk_box_pack_start(GTK_BOX (vbox), image, FALSE, FALSE, 0);
}
-
+
label = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label), name_string);
@@ -113,7 +106,7 @@ void nsgtk_about_dialog_init(GtkWindow *parent,
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_CENTER);
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
- label = gtk_label_new("NetSurf is a small fast web browser");
+ label = gtk_label_new("NetSurf is a small fast web browser");
gtk_label_set_selectable(GTK_LABEL (label), TRUE);
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_CENTER);
gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
@@ -136,14 +129,14 @@ void nsgtk_about_dialog_init(GtkWindow *parent,
gtk_box_pack_end(GTK_BOX(nsgtk_dialog_get_action_area(GTK_DIALOG(dialog))),
button, FALSE, TRUE, 0);
gtk_button_box_set_child_secondary (GTK_BUTTON_BOX(nsgtk_dialog_get_action_area(GTK_DIALOG(dialog))), button, TRUE);
- g_signal_connect(button, "clicked", G_CALLBACK(nsgtk_about_dialog_credits), (gpointer)bw);
+ g_signal_connect(button, "clicked", G_CALLBACK(nsgtk_about_dialog_info), (gpointer)"about:credits");
/* Add the Licence button */
button = gtk_button_new_from_stock ("Licence");
- gtk_box_pack_end(GTK_BOX (GTK_DIALOG(nsgtk_dialog_get_action_area(GTK_DIALOG(dialog)))),
+ gtk_box_pack_end(GTK_BOX (nsgtk_dialog_get_action_area(GTK_DIALOG(dialog))),
button, FALSE, TRUE, 0);
gtk_button_box_set_child_secondary (GTK_BUTTON_BOX(nsgtk_dialog_get_action_area(GTK_DIALOG(dialog))), button, TRUE);
- g_signal_connect(button, "clicked", G_CALLBACK(nsgtk_about_dialog_licence), (gpointer)bw);
+ g_signal_connect(button, "clicked", G_CALLBACK(nsgtk_about_dialog_info), (gpointer)"about:licence");
/* Ensure that the dialog box is destroyed when the user responds. */
diff --git a/gtk/dialogs/about.h b/gtk/dialogs/about.h
index e34a7bff7..1ca0d86b3 100644
--- a/gtk/dialogs/about.h
+++ b/gtk/dialogs/about.h
@@ -19,8 +19,6 @@
#ifndef NETSURF_GTK_ABOUT_H
#define NETSURF_GTK_ABOUT_H
-#include "desktop/browser.h"
-
-void nsgtk_about_dialog_init(GtkWindow *parent, struct browser_window *bw, const char *version);
+void nsgtk_about_dialog_init(GtkWindow *parent, const char *version);
#endif
diff --git a/gtk/dialogs/preferences.c b/gtk/dialogs/preferences.c
index 0669f8d9f..f38c7e9bc 100644
--- a/gtk/dialogs/preferences.c
+++ b/gtk/dialogs/preferences.c
@@ -18,13 +18,15 @@
#include <stdint.h>
#include <math.h>
+#include <string.h>
-#include "desktop/browser_private.h"
-#include "utils/nsoption.h"
-#include "desktop/searchweb.h"
-#include "utils/log.h"
#include "utils/utils.h"
#include "utils/messages.h"
+#include "utils/nsoption.h"
+#include "utils/file.h"
+#include "utils/log.h"
+#include "desktop/browser.h"
+#include "desktop/searchweb.h"
#include "gtk/compat.h"
#include "gtk/window.h"
@@ -51,6 +53,7 @@ struct ppref {
/* dynamic list stores */
GtkListStore *themes;
GtkListStore *content_language;
+ GtkListStore *search_providers;
};
static struct ppref ppref;
@@ -105,6 +108,27 @@ nsgtk_preferences_##WIDGET##_realize(GtkWidget *widget, struct ppref *priv) \
((gdouble)nsoption_int(OPTION)) / MULTIPLIER); \
}
+#define SPINBUTTON_UINT_SIGNALS(WIDGET, OPTION, MULTIPLIER) \
+G_MODULE_EXPORT void \
+nsgtk_preferences_##WIDGET##_valuechanged(GtkSpinButton *spinbutton, \
+ struct ppref *priv); \
+G_MODULE_EXPORT void \
+nsgtk_preferences_##WIDGET##_valuechanged(GtkSpinButton *spinbutton, \
+ struct ppref *priv) \
+{ \
+ nsoption_set_uint(OPTION, \
+ round(gtk_spin_button_get_value(spinbutton) * MULTIPLIER)); \
+} \
+ \
+G_MODULE_EXPORT void \
+nsgtk_preferences_##WIDGET##_realize(GtkWidget *widget, struct ppref *priv); \
+G_MODULE_EXPORT void \
+nsgtk_preferences_##WIDGET##_realize(GtkWidget *widget, struct ppref *priv) \
+{ \
+ gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), \
+ ((gdouble)nsoption_uint(OPTION)) / MULTIPLIER); \
+}
+
#define ENTRY_SIGNALS(WIDGET, OPTION) \
G_MODULE_EXPORT void \
nsgtk_preferences_##WIDGET##_changed(GtkEditable *editable, struct ppref *priv); \
@@ -146,8 +170,8 @@ G_MODULE_EXPORT void nsgtk_preferences_checkShowSingleTab_toggled(GtkToggleButto
G_MODULE_EXPORT void nsgtk_preferences_checkShowSingleTab_realize(GtkWidget *widget, struct ppref *priv);
G_MODULE_EXPORT void nsgtk_preferences_comboTabPosition_changed(GtkComboBox *widget, struct ppref *priv);
G_MODULE_EXPORT void nsgtk_preferences_comboTabPosition_realize(GtkWidget *widget, struct ppref *priv);
-G_MODULE_EXPORT void nsgtk_preferences_sourceButtonWindow_toggled(GtkToggleButton *togglebutton, struct ppref *priv);
-G_MODULE_EXPORT void nsgtk_preferences_sourceButtonWindow_realize(GtkWidget *widget, struct ppref *priv);
+G_MODULE_EXPORT void nsgtk_preferences_comboDeveloperView_changed(GtkComboBox *widget, struct ppref *priv);
+G_MODULE_EXPORT void nsgtk_preferences_comboDeveloperView_realize(GtkWidget *widget, struct ppref *priv);
G_MODULE_EXPORT void nsgtk_preferences_comboButtonType_changed(GtkComboBox *widget, struct ppref *priv);
G_MODULE_EXPORT void nsgtk_preferences_comboButtonType_realize(GtkWidget *widget, struct ppref *priv);
G_MODULE_EXPORT void nsgtk_preferences_setCurrentPage_clicked(GtkButton *button, struct ppref *priv);
@@ -369,7 +393,7 @@ SPINBUTTON_SIGNALS(spinHistoryAge, history_age, 1.0)
SPINBUTTON_SIGNALS(spinMemoryCacheSize, memory_cache_size, (1024*1024))
/* disc cache size */
-SPINBUTTON_SIGNALS(spinDiscCacheSize, disc_cache_size, (1024*1024))
+SPINBUTTON_UINT_SIGNALS(spinDiscCacheSize, disc_cache_size, (1024*1024))
/* disc cache age */
@@ -587,7 +611,7 @@ nsgtk_preferences_comboboxLanguage_realize(GtkWidget *widget,
G_MODULE_EXPORT void
nsgtk_preferences_comboTheme_changed(GtkComboBox *combo, struct ppref *priv)
{
- nsgtk_scaffolding *current = scaf_list;
+ struct nsgtk_scaffolding *current;
int theme = 0;
gchar *name;
GtkTreeIter iter;
@@ -619,7 +643,8 @@ nsgtk_preferences_comboTheme_changed(GtkComboBox *combo, struct ppref *priv)
g_free(name);
}
- while (current) {
+ current = nsgtk_scaffolding_iterate(NULL);
+ while (current != NULL) {
nsgtk_theme_implement(current);
current = nsgtk_scaffolding_iterate(current);
}
@@ -773,12 +798,13 @@ G_MODULE_EXPORT void
nsgtk_preferences_comboTabPosition_changed(GtkComboBox *widget,
struct ppref *priv)
{
- nsgtk_scaffolding *current = scaf_list;
+ struct nsgtk_scaffolding *current;
/* set the option */
nsoption_set_int(position_tab, gtk_combo_box_get_active(widget));
/* update all notebooks in all scaffolds */
+ current = nsgtk_scaffolding_iterate(NULL);
while (current) {
nsgtk_scaffolding_reset_offset(current);
@@ -796,25 +822,23 @@ nsgtk_preferences_comboTabPosition_realize(GtkWidget *widget,
nsoption_int(position_tab));
}
-/* Source */
-
-/* source view opening */
-TOGGLEBUTTON_SIGNALS(sourceButtonTab, source_tab)
+/* Tools */
+/* developer view opening */
G_MODULE_EXPORT void
-nsgtk_preferences_sourceButtonWindow_toggled(GtkToggleButton *togglebutton,
- struct ppref *priv)
+nsgtk_preferences_comboDeveloperView_changed(GtkComboBox *widget,
+ struct ppref *priv)
{
- nsoption_set_bool(source_tab,
- !gtk_toggle_button_get_active(togglebutton));
+ /* set the option */
+ nsoption_set_int(developer_view, gtk_combo_box_get_active(widget));
}
G_MODULE_EXPORT void
-nsgtk_preferences_sourceButtonWindow_realize(GtkWidget *widget,
+nsgtk_preferences_comboDeveloperView_realize(GtkWidget *widget,
struct ppref *priv)
{
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
- !nsoption_bool(source_tab));
+ gtk_combo_box_set_active(GTK_COMBO_BOX(widget),
+ nsoption_int(developer_view));
}
@@ -830,13 +854,15 @@ G_MODULE_EXPORT void
nsgtk_preferences_comboButtonType_changed(GtkComboBox *widget,
struct ppref *priv)
{
- nsgtk_scaffolding *current = scaf_list;
+ struct nsgtk_scaffolding *current;
+
nsoption_set_int(button_type, gtk_combo_box_get_active(widget) + 1);
- /* value of 0 is reserved for 'unset' */
- while (current) {
+ current = nsgtk_scaffolding_iterate(NULL);
+ while (current != NULL) {
nsgtk_scaffolding_reset_offset(current);
switch(nsoption_int(button_type)) {
+ /* value of 0 is reserved for 'unset' */
case 1:
gtk_toolbar_set_style(
GTK_TOOLBAR(nsgtk_scaffolding_toolbar(current)),
@@ -893,13 +919,7 @@ ENTRY_SIGNALS(entryHomePageURL, homepage_url)
G_MODULE_EXPORT void
nsgtk_preferences_setCurrentPage_clicked(GtkButton *button, struct ppref *priv)
{
- const gchar *url;
-
- if (priv->bw != NULL) {
- url = nsurl_access(hlcache_handle_get_url(priv->bw->current_content));
- } else {
- url = "about:blank";
- }
+ const gchar *url = nsurl_access(browser_window_get_url(priv->bw));
if (priv->entryHomePageURL != NULL) {
gtk_entry_set_text(GTK_ENTRY(priv->entryHomePageURL), url);
@@ -928,8 +948,6 @@ TOGGLEBUTTON_SIGNALS(checkUrlSearch, search_url_bar)
G_MODULE_EXPORT void
nsgtk_preferences_comboSearch_changed(GtkComboBox *widget, struct ppref *priv)
{
- nsgtk_scaffolding *current = scaf_list;
- char *name;
int provider;
provider = gtk_combo_box_get_active(widget);
@@ -937,36 +955,29 @@ nsgtk_preferences_comboSearch_changed(GtkComboBox *widget, struct ppref *priv)
/* set the option */
nsoption_set_int(search_provider, provider);
- /* refresh web search prefs from file */
- search_web_provider_details(provider);
-
- /* retrieve ico */
- search_web_retrieve_ico(false);
-
- /* callback may handle changing gui */
- if (search_web_ico() != NULL) {
- gui_window_set_search_ico(search_web_ico());
- }
-
- /* set entry */
- name = search_web_provider_name();
- if (name != NULL) {
- char content[strlen(name) + SLEN("Search ") + 1];
-
- sprintf(content, "Search %s", name);
- free(name);
- while (current) {
- nsgtk_scaffolding_set_websearch(current, content);
- current = nsgtk_scaffolding_iterate(current);
- }
- }
+ /* set search provider */
+ search_web_select_provider(provider);
}
G_MODULE_EXPORT void
nsgtk_preferences_comboSearch_realize(GtkWidget *widget, struct ppref *priv)
{
- gtk_combo_box_set_active(GTK_COMBO_BOX(widget),
- nsoption_int(search_provider));
+ int iter;
+ const char *name;
+ int provider = nsoption_int(search_provider);
+
+ if (priv->search_providers != NULL) {
+ gtk_list_store_clear(priv->search_providers);
+ for (iter = search_web_iterate_providers(0, &name);
+ iter != -1;
+ iter = search_web_iterate_providers(iter, &name)) {
+ gtk_list_store_insert_with_values(priv->search_providers,
+ NULL, -1,
+ 0, name, -1);
+ }
+ }
+
+ gtk_combo_box_set_active(GTK_COMBO_BOX(widget), provider);
}
@@ -1009,8 +1020,14 @@ nsgtk_preferences_fileChooserDownloads_realize(GtkWidget *widget,
G_MODULE_EXPORT void
nsgtk_preferences_dialogPreferences_response(GtkDialog *dlg, gint resid)
{
+ char *choices = NULL;
+
if (resid == GTK_RESPONSE_CLOSE) {
- nsoption_write(options_file_location, NULL, NULL);
+ netsurf_mkpath(&choices, NULL, 2, nsgtk_config_home, "Choices");
+ if (choices != NULL) {
+ nsoption_write(choices, NULL, NULL);
+ free(choices);
+ }
gtk_widget_hide(GTK_WIDGET(dlg));
}
}
@@ -1019,18 +1036,32 @@ G_MODULE_EXPORT gboolean
nsgtk_preferences_dialogPreferences_deleteevent(GtkDialog *dlg,
struct ppref *priv)
{
- nsoption_write(options_file_location, NULL, NULL);
+ char *choices = NULL;
+
+ netsurf_mkpath(&choices, NULL, 2, nsgtk_config_home, "Choices");
+ if (choices != NULL) {
+ nsoption_write(choices, NULL, NULL);
+ free(choices);
+ }
+
gtk_widget_hide(GTK_WIDGET(dlg));
- /* delt with it by hiding window, no need to destory widget by
- * default */
+ /* Delt with it by hiding window, no need to destory widget by
+ * default.
+ */
return TRUE;
}
G_MODULE_EXPORT void
nsgtk_preferences_dialogPreferences_destroy(GtkDialog *dlg, struct ppref *priv)
{
- nsoption_write(options_file_location, NULL, NULL);
+ char *choices = NULL;
+
+ netsurf_mkpath(&choices, NULL, 2, nsgtk_config_home, "Choices");
+ if (choices != NULL) {
+ nsoption_write(choices, NULL, NULL);
+ free(choices);
+ }
}
@@ -1076,6 +1107,7 @@ GtkWidget* nsgtk_preferences(struct browser_window *bw, GtkWindow *parent)
priv->entryHomePageURL = GB(ENTRY, entryHomePageURL);
priv->themes = GB(LIST_STORE, liststore_themes);
priv->content_language = GB(LIST_STORE, liststore_content_language);
+ priv->search_providers = GB(LIST_STORE, liststore_search_provider);
priv->entryProxyHost = GB(ENTRY, entryProxyHost);
priv->spinProxyPort = GB(SPIN_BUTTON, spinProxyPort);
priv->entryProxyUser = GB(ENTRY, entryProxyUser);
diff --git a/gtk/dialogs/source.c b/gtk/dialogs/source.c
deleted file mode 100644
index 5306bdc16..000000000
--- a/gtk/dialogs/source.c
+++ /dev/null
@@ -1,540 +0,0 @@
-/*
- * Copyright 2009 Mark Benjamin <MarkBenjamin@dfgh.net>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <gtk/gtk.h>
-
-#include "gtk/compat.h"
-#include "gtk/dialogs/source.h"
-#include "gtk/dialogs/about.h"
-#include "gtk/window.h"
-#include "gtk/gui.h"
-#include "gtk/print.h"
-#include "gtk/selection.h"
-#include "desktop/browser_private.h"
-#include "desktop/netsurf.h"
-#include "desktop/print.h"
-#include "utils/nsoption.h"
-#include "utils/messages.h"
-#include "utils/url.h"
-#include "utils/utils.h"
-#include "utils/utf8.h"
-#include "render/html.h"
-#include "render/font.h"
-#include "content/content.h"
-#include "content/content_type.h"
-
-#include "utils/log.h"
-
-struct nsgtk_source_window {
- gchar *url;
- char *data;
- size_t data_len;
- GtkWindow *sourcewindow;
- GtkTextView *gv;
- struct browser_window *bw;
- struct nsgtk_source_window *next;
- struct nsgtk_source_window *prev;
-};
-
-struct menu_events {
- const char *widget;
- GCallback handler;
-};
-
-static GtkBuilder *glade_File;
-static struct nsgtk_source_window *nsgtk_source_list = 0;
-static char source_zoomlevel = 10;
-
-void nsgtk_source_tab_init(GtkWindow *parent, struct browser_window *bw);
-
-#define MENUEVENT(x) { #x, G_CALLBACK(nsgtk_on_##x##_activate) }
-#define MENUPROTO(x) static gboolean nsgtk_on_##x##_activate( \
- GtkMenuItem *widget, gpointer g)
-
-MENUPROTO(source_save_as);
-MENUPROTO(source_print);
-MENUPROTO(source_close);
-MENUPROTO(source_select_all);
-MENUPROTO(source_cut);
-MENUPROTO(source_copy);
-MENUPROTO(source_paste);
-MENUPROTO(source_delete);
-MENUPROTO(source_zoom_in);
-MENUPROTO(source_zoom_out);
-MENUPROTO(source_zoom_normal);
-MENUPROTO(source_about);
-
-struct menu_events source_menu_events[] = {
-MENUEVENT(source_save_as),
-MENUEVENT(source_print),
-MENUEVENT(source_close),
-MENUEVENT(source_select_all),
-MENUEVENT(source_cut),
-MENUEVENT(source_copy),
-MENUEVENT(source_paste),
-MENUEVENT(source_delete),
-MENUEVENT(source_zoom_in),
-MENUEVENT(source_zoom_out),
-MENUEVENT(source_zoom_normal),
-MENUEVENT(source_about),
-{NULL, NULL}
-};
-
-static void nsgtk_attach_source_menu_handlers(GtkBuilder *xml, gpointer g)
-{
- struct menu_events *event = source_menu_events;
-
- while (event->widget != NULL)
- {
- GtkWidget *w = GTK_WIDGET(gtk_builder_get_object(xml, event->widget));
- g_signal_connect(G_OBJECT(w), "activate", event->handler, g);
- event++;
- }
-}
-
-static gboolean nsgtk_source_destroy_event(GtkBuilder *window, gpointer g)
-{
- struct nsgtk_source_window *nsg = (struct nsgtk_source_window *) g;
-
- if (nsg->next != NULL)
- nsg->next->prev = nsg->prev;
-
- if (nsg->prev != NULL)
- nsg->prev->next = nsg->next;
- else
- nsgtk_source_list = nsg->next;
-
- free(nsg->data);
- free(nsg->url);
- free(g);
-
- return FALSE;
-}
-
-static gboolean nsgtk_source_delete_event(GtkWindow * window, gpointer g)
-{
- return FALSE;
-}
-
-void nsgtk_source_dialog_init(GtkWindow *parent, struct browser_window *bw)
-{
- char glade_Location[strlen(res_dir_location) + SLEN("source.gtk2.ui")
- + 1];
- if (content_get_type(bw->current_content) != CONTENT_HTML)
- return;
-
- if (nsoption_bool(source_tab)) {
- nsgtk_source_tab_init(parent, bw);
- return;
- }
-
- sprintf(glade_Location, "%ssource.gtk2.ui", res_dir_location);
-
- GError* error = NULL;
- glade_File = gtk_builder_new();
- if (!gtk_builder_add_from_file(glade_File, glade_Location, &error)) {
- g_warning ("Couldn't load builder file: %s", error->message);
- g_error_free (error);
- LOG(("error loading glade tree"));
- return;
- }
-
-
- const char *source_data;
- unsigned long source_size;
- char *data = NULL;
- size_t data_len;
-
- source_data = content_get_source_data(bw->current_content,
- &source_size);
-
- utf8_convert_ret r = utf8_from_enc(
- source_data,
- html_get_encoding(bw->current_content),
- source_size,
- &data,
- &data_len);
- if (r == UTF8_CONVERT_NOMEM) {
- warn_user("NoMemory",0);
- return;
- } else if (r == UTF8_CONVERT_BADENC) {
- warn_user("EncNotRec",0);
- return;
- }
-
- GtkWindow *wndSource = GTK_WINDOW(gtk_builder_get_object(
- glade_File, "wndSource"));
- GtkWidget *cutbutton = GTK_WIDGET(gtk_builder_get_object(
- glade_File, "source_cut"));
- GtkWidget *pastebutton = GTK_WIDGET(gtk_builder_get_object(
- glade_File, "source_paste"));
- GtkWidget *deletebutton = GTK_WIDGET(gtk_builder_get_object(
- glade_File, "source_delete"));
- GtkWidget *printbutton = GTK_WIDGET(gtk_builder_get_object(
- glade_File, "source_print"));
- gtk_widget_set_sensitive(cutbutton, FALSE);
- gtk_widget_set_sensitive(pastebutton, FALSE);
- gtk_widget_set_sensitive(deletebutton, FALSE);
- /* for now */
- gtk_widget_set_sensitive(printbutton, FALSE);
-
- struct nsgtk_source_window *thiswindow =
- malloc(sizeof(struct nsgtk_source_window));
- if (thiswindow == NULL) {
- free(data);
- warn_user("NoMemory", 0);
- return;
- }
-
- thiswindow->url = strdup(nsurl_access(hlcache_handle_get_url(
- bw->current_content)));
- if (thiswindow->url == NULL) {
- free(thiswindow);
- free(data);
- warn_user("NoMemory", 0);
- return;
- }
-
- thiswindow->data = data;
- thiswindow->data_len = data_len;
-
- thiswindow->sourcewindow = wndSource;
- thiswindow->bw = bw;
-
- char title[strlen(thiswindow->url) + SLEN("Source of - NetSurf") + 1];
- sprintf(title, "Source of %s - NetSurf", thiswindow->url);
-
- thiswindow->next = nsgtk_source_list;
- thiswindow->prev = NULL;
- if (nsgtk_source_list != NULL)
- nsgtk_source_list->prev = thiswindow;
- nsgtk_source_list = thiswindow;
-
- nsgtk_attach_source_menu_handlers(glade_File, thiswindow);
-
- gtk_window_set_title(wndSource, title);
-
- g_signal_connect(G_OBJECT(wndSource), "destroy",
- G_CALLBACK(nsgtk_source_destroy_event),
- thiswindow);
- g_signal_connect(G_OBJECT(wndSource), "delete-event",
- G_CALLBACK(nsgtk_source_delete_event),
- thiswindow);
-
- GtkTextView *sourceview = GTK_TEXT_VIEW(
- gtk_builder_get_object(glade_File,
- "source_view"));
-
- PangoFontDescription *fontdesc =
- pango_font_description_from_string("Monospace 8");
-
- thiswindow->gv = sourceview;
- nsgtk_widget_modify_font(GTK_WIDGET(sourceview), fontdesc);
-
- GtkTextBuffer *tb = gtk_text_view_get_buffer(sourceview);
- gtk_text_buffer_set_text(tb, thiswindow->data, -1);
-
- gtk_widget_show(GTK_WIDGET(wndSource));
-
-}
-
-/**
- * create a new tab with page source
- */
-void nsgtk_source_tab_init(GtkWindow *parent, struct browser_window *bw)
-{
- const char *source_data;
- unsigned long source_size;
- char *ndata = 0;
- size_t ndata_len;
- nsurl *url;
- nserror error;
- utf8_convert_ret r;
- gchar *filename;
- char *fileurl;
- gint handle;
-
- source_data = content_get_source_data(bw->current_content,
- &source_size);
-
- r = utf8_from_enc(source_data,
- html_get_encoding(bw->current_content),
- source_size,
- &ndata,
- &ndata_len);
- if (r == UTF8_CONVERT_NOMEM) {
- warn_user("NoMemory",0);
- return;
- } else if (r == UTF8_CONVERT_BADENC) {
- warn_user("EncNotRec",0);
- return;
- }
-
- handle = g_file_open_tmp("nsgtksourceXXXXXX", &filename, NULL);
- if ((handle == -1) || (filename == NULL)) {
- warn_user(messages_get("gtkSourceTabError"), 0);
- free(ndata);
- return;
- }
- close (handle); /* in case it was binary mode */
-
- FILE *f = fopen(filename, "w");
- if (f == NULL) {
- warn_user(messages_get("gtkSourceTabError"), 0);
- g_free(filename);
- free(ndata);
- return;
- }
-
- fprintf(f, "%s", ndata);
- fclose(f);
- free(ndata);
- fileurl = path_to_url(filename);
- g_free(filename);
- if (fileurl == NULL) {
- warn_user(messages_get("NoMemory"), 0);
- return;
- }
-
- /* Open tab */
- error = nsurl_create(fileurl, &url);
- if (error != NSERROR_OK) {
- warn_user(messages_get_errorcode(error), 0);
- } else {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_TAB,
- url,
- NULL,
- bw,
- NULL);
- nsurl_unref(url);
- if (error != NSERROR_OK) {
- warn_user(messages_get_errorcode(error), 0);
- }
- }
- free(fileurl);
-}
-
-static void nsgtk_source_file_save(GtkWindow *parent, const char *filename,
- const char *data, size_t data_size)
-{
- FILE *f;
- GtkWidget *notif;
- GtkWidget *label;
-
- f = fopen(filename, "w+");
- if (f != NULL) {
- fwrite(data, data_size, 1, f);
- fclose(f);
- return;
- }
-
- /* inform user of faliure */
- notif = gtk_dialog_new_with_buttons(messages_get("gtkSaveFailedTitle"),
- parent,
- GTK_DIALOG_MODAL, GTK_STOCK_OK,
- GTK_RESPONSE_NONE, NULL);
-
- g_signal_connect_swapped(notif, "response",
- G_CALLBACK(gtk_widget_destroy), notif);
-
- label = gtk_label_new(messages_get("gtkSaveFailed"));
- gtk_container_add(GTK_CONTAINER(nsgtk_dialog_get_content_area(GTK_DIALOG(notif))), label);
- gtk_widget_show_all(notif);
-
-}
-
-
-gboolean nsgtk_on_source_save_as_activate(GtkMenuItem *widget, gpointer g)
-{
- struct nsgtk_source_window *nsg = (struct nsgtk_source_window *) g;
- GtkWidget *fc = gtk_file_chooser_dialog_new(
- messages_get("gtkSourceSave"),
- nsg->sourcewindow,
- GTK_FILE_CHOOSER_ACTION_SAVE,
- GTK_STOCK_CANCEL,
- GTK_RESPONSE_CANCEL,
- GTK_STOCK_SAVE,
- GTK_RESPONSE_ACCEPT,
- NULL);
- char *filename;
- url_func_result res;
-
- res = url_nice(nsg->url, &filename, false);
- if (res != URL_FUNC_OK) {
- filename = strdup(messages_get("SaveSource"));
- if (filename == NULL) {
- warn_user("NoMemory", 0);
- return FALSE;
- }
- }
-
- gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(fc), filename);
-
- free(filename);
-
- gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(fc),
- TRUE);
-
- if (gtk_dialog_run(GTK_DIALOG(fc)) == GTK_RESPONSE_ACCEPT) {
- filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fc));
- nsgtk_source_file_save(nsg->sourcewindow, filename, nsg->data, nsg->data_len);
- g_free(filename);
- }
-
- gtk_widget_destroy(fc);
-
- return TRUE;
-}
-
-
-gboolean nsgtk_on_source_print_activate( GtkMenuItem *widget, gpointer g)
-{
- /* correct printing */
-
- return TRUE;
-}
-
-gboolean nsgtk_on_source_close_activate( GtkMenuItem *widget, gpointer g)
-{
- struct nsgtk_source_window *nsg = (struct nsgtk_source_window *) g;
-
- gtk_widget_destroy(GTK_WIDGET(nsg->sourcewindow));
-
- return TRUE;
-}
-
-
-
-gboolean nsgtk_on_source_select_all_activate (GtkMenuItem *widget, gpointer g)
-{
- struct nsgtk_source_window *nsg = (struct nsgtk_source_window *) g;
- GtkTextBuffer *buf = gtk_text_view_get_buffer(nsg->gv);
- GtkTextIter start, end;
-
- gtk_text_buffer_get_bounds(buf, &start, &end);
-
- gtk_text_buffer_select_range(buf, &start, &end);
-
- return TRUE;
-}
-
-gboolean nsgtk_on_source_cut_activate(GtkMenuItem *widget, gpointer g)
-{
- return TRUE;
-}
-
-gboolean nsgtk_on_source_copy_activate(GtkMenuItem *widget, gpointer g)
-{
- struct nsgtk_source_window *nsg = (struct nsgtk_source_window *) g;
- GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(nsg->gv));
-
- gtk_text_buffer_copy_clipboard(buf,
- gtk_clipboard_get(GDK_SELECTION_CLIPBOARD));
-
- return TRUE;
-}
-
-gboolean nsgtk_on_source_paste_activate(GtkMenuItem *widget, gpointer g)
-{
- return TRUE;
-}
-
-gboolean nsgtk_on_source_delete_activate(GtkMenuItem *widget, gpointer g)
-{
- return TRUE;
-}
-
-static void nsgtk_source_update_zoomlevel(gpointer g)
-{
- struct nsgtk_source_window *nsg;
- GtkTextBuffer *buf;
- GtkTextTagTable *tab;
- GtkTextTag *tag;
-
- nsg = nsgtk_source_list;
- while (nsg) {
- if (nsg->gv) {
- buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(nsg->gv));
-
- tab = gtk_text_buffer_get_tag_table(
- GTK_TEXT_BUFFER(buf));
-
- tag = gtk_text_tag_table_lookup(tab, "zoomlevel");
- if (!tag) {
- tag = gtk_text_tag_new("zoomlevel");
- gtk_text_tag_table_add(tab, GTK_TEXT_TAG(tag));
- }
-
- gdouble fscale = ((gdouble) source_zoomlevel) / 10;
-
- g_object_set(GTK_TEXT_TAG(tag), "scale", fscale, NULL);
-
- GtkTextIter start, end;
-
- gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(buf),
- &start, &end);
- gtk_text_buffer_remove_all_tags(GTK_TEXT_BUFFER(buf),
- &start, &end);
- gtk_text_buffer_apply_tag(GTK_TEXT_BUFFER(buf),
- GTK_TEXT_TAG(tag), &start, &end);
- }
- nsg = nsg->next;
- }
-}
-
-gboolean nsgtk_on_source_zoom_in_activate(GtkMenuItem *widget, gpointer g)
-{
- source_zoomlevel++;
- nsgtk_source_update_zoomlevel(g);
-
- return TRUE;
-}
-
-gboolean nsgtk_on_source_zoom_out_activate(GtkMenuItem *widget, gpointer g)
-{
- if (source_zoomlevel > 1) {
- source_zoomlevel--;
- nsgtk_source_update_zoomlevel(g);
- }
-
- return TRUE;
-}
-
-
-gboolean nsgtk_on_source_zoom_normal_activate(GtkMenuItem *widget, gpointer g)
-{
- source_zoomlevel = 10;
- nsgtk_source_update_zoomlevel(g);
-
- return TRUE;
-}
-
-gboolean nsgtk_on_source_about_activate(GtkMenuItem *widget, gpointer g)
-{
- struct nsgtk_source_window *nsg = (struct nsgtk_source_window *) g;
-
- nsgtk_about_dialog_init(nsg->sourcewindow, nsg->bw, netsurf_version);
-
- return TRUE;
-}
diff --git a/gtk/dialogs/source.h b/gtk/dialogs/source.h
deleted file mode 100644
index fcba6b664..000000000
--- a/gtk/dialogs/source.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 2009 Mark Benjamin <netsurfbrowser.org.MarkBenjamin@dfgh.net>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef netsurf_gtk_dialogs_source_h_
-#define netsurf_gtk_dialogs_source_h_
-
-#include <gtk/gtk.h>
-#include "desktop/browser.h"
-
-void nsgtk_source_dialog_init(GtkWindow *parent, struct browser_window *bw);
-
-#endif
-
diff --git a/gtk/download.c b/gtk/download.c
index e882ec798..3a321ec5f 100644
--- a/gtk/download.c
+++ b/gtk/download.c
@@ -25,12 +25,14 @@
#include "utils/log.h"
#include "utils/utils.h"
-#include "utils/url.h"
+#include "utils/nsurl.h"
#include "utils/messages.h"
+#include "utils/nsoption.h"
+#include "desktop/download.h"
#include "desktop/gui.h"
+
#include "gtk/gui.h"
#include "gtk/scaffolding.h"
-#include "utils/nsoption.h"
#include "gtk/download.h"
#include "gtk/window.h"
#include "gtk/compat.h"
@@ -712,10 +714,10 @@ static void nsgtk_download_store_create_item (struct gui_download_window *dl)
NSGTK_DOWNLOAD, dl, -1);
}
-struct gui_download_window *gui_download_window_create(download_context *ctx,
- struct gui_window *gui)
+static struct gui_download_window *
+gui_download_window_create(download_context *ctx, struct gui_window *gui)
{
- const char *url = download_context_get_url(ctx);
+ nsurl *url = download_context_get_url(ctx);
unsigned long total_size = download_context_get_total_length(ctx);
gchar *domain;
gchar *destination;
@@ -728,17 +730,22 @@ struct gui_download_window *gui_download_window_create(download_context *ctx,
nsgtk_scaffolding_window(nsgtk_get_scaffold(gui));
struct gui_download_window *download = malloc(sizeof *download);
- if (download == NULL)
+ if (download == NULL) {
return NULL;
+ }
- if (url_host(url, &domain) != URL_FUNC_OK) {
+ /* set the domain to the host component of the url if it exists */
+ if (nsurl_has_component(url, NSURL_HOST)) {
+ domain = g_strdup(lwc_string_data(nsurl_get_component(url, NSURL_HOST)));
+ } else {
domain = g_strdup(messages_get("gtkUnknownHost"));
- if (domain == NULL) {
- free(download);
- return NULL;
- }
+ }
+ if (domain == NULL) {
+ free(download);
+ return NULL;
}
+ /* show the dialog */
destination = nsgtk_download_dialog_show(
download_context_get_filename(ctx), domain, size);
if (destination == NULL) {
@@ -797,7 +804,7 @@ struct gui_download_window *gui_download_window_create(download_context *ctx,
}
-nserror gui_download_window_data(struct gui_download_window *dw,
+static nserror gui_download_window_data(struct gui_download_window *dw,
const char *data, unsigned int size)
{
g_io_channel_write_chars(dw->write, data, size, NULL, &dw->error);
@@ -820,13 +827,13 @@ nserror gui_download_window_data(struct gui_download_window *dw,
}
-void gui_download_window_error(struct gui_download_window *dw,
+static void gui_download_window_error(struct gui_download_window *dw,
const char *error_msg)
{
}
-void gui_download_window_done(struct gui_download_window *dw)
+static void gui_download_window_done(struct gui_download_window *dw)
{
g_io_channel_shutdown(dw->write, TRUE, &dw->error);
g_io_channel_unref(dw->write);
@@ -845,17 +852,11 @@ void gui_download_window_done(struct gui_download_window *dw)
}
+static struct gui_download_table download_table = {
+ .create = gui_download_window_create,
+ .data = gui_download_window_data,
+ .error = gui_download_window_error,
+ .done = gui_download_window_done,
+};
-
-
-
-
-
-
-
-
-
-
-
-
-
+struct gui_download_table *nsgtk_download_table = &download_table;
diff --git a/gtk/download.h b/gtk/download.h
index e85c4126a..a6e624fbd 100644
--- a/gtk/download.h
+++ b/gtk/download.h
@@ -21,6 +21,8 @@
#include <gtk/gtk.h>
+struct gui_download_table *nsgtk_download_table;
+
bool nsgtk_download_init(const char *glade_file_location);
void nsgtk_download_destroy (void);
bool nsgtk_check_for_downloads(GtkWindow *parent);
diff --git a/gtk/filetype.c b/gtk/fetch.c
index 2ae59d867..42ba89839 100644
--- a/gtk/filetype.c
+++ b/gtk/fetch.c
@@ -1,6 +1,5 @@
/*
- * Copyright 2007 Rob Kendrick <rjek@netsurf-browser.org>
- * Copyright 2007 Vincent Sanders <vince@debian.org>
+ * Copyright 2014 vincent Sanders <vince@netsurf-browser.org>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -18,18 +17,21 @@
*/
#include <stdio.h>
-#include <stdbool.h>
-#include <string.h>
#include <stdlib.h>
-#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
+#include <ctype.h>
+#include <string.h>
-#include "gtk/filetype.h"
-#include "content/fetch.h"
-#include "utils/log.h"
#include "utils/hashtable.h"
+#include "utils/log.h"
+#include "utils/filepath.h"
+#include "utils/file.h"
+#include "desktop/gui.h"
+
+#include "gtk/gui.h"
+#include "gtk/fetch.h"
static struct hash_table *mime_hash = NULL;
@@ -43,9 +45,8 @@ void gtk_fetch_filetype_init(const char *mimefile)
/* first, check to see if /etc/mime.types in preference */
if ((stat("/etc/mime.types", &statbuf) == 0) &&
- S_ISREG(statbuf.st_mode)) {
+ S_ISREG(statbuf.st_mode)) {
mimefile = "/etc/mime.types";
-
}
fh = fopen(mimefile, "r");
@@ -75,25 +76,30 @@ void gtk_fetch_filetype_init(const char *mimefile)
while (!feof(fh)) {
char line[256], *ptr, *type, *ext;
+
if (fgets(line, 256, fh) == NULL)
- break;
+ break;
+
if (!feof(fh) && line[0] != '#') {
ptr = line;
/* search for the first non-whitespace character */
- while (isspace(*ptr))
+ while (isspace(*ptr)) {
ptr++;
+ }
/* is this line empty other than leading whitespace? */
- if (*ptr == '\n' || *ptr == '\0')
+ if (*ptr == '\n' || *ptr == '\0') {
continue;
+ }
type = ptr;
/* search for the first non-whitespace char or NUL or
* NL */
- while (*ptr && (!isspace(*ptr)) && *ptr != '\n')
+ while (*ptr && (!isspace(*ptr)) && *ptr != '\n') {
ptr++;
+ }
if (*ptr == '\0' || *ptr == '\n') {
/* this mimetype has no extensions - read next
@@ -106,8 +112,9 @@ void gtk_fetch_filetype_init(const char *mimefile)
/* search for the first non-whitespace character which
* will be the first filename extenion */
- while (isspace(*ptr))
+ while (isspace(*ptr)) {
ptr++;
+ }
while(true) {
ext = ptr;
@@ -115,9 +122,11 @@ void gtk_fetch_filetype_init(const char *mimefile)
/* search for the first whitespace char or
* NUL or NL which is the end of the ext.
*/
- while (*ptr && (!isspace(*ptr)) &&
- *ptr != '\n')
+ while (*ptr &&
+ (!isspace(*ptr)) &&
+ *ptr != '\n') {
ptr++;
+ }
if (*ptr == '\0' || *ptr == '\n') {
/* special case for last extension on
@@ -134,8 +143,11 @@ void gtk_fetch_filetype_init(const char *mimefile)
/* search for the first non-whitespace char or
* NUL or NL, to find start of next ext.
*/
- while (*ptr && (isspace(*ptr)) && *ptr != '\n')
+ while (*ptr &&
+ (isspace(*ptr)) &&
+ *ptr != '\n') {
ptr++;
+ }
}
}
}
@@ -162,8 +174,9 @@ const char *fetch_filetype(const char *unix_path)
return "text/plain";
}
- if (S_ISDIR(statbuf.st_mode))
+ if (S_ISDIR(statbuf.st_mode)) {
return "application/x-netsurf-directory";
+ }
l = strlen(unix_path);
@@ -184,11 +197,13 @@ const char *fetch_filetype(const char *unix_path)
}
ptr = unix_path + strlen(unix_path);
- while (*ptr != '.' && *ptr != '/')
+ while (*ptr != '.' && *ptr != '/') {
ptr--;
+ }
- if (*ptr != '.')
+ if (*ptr != '.') {
return "text/plain";
+ }
ext = strdup(ptr + 1); /* skip the . */
@@ -196,7 +211,7 @@ const char *fetch_filetype(const char *unix_path)
* copy is lower case too.
*/
lowerchar = ext;
- while(*lowerchar) {
+ while (*lowerchar) {
*lowerchar = tolower(*lowerchar);
lowerchar++;
}
@@ -204,36 +219,38 @@ const char *fetch_filetype(const char *unix_path)
type = hash_get(mime_hash, ext);
free(ext);
- return type != NULL ? type : "text/plain";
-}
+ if (type == NULL) {
+ type = "text/plain";
+ }
-char *fetch_mimetype(const char *unix_path)
-{
- return strdup(fetch_filetype(unix_path));
+ return type;
}
-#ifdef TEST_RIG
-int main(int argc, char *argv[])
+static nsurl *gui_get_resource_url(const char *path)
{
- unsigned int c1, *c2;
- const char *key;
-
- gtk_fetch_filetype_init("./mime.types");
+ char buf[PATH_MAX];
+ nsurl *url = NULL;
- c1 = 0; c2 = 0;
-
- while ( (key = hash_iterate(mime_hash, &c1, &c2)) != NULL) {
- printf("%s ", key);
+ /* default.css -> gtkdefault.css */
+ if (strcmp(path, "default.css") == 0) {
+ path = "gtkdefault.css";
}
- printf("\n");
-
- if (argc > 1) {
- printf("%s maps to %s\n", argv[1], fetch_filetype(argv[1]));
+ /* favicon.ico -> favicon.png */
+ if (strcmp(path, "favicon.ico") == 0) {
+ path = "favicon.png";
}
- gtk_fetch_filetype_fin();
+ netsurf_path_to_nsurl(filepath_sfind(respaths, buf, path), &url);
+
+ return url;
}
-#endif
+static struct gui_fetch_table fetch_table = {
+ .filetype = fetch_filetype,
+
+ .get_resource_url = gui_get_resource_url,
+};
+
+struct gui_fetch_table *nsgtk_fetch_table = &fetch_table;
diff --git a/gtk/filetype.h b/gtk/fetch.h
index 8bf98db7c..a095adbf9 100644
--- a/gtk/filetype.h
+++ b/gtk/fetch.h
@@ -1,6 +1,5 @@
/*
- * Copyright 2007 Rob Kendrick <rjek@netsurf-browser.org>
- * Copyright 2007 Vincent Sanders <vince@debian.org>
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -17,5 +16,13 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#ifndef NETSURF_GTK_FETCH_H
+#define NETSURF_GTK_FETCH_H
+
+struct gui_fetch_table *nsgtk_fetch_table;
+
void gtk_fetch_filetype_init(const char *mimefile);
void gtk_fetch_filetype_fin(void);
+const char *fetch_filetype(const char *unix_path);
+
+#endif
diff --git a/gtk/font_pango.c b/gtk/font_pango.c
index 6c7f1592f..1cb536e9e 100644
--- a/gtk/font_pango.c
+++ b/gtk/font_pango.c
@@ -27,8 +27,6 @@
#include <stdio.h>
#include <gtk/gtk.h>
-#include "css/css.h"
-#include "css/utils.h"
#include "gtk/font_pango.h"
#include "gtk/plotters.h"
#include "render/font.h"
@@ -235,17 +233,11 @@ bool nsfont_paint(int x, int y, const char *string, size_t length,
PangoFontDescription *desc;
PangoLayout *layout;
PangoLayoutLine *line;
- gint size;
if (length == 0)
return true;
desc = nsfont_style_to_description(fstyle);
- size = (gint)(pango_font_description_get_size(desc));
- if (pango_font_description_get_size_is_absolute(desc))
- pango_font_description_set_absolute_size(desc, size);
- else
- pango_font_description_set_size(desc, size);
layout = pango_cairo_create_layout(current_cr);
diff --git a/gtk/gui.c b/gtk/gui.c
index 649c4a239..6fb2a4125 100644
--- a/gtk/gui.c
+++ b/gtk/gui.c
@@ -33,18 +33,19 @@
#include <sys/select.h>
#include <sys/stat.h>
#include <sys/types.h>
-#include <curl/curl.h>
#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>
#include <glib.h>
#include "content/content.h"
#include "content/fetch.h"
+#include "content/fetchers.h"
#include "content/fetchers/curl.h"
#include "content/fetchers/resource.h"
#include "content/hlcache.h"
#include "content/urldb.h"
-#include "desktop/browser_private.h"
+#include "content/backing_store.h"
+#include "desktop/browser.h"
#include "desktop/gui.h"
#include "desktop/netsurf.h"
#include "utils/nsoption.h"
@@ -55,11 +56,19 @@
#include "desktop/textinput.h"
#include "desktop/tree.h"
#include "css/utils.h"
+#include "render/form.h"
+#include "utils/filepath.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/utf8.h"
+#include "utils/utils.h"
+#include "utils/file.h"
+
#include "gtk/compat.h"
#include "gtk/completion.h"
#include "gtk/cookies.h"
#include "gtk/download.h"
-#include "gtk/filetype.h"
+#include "gtk/fetch.h"
#include "gtk/gui.h"
#include "gtk/history.h"
#include "gtk/hotlist.h"
@@ -67,22 +76,17 @@
#include "gtk/treeview.h"
#include "gtk/window.h"
#include "gtk/schedule.h"
+#include "gtk/selection.h"
+#include "gtk/search.h"
-#include "render/form.h"
-#include "utils/filepath.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/url.h"
-#include "utils/utf8.h"
-#include "utils/utils.h"
-char *options_file_location;
char *toolbar_indices_file_location;
char *res_dir_location;
-char *print_options_file_location;
char *languages_file_location;
char *themelist_file_location;
+char *nsgtk_config_home; /* exported global defined in gtk/gui.h */
+
GdkPixbuf *favicon_pixbuf; /* favicon default pixbuf */
struct glade_file_location_s *glade_file_location;
@@ -107,7 +111,7 @@ static void nsgtk_PDF_no_pass(GtkButton *w, gpointer data);
#define THROBBER_FRAMES 9
-static char **respaths; /** resource search path vector */
+char **respaths; /** resource search path vector */
/** Create an array of valid paths to search for resources.
*
@@ -183,7 +187,7 @@ nsgtk_new_ui(char **respath, const char *name, GtkBuilder **pglade)
filepath = filepath_find(respath, resname);
if (filepath == NULL) {
- snprintf(errorstr, NEW_GLADE_ERROR_SIZE,
+ snprintf(errorstr, NEW_GLADE_ERROR_SIZE,
"Unable to locate %s glade template file.\n", name);
die(errorstr);
}
@@ -192,7 +196,7 @@ nsgtk_new_ui(char **respath, const char *name, GtkBuilder **pglade)
if (!gtk_builder_add_from_file(builder, filepath, &error)) {
g_warning ("Couldn't load builder file: %s", error->message);
g_error_free (error);
- snprintf(errorstr, NEW_GLADE_ERROR_SIZE,
+ snprintf(errorstr, NEW_GLADE_ERROR_SIZE,
"Unable to load glade %s window definitions.\n", name);
die(errorstr);
@@ -204,6 +208,11 @@ nsgtk_new_ui(char **respath, const char *name, GtkBuilder **pglade)
if (pglade != NULL) {
*pglade = builder;
+ } else {
+ /* release our reference to the builder if it is not
+ * being used.
+ */
+ g_object_unref(G_OBJECT(builder));
}
return filepath;
@@ -212,7 +221,7 @@ nsgtk_new_ui(char **respath, const char *name, GtkBuilder **pglade)
/**
* Load definitions from glade files.
*/
-static void
+static void
nsgtk_init_glade(char **respath)
{
GtkBuilder *gladeWarning;
@@ -233,6 +242,7 @@ nsgtk_init_glade(char **respath)
glade_file_location->options = nsgtk_new_ui(respath, "options", NULL);
glade_file_location->hotlist = nsgtk_new_ui(respath, "hotlist", NULL);
glade_file_location->cookies = nsgtk_new_ui(respath, "cookies", NULL);
+ glade_file_location->viewdata = nsgtk_new_ui(respath, "viewdata", NULL);
glade_file_location->warning = nsgtk_new_ui(respath, "warning", &gladeWarning);
nsgtk_warning_window = GTK_WINDOW(gtk_builder_get_object(gladeWarning, "wndWarning"));
@@ -240,48 +250,59 @@ nsgtk_init_glade(char **respath)
}
/**
- * Set option defaults for gtk frontend
+ * Set option defaults for gtk frontend.
*
* @param defaults The option table to update.
* @return error status.
*/
static nserror set_defaults(struct nsoption_s *defaults)
{
- char *hdir = getenv("HOME");
- char buf[PATH_MAX];
+ char *fname;
- /* Set defaults for absent option strings */
- snprintf(buf, PATH_MAX, "%s/.netsurf/Cookies", hdir);
- nsoption_setnull_charp(cookie_file, strdup(buf));
- nsoption_setnull_charp(cookie_jar, strdup(buf));
- if (nsoption_charp(cookie_file) == NULL ||
- nsoption_charp(cookie_jar) == NULL) {
- LOG(("Failed initialising cookie options"));
- return NSERROR_BAD_PARAMETER;
+ /* cookie file default */
+ fname = NULL;
+ netsurf_mkpath(&fname, NULL, 2, nsgtk_config_home, "Cookies");
+ if (fname != NULL) {
+ nsoption_setnull_charp(cookie_file, fname);
}
- if (nsoption_charp(downloads_directory) == NULL) {
- snprintf(buf, PATH_MAX, "%s/", hdir);
- nsoption_set_charp(downloads_directory, strdup(buf));
+ /* cookie jar default */
+ fname = NULL;
+ netsurf_mkpath(&fname, NULL, 2, nsgtk_config_home, "Cookies");
+ if (fname != NULL) {
+ nsoption_setnull_charp(cookie_jar, fname);
}
- if (nsoption_charp(url_file) == NULL) {
- snprintf(buf, PATH_MAX, "%s/.netsurf/URLs", hdir);
- nsoption_set_charp(url_file, strdup(buf));
+ /* url database default */
+ fname = NULL;
+ netsurf_mkpath(&fname, NULL, 2, nsgtk_config_home, "URLs");
+ if (fname != NULL) {
+ nsoption_setnull_charp(url_file, fname);
}
- if (nsoption_charp(hotlist_path) == NULL) {
- snprintf(buf, PATH_MAX, "%s/.netsurf/Hotlist", hdir);
- nsoption_set_charp(hotlist_path, strdup(buf));
+ /* bookmark database default */
+ fname = NULL;
+ netsurf_mkpath(&fname, NULL, 2, nsgtk_config_home, "Hotlist");
+ if (fname != NULL) {
+ nsoption_setnull_charp(hotlist_path, fname);
}
+ /* download directory default */
+ fname = getenv("HOME");
+ if (fname != NULL) {
+ nsoption_setnull_charp(downloads_directory, strdup(fname));
+ }
+
+ /* default path to certificates */
nsoption_setnull_charp(ca_path, strdup("/etc/ssl/certs"));
- if (nsoption_charp(url_file) == NULL ||
- nsoption_charp(ca_path) == NULL ||
- nsoption_charp(downloads_directory) == NULL ||
- nsoption_charp(hotlist_path) == NULL) {
- LOG(("Failed initialising string options"));
+ if ((nsoption_charp(cookie_file) == NULL) ||
+ (nsoption_charp(cookie_jar) == NULL) ||
+ (nsoption_charp(url_file) == NULL) ||
+ (nsoption_charp(hotlist_path) == NULL) ||
+ (nsoption_charp(downloads_directory) == NULL) ||
+ (nsoption_charp(ca_path) == NULL)) {
+ LOG(("Failed initialising default resource paths"));
return NSERROR_BAD_PARAMETER;
}
@@ -295,55 +316,7 @@ static nserror set_defaults(struct nsoption_s *defaults)
return NSERROR_OK;
}
-static void check_options(char **respath)
-{
- char *hdir = getenv("HOME");
- char buf[PATH_MAX];
- nsoption_set_bool(core_select_menu, true);
-
- /* Attempt to handle nonsense status bar widths. These may exist
- * in people's Choices as the GTK front end used to abuse the
- * status bar width option by using it for an absolute value in px.
- * The GTK front end now correctly uses it as a proportion of window
- * width. Here we assume that a value of less than 15% is wrong
- * and set to the default two thirds. */
- if (nsoption_int(toolbar_status_size) < 1500) {
- nsoption_set_int(toolbar_status_size, 6667);
- }
-
- /* user options should be stored in the users home directory */
- snprintf(buf, PATH_MAX, "%s/.netsurf/Choices", hdir);
- options_file_location = strdup(buf);
-
- filepath_sfinddef(respath, buf, "Print", "~/.netsurf/");
- LOG(("Using '%s' as Print Settings file", buf));
- print_options_file_location = strdup(buf);
-
-
-}
-
-nsurl *gui_get_resource_url(const char *path)
-{
- char buf[PATH_MAX];
- char *raw;
- nsurl *url = NULL;
- /* default.css -> gtkdefault.css */
- if (strcmp(path, "default.css") == 0)
- path = "gtkdefault.css";
-
- /* favicon.ico -> favicon.png */
- if (strcmp(path, "favicon.ico") == 0)
- path = "favicon.png";
-
- raw = path_to_url(filepath_sfind(respaths, buf, path));
- if (raw != NULL) {
- nsurl_create(raw, &url);
- free(raw);
- }
-
- return url;
-}
/**
@@ -357,32 +330,32 @@ static void gui_init(int argc, char** argv, char **respath)
nsurl *url;
nserror error;
- /* find the languages file */
+ /* find the languages file */
languages_file_location = filepath_find(respath, "languages");
- if ((languages_file_location == NULL) ||
+ if ((languages_file_location == NULL) ||
(strlen(languages_file_location) < 10)) {
- die("Unable to find resources.\n");
+ die("Unable to find resources.\n");
}
- /* find the theme list file */
+ /* find the theme list file */
themelist_file_location = filepath_find(respath, "themelist");
if ((themelist_file_location != NULL) &&
(strlen(themelist_file_location) < 10)) {
free(themelist_file_location);
themelist_file_location = NULL;
}
- if (themelist_file_location == NULL) {
+ if (themelist_file_location == NULL) {
LOG(("Unable to find themelist - disabling"));
}
- /* Obtain resources path location.
+ /* Obtain resources path location.
*
* Uses the directory the languages file was found in,
* @todo find and slaughter all references to this!
*/
res_dir_location = calloc(1, strlen(languages_file_location) - 8);
- memcpy(res_dir_location,
- languages_file_location,
+ memcpy(res_dir_location,
+ languages_file_location,
strlen(languages_file_location) - 9);
LOG(("Using '%s' for resource path", res_dir_location));
@@ -397,12 +370,12 @@ static void gui_init(int argc, char** argv, char **respath)
}
/* Search engine sources */
- search_engines_file_location = filepath_find(respath, "SearchEngines");
- LOG(("Using '%s' as Search Engines file", search_engines_file_location));
-
- /* Default Icon */
- search_default_ico_location = filepath_find(respath, "default.ico");
- LOG(("Using '%s' as default search ico", search_default_ico_location));
+ resource_filename = filepath_find(respath, "SearchEngines");
+ search_web_init(resource_filename);
+ if (resource_filename != NULL) {
+ LOG(("Using '%s' as Search Engines file", resource_filename));
+ free(resource_filename);
+ }
/* Default favicon */
resource_filename = filepath_find(respath, "favicon.png");
@@ -411,7 +384,7 @@ static void gui_init(int argc, char** argv, char **respath)
free(resource_filename);
if (favicon_pixbuf == NULL) {
favicon_pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, false, 8, 16,16);
-
+
}
}
@@ -419,7 +392,7 @@ static void gui_init(int argc, char** argv, char **respath)
toolbar_indices_file_location = filepath_find(respath, "toolbarIndices");
LOG(("Using '%s' as custom toolbar settings file", toolbar_indices_file_location));
- /* load throbber images */
+ /* load throbber images */
if (nsgtk_throbber_init(respath, THROBBER_FRAMES) == false)
die("Unable to load throbber image.\n");
@@ -459,13 +432,15 @@ static void gui_init(int argc, char** argv, char **respath)
if (argc > 1) {
struct stat fs;
if (stat(argv[1], &fs) == 0) {
+ size_t addrlen;
char *rp = realpath(argv[1], NULL);
assert(rp != NULL);
- addr = malloc(SLEN("file://") + strlen(rp) + /*\0 */ 1);
+
+ /* calculate file url length including terminator */
+ addrlen = SLEN("file://") + strlen(rp) + 1;
+ addr = malloc(addrlen);
assert(addr != NULL);
- /* These are safe thanks to the above sum */
- strcpy(addr, "file://");
- strcat(addr, rp);
+ snprintf(addr, addrlen, "file://%s", rp);
free(rp);
} else {
addr = strdup(argv[1]);
@@ -482,8 +457,7 @@ static void gui_init(int argc, char** argv, char **respath)
/* create an initial browser window */
error = nsurl_create(addr, &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -501,157 +475,55 @@ static void gui_init(int argc, char** argv, char **respath)
}
-/**
- * Check that ~/.netsurf/ exists, and if it doesn't, create it.
- */
-static void nsgtk_check_homedir(void)
-{
- char *hdir = getenv("HOME");
- char buf[PATH_MAX];
-
- if (hdir == NULL) {
- /* we really can't continue without a home directory. */
- LOG(("HOME is not set - nowhere to store state!"));
- die("NetSurf requires HOME to be set in order to run.\n");
-
- }
-
- snprintf(buf, PATH_MAX, "%s/.netsurf", hdir);
- if (access(buf, F_OK) != 0) {
- LOG(("You don't have a ~/.netsurf - creating one for you."));
- if (mkdir(buf, S_IRWXU) == -1) {
- LOG(("Unable to create %s", buf));
- die("NetSurf requires ~/.netsurf to exist, but it cannot be created.\n");
- }
- } else {
- if (chmod(buf, S_IRWXU) != 0) {
- LOG(("Unable to set permissions on %s", buf));
- }
- }
-}
/**
* Ensures output logging stream is correctly configured
*/
static bool nslog_stream_configure(FILE *fptr)
{
- /* set log stream to be non-buffering */
+ /* set log stream to be non-buffering */
setbuf(fptr, NULL);
return true;
}
-/**
- * Main entry point from OS.
- */
-int main(int argc, char** argv)
-{
- char *messages;
- char *options;
- nserror ret;
-
- /* check home directory is available */
- nsgtk_check_homedir();
-
- respaths = nsgtk_init_resource("${HOME}/.netsurf/:${NETSURFRES}:"GTK_RESPATH":./gtk/res");
-
- gtk_init(&argc, &argv);
-
- /* initialise logging. Not fatal if it fails but not much we
- * can do about it either.
- */
- nslog_init(nslog_stream_configure, &argc, argv);
-
- /* user options setup */
- ret = nsoption_init(set_defaults, &nsoptions, &nsoptions_default);
- if (ret != NSERROR_OK) {
- fprintf(stderr, "Options failed to initialise (%s)\n",
- messages_get_errorcode(ret));
- return 1;
- }
- options = filepath_find(respaths, "Choices");
- nsoption_read(options, nsoptions);
- free(options);
- nsoption_commandline(&argc, argv, nsoptions);
- check_options(respaths); /* check user options */
-
- /* common initialisation */
- messages = filepath_find(respaths, "Messages");
- ret = netsurf_init(messages);
- free(messages);
- if (ret != NSERROR_OK) {
- fprintf(stderr, "NetSurf core failed to initialise (%s)\n",
- messages_get_errorcode(ret));
- return 1;
- }
-
- /* run the browser */
- gui_init(argc, argv, respaths);
- /* Ensure all scaffoldings are destroyed before we go into exit */
- while (scaf_list != NULL) {
- nsgtk_scaffolding_destroy(scaf_list);
- }
-
- /* common finalisation */
- netsurf_exit();
- /* finalise options */
- nsoption_finalise(nsoptions, nsoptions_default);
-
- return 0;
-}
-
-
-void gui_poll(bool active)
+static void nsgtk_poll(bool active)
{
- CURLMcode code;
fd_set read_fd_set, write_fd_set, exc_fd_set;
int max_fd;
GPollFD *fd_list[1000];
unsigned int fd_count = 0;
bool block = true;
- schedule_run();
-
- if (browser_reformat_pending)
- block = false;
-
- if (active) {
- FD_ZERO(&read_fd_set);
- FD_ZERO(&write_fd_set);
- FD_ZERO(&exc_fd_set);
- code = curl_multi_fdset(fetch_curl_multi,
- &read_fd_set,
- &write_fd_set,
- &exc_fd_set,
- &max_fd);
- assert(code == CURLM_OK);
- for (int i = 0; i <= max_fd; i++) {
- if (FD_ISSET(i, &read_fd_set)) {
- GPollFD *fd = malloc(sizeof *fd);
- fd->fd = i;
- fd->events = G_IO_IN | G_IO_HUP | G_IO_ERR;
- g_main_context_add_poll(0, fd, 0);
- fd_list[fd_count++] = fd;
- }
- if (FD_ISSET(i, &write_fd_set)) {
- GPollFD *fd = malloc(sizeof *fd);
- fd->fd = i;
- fd->events = G_IO_OUT | G_IO_ERR;
- g_main_context_add_poll(0, fd, 0);
- fd_list[fd_count++] = fd;
- }
- if (FD_ISSET(i, &exc_fd_set)) {
- GPollFD *fd = malloc(sizeof *fd);
- fd->fd = i;
- fd->events = G_IO_ERR;
- g_main_context_add_poll(0, fd, 0);
- fd_list[fd_count++] = fd;
- }
+ fetcher_fdset(&read_fd_set, &write_fd_set, &exc_fd_set, &max_fd);
+ for (int i = 0; i <= max_fd; i++) {
+ if (FD_ISSET(i, &read_fd_set)) {
+ GPollFD *fd = malloc(sizeof *fd);
+ fd->fd = i;
+ fd->events = G_IO_IN | G_IO_HUP | G_IO_ERR;
+ g_main_context_add_poll(0, fd, 0);
+ fd_list[fd_count++] = fd;
+ }
+ if (FD_ISSET(i, &write_fd_set)) {
+ GPollFD *fd = malloc(sizeof *fd);
+ fd->fd = i;
+ fd->events = G_IO_OUT | G_IO_ERR;
+ g_main_context_add_poll(0, fd, 0);
+ fd_list[fd_count++] = fd;
+ }
+ if (FD_ISSET(i, &exc_fd_set)) {
+ GPollFD *fd = malloc(sizeof *fd);
+ fd->fd = i;
+ fd->events = G_IO_ERR;
+ g_main_context_add_poll(0, fd, 0);
+ fd_list[fd_count++] = fd;
}
}
+ schedule_run();
+
gtk_main_iteration_do(block);
for (unsigned int i = 0; i != fd_count; i++) {
@@ -659,40 +531,36 @@ void gui_poll(bool active)
free(fd_list[i]);
}
- schedule_run();
-
- if (browser_reformat_pending)
- nsgtk_window_process_reformats();
}
-void gui_quit(void)
+static void gui_quit(void)
{
+ LOG(("Quitting GUI"));
+
+ /* Ensure all scaffoldings are destroyed before we go into exit */
nsgtk_download_destroy();
urldb_save_cookies(nsoption_charp(cookie_jar));
urldb_save(nsoption_charp(url_file));
nsgtk_cookies_destroy();
nsgtk_history_destroy();
nsgtk_hotlist_destroy();
- free(print_options_file_location);
- free(search_engines_file_location);
- free(search_default_ico_location);
- free(toolbar_indices_file_location);
- gtk_fetch_filetype_fin();
-}
-
+ free(toolbar_indices_file_location);
+ free(nsgtk_config_home);
+ gtk_fetch_filetype_fin();
+}
static void nsgtk_select_menu_clicked(GtkCheckMenuItem *checkmenuitem,
gpointer user_data)
{
- form_select_process_selection(select_menu_bw->current_content,
- select_menu_control, (intptr_t)user_data);
+ form_select_process_selection(select_menu_control,
+ (intptr_t)user_data);
}
-void gui_create_form_select_menu(struct browser_window *bw,
+static void gui_create_form_select_menu(struct browser_window *bw,
struct form_control *control)
{
@@ -733,24 +601,21 @@ void gui_create_form_select_menu(struct browser_window *bw,
}
-void gui_window_save_link(struct gui_window *g, const char *url,
- const char *title)
-{
-}
-
-void gui_launch_url(const char *url)
+static nserror gui_launch_url(struct nsurl *url)
{
gboolean ok;
GError *error = NULL;
- ok = nsgtk_show_uri(NULL, url, GDK_CURRENT_TIME, &error);
- if (ok == TRUE)
- return;
+ ok = nsgtk_show_uri(NULL, nsurl_access(url), GDK_CURRENT_TIME, &error);
+ if (ok == TRUE) {
+ return NSERROR_OK;
+ }
if (error) {
warn_user(messages_get("URIOpenError"), error->message);
g_error_free(error);
}
+ return NSERROR_NO_FETCH_HANDLER;
}
void warn_user(const char *warning, const char *detail)
@@ -776,11 +641,11 @@ void die(const char * const error)
}
-void gui_cert_verify(nsurl *url, const struct ssl_cert_info *certs,
+static void gui_cert_verify(nsurl *url, const struct ssl_cert_info *certs,
unsigned long num, nserror (*cb)(bool proceed, void *pw),
void *cbpw)
-{
- static struct nsgtk_treeview *ssl_window;
+{
+ static struct nsgtk_treeview *ssl_window;
struct sslcert_session_data *data;
GtkButton *accept, *reject;
void **session;
@@ -788,12 +653,20 @@ void gui_cert_verify(nsurl *url, const struct ssl_cert_info *certs,
GtkScrolledWindow *scrolled;
GtkDrawingArea *drawing_area;
GError* error = NULL;
- GtkBuilder* builder;
+ GtkBuilder* builder;
+
+ /* state while window is open */
+ session = calloc(sizeof(void *), 3);
+ if (session == NULL) {
+ return;
+ }
builder = gtk_builder_new ();
if (!gtk_builder_add_from_file(builder, glade_file_location->ssl, &error)) {
g_warning("Couldn't load builder file: %s", error->message);
g_error_free(error);
+
+ free(session);
return;
}
@@ -804,36 +677,31 @@ void gui_cert_verify(nsurl *url, const struct ssl_cert_info *certs,
scrolled = GTK_SCROLLED_WINDOW(gtk_builder_get_object(builder, "SSLScrolled"));
drawing_area = GTK_DRAWING_AREA(gtk_builder_get_object(builder, "SSLDrawingArea"));
- session = calloc(sizeof(void *), 3);
-
- if (session == NULL) {
- return;
- }
ssl_window = nsgtk_treeview_create(TREE_SSLCERT, window, scrolled,
drawing_area);
-
+
if (ssl_window == NULL) {
free(session);
return;
}
-
+
accept = GTK_BUTTON(gtk_builder_get_object(builder, "sslaccept"));
- reject = GTK_BUTTON(gtk_builder_get_object(builder, "sslreject"));
+ reject = GTK_BUTTON(gtk_builder_get_object(builder, "sslreject"));
session[0] = builder;
session[1] = ssl_window;
session[2] = data;
-
+
#define CONNECT(obj, sig, callback, ptr) \
- g_signal_connect(G_OBJECT(obj), (sig), G_CALLBACK(callback), (ptr))
-
+ g_signal_connect(G_OBJECT(obj), (sig), G_CALLBACK(callback), (ptr))
+
CONNECT(accept, "clicked", nsgtk_ssl_accept, session);
CONNECT(reject, "clicked", nsgtk_ssl_reject, session);
CONNECT(window, "delete_event", G_CALLBACK(nsgtk_ssl_delete_event),
(gpointer)session);
-
- gtk_widget_show(GTK_WIDGET(window));
+
+ gtk_widget_show(GTK_WIDGET(window));
}
void nsgtk_ssl_accept(GtkButton *w, gpointer data)
@@ -844,7 +712,7 @@ void nsgtk_ssl_accept(GtkButton *w, gpointer data)
struct sslcert_session_data *ssl_data = session[2];
sslcert_viewer_accept(ssl_data);
-
+
nsgtk_treeview_destroy(wnd);
g_object_unref(G_OBJECT(x));
free(session);
@@ -858,7 +726,7 @@ void nsgtk_ssl_reject(GtkWidget *w, gpointer data)
struct sslcert_session_data *ssl_data = session[2];
sslcert_viewer_reject(ssl_data);
-
+
nsgtk_treeview_destroy(wnd);
g_object_unref(G_OBJECT(x));
free(session);
@@ -870,84 +738,6 @@ gboolean nsgtk_ssl_delete_event(GtkWidget *w, GdkEvent *event, gpointer data)
return FALSE;
}
-utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len,
- char **result)
-{
- assert(string && result);
-
- if (len == 0)
- len = strlen(string);
-
- *result = strndup(string, len);
- if (!(*result))
- return UTF8_CONVERT_NOMEM;
-
- return UTF8_CONVERT_OK;
-}
-
-
-utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len,
- char **result)
-{
- assert(string && result);
-
- if (len == 0)
- len = strlen(string);
-
- *result = strndup(string, len);
- if (!(*result))
- return UTF8_CONVERT_NOMEM;
-
- return UTF8_CONVERT_OK;
-}
-
-
-char *path_to_url(const char *path)
-{
- int urllen;
- char *url;
-
- if (path == NULL) {
- return NULL;
- }
-
- urllen = strlen(path) + FILE_SCHEME_PREFIX_LEN + 1;
-
- url = malloc(urllen);
- if (url == NULL) {
- return NULL;
- }
-
- if (*path == '/') {
- path++; /* file: paths are already absolute */
- }
-
- snprintf(url, urllen, "%s%s", FILE_SCHEME_PREFIX, path);
-
- return url;
-}
-
-
-char *url_to_path(const char *url)
-{
- char *path;
- char *respath;
- url_func_result res; /* result from url routines */
-
- res = url_path(url, &path);
- if (res != URL_FUNC_OK) {
- return NULL;
- }
-
- res = url_unescape(path, &respath);
- free(path);
- if (res != URL_FUNC_OK) {
- return NULL;
- }
-
- return respath;
-}
-
#ifdef WITH_PDF_EXPORT
void PDF_Password(char **owner_pass, char **user_pass, char *path)
@@ -1061,7 +851,7 @@ uint32_t gtk_gui_gdkkey_to_nskey(GdkEventKey *key)
* now. I hope.
*/
switch (key->keyval) {
-
+
case GDK_KEY(Tab):
return KEY_TAB;
@@ -1141,49 +931,403 @@ uint32_t gtk_gui_gdkkey_to_nskey(GdkEventKey *key)
case GDK_KEY(Super_L):
case GDK_KEY(Super_R):
case GDK_KEY(Hyper_L):
- case GDK_KEY(Hyper_R):
+ case GDK_KEY(Hyper_R):
return 0;
- default:
+ default:
return gdk_keyval_to_unicode(key->keyval);
- }
+ }
+}
+
+
+/**
+ * create directory name and check it is acessible and a directory.
+ */
+static nserror
+check_dirname(const char *path, const char *leaf, char **dirname_out)
+{
+ nserror ret;
+ char *dirname = NULL;
+ struct stat dirname_stat;
+
+ ret = netsurf_mkpath(&dirname, NULL, 2, path, leaf);
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+
+ /* ensure access is possible and the entry is actualy
+ * a directory.
+ */
+ if (stat(dirname, &dirname_stat) == 0) {
+ if (S_ISDIR(dirname_stat.st_mode)) {
+ if (access(dirname, R_OK | W_OK) == 0) {
+ *dirname_out = dirname;
+ return NSERROR_OK;
+ } else {
+ ret = NSERROR_PERMISSION;
+ }
+ } else {
+ ret = NSERROR_NOT_DIRECTORY;
+ }
+ } else {
+ ret = NSERROR_NOT_FOUND;
+ }
+
+ free(dirname);
+
+ return ret;
}
/**
- * Return the filename part of a full path
+ * Get the path to the config directory.
*
- * \param path full path and filename
- * \return filename (will be freed with free())
+ * @param config_home_out Path to configuration directory.
+ * @return NSERROR_OK on sucess and \a config_home_out updated else error code.
*/
+static nserror get_config_home(char **config_home_out)
+{
+ nserror ret;
+ char *home_dir;
+ char *xdg_config_dir;
+ char *config_home;
+
+ home_dir = getenv("HOME");
+
+ /* The old $HOME/.netsurf/ directory should be used if it
+ * exists and is accessible.
+ */
+ if (home_dir != NULL) {
+ ret = check_dirname(home_dir, ".netsurf", &config_home);
+ if (ret == NSERROR_OK) {
+ LOG(("\"%s\"", config_home));
+ *config_home_out = config_home;
+ return ret;
+ }
+ }
+
+ /* $XDG_CONFIG_HOME defines the base directory
+ * relative to which user specific configuration files
+ * should be stored.
+ */
+ xdg_config_dir = getenv("XDG_CONFIG_HOME");
+
+ if ((xdg_config_dir == NULL) || (*xdg_config_dir == 0)) {
+ /* If $XDG_CONFIG_HOME is either not set or empty, a
+ * default equal to $HOME/.config should be used.
+ */
+
+ /** @todo the meaning of empty is never defined so I
+ * am assuming it is a zero length string but is it
+ * supposed to mean "whitespace" and if so what counts
+ * as whitespace? (are tabs etc. counted or should
+ * isspace() be used)
+ */
+
+ /* the HOME envvar is required */
+ if (home_dir == NULL) {
+ return NSERROR_NOT_DIRECTORY;
+ }
+
+ ret = check_dirname(home_dir, ".config/netsurf", &config_home);
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+ } else {
+ ret = check_dirname(xdg_config_dir, "netsurf", &config_home);
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+ }
+
+ LOG(("\"%s\"", config_home));
+
+ *config_home_out = config_home;
+ return NSERROR_OK;
+}
-char *filename_from_path(char *path)
+static nserror create_config_home(char **config_home_out)
{
- char *leafname;
+ char *config_home = NULL;
+ char *home_dir;
+ char *xdg_config_dir;
+ nserror ret;
+
+ LOG(("Attempting to create configuration directory"));
+
+ /* $XDG_CONFIG_HOME defines the base directory
+ * relative to which user specific configuration files
+ * should be stored.
+ */
+ xdg_config_dir = getenv("XDG_CONFIG_HOME");
+
+ if ((xdg_config_dir == NULL) || (*xdg_config_dir == 0)) {
+ home_dir = getenv("HOME");
- leafname = strrchr(path, '/');
- if (!leafname)
- leafname = path;
- else
- leafname += 1;
+ if ((home_dir == NULL) || (*home_dir == 0)) {
+ return NSERROR_NOT_DIRECTORY;
+ }
+
+ ret = netsurf_mkpath(&config_home, NULL, 4, home_dir, ".config","netsurf", "/");
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+ } else {
+ ret = netsurf_mkpath(&config_home, NULL, 3, xdg_config_dir, "netsurf", "/");
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+ }
- return strdup(leafname);
+ /* ensure all elements of path exist (the trailing / is required) */
+ ret = netsurf_mkdir_all(config_home);
+ if (ret != NSERROR_OK) {
+ free(config_home);
+ return ret;
+ }
+
+ /* strip the trailing separator */
+ config_home[strlen(config_home) - 1] = 0;
+
+ LOG(("\"%s\"", config_home));
+
+ *config_home_out = config_home;
+
+ return NSERROR_OK;
}
/**
- * Add a path component/filename to an existing path
+ * Get the path to the cache directory.
*
- * \param path buffer containing path + free space
- * \param length length of buffer "path"
- * \param newpart string containing path component to add to path
- * \return true on success
+ * @param cache_home_out Path to cache directory.
+ * @return NSERROR_OK on sucess and \a cache_home_out updated else error code.
*/
+static nserror get_cache_home(char **cache_home_out)
+{
+ nserror ret;
+ char *xdg_cache_dir;
+ char *cache_home;
+ char *home_dir;
+
+ /* $XDG_CACHE_HOME defines the base directory relative to
+ * which user specific non-essential data files should be
+ * stored.
+ */
+ xdg_cache_dir = getenv("XDG_CACHE_HOME");
-bool path_add_part(char *path, int length, const char *newpart)
+ if ((xdg_cache_dir == NULL) || (*xdg_cache_dir == 0)) {
+ /* If $XDG_CACHE_HOME is either not set or empty, a
+ * default equal to $HOME/.cache should be used.
+ */
+
+ home_dir = getenv("HOME");
+
+ /* the HOME envvar is required */
+ if (home_dir == NULL) {
+ return NSERROR_NOT_DIRECTORY;
+ }
+
+ ret = check_dirname(home_dir, ".cache/netsurf", &cache_home);
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+ } else {
+ ret = check_dirname(xdg_cache_dir, "netsurf", &cache_home);
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+ }
+
+ LOG(("\"%s\"", cache_home));
+
+ *cache_home_out = cache_home;
+ return NSERROR_OK;
+}
+
+static nserror create_cache_home(char **cache_home_out)
{
- if(path[strlen(path) - 1] != '/')
- strncat(path, "/", length);
+ char *cache_home = NULL;
+ char *home_dir;
+ char *xdg_cache_dir;
+ nserror ret;
- strncat(path, newpart, length);
+ LOG(("Attempting to create configuration directory"));
- return true;
+ /* $XDG_CACHE_HOME defines the base directory
+ * relative to which user specific cache files
+ * should be stored.
+ */
+ xdg_cache_dir = getenv("XDG_CACHE_HOME");
+
+ if ((xdg_cache_dir == NULL) || (*xdg_cache_dir == 0)) {
+ home_dir = getenv("HOME");
+
+ if ((home_dir == NULL) || (*home_dir == 0)) {
+ return NSERROR_NOT_DIRECTORY;
+ }
+
+ ret = netsurf_mkpath(&cache_home, NULL, 4, home_dir, ".cache", "netsurf", "/");
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+ } else {
+ ret = netsurf_mkpath(&cache_home, NULL, 3, xdg_cache_dir, "netsurf", "/");
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+ }
+
+ /* ensure all elements of path exist (the trailing / is required) */
+ ret = netsurf_mkdir_all(cache_home);
+ if (ret != NSERROR_OK) {
+ free(cache_home);
+ return ret;
+ }
+
+ /* strip the trailing separator */
+ cache_home[strlen(cache_home) - 1] = 0;
+
+ LOG(("\"%s\"", cache_home));
+
+ *cache_home_out = cache_home;
+
+ return NSERROR_OK;
+}
+
+static nserror nsgtk_option_init(int *pargc, char** argv)
+{
+ nserror ret;
+ char *choices = NULL;
+
+ /* user options setup */
+ ret = nsoption_init(set_defaults, &nsoptions, &nsoptions_default);
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+
+ /* Attempt to load the user choices */
+ ret = netsurf_mkpath(&choices, NULL, 2, nsgtk_config_home, "Choices");
+ if (ret == NSERROR_OK) {
+ nsoption_read(choices, nsoptions);
+ free(choices);
+ }
+
+ /* overide loaded options with those from commandline */
+ nsoption_commandline(pargc, argv, nsoptions);
+
+ /* ensure all options fall within sensible bounds */
+
+ /* select menus generated by core code */
+ nsoption_set_bool(core_select_menu, true);
+
+ /* Attempt to handle nonsense status bar widths. These may exist
+ * in people's Choices as the GTK front end used to abuse the
+ * status bar width option by using it for an absolute value in px.
+ * The GTK front end now correctly uses it as a proportion of window
+ * width. Here we assume that a value of less than 15% is wrong
+ * and set to the default two thirds. */
+ if (nsoption_int(toolbar_status_size) < 1500) {
+ nsoption_set_int(toolbar_status_size, 6667);
+ }
+
+ return NSERROR_OK;
+}
+
+static struct gui_browser_table nsgtk_browser_table = {
+ .poll = nsgtk_poll,
+ .schedule = nsgtk_schedule,
+
+ .quit = gui_quit,
+ .launch_url = gui_launch_url,
+ .create_form_select_menu = gui_create_form_select_menu,
+ .cert_verify = gui_cert_verify,
+ .login = gui_401login_open,
+};
+
+/**
+ * Main entry point from OS.
+ */
+int main(int argc, char** argv)
+{
+ char *messages;
+ char *cache_home = NULL;
+ nserror ret;
+ struct netsurf_table nsgtk_table = {
+ .browser = &nsgtk_browser_table,
+ .window = nsgtk_window_table,
+ .clipboard = nsgtk_clipboard_table,
+ .download = nsgtk_download_table,
+ .fetch = nsgtk_fetch_table,
+ .llcache = filesystem_llcache_table,
+ .search = nsgtk_search_table,
+ .search_web = nsgtk_search_web_table,
+ };
+
+ ret = netsurf_register(&nsgtk_table);
+ if (ret != NSERROR_OK) {
+ die("NetSurf operation table failed registration");
+ }
+
+ /* build the common resource path list */
+ respaths = nsgtk_init_resource("${HOME}/.netsurf/:${NETSURFRES}:"GTK_RESPATH":./gtk/res");
+
+ /* Locate the correct user configuration directory path */
+ ret = get_config_home(&nsgtk_config_home);
+ if (ret == NSERROR_NOT_FOUND) {
+ /* no config directory exists yet so try to create one */
+ ret = create_config_home(&nsgtk_config_home);
+ }
+ if (ret != NSERROR_OK) {
+ LOG(("Unable to locate a configuration directory."));
+ nsgtk_config_home = NULL;
+ }
+
+ /* Initialise gtk */
+ gtk_init(&argc, &argv);
+
+ /* initialise logging. Not fatal if it fails but not much we
+ * can do about it either.
+ */
+ nslog_init(nslog_stream_configure, &argc, argv);
+
+ /* Initialise user options */
+ ret = nsgtk_option_init(&argc, argv);
+ if (ret != NSERROR_OK) {
+ fprintf(stderr, "Options failed to initialise (%s)\n",
+ messages_get_errorcode(ret));
+ return 1;
+ }
+
+ /* Obtain path to messages */
+ messages = filepath_find(respaths, "Messages");
+
+ /* Locate the correct user cache directory path */
+ ret = get_cache_home(&cache_home);
+ if (ret == NSERROR_NOT_FOUND) {
+ /* no cache directory exists yet so try to create one */
+ ret = create_cache_home(&cache_home);
+ }
+ if (ret != NSERROR_OK) {
+ LOG(("Unable to locate a cache directory."));
+ }
+
+ /* core initialisation */
+ ret = netsurf_init(messages, cache_home);
+ free(messages);
+ free(cache_home);
+ if (ret != NSERROR_OK) {
+ fprintf(stderr, "NetSurf core failed to initialise (%s)\n",
+ messages_get_errorcode(ret));
+ return 1;
+ }
+
+ /* run the browser */
+ gui_init(argc, argv, respaths);
+
+ /* common finalisation */
+ netsurf_exit();
+
+ /* finalise options */
+ nsoption_finalise(nsoptions, nsoptions_default);
+
+ return 0;
}
diff --git a/gtk/gui.h b/gtk/gui.h
index 72794b231..32f864f71 100644
--- a/gtk/gui.h
+++ b/gtk/gui.h
@@ -29,7 +29,8 @@
#include <inttypes.h>
#include <stdbool.h>
#include <gtk/gtk.h>
-//#include <glade/glade.h>
+
+#include "utils/nsurl.h"
struct glade_file_location_s {
char *netsurf;
@@ -44,6 +45,7 @@ struct glade_file_location_s {
char *history;
char *hotlist;
char *cookies;
+ char *viewdata;
};
/** location of all glade files. */
@@ -51,14 +53,20 @@ extern struct glade_file_location_s *glade_file_location;
extern char *languages_file_location;
extern char *toolbar_indices_file_location;
-extern char *options_file_location; /**< location where user options are written */
extern char *res_dir_location;
-extern char *print_options_file_location;
extern char *themelist_file_location;
+/** Directory where all configuration files are held. */
+extern char *nsgtk_config_home;
+
extern GdkPixbuf *favicon_pixbuf; /* favicon default pixbuf */
+extern char **respaths; /** resource search path vector */
+
uint32_t gtk_gui_gdkkey_to_nskey(GdkEventKey *);
+extern void gui_401login_open(nsurl *url, const char *realm,
+ nserror (*cb)(bool proceed, void *pw), void *cbpw);
+
#endif /* GTK_GUI_H */
diff --git a/gtk/hotlist.c b/gtk/hotlist.c
index db090992c..0c98bd90c 100644
--- a/gtk/hotlist.c
+++ b/gtk/hotlist.c
@@ -16,17 +16,19 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <stdlib.h>
-#include "desktop/hotlist.h"
+#include "utils/log.h"
#include "utils/nsoption.h"
+#include "desktop/hotlist.h"
#include "desktop/plotters.h"
#include "desktop/tree.h"
+
#include "gtk/gui.h"
#include "gtk/hotlist.h"
#include "gtk/plotters.h"
#include "gtk/scaffolding.h"
#include "gtk/treeview.h"
-#include "utils/log.h"
#define GLADE_NAME "hotlist.glade"
diff --git a/gtk/login.c b/gtk/login.c
index 3b8d68254..f98a78703 100644
--- a/gtk/login.c
+++ b/gtk/login.c
@@ -28,10 +28,8 @@
#include "content/hlcache.h"
#include "content/urldb.h"
#include "desktop/browser.h"
-#include "desktop/401login.h"
#include "desktop/gui.h"
#include "utils/messages.h"
-#include "utils/url.h"
#include "utils/utils.h"
struct session_401 {
diff --git a/gtk/menu.c b/gtk/menu.c
index 7c55a9fd6..065ee6bdf 100644
--- a/gtk/menu.c
+++ b/gtk/menu.c
@@ -53,6 +53,13 @@ static bool nsgtk_menu_add_image_item(GtkMenu *menu,
return true;
}
+#define NEW_MENU(n, m) \
+ n = malloc(sizeof(*n)); \
+ if (n == NULL) { \
+ return NULL; \
+ } \
+ n->m##_menu = GTK_MENU(gtk_menu_new())
+
#define IMAGE_ITEM(p, q, r, s, t)\
nsgtk_menu_add_image_item(s->p##_menu, &(s->q##_menuitem), #r,\
#r "Accel", t)
@@ -66,7 +73,7 @@ static bool nsgtk_menu_add_image_item(GtkMenu *menu,
GTK_WIDGET(s->q##_menuitem));\
gtk_widget_show(GTK_WIDGET(s->q##_menuitem));\
}
-
+
#define SET_SUBMENU(q, r) \
do { \
r->q##_submenu = nsgtk_menu_##q##_submenu(group); \
@@ -76,7 +83,7 @@ static bool nsgtk_menu_add_image_item(GtkMenu *menu,
gtk_menu_item_set_submenu(GTK_MENU_ITEM(r->q##_menuitem), \
GTK_WIDGET(r->q##_submenu->q##_menu)); \
} \
- } while(0)
+ } while(0)
#define ADD_NAMED_SEP(q, r, s) \
do { \
@@ -85,7 +92,7 @@ static bool nsgtk_menu_add_image_item(GtkMenu *menu,
gtk_menu_shell_append(GTK_MENU_SHELL(s->q##_menu), s->r##_separator); \
gtk_widget_show(s->r##_separator); \
} \
- } while(0)
+ } while(0)
#define ADD_SEP(q, r) \
do { \
@@ -94,22 +101,20 @@ static bool nsgtk_menu_add_image_item(GtkMenu *menu,
gtk_menu_shell_append(GTK_MENU_SHELL(r->q##_menu), w); \
gtk_widget_show(w); \
} \
- } while(0)
+ } while(0)
#define ATTACH_PARENT(parent, msgname, menuv, group) \
do { \
- if (parent != NULL) { \
- /* create top level menu entry and attach to parent */ \
- menuv = GTK_MENU_ITEM(gtk_menu_item_new_with_mnemonic(messages_get(#msgname))); \
- gtk_menu_shell_append(parent, GTK_WIDGET(menuv)); \
- gtk_widget_show(GTK_WIDGET(menuv)); \
- /* attach submenu to parent */ \
- gtk_menu_item_set_submenu(menuv, GTK_WIDGET(menuv##_menu)); \
- gtk_menu_set_accel_group(menuv##_menu, group); \
- } \
- } while(0)
+ /* create top level menu entry and attach to parent */ \
+ menuv = GTK_MENU_ITEM(gtk_menu_item_new_with_mnemonic(messages_get(#msgname))); \
+ gtk_menu_shell_append(parent, GTK_WIDGET(menuv)); \
+ gtk_widget_show(GTK_WIDGET(menuv)); \
+ /* attach submenu to parent */ \
+ gtk_menu_item_set_submenu(menuv, GTK_WIDGET(menuv##_menu)); \
+ gtk_menu_set_accel_group(menuv##_menu, group); \
+ } while(0)
-/**
+/**
* creates an export submenu
* \param group the 'global' in a gtk sense accelerator reference
*/
@@ -135,7 +140,7 @@ static struct nsgtk_export_submenu *nsgtk_menu_export_submenu(GtkAccelGroup *gro
return ret;
}
-/**
+/**
* creates a scaleview submenu
* \param group the 'global' in a gtk sense accelerator reference
*/
@@ -143,7 +148,7 @@ static struct nsgtk_export_submenu *nsgtk_menu_export_submenu(GtkAccelGroup *gro
static struct nsgtk_scaleview_submenu *nsgtk_menu_scaleview_submenu(
GtkAccelGroup *group)
{
- struct nsgtk_scaleview_submenu *ret =
+ struct nsgtk_scaleview_submenu *ret =
malloc(sizeof(struct nsgtk_scaleview_submenu));
if (ret == NULL) {
warn_user(messages_get("NoMemory"), 0);
@@ -161,7 +166,7 @@ static struct nsgtk_scaleview_submenu *nsgtk_menu_scaleview_submenu(
return ret;
}
-/**
+/**
* creates a tab navigation submenu
* \param group the 'global' in a gtk sense accelerator reference
*/
@@ -186,7 +191,7 @@ static struct nsgtk_tabs_submenu *nsgtk_menu_tabs_submenu(GtkAccelGroup *group)
return ret;
}
-/**
+/**
* creates an images submenu
* \param group the 'global' in a gtk sense accelerator reference
*/
@@ -210,7 +215,7 @@ static struct nsgtk_images_submenu *nsgtk_menu_images_submenu(GtkAccelGroup *gro
return ret;
}
-/**
+/**
* creates a toolbars submenu
* \param group the 'global' in a gtk sense accelerator reference
*/
@@ -234,38 +239,41 @@ static struct nsgtk_toolbars_submenu *nsgtk_menu_toolbars_submenu(
if (ret->menubar_menuitem != NULL)
gtk_check_menu_item_set_active(ret->menubar_menuitem, TRUE);
CHECK_ITEM(toolbars, toolbar, gtkToolBar, ret)
- if (ret->toolbar_menuitem != NULL)
+ if (ret->toolbar_menuitem != NULL)
gtk_check_menu_item_set_active(ret->toolbar_menuitem, TRUE);
return ret;
}
-/**
+/**
* creates a debugging submenu
* \param group the 'global' in a gtk sense accelerator reference
*/
-static struct nsgtk_debugging_submenu *nsgtk_menu_debugging_submenu(
+static struct nsgtk_developer_submenu *nsgtk_menu_developer_submenu(
GtkAccelGroup *group)
{
- struct nsgtk_debugging_submenu *ret =
- malloc(sizeof(struct nsgtk_debugging_submenu));
- if (ret == NULL) {
+ struct nsgtk_developer_submenu *dmenu =
+ malloc(sizeof(struct nsgtk_developer_submenu));
+ if (dmenu == NULL) {
warn_user(messages_get("NoMemory"), 0);
return NULL;
}
- ret->debugging_menu = GTK_MENU(gtk_menu_new());
- if (ret->debugging_menu == NULL) {
+ dmenu->developer_menu = GTK_MENU(gtk_menu_new());
+ if (dmenu->developer_menu == NULL) {
warn_user(messages_get("NoMemory"), 0);
- free(ret);
+ free(dmenu);
return NULL;
}
- IMAGE_ITEM(debugging, toggledebugging, gtkToggleDebugging, ret, group);
- IMAGE_ITEM(debugging, saveboxtree, gtkSaveBoxTree, ret, group);
- IMAGE_ITEM(debugging, savedomtree, gtkSaveDomTree, ret, group);
- return ret;
+
+ IMAGE_ITEM(developer, viewsource, gtkPageSource, dmenu, group);
+ IMAGE_ITEM(developer, toggledebugging, gtkToggleDebugging, dmenu, group);
+ IMAGE_ITEM(developer, debugboxtree, gtkDebugBoxTree, dmenu, group);
+ IMAGE_ITEM(developer, debugdomtree, gtkDebugDomTree, dmenu, group);
+
+ return dmenu;
}
-
-/**
+
+/**
* creates the file menu
* \param group The gtk 'global' accelerator reference
* \param parent The parent menu to attach to or NULL
@@ -304,7 +312,7 @@ static struct nsgtk_file_menu *nsgtk_menu_file_submenu(GtkAccelGroup *group)
return fmenu;
}
-/**
+/**
* creates an edit menu
* \param group the 'global' in a gtk sense accelerator reference
*/
@@ -336,7 +344,7 @@ static struct nsgtk_edit_menu *nsgtk_menu_edit_submenu(GtkAccelGroup *group)
return ret;
}
-/**
+/**
* creates a view menu
* \param group the 'global' in a gtk sense accelerator reference
*/
@@ -359,26 +367,22 @@ static struct nsgtk_view_menu *nsgtk_menu_view_submenu(GtkAccelGroup *group)
ADD_SEP(view, ret);
IMAGE_ITEM(view, scaleview, gtkScaleView, ret, group);
IMAGE_ITEM(view, fullscreen, gtkFullScreen, ret, group);
- IMAGE_ITEM(view, viewsource, gtkViewSource, ret, group);
ADD_SEP(view, ret);
IMAGE_ITEM(view, images, gtkImages, ret, group);
IMAGE_ITEM(view, toolbars, gtkToolbars, ret, group);
IMAGE_ITEM(view, tabs, gtkTabs, ret, group);
ADD_SEP(view, ret);
- IMAGE_ITEM(view, downloads, gtkDownloads, ret, group);
IMAGE_ITEM(view, savewindowsize, gtkSaveWindowSize, ret, group);
- IMAGE_ITEM(view, debugging, gtkDebugging, ret, group);
SET_SUBMENU(scaleview, ret);
SET_SUBMENU(images, ret);
SET_SUBMENU(toolbars, ret);
SET_SUBMENU(tabs, ret);
- SET_SUBMENU(debugging, ret);
return ret;
}
-/**
+/**
* creates a nav menu
* \param group the 'global' in a gtk sense accelerator reference
*/
@@ -407,19 +411,42 @@ static struct nsgtk_nav_menu *nsgtk_menu_nav_submenu(GtkAccelGroup *group)
IMAGE_ITEM(nav, addbookmarks, gtkAddBookMarks, ret, group);
IMAGE_ITEM(nav, showbookmarks, gtkShowBookMarks, ret, group);
ADD_SEP(nav, ret);
- IMAGE_ITEM(nav, showcookies, gtkShowCookies, ret, group);
- ADD_SEP(nav, ret);
IMAGE_ITEM(nav, openlocation, gtkOpenLocation, ret, group);
return ret;
}
-/**
-* creates a help menu
-* \param group the 'global' in a gtk sense accelerator reference
-*/
+/**
+ * creates the tools menu
+ * \param group the 'global' in a gtk sense accelerator reference
+ */
+static struct nsgtk_tools_menu *nsgtk_menu_tools_submenu(GtkAccelGroup *group)
+{
+ struct nsgtk_tools_menu *ret = malloc(sizeof(struct nsgtk_tools_menu));
+ if (ret == NULL) {
+ warn_user(messages_get("NoMemory"), 0);
+ return NULL;
+ }
+ ret->tools_menu = GTK_MENU(gtk_menu_new());
+ if (ret->tools_menu == NULL) {
+ warn_user(messages_get("NoMemory"), 0);
+ free(ret);
+ return NULL;
+ }
+
+ IMAGE_ITEM(tools, downloads, gtkDownloads, ret, group);
+ IMAGE_ITEM(tools, showcookies, gtkShowCookies, ret, group);
+ IMAGE_ITEM(tools, developer, gtkDeveloper, ret, group);
+ SET_SUBMENU(developer, ret);
+ return ret;
+}
+
+/**
+ * creates a help menu
+ * \param group the 'global' in a gtk sense accelerator reference
+ */
static struct nsgtk_help_menu *nsgtk_menu_help_submenu(GtkAccelGroup *group)
{
struct nsgtk_help_menu *ret = malloc(sizeof(struct nsgtk_help_menu));
@@ -448,53 +475,46 @@ static struct nsgtk_help_menu *nsgtk_menu_help_submenu(GtkAccelGroup *group)
*
* Generate the main menu structure and attach it to a menubar widget.
*/
-struct nsgtk_bar_submenu *nsgtk_menu_bar_create(GtkMenuShell *menubar, GtkAccelGroup *group)
+struct nsgtk_bar_submenu *
+nsgtk_menu_bar_create(GtkMenuShell *menubar, GtkAccelGroup *group)
{
- ;
struct nsgtk_bar_submenu *nmenu;
- nmenu = malloc(sizeof(struct nsgtk_bar_submenu));
+ nmenu = calloc(1, sizeof(struct nsgtk_bar_submenu));
if (nmenu == NULL) {
- warn_user(messages_get("NoMemory"), 0);
return NULL;
}
- nmenu->bar_menu = GTK_MENU_BAR(menubar);
-
+ /* create sub menus */
nmenu->file_submenu = nsgtk_menu_file_submenu(group);
- ATTACH_PARENT(menubar, gtkFile, nmenu->file_submenu->file, group);
-
nmenu->edit_submenu = nsgtk_menu_edit_submenu(group);
- ATTACH_PARENT(menubar, gtkEdit, nmenu->edit_submenu->edit, group);
-
nmenu->view_submenu = nsgtk_menu_view_submenu(group);
- ATTACH_PARENT(menubar, gtkView, nmenu->view_submenu->view, group);
-
nmenu->nav_submenu = nsgtk_menu_nav_submenu(group);
- ATTACH_PARENT(menubar, gtkNavigate, nmenu->nav_submenu->nav, group);
-
+ nmenu->tools_submenu = nsgtk_menu_tools_submenu(group);
nmenu->help_submenu = nsgtk_menu_help_submenu(group);
- ATTACH_PARENT(menubar, gtkHelp, nmenu->help_submenu->help, group);
+
+ if (menubar != NULL) {
+ nmenu->bar_menu = GTK_MENU_BAR(menubar);
+
+ /* attach menus to menubar */
+ ATTACH_PARENT(menubar, gtkFile, nmenu->file_submenu->file, group);
+ ATTACH_PARENT(menubar, gtkEdit, nmenu->edit_submenu->edit, group);
+ ATTACH_PARENT(menubar, gtkView, nmenu->view_submenu->view, group);
+ ATTACH_PARENT(menubar, gtkNavigate, nmenu->nav_submenu->nav, group);
+ ATTACH_PARENT(menubar, gtkTools, nmenu->tools_submenu->tools, group);
+ ATTACH_PARENT(menubar, gtkHelp, nmenu->help_submenu->help, group);
+ }
return nmenu;
}
-/**
- * Generate right click menu menu.
- *
- */
-struct nsgtk_popup_submenu *nsgtk_menu_popup_create(GtkAccelGroup *group)
+/* exported function documented in gtk/menu.h */
+struct nsgtk_popup_menu *nsgtk_popup_menu_create(GtkAccelGroup *group)
{
- struct nsgtk_popup_submenu *nmenu;
+ struct nsgtk_popup_menu *nmenu;
- nmenu = malloc(sizeof(struct nsgtk_popup_submenu));
- if (nmenu == NULL) {
- warn_user(messages_get("NoMemory"), 0);
- return NULL;
- }
+ NEW_MENU(nmenu, popup);
- nmenu->popup_menu = GTK_MENU(gtk_menu_new());
-
IMAGE_ITEM(popup, file, gtkFile, nmenu, group);
SET_SUBMENU(file, nmenu);
@@ -507,17 +527,14 @@ struct nsgtk_popup_submenu *nsgtk_menu_popup_create(GtkAccelGroup *group)
IMAGE_ITEM(popup, nav, gtkNavigate, nmenu, group);
SET_SUBMENU(nav, nmenu);
+ IMAGE_ITEM(popup, tools, gtkTools, nmenu, group);
+ SET_SUBMENU(tools, nmenu);
+
IMAGE_ITEM(popup, help, gtkHelp, nmenu, group);
SET_SUBMENU(help, nmenu);
ADD_NAMED_SEP(popup, first, nmenu);
- IMAGE_ITEM(popup, opentab, gtkOpentab, nmenu, group);
- IMAGE_ITEM(popup, openwin, gtkOpenwin, nmenu, group);
- IMAGE_ITEM(popup, savelink, gtkSavelink, nmenu, group);
-
- ADD_NAMED_SEP(popup, second, nmenu);
-
IMAGE_ITEM(popup, back, gtkBack, nmenu, group);
IMAGE_ITEM(popup, forward, gtkForward, nmenu, group);
@@ -530,6 +547,26 @@ struct nsgtk_popup_submenu *nsgtk_menu_popup_create(GtkAccelGroup *group)
IMAGE_ITEM(popup, paste, gtkPaste, nmenu, group);
IMAGE_ITEM(popup, customize, gtkCustomize, nmenu, group);
+ return nmenu;
+}
+
+
+/* exported function documented in gtk/menu.h */
+struct nsgtk_link_menu *
+nsgtk_link_menu_create(GtkAccelGroup *group)
+{
+ struct nsgtk_link_menu *nmenu;
+
+ NEW_MENU(nmenu, link);
+
+ IMAGE_ITEM(link, opentab, gtkOpentab, nmenu, group);
+ IMAGE_ITEM(link, openwin, gtkOpenwin, nmenu, group);
+
+ ADD_SEP(link, nmenu);
+
+ IMAGE_ITEM(link, save, gtkSavelink, nmenu, group);
+ IMAGE_ITEM(link, bookmark, gtkBookmarklink, nmenu, group);
+ IMAGE_ITEM(link, copy, gtkCopylink, nmenu, group);
return nmenu;
}
diff --git a/gtk/menu.h b/gtk/menu.h
index 681f43c2b..b14c0bb82 100644
--- a/gtk/menu.h
+++ b/gtk/menu.h
@@ -55,17 +55,13 @@ struct nsgtk_view_menu {
GtkImageMenuItem *scaleview_menuitem;
struct nsgtk_scaleview_submenu *scaleview_submenu;
GtkImageMenuItem *fullscreen_menuitem;
- GtkImageMenuItem *viewsource_menuitem;
GtkImageMenuItem *images_menuitem;
struct nsgtk_images_submenu *images_submenu;
GtkImageMenuItem *toolbars_menuitem;
struct nsgtk_toolbars_submenu *toolbars_submenu;
GtkImageMenuItem *tabs_menuitem;
struct nsgtk_tabs_submenu *tabs_submenu;
- GtkImageMenuItem *downloads_menuitem;
GtkImageMenuItem *savewindowsize_menuitem;
- GtkImageMenuItem *debugging_menuitem;
- struct nsgtk_debugging_submenu *debugging_submenu;
};
struct nsgtk_nav_menu {
@@ -78,10 +74,19 @@ struct nsgtk_nav_menu {
GtkImageMenuItem *globalhistory_menuitem;
GtkImageMenuItem *addbookmarks_menuitem;
GtkImageMenuItem *showbookmarks_menuitem;
- GtkImageMenuItem *showcookies_menuitem;
GtkImageMenuItem *openlocation_menuitem;
};
+struct nsgtk_tools_menu {
+ GtkMenuItem *tools; /* Tools menu item on menubar */
+ GtkMenu *tools_menu;
+
+ GtkImageMenuItem *showcookies_menuitem;
+ GtkImageMenuItem *downloads_menuitem;
+ GtkImageMenuItem *developer_menuitem;
+ struct nsgtk_developer_submenu *developer_submenu;
+};
+
struct nsgtk_help_menu {
GtkMenuItem *help; /* Help menu item on menubar */
GtkMenu *help_menu;
@@ -91,6 +96,7 @@ struct nsgtk_help_menu {
GtkImageMenuItem *about_menuitem;
};
+
struct nsgtk_export_submenu {
GtkMenu *export_menu;
GtkImageMenuItem *plaintext_menuitem;
@@ -125,11 +131,13 @@ struct nsgtk_toolbars_submenu {
GtkCheckMenuItem *toolbar_menuitem;
};
-struct nsgtk_debugging_submenu {
- GtkMenu *debugging_menu;
+struct nsgtk_developer_submenu {
+ GtkMenu *developer_menu;
+
+ GtkImageMenuItem *viewsource_menuitem;
GtkImageMenuItem *toggledebugging_menuitem;
- GtkImageMenuItem *saveboxtree_menuitem;
- GtkImageMenuItem *savedomtree_menuitem;
+ GtkImageMenuItem *debugboxtree_menuitem;
+ GtkImageMenuItem *debugdomtree_menuitem;
};
@@ -139,11 +147,12 @@ struct nsgtk_bar_submenu {
struct nsgtk_edit_menu *edit_submenu;
struct nsgtk_view_menu *view_submenu;
struct nsgtk_nav_menu *nav_submenu;
- struct nsgtk_tabs_menu *tabs_submenu;
+ struct nsgtk_tabs_submenu *tabs_submenu;
+ struct nsgtk_tools_menu *tools_submenu;
struct nsgtk_help_menu *help_submenu;
};
-struct nsgtk_popup_submenu {
+struct nsgtk_popup_menu {
GtkMenu *popup_menu;
GtkImageMenuItem *file_menuitem;
@@ -159,19 +168,16 @@ struct nsgtk_popup_submenu {
struct nsgtk_nav_menu *nav_submenu;
GtkImageMenuItem *tabs_menuitem;
- struct nsgtk_tabs_menu *tabs_submenu;
+ struct nsgtk_tabs_submenu *tabs_submenu;
+
+ GtkImageMenuItem *tools_menuitem;
+ struct nsgtk_tools_menu *tools_submenu;
GtkImageMenuItem *help_menuitem;
struct nsgtk_help_menu *help_submenu;
GtkWidget *first_separator;
- GtkImageMenuItem *opentab_menuitem;
- GtkImageMenuItem *openwin_menuitem;
- GtkImageMenuItem *savelink_menuitem;
-
- GtkWidget *second_separator;
-
/* navigation entries */
GtkImageMenuItem *back_menuitem;
GtkImageMenuItem *forward_menuitem;
@@ -189,7 +195,33 @@ struct nsgtk_popup_submenu {
};
+struct nsgtk_link_menu {
+ GtkMenu *link_menu;
+
+ GtkImageMenuItem *opentab_menuitem;
+ GtkImageMenuItem *openwin_menuitem;
+
+ GtkImageMenuItem *save_menuitem;
+ GtkImageMenuItem *bookmark_menuitem;
+ GtkImageMenuItem *copy_menuitem;
+};
+
+/**
+ * Create main menu bar.
+ */
struct nsgtk_bar_submenu *nsgtk_menu_bar_create(GtkMenuShell *menubar, GtkAccelGroup *group);
-struct nsgtk_popup_submenu *nsgtk_menu_popup_create(GtkAccelGroup *group);
+
+/**
+ * Generate right click menu menu.
+ *
+ */
+struct nsgtk_popup_menu *nsgtk_popup_menu_create(GtkAccelGroup *group);
+
+/**
+ * Generate context sensitive popup menu for link.
+ *
+ */
+struct nsgtk_link_menu *nsgtk_link_menu_create(GtkAccelGroup *group);
+
#endif
diff --git a/gtk/options.h b/gtk/options.h
index 612809eac..63f2ad177 100644
--- a/gtk/options.h
+++ b/gtk/options.h
@@ -65,8 +65,8 @@ NSOPTION_BOOL(new_blank, false)
/* path to save hotlist file */
NSOPTION_STRING(hotlist_path, NULL)
-/* open source views in a tab */
-NSOPTION_BOOL(source_tab, false)
+/* Developer information viewer display method */
+NSOPTION_INTEGER(developer_view, 0)
/* currently selected theme */
NSOPTION_INTEGER(current_theme, 0)
diff --git a/gtk/plotters.c b/gtk/plotters.c
index 8896da448..b2a7edecc 100644
--- a/gtk/plotters.c
+++ b/gtk/plotters.c
@@ -33,11 +33,12 @@
#include "utils/log.h"
#include "desktop/plotters.h"
+#include "render/font.h"
+#include "utils/nsoption.h"
+
#include "gtk/font_pango.h"
#include "gtk/plotters.h"
#include "gtk/scaffolding.h"
-#include "render/font.h"
-#include "utils/nsoption.h"
#include "gtk/bitmap.h"
GtkWidget *current_widget;
diff --git a/gtk/res/C/Messages b/gtk/res/C/Messages
deleted file mode 120000
index 72c9eff90..000000000
--- a/gtk/res/C/Messages
+++ /dev/null
@@ -1 +0,0 @@
-../../../!NetSurf/Resources/en/Messages \ No newline at end of file
diff --git a/gtk/res/Messages b/gtk/res/Messages
new file mode 120000
index 000000000..75bfdf53d
--- /dev/null
+++ b/gtk/res/Messages
@@ -0,0 +1 @@
+en/Messages \ No newline at end of file
diff --git a/gtk/res/SearchEngines b/gtk/res/SearchEngines
index e7fd7cb65..38e77957b 100644
--- a/gtk/res/SearchEngines
+++ b/gtk/res/SearchEngines
@@ -2,15 +2,13 @@ Google|www.google.com|http://www.google.com/search?q=%s|http://www.google.com/fa
Yahoo|search.yahoo.com|http://search.yahoo.com/search?p=%s|http://www.yahoo.com/favicon.ico|
Bing|www.bing.com|http://www.bing.com/search?q=%s|http://www.bing.com/favicon.ico|
Business.com|www.business.com|http://www.business.com/search/rslt_default.asp?query=%s|http://www.business.com/favicon.ico|
-Omgili|www.omgili.com|http://www.omgili.com/AAAAA/%s.html|http://www.omgili.com/favicon.ico|
-BBC News|search.bbc.co.uk|http://search.bbc.co.uk/search?q=%s&tab=ns|http://news.bbc.co.uk/favicon.ico|
+Omgili|www.omgili.com|http://www.omgili.com/AAAAA/%s.html|http://omgili.com/public/images/favicon.ico|
+BBC News|search.bbc.co.uk|http://search.bbc.co.uk/search?q=%s&tab=ns|http://www.bbc.co.uk/favicon.ico|
Ubuntu Packages|packages.ubuntu.com|http://packages.ubuntu.com/search?keywords=%s|http://packages.ubuntu.com/favicon.ico|
-Creative Commons|creativecommons.org|http://creativecommons.org/?s=%s|http://creativecommons.org/favicon.ico|
-Ask.com|www.ask.com|http://www.ask.com/web?q=%s|http://www.ask.com/favicon.ico|
-Answers.com|www.answers.com|http://www.answers.com/%s|http://www.answers.com/favicon.ico|
+Creative Commons|creativecommons.org|http://creativecommons.org/?s=%s|http://creativecommons.org/favicon.ico|fixme:favicon does not work as it is served as x-icon and is a png
+Ask.com|www.ask.com|http://www.ask.com/web?q=%s|http://sp.uk.ask.com/sh/i/a14/favicon/favicon.ico|fixme:favicon is served as text/plain
Dictionary.com|dictionary.reference.com|http://dictionary.reference.com/browse/%s?jss=0|http://dictionary.reference.com/favicon.ico|
Youtube|www.youtube.com|http://www.youtube.com/results?search_query=%s|http://www.youtube.com/favicon.ico|
-AeroMp3|www.aeromp3.com|http://www.aeromp3.com/search?q=%s|http://www.aeromp3.com/favicon.ico|
AOL|search.aol.com|http://search.aol.com/aol/search?query=%s|http://www.aol.com/favicon.ico|
Baidu|www.baidu.com|http://www.baidu.com/s?wd=%s|http://www.baidu.com/favicon.ico|
Amazon|www.amazon.com|http://www.amazon.com/s/ref=nb_ss_gw?field-keywords=%s|http://www.amazon.com/favicon.ico|
@@ -18,5 +16,5 @@ Ebay|shop.ebay.com|http://shop.ebay.com/items/%s|http://www.ebay.com/favicon.ico
IMDB|www.imdb.com|http://www.imdb.com/find?q=%s|http://www.imdb.com/favicon.ico|
ESPN|search.espn.go.com|http://search.espn.go.com/%s/|http://www.espn.go.com/favicon.ico|
Wikipedia|en.wikipedia.org|http://en.wikipedia.org/w/index.php?title=Special%%3ASearch&search=%s|http://en.wikipedia.org/favicon.ico|
-DuckDuckGo|www.duckduckgo.com|http://www.duckduckgo.com/?q=%s|http://www.duckduckgo.com/favicon.ico|
-Seeks|www.seeks-project.info|https://www.seeks-project.info/search.php/search?q=%s|http://www.seeks-project.info/search.php/public/images/seek_icon_32x32_transparent.png|
+DuckDuckGo|www.duckduckgo.com|http://www.duckduckgo.com/html/?q=%s|http://www.duckduckgo.com/favicon.ico|fixme:Their ico upsets the current implementation
+Seeks|www.seeks-project.info|https://www.seeks-project.info/search.php/search?q=%s|http://www.seeks-project.info/search.php/public/images/seek_icon_32x32_transparent.png|fixme:they have no icon
diff --git a/gtk/res/credits.html b/gtk/res/credits.html
new file mode 120000
index 000000000..ca85d3d27
--- /dev/null
+++ b/gtk/res/credits.html
@@ -0,0 +1 @@
+en/credits.html \ No newline at end of file
diff --git a/gtk/res/gtkdefault.css b/gtk/res/gtkdefault.css
index 9021eedd9..300c13add 100644
--- a/gtk/res/gtkdefault.css
+++ b/gtk/res/gtkdefault.css
@@ -12,7 +12,7 @@ input { font-size: 95%; border: medium inset #ddd; }
input[type=button], input[type=reset], input[type=submit], button {
background-color: #ddd; border: medium outset #ddd; }
input[type=checkbox], input[type=radio] { font-size: 105%; }
-input[type=file] { background-color: #ddd; border: medium inset #ddd; }
+input[type=file] { background-color: #ddd; border: medium outset #ddd; }
select { background-color: #ddd; border: medium inset #ddd; font-size: 95%; }
select:after { border-left:4px ridge #ddd; }
diff --git a/gtk/res/licence.html b/gtk/res/licence.html
new file mode 120000
index 000000000..86f8c54bf
--- /dev/null
+++ b/gtk/res/licence.html
@@ -0,0 +1 @@
+en/licence.html \ No newline at end of file
diff --git a/gtk/res/options.gtk2.ui b/gtk/res/options.gtk2.ui
index 5e24f8942..9c2f5c6d2 100644
--- a/gtk/res/options.gtk2.ui
+++ b/gtk/res/options.gtk2.ui
@@ -1,22 +1,63 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
<interface>
- <!-- interface-requires gtk+ 2.12 -->
+ <requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkDialog" id="dialogPreferences">
+ <property name="can_focus">False</property>
<property name="border_width">5</property>
<property name="title" translatable="yes">preferencesTitle</property>
<property name="window_position">center-on-parent</property>
<property name="destroy_with_parent">True</property>
<property name="type_hint">dialog</property>
- <property name="has_separator">False</property>
- <signal name="destroy" handler="nsgtk_preferences_dialogPreferences_destroy"/>
- <signal name="response" handler="nsgtk_preferences_dialogPreferences_response"/>
- <signal name="delete_event" handler="nsgtk_preferences_dialogPreferences_deleteevent"/>
+ <signal name="destroy" handler="nsgtk_preferences_dialogPreferences_destroy" swapped="no"/>
+ <signal name="delete-event" handler="nsgtk_preferences_dialogPreferences_deleteevent" swapped="no"/>
+ <signal name="response" handler="nsgtk_preferences_dialogPreferences_response" swapped="no"/>
<child internal-child="vbox">
<object class="GtkVBox" id="vbox_dialog">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkHButtonBox" id="dialog-action_area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">edge</property>
+ <child>
+ <object class="GtkButton" id="help">
+ <property name="label">gtk-help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="close">
+ <property name="label">gtk-close</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
<child>
<object class="GtkNotebook" id="notebook1">
<property name="visible">True</property>
@@ -24,31 +65,35 @@
<child>
<object class="GtkVBox" id="vbox_main">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkFrame" id="frame_main_startup">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
<object class="GtkVBox" id="vbox2">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkHBox" id="hbox1">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label_startup_page">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesStartupPage</property>
</object>
<packing>
@@ -61,59 +106,69 @@
<object class="GtkEntry" id="entryHomePageURL">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="invisible_char">&#x25CF;</property>
- <signal name="changed" handler="nsgtk_preferences_entryHomePageURL_changed"/>
- <signal name="realize" handler="nsgtk_preferences_entryHomePageURL_realize"/>
+ <property name="invisible_char">â—</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ <signal name="changed" handler="nsgtk_preferences_entryHomePageURL_changed" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_entryHomePageURL_realize" swapped="no"/>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox2">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<placeholder/>
</child>
<child>
- <object class="GtkButton" id="setCurrentPage">
- <property name="label" translatable="yes">preferencesStartupPageCurrent</property>
+ <object class="GtkButton" id="setDefaultPage">
+ <property name="label" translatable="yes">preferencesStartupPageDefault</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
- <signal name="clicked" handler="nsgtk_preferences_setCurrentPage_clicked"/>
+ <signal name="clicked" handler="nsgtk_preferences_setDefaultPage_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="pack_type">end</property>
- <property name="position">2</property>
+ <property name="position">1</property>
</packing>
</child>
<child>
- <object class="GtkButton" id="setDefaultPage">
- <property name="label" translatable="yes">preferencesStartupPageDefault</property>
+ <object class="GtkButton" id="setCurrentPage">
+ <property name="label" translatable="yes">preferencesStartupPageCurrent</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
- <signal name="clicked" handler="nsgtk_preferences_setDefaultPage_clicked"/>
+ <signal name="clicked" handler="nsgtk_preferences_setCurrentPage_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="pack_type">end</property>
- <property name="position">1</property>
+ <property name="position">2</property>
</packing>
</child>
</object>
<packing>
+ <property name="expand">True</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
@@ -125,6 +180,7 @@
<child type="label">
<object class="GtkLabel" id="label_main_startup">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesStartup</property>
<property name="use_markup">True</property>
</object>
@@ -132,6 +188,7 @@
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="padding">6</property>
<property name="position">0</property>
</packing>
@@ -139,18 +196,20 @@
<child>
<object class="GtkFrame" id="frame_main_search">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment2">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
<object class="GtkVBox" id="vbox3">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkUrlSearch">
@@ -159,20 +218,24 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
- <signal name="realize" handler="nsgtk_preferences_checkUrlSearch_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_checkUrlSearch_toggled"/>
+ <signal name="toggled" handler="nsgtk_preferences_checkUrlSearch_toggled" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_checkUrlSearch_realize" swapped="no"/>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox3">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label5">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesSearchProvider</property>
</object>
<packing>
@@ -184,9 +247,10 @@
<child>
<object class="GtkComboBox" id="comboSearch">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="model">liststore_search_provider</property>
- <signal name="changed" handler="nsgtk_preferences_comboSearch_changed"/>
- <signal name="realize" handler="nsgtk_preferences_comboSearch_realize"/>
+ <signal name="changed" handler="nsgtk_preferences_comboSearch_changed" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_comboSearch_realize" swapped="no"/>
<child>
<object class="GtkCellRendererText" id="cellrenderertext1"/>
<attributes>
@@ -195,11 +259,15 @@
</child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@@ -210,6 +278,7 @@
<child type="label">
<object class="GtkLabel" id="label4">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesSearch</property>
<property name="use_markup">True</property>
</object>
@@ -217,6 +286,7 @@
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="padding">6</property>
<property name="position">1</property>
</packing>
@@ -224,18 +294,20 @@
<child>
<object class="GtkFrame" id="frame_main_downloads">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment3">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
<object class="GtkVBox" id="vbox4">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkClearDownloads">
@@ -244,11 +316,12 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
- <signal name="realize" handler="nsgtk_preferences_checkClearDownloads_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_checkClearDownloads_toggled"/>
+ <signal name="toggled" handler="nsgtk_preferences_checkClearDownloads_toggled" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_checkClearDownloads_realize" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@@ -259,42 +332,50 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
- <signal name="realize" handler="nsgtk_preferences_checkRequestOverwrite_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_checkRequestOverwrite_toggled"/>
+ <signal name="toggled" handler="nsgtk_preferences_checkRequestOverwrite_toggled" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_checkRequestOverwrite_realize" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox4">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label8">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesDownloadsLocation</property>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFileChooserButton" id="fileChooserDownloads">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="action">select-folder</property>
- <signal name="selection_changed" handler="nsgtk_preferences_fileChooserDownloads_selectionchanged"/>
- <signal name="realize" handler="nsgtk_preferences_fileChooserDownloads_realize"/>
+ <signal name="selection-changed" handler="nsgtk_preferences_fileChooserDownloads_selectionchanged" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_fileChooserDownloads_realize" swapped="no"/>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
@@ -305,6 +386,7 @@
<child type="label">
<object class="GtkLabel" id="label7">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesDownloads</property>
<property name="use_markup">True</property>
</object>
@@ -312,6 +394,7 @@
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="padding">6</property>
<property name="position">2</property>
</packing>
@@ -321,6 +404,7 @@
<child type="tab">
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesMainTabtitle</property>
</object>
<packing>
@@ -330,29 +414,33 @@
<child>
<object class="GtkVBox" id="vbox_appearance">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkFrame" id="frame_appearance_theme">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment4">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
<object class="GtkHBox" id="themehbox">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="spacing">12</property>
<child>
<object class="GtkComboBox" id="comboTheme">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="model">liststore_themes</property>
- <signal name="changed" handler="nsgtk_preferences_comboTheme_changed"/>
- <signal name="realize" handler="nsgtk_preferences_comboTheme_realize"/>
+ <signal name="changed" handler="nsgtk_preferences_comboTheme_changed" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_comboTheme_realize" swapped="no"/>
<child>
<object class="GtkCellRendererText" id="cellrenderertext9"/>
<attributes>
@@ -361,6 +449,8 @@
</child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@@ -370,10 +460,11 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
- <signal name="clicked" handler="nsgtk_preferences_buttonAddTheme_clicked"/>
+ <signal name="clicked" handler="nsgtk_preferences_buttonAddTheme_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
@@ -385,6 +476,7 @@
<child type="label">
<object class="GtkLabel" id="label3">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesThemes</property>
<property name="use_markup">True</property>
</object>
@@ -392,6 +484,7 @@
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="padding">6</property>
<property name="position">0</property>
</packing>
@@ -399,18 +492,20 @@
<child>
<object class="GtkFrame" id="frame_appearance_tabs">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment5">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
<object class="GtkVBox" id="vbox5">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkShowSingleTab">
@@ -419,10 +514,12 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
- <signal name="realize" handler="nsgtk_preferences_checkShowSingleTab_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_checkShowSingleTab_toggled"/>
+ <signal name="toggled" handler="nsgtk_preferences_checkShowSingleTab_toggled" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_checkShowSingleTab_realize" swapped="no"/>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@@ -433,10 +530,12 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
- <signal name="realize" handler="nsgtk_preferences_checkFocusNew_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_checkFocusNew_toggled"/>
+ <signal name="toggled" handler="nsgtk_preferences_checkFocusNew_toggled" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_checkFocusNew_realize" swapped="no"/>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@@ -447,20 +546,24 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
- <signal name="realize" handler="nsgtk_preferences_checkNewBlank_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_checkNewBlank_toggled"/>
+ <signal name="toggled" handler="nsgtk_preferences_checkNewBlank_toggled" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_checkNewBlank_realize" swapped="no"/>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox5">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label9">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesTabsPosition</property>
</object>
<packing>
@@ -472,9 +575,10 @@
<child>
<object class="GtkComboBox" id="comboTabPosition">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="model">liststore_tab_position</property>
- <signal name="changed" handler="nsgtk_preferences_comboTabPosition_changed"/>
- <signal name="realize" handler="nsgtk_preferences_comboTabPosition_realize"/>
+ <signal name="changed" handler="nsgtk_preferences_comboTabPosition_changed" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_comboTabPosition_realize" swapped="no"/>
<child>
<object class="GtkCellRendererText" id="cellrenderertext2"/>
<attributes>
@@ -483,11 +587,15 @@
</child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
@@ -498,6 +606,7 @@
<child type="label">
<object class="GtkLabel" id="label6">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesTabs</property>
<property name="use_markup">True</property>
</object>
@@ -505,73 +614,71 @@
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="padding">6</property>
<property name="position">1</property>
</packing>
</child>
<child>
- <object class="GtkFrame" id="frame_appearance_source">
+ <object class="GtkFrame" id="frame_appearance_tools">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment7">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
- <object class="GtkLabel" id="label13">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">preferencesSourceOpen</property>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
<object class="GtkHBox" id="hbox6">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">6</property>
<child>
- <object class="GtkRadioButton" id="sourceButtonWindow">
- <property name="label" translatable="yes">preferencesSourceWindow</property>
+ <object class="GtkLabel" id="label13">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <property name="group">sourceButtonTab</property>
- <signal name="realize" handler="nsgtk_preferences_sourceButtonWindow_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_sourceButtonWindow_toggled"/>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">preferencesDeveloperView</property>
</object>
<packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
- <object class="GtkRadioButton" id="sourceButtonTab">
- <property name="label" translatable="yes">preferencesSourceTab</property>
+ <object class="GtkComboBox" id="comboboxDeveloperView">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <signal name="realize" handler="nsgtk_preferences_sourceButtonTab_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_sourceButtonTab_toggled"/>
+ <property name="can_focus">False</property>
+ <property name="model">liststore_developer_view</property>
+ <signal name="changed" handler="nsgtk_preferences_comboDeveloperView_changed" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_comboDeveloperView_realize" swapped="no"/>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext10"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
- <property name="position">1</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
</packing>
</child>
</object>
@@ -581,13 +688,15 @@
<child type="label">
<object class="GtkLabel" id="label12">
<property name="visible">True</property>
- <property name="label" translatable="yes">preferencesSource</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">preferencesTools</property>
<property name="use_markup">True</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="padding">6</property>
<property name="position">2</property>
</packing>
@@ -595,18 +704,20 @@
<child>
<object class="GtkFrame" id="frame_appearance_url">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment8">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
<object class="GtkVBox" id="vbox7">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkDisplayRecentURLs">
@@ -615,10 +726,12 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
- <signal name="realize" handler="nsgtk_preferences_checkDisplayRecentURLs_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_checkDisplayRecentURLs_toggled"/>
+ <signal name="toggled" handler="nsgtk_preferences_checkDisplayRecentURLs_toggled" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_checkDisplayRecentURLs_realize" swapped="no"/>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@@ -629,6 +742,7 @@
<child type="label">
<object class="GtkLabel" id="label14">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesURLbar</property>
<property name="use_markup">True</property>
</object>
@@ -636,6 +750,7 @@
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="padding">7</property>
<property name="position">3</property>
</packing>
@@ -643,39 +758,45 @@
<child>
<object class="GtkFrame" id="frame_appearance_toolbar">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment9">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
<object class="GtkVBox" id="vbox8">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkHBox" id="hbox7">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label16">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesToolbarButtons</property>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="comboButtonType">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="model">liststore_toolbar_buttontype</property>
- <signal name="changed" handler="nsgtk_preferences_comboButtonType_changed"/>
- <signal name="realize" handler="nsgtk_preferences_comboButtonType_realize"/>
+ <signal name="changed" handler="nsgtk_preferences_comboButtonType_changed" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_comboButtonType_realize" swapped="no"/>
<child>
<object class="GtkCellRendererText" id="cellrenderertext3"/>
<attributes>
@@ -684,11 +805,15 @@
</child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@@ -699,6 +824,7 @@
<child type="label">
<object class="GtkLabel" id="label15">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesToolbar</property>
<property name="use_markup">True</property>
</object>
@@ -706,6 +832,7 @@
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="padding">6</property>
<property name="position">4</property>
</packing>
@@ -718,6 +845,7 @@
<child type="tab">
<object class="GtkLabel" id="label2">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesAppearanceTabtitle</property>
</object>
<packing>
@@ -728,23 +856,25 @@
<child>
<object class="GtkVBox" id="vbox_content">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkFrame" id="frame_content_control">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment6">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
<object class="GtkVBox" id="vbox6">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkDisablePopups">
@@ -753,8 +883,8 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
- <signal name="realize" handler="nsgtk_preferences_checkDisablePopups_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_checkDisablePopups_toggled"/>
+ <signal name="toggled" handler="nsgtk_preferences_checkDisablePopups_toggled" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_checkDisablePopups_realize" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@@ -769,8 +899,8 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
- <signal name="realize" handler="nsgtk_preferences_checkHideAdverts_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_checkHideAdverts_toggled"/>
+ <signal name="toggled" handler="nsgtk_preferences_checkHideAdverts_toggled" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_checkHideAdverts_realize" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@@ -785,8 +915,8 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
- <signal name="realize" handler="nsgtk_preferences_checkEnableJavascript_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_checkEnableJavascript_toggled"/>
+ <signal name="toggled" handler="nsgtk_preferences_checkEnableJavascript_toggled" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_checkEnableJavascript_realize" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@@ -801,8 +931,8 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
- <signal name="realize" handler="nsgtk_preferences_checkDisablePlugins_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_checkDisablePlugins_toggled"/>
+ <signal name="toggled" handler="nsgtk_preferences_checkDisablePlugins_toggled" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_checkDisablePlugins_realize" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@@ -817,33 +947,39 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
- <signal name="realize" handler="nsgtk_preferences_checkResampleImages_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_checkResampleImages_toggled"/>
+ <signal name="toggled" handler="nsgtk_preferences_checkResampleImages_toggled" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_checkResampleImages_realize" swapped="no"/>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox8">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label17">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesControlLoad</property>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="comboboxLoadImages">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="model">liststore_image_loading</property>
- <signal name="changed" handler="nsgtk_preferences_comboboxLoadImages_changed"/>
- <signal name="realize" handler="nsgtk_preferences_comboboxLoadImages_realize"/>
+ <signal name="changed" handler="nsgtk_preferences_comboboxLoadImages_changed" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_comboboxLoadImages_realize" swapped="no"/>
<child>
<object class="GtkCellRendererText" id="cellrenderertext4"/>
<attributes>
@@ -852,11 +988,15 @@
</child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">5</property>
</packing>
</child>
@@ -867,6 +1007,7 @@
<child type="label">
<object class="GtkLabel" id="label11">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesControl</property>
<property name="use_markup">True</property>
</object>
@@ -874,6 +1015,7 @@
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="padding">6</property>
<property name="position">0</property>
</packing>
@@ -881,18 +1023,20 @@
<child>
<object class="GtkFrame" id="frame_content_animation">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment10">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
<object class="GtkVBox" id="vbox9">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkEnableAnimations">
@@ -901,24 +1045,29 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
- <signal name="realize" handler="nsgtk_preferences_checkEnableAnimations_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_checkEnableAnimations_toggled"/>
+ <signal name="toggled" handler="nsgtk_preferences_checkEnableAnimations_toggled" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_checkEnableAnimations_realize" swapped="no"/>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox9">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label19">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesAnimationMinimum</property>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@@ -928,22 +1077,29 @@
<property name="can_focus">True</property>
<property name="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes">preferencesAnimationMinimumTooltip</property>
- <property name="invisible_char">&#x25CF;</property>
+ <property name="invisible_char">â—</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
<property name="adjustment">adjustment_animation_time</property>
<property name="climb_rate">1</property>
<property name="digits">1</property>
<property name="numeric">True</property>
<property name="update_policy">if-valid</property>
- <signal name="value_changed" handler="nsgtk_preferences_spinAnimationSpeed_valuechanged"/>
- <signal name="realize" handler="nsgtk_preferences_spinAnimationSpeed_realize"/>
+ <signal name="value-changed" handler="nsgtk_preferences_spinAnimationSpeed_valuechanged" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_spinAnimationSpeed_realize" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@@ -954,6 +1110,7 @@
<child type="label">
<object class="GtkLabel" id="label18">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesAnimation</property>
<property name="use_markup">True</property>
</object>
@@ -961,6 +1118,7 @@
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="padding">6</property>
<property name="position">1</property>
</packing>
@@ -968,38 +1126,45 @@
<child>
<object class="GtkFrame" id="frame_content_fonts">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment14">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
<object class="GtkHBox" id="hbox11">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="spacing">12</property>
<child>
<object class="GtkHBox" id="hbox12">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label26">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesFontsDefault</property>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="comboDefault">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="model">liststore_defaultfont</property>
- <signal name="changed" handler="nsgtk_preferences_comboDefault_changed"/>
- <signal name="realize" handler="nsgtk_preferences_comboDefault_realize"/>
+ <signal name="changed" handler="nsgtk_preferences_comboDefault_changed" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_comboDefault_realize" swapped="no"/>
<child>
<object class="GtkCellRendererText" id="cellrenderertext5"/>
<attributes>
@@ -1008,25 +1173,32 @@
</child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox13">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label27">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesFontsSize</property>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@@ -1037,23 +1209,29 @@
<property name="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes">preferencesFontsSizeTooltip</property>
<property name="max_length">4</property>
- <property name="invisible_char">&#x25CF;</property>
+ <property name="invisible_char">â—</property>
<property name="width_chars">4</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
<property name="adjustment">adjustment_font_default_size</property>
<property name="climb_rate">1</property>
<property name="digits">1</property>
<property name="numeric">True</property>
- <signal name="value_changed" handler="nsgtk_preferences_spinDefaultSize_valuechanged"/>
- <signal name="realize" handler="nsgtk_preferences_spinDefaultSize_realize"/>
+ <signal name="value-changed" handler="nsgtk_preferences_spinDefaultSize_valuechanged" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_spinDefaultSize_realize" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@@ -1065,10 +1243,11 @@
<property name="receives_default">True</property>
<property name="image">image1</property>
<property name="use_underline">True</property>
- <signal name="clicked" handler="nsgtk_preferences_fontPreview_clicked"/>
+ <signal name="clicked" handler="nsgtk_preferences_fontPreview_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
@@ -1079,6 +1258,7 @@
<child type="label">
<object class="GtkLabel" id="label20">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesFonts</property>
<property name="use_markup">True</property>
</object>
@@ -1086,47 +1266,54 @@
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame_content_font">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment11">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
<object class="GtkVBox" id="vbox10">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkHBox" id="hbox10">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label21">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesLanguagePreferred</property>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="comboboxLanguage">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes">preferencesLanguagePreferredTooltip</property>
<property name="model">liststore_content_language</property>
- <signal name="changed" handler="nsgtk_preferences_comboboxLanguage_changed"/>
- <signal name="realize" handler="nsgtk_preferences_comboboxLanguage_realize"/>
+ <signal name="changed" handler="nsgtk_preferences_comboboxLanguage_changed" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_comboboxLanguage_realize" swapped="no"/>
<child>
<object class="GtkCellRendererText" id="cellrenderertext7">
<property name="xalign">0</property>
@@ -1145,11 +1332,15 @@
</child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@@ -1160,6 +1351,7 @@
<child type="label">
<object class="GtkLabel" id="label25">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesLanguage</property>
<property name="use_markup">True</property>
</object>
@@ -1167,6 +1359,7 @@
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
@@ -1178,6 +1371,7 @@
<child type="tab">
<object class="GtkLabel" id="label10">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesContentTabtitle</property>
</object>
<packing>
@@ -1188,23 +1382,25 @@
<child>
<object class="GtkVBox" id="vbox_privacy">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkFrame" id="frame_privacy_general">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment20">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
<object class="GtkVBox" id="vbox15">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkSendReferer">
@@ -1213,10 +1409,12 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
- <signal name="realize" handler="nsgtk_preferences_checkSendReferer_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_checkSendReferer_toggled"/>
+ <signal name="toggled" handler="nsgtk_preferences_checkSendReferer_toggled" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_checkSendReferer_realize" swapped="no"/>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@@ -1227,10 +1425,12 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
- <signal name="realize" handler="nsgtk_preferences_checkSendDNT_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_checkSendDNT_toggled"/>
+ <signal name="toggled" handler="nsgtk_preferences_checkSendDNT_toggled" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_checkSendDNT_realize" swapped="no"/>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@@ -1241,6 +1441,7 @@
<child type="label">
<object class="GtkLabel" id="label61">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesGeneral</property>
<property name="use_markup">True</property>
</object>
@@ -1248,6 +1449,7 @@
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="padding">6</property>
<property name="position">0</property>
</packing>
@@ -1255,18 +1457,20 @@
<child>
<object class="GtkFrame" id="frame_privacy_history">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment12">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
<object class="GtkVBox" id="vbox11">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkHoverURLs">
@@ -1275,24 +1479,29 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
- <signal name="realize" handler="nsgtk_preferences_checkHoverURLs_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_checkHoverURLs_toggled"/>
+ <signal name="toggled" handler="nsgtk_preferences_checkHoverURLs_toggled" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_checkHoverURLs_realize" swapped="no"/>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox14">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label28">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesHistoryRemember</property>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@@ -1301,32 +1510,41 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">4</property>
- <property name="invisible_char">&#x25CF;</property>
+ <property name="invisible_char">â—</property>
<property name="width_chars">4</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
<property name="adjustment">adjustment_history_age</property>
<property name="climb_rate">1</property>
<property name="numeric">True</property>
<property name="update_policy">if-valid</property>
- <signal name="value_changed" handler="nsgtk_preferences_spinHistoryAge_valuechanged"/>
- <signal name="realize" handler="nsgtk_preferences_spinHistoryAge_realize"/>
+ <signal name="value-changed" handler="nsgtk_preferences_spinHistoryAge_valuechanged" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_spinHistoryAge_realize" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label29">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesHistoryDays</property>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@@ -1337,6 +1555,7 @@
<child type="label">
<object class="GtkLabel" id="label23">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesHistory</property>
<property name="use_markup">True</property>
</object>
@@ -1344,6 +1563,7 @@
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="padding">6</property>
<property name="position">1</property>
</packing>
@@ -1351,22 +1571,25 @@
<child>
<object class="GtkFrame" id="frame_privacy_cache">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment13">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
<object class="GtkVBox" id="vbox12">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkTable" id="table3">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="n_rows">3</property>
<property name="n_columns">3</property>
<property name="column_spacing">6</property>
@@ -1374,6 +1597,7 @@
<child>
<object class="GtkLabel" id="label30">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">preferencesCacheMemory</property>
</object>
@@ -1384,6 +1608,7 @@
<child>
<object class="GtkLabel" id="label31">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">preferencesCacheDisc</property>
</object>
@@ -1396,6 +1621,7 @@
<child>
<object class="GtkLabel" id="label34">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">preferencesCacheExpire</property>
</object>
@@ -1409,13 +1635,17 @@
<object class="GtkSpinButton" id="spinMemoryCacheSize">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="invisible_char">&#x25CF;</property>
+ <property name="invisible_char">â—</property>
<property name="width_chars">5</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
<property name="adjustment">adjustment_cache_memory_size</property>
<property name="climb_rate">1</property>
<property name="numeric">True</property>
- <signal name="value_changed" handler="nsgtk_preferences_spinMemoryCacheSize_valuechanged"/>
- <signal name="realize" handler="nsgtk_preferences_spinMemoryCacheSize_realize"/>
+ <signal name="value-changed" handler="nsgtk_preferences_spinMemoryCacheSize_valuechanged" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_spinMemoryCacheSize_realize" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
@@ -1427,13 +1657,17 @@
<object class="GtkSpinButton" id="spinDiscCacheSize">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="invisible_char">&#x25CF;</property>
+ <property name="invisible_char">â—</property>
<property name="width_chars">5</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
<property name="adjustment">adjustment_cache_disc_size</property>
<property name="climb_rate">1</property>
<property name="numeric">True</property>
- <signal name="value_changed" handler="nsgtk_preferences_spinDiscCacheSize_valuechanged"/>
- <signal name="realize" handler="nsgtk_preferences_spinDiscCacheSize_realize"/>
+ <signal name="value-changed" handler="nsgtk_preferences_spinDiscCacheSize_valuechanged" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_spinDiscCacheSize_realize" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
@@ -1447,13 +1681,17 @@
<object class="GtkSpinButton" id="spinDiscCacheAge">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="invisible_char">&#x25CF;</property>
+ <property name="invisible_char">â—</property>
<property name="width_chars">3</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
<property name="adjustment">adjustment_disc_cache_age</property>
<property name="climb_rate">1</property>
<property name="numeric">True</property>
- <signal name="value_changed" handler="nsgtk_preferences_spinDiscCacheAge_valuechanged"/>
- <signal name="realize" handler="nsgtk_preferences_spinDiscCacheAge_realize"/>
+ <signal name="value-changed" handler="nsgtk_preferences_spinDiscCacheAge_valuechanged" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_spinDiscCacheAge_realize" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
@@ -1466,8 +1704,9 @@
<child>
<object class="GtkLabel" id="label32">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="xalign">0</property>
- <property name="label" translatable="no">MB</property>
+ <property name="label">MB</property>
</object>
<packing>
<property name="left_attach">2</property>
@@ -1478,8 +1717,9 @@
<child>
<object class="GtkLabel" id="label33">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="xalign">0</property>
- <property name="label" translatable="no">MB</property>
+ <property name="label">MB</property>
</object>
<packing>
<property name="left_attach">2</property>
@@ -1492,6 +1732,7 @@
<child>
<object class="GtkLabel" id="label35">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">preferencesHistoryDays</property>
</object>
@@ -1505,12 +1746,15 @@
</child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox17">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<child>
<placeholder/>
</child>
@@ -1523,11 +1767,14 @@
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@@ -1538,6 +1785,7 @@
<child type="label">
<object class="GtkLabel" id="label24">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesCache</property>
<property name="use_markup">True</property>
</object>
@@ -1545,6 +1793,7 @@
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="padding">6</property>
<property name="position">2</property>
</packing>
@@ -1557,6 +1806,7 @@
<child type="tab">
<object class="GtkLabel" id="label22">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesPrivacyTabtitle</property>
</object>
<packing>
@@ -1567,29 +1817,33 @@
<child>
<object class="GtkVBox" id="vbox_network">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkFrame" id="frame_network_proxy">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment15">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
<object class="GtkTable" id="table2">
<property name="visible">True</property>
- <property name="n_rows">4</property>
+ <property name="can_focus">False</property>
+ <property name="n_rows">5</property>
<property name="n_columns">2</property>
<property name="column_spacing">6</property>
<property name="row_spacing">6</property>
<child>
<object class="GtkLabel" id="label42">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">preferencesProxyType</property>
</object>
@@ -1600,6 +1854,7 @@
<child>
<object class="GtkLabel" id="label43">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">preferencesProxyHost</property>
</object>
@@ -1612,6 +1867,7 @@
<child>
<object class="GtkLabel" id="label44">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">preferencesProxyUsername</property>
</object>
@@ -1624,6 +1880,7 @@
<child>
<object class="GtkLabel" id="label45">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">preferencesProxyPassword</property>
</object>
@@ -1636,11 +1893,12 @@
<child>
<object class="GtkComboBox" id="comboProxyType">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes">preferencesProxyTypeTooltip</property>
<property name="model">liststore_proxy_type</property>
- <signal name="changed" handler="nsgtk_preferences_comboProxyType_changed"/>
- <signal name="realize" handler="nsgtk_preferences_comboProxyType_realize"/>
+ <signal name="changed" handler="nsgtk_preferences_comboProxyType_changed" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_comboProxyType_realize" swapped="no"/>
<child>
<object class="GtkCellRendererText" id="cellrenderertext6"/>
<attributes>
@@ -1656,6 +1914,7 @@
<child>
<object class="GtkHBox" id="hbox19">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkEntry" id="entryProxyHost">
@@ -1663,21 +1922,29 @@
<property name="can_focus">True</property>
<property name="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes">preferencesProxyHostTooltip</property>
- <property name="invisible_char">&#x25CF;</property>
- <signal name="changed" handler="nsgtk_preferences_entryProxyHost_changed"/>
- <signal name="realize" handler="nsgtk_preferences_entryProxyHost_realize"/>
+ <property name="invisible_char">â—</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ <signal name="changed" handler="nsgtk_preferences_entryProxyHost_changed" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_entryProxyHost_realize" swapped="no"/>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label46">
<property name="visible">True</property>
- <property name="label" translatable="no">:</property>
+ <property name="can_focus">False</property>
+ <property name="label">:</property>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@@ -1688,17 +1955,22 @@
<property name="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes">preferencesProxyPortTooltip</property>
<property name="max_length">5</property>
- <property name="invisible_char">&#x25CF;</property>
+ <property name="invisible_char">â—</property>
<property name="width_chars">5</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
<property name="adjustment">adjustment_proxy_port</property>
<property name="climb_rate">1</property>
<property name="numeric">True</property>
<property name="update_policy">if-valid</property>
- <signal name="value_changed" handler="nsgtk_preferences_spinProxyPort_valuechanged"/>
- <signal name="realize" handler="nsgtk_preferences_spinProxyPort_realize"/>
+ <signal name="value-changed" handler="nsgtk_preferences_spinProxyPort_valuechanged" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_spinProxyPort_realize" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
@@ -1716,9 +1988,13 @@
<property name="can_focus">True</property>
<property name="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes">preferencesProxyUsernameTooltip</property>
- <property name="invisible_char">&#x25CF;</property>
- <signal name="changed" handler="nsgtk_preferences_entryProxyUser_changed"/>
- <signal name="realize" handler="nsgtk_preferences_entryProxyUser_realize"/>
+ <property name="invisible_char">â—</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ <signal name="changed" handler="nsgtk_preferences_entryProxyUser_changed" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_entryProxyUser_realize" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
@@ -1734,9 +2010,13 @@
<property name="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes">preferencesProxyPasswordTooltip</property>
<property name="visibility">False</property>
- <property name="invisible_char">&#x25CF;</property>
- <signal name="changed" handler="nsgtk_preferences_entryProxyPassword_changed"/>
- <signal name="realize" handler="nsgtk_preferences_entryProxyPassword_realize"/>
+ <property name="invisible_char">â—</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ <signal name="changed" handler="nsgtk_preferences_entryProxyPassword_changed" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_entryProxyPassword_realize" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
@@ -1745,6 +2025,40 @@
<property name="bottom_attach">4</property>
</packing>
</child>
+ <child>
+ <object class="GtkLabel" id="label55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">preferencesProxyNoproxy</property>
+ </object>
+ <packing>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entryProxyNoproxy">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip_text" translatable="yes">preferencesProxyNoproxyTooltip</property>
+ <property name="caps_lock_warning">False</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ <signal name="changed" handler="nsgtk_preferences_entryProxyNoproxy_changed" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_entryProxyNoproxy_realize" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
</object>
</child>
</object>
@@ -1752,6 +2066,7 @@
<child type="label">
<object class="GtkLabel" id="label37">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesProxy</property>
<property name="use_markup">True</property>
</object>
@@ -1759,6 +2074,7 @@
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="padding">6</property>
<property name="position">0</property>
</packing>
@@ -1766,17 +2082,20 @@
<child>
<object class="GtkFrame" id="frame_network_fetching">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment16">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
<object class="GtkTable" id="table1">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="n_rows">3</property>
<property name="n_columns">2</property>
<property name="column_spacing">6</property>
@@ -1784,6 +2103,7 @@
<child>
<object class="GtkLabel" id="label39">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">preferencesFetchingMax</property>
</object>
@@ -1794,6 +2114,7 @@
<child>
<object class="GtkLabel" id="label40">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">preferencesFetchingPerhost</property>
</object>
@@ -1806,6 +2127,7 @@
<child>
<object class="GtkLabel" id="label41">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">preferencesFetchingCached</property>
</object>
@@ -1821,13 +2143,17 @@
<property name="can_focus">True</property>
<property name="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes">preferencesFetchingMaxTooltip</property>
- <property name="invisible_char">&#x25CF;</property>
+ <property name="invisible_char">â—</property>
<property name="width_chars">3</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
<property name="adjustment">adjustment_fetching_max</property>
<property name="climb_rate">1</property>
<property name="numeric">True</property>
- <signal name="value_changed" handler="nsgtk_preferences_spinMaxFetchers_valuechanged"/>
- <signal name="realize" handler="nsgtk_preferences_spinMaxFetchers_realize"/>
+ <signal name="value-changed" handler="nsgtk_preferences_spinMaxFetchers_valuechanged" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_spinMaxFetchers_realize" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
@@ -1841,13 +2167,17 @@
<property name="can_focus">True</property>
<property name="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes">preferencesFetchingPerhostTooltip</property>
- <property name="invisible_char">&#x25CF;</property>
+ <property name="invisible_char">â—</property>
<property name="width_chars">3</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
<property name="adjustment">adjustment_fetching_perhost</property>
<property name="climb_rate">1</property>
<property name="numeric">True</property>
- <signal name="value_changed" handler="nsgtk_preferences_spinFetchesPerHost_valuechanged"/>
- <signal name="realize" handler="nsgtk_preferences_spinFetchesPerHost_realize"/>
+ <signal name="value-changed" handler="nsgtk_preferences_spinFetchesPerHost_valuechanged" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_spinFetchesPerHost_realize" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
@@ -1863,13 +2193,17 @@
<property name="can_focus">True</property>
<property name="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes">preferencesFetchingCachedTooltip.</property>
- <property name="invisible_char">&#x25CF;</property>
+ <property name="invisible_char">â—</property>
<property name="width_chars">3</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
<property name="adjustment">adjustment_fetching_cached</property>
<property name="climb_rate">1</property>
<property name="numeric">True</property>
- <signal name="value_changed" handler="nsgtk_preferences_spinCachedConnections_valuechanged"/>
- <signal name="realize" handler="nsgtk_preferences_spinCachedConnections_realize"/>
+ <signal name="value-changed" handler="nsgtk_preferences_spinCachedConnections_valuechanged" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_spinCachedConnections_realize" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
@@ -1886,6 +2220,7 @@
<child type="label">
<object class="GtkLabel" id="label38">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesFetching</property>
<property name="use_markup">True</property>
</object>
@@ -1893,6 +2228,7 @@
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="padding">6</property>
<property name="position">1</property>
</packing>
@@ -1905,6 +2241,7 @@
<child type="tab">
<object class="GtkLabel" id="label36">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesNetworkTabtitle</property>
</object>
<packing>
@@ -1915,23 +2252,25 @@
<child>
<object class="GtkVBox" id="vbox_pdfexport">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkFrame" id="frame_pdfexport_appearance">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment17">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
<object class="GtkVBox" id="vbox13">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="checkSuppressImages">
@@ -1940,10 +2279,12 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
- <signal name="realize" handler="nsgtk_preferences_checkSuppressImages_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_checkSuppressImages_toggled"/>
+ <signal name="toggled" handler="nsgtk_preferences_checkSuppressImages_toggled" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_checkSuppressImages_realize" swapped="no"/>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@@ -1954,10 +2295,12 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
- <signal name="realize" handler="nsgtk_preferences_checkRemoveBackgrounds_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_checkRemoveBackgrounds_toggled"/>
+ <signal name="toggled" handler="nsgtk_preferences_checkRemoveBackgrounds_toggled" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_checkRemoveBackgrounds_realize" swapped="no"/>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@@ -1968,24 +2311,29 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
- <signal name="realize" handler="nsgtk_preferences_checkFitPage_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_checkFitPage_toggled"/>
+ <signal name="toggled" handler="nsgtk_preferences_checkFitPage_toggled" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_checkFitPage_realize" swapped="no"/>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox15">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label59">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesAppearanceScale</property>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@@ -1994,32 +2342,41 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">4</property>
- <property name="invisible_char">&#x25CF;</property>
+ <property name="invisible_char">â—</property>
<property name="width_chars">4</property>
<property name="xalign">1</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
<property name="adjustment">adjustment_pdf_scale</property>
<property name="climb_rate">1</property>
<property name="numeric">True</property>
- <signal name="value_changed" handler="nsgtk_preferences_spinExportScale_valuechanged"/>
- <signal name="realize" handler="nsgtk_preferences_spinExportScale_realize"/>
+ <signal name="value-changed" handler="nsgtk_preferences_spinExportScale_valuechanged" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_spinExportScale_realize" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label60">
<property name="visible">True</property>
- <property name="label" translatable="no">%</property>
+ <property name="can_focus">False</property>
+ <property name="label">%</property>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
@@ -2030,6 +2387,7 @@
<child type="label">
<object class="GtkLabel" id="label48">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesAppearance</property>
<property name="use_markup">True</property>
</object>
@@ -2037,6 +2395,7 @@
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="padding">6</property>
<property name="position">0</property>
</packing>
@@ -2044,29 +2403,34 @@
<child>
<object class="GtkFrame" id="frame_pdfexport_margins">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment18">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
<object class="GtkVBox" id="vbox16">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkHBox" id="hbox22">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="label62">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesMarginsMeasurements</property>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@@ -2075,25 +2439,40 @@
</child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkTable" id="table4">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="n_rows">3</property>
<property name="n_columns">3</property>
<child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
<object class="GtkHBox" id="hbox16">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label51">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">Top</property>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@@ -2102,17 +2481,22 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">4</property>
- <property name="invisible_char">&#x25CF;</property>
+ <property name="invisible_char">â—</property>
<property name="width_chars">5</property>
<property name="xalign">1</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
<property name="climb_rate">1</property>
<property name="digits">1</property>
<property name="numeric">True</property>
- <signal name="value_changed" handler="nsgtk_preferences_spinMarginTop_valuechanged"/>
- <signal name="realize" handler="nsgtk_preferences_spinMarginTop_realize"/>
+ <signal name="value-changed" handler="nsgtk_preferences_spinMarginTop_valuechanged" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_spinMarginTop_realize" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@@ -2126,14 +2510,17 @@
<child>
<object class="GtkHBox" id="hbox18">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label52">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">Left</property>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@@ -2142,18 +2529,23 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">4</property>
- <property name="invisible_char">&#x25CF;</property>
+ <property name="invisible_char">â—</property>
<property name="width_chars">5</property>
<property name="xalign">1</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
<property name="adjustment">adjustment_pdf_lmargin</property>
<property name="climb_rate">1</property>
<property name="digits">1</property>
<property name="numeric">True</property>
- <signal name="value_changed" handler="nsgtk_preferences_spinMarginLeft_valuechanged"/>
- <signal name="realize" handler="nsgtk_preferences_spinMarginLeft_realize"/>
+ <signal name="value-changed" handler="nsgtk_preferences_spinMarginLeft_valuechanged" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_spinMarginLeft_realize" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@@ -2167,14 +2559,17 @@
<child>
<object class="GtkHBox" id="hbox20">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label53">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">Bottom</property>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@@ -2183,17 +2578,22 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">4</property>
- <property name="invisible_char">&#x25CF;</property>
+ <property name="invisible_char">â—</property>
<property name="width_chars">5</property>
<property name="xalign">1</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
<property name="climb_rate">1</property>
<property name="digits">1</property>
<property name="numeric">True</property>
- <signal name="value_changed" handler="nsgtk_preferences_spinMarginBottom_valuechanged"/>
- <signal name="realize" handler="nsgtk_preferences_spinMarginBottom_realize"/>
+ <signal name="value-changed" handler="nsgtk_preferences_spinMarginBottom_valuechanged" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_spinMarginBottom_realize" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@@ -2209,14 +2609,17 @@
<child>
<object class="GtkHBox" id="hbox21">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label54">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">Right</property>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@@ -2225,17 +2628,22 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">4</property>
- <property name="invisible_char">&#x25CF;</property>
+ <property name="invisible_char">â—</property>
<property name="width_chars">5</property>
<property name="xalign">1</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
<property name="climb_rate">1</property>
<property name="digits">1</property>
<property name="numeric">True</property>
- <signal name="value_changed" handler="nsgtk_preferences_spinMarginRight_valuechanged"/>
- <signal name="realize" handler="nsgtk_preferences_spinMarginRight_realize"/>
+ <signal name="value-changed" handler="nsgtk_preferences_spinMarginRight_valuechanged" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_spinMarginRight_realize" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@@ -2248,23 +2656,10 @@
<property name="x_options">GTK_EXPAND</property>
</packing>
</child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@@ -2275,6 +2670,7 @@
<child type="label">
<object class="GtkLabel" id="label49">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesMargins</property>
<property name="use_markup">True</property>
</object>
@@ -2282,6 +2678,7 @@
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="padding">6</property>
<property name="position">1</property>
</packing>
@@ -2289,18 +2686,20 @@
<child>
<object class="GtkFrame" id="frame_pdfexport_generation">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment19">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
<object class="GtkVBox" id="vbox14">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
<property name="spacing">7</property>
<child>
<object class="GtkCheckButton" id="checkCompressPDF">
@@ -2309,10 +2708,12 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
- <signal name="realize" handler="nsgtk_preferences_checkCompressPDF_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_checkCompressPDF_toggled"/>
+ <signal name="toggled" handler="nsgtk_preferences_checkCompressPDF_toggled" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_checkCompressPDF_realize" swapped="no"/>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
@@ -2323,10 +2724,12 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
- <signal name="realize" handler="nsgtk_preferences_checkPasswordPDF_realize"/>
- <signal name="toggled" handler="nsgtk_preferences_checkPasswordPDF_toggled"/>
+ <signal name="toggled" handler="nsgtk_preferences_checkPasswordPDF_toggled" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_checkPasswordPDF_realize" swapped="no"/>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
@@ -2337,6 +2740,7 @@
<child type="label">
<object class="GtkLabel" id="label50">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesGeneration</property>
<property name="use_markup">True</property>
</object>
@@ -2344,6 +2748,7 @@
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="padding">6</property>
<property name="position">2</property>
</packing>
@@ -2356,6 +2761,7 @@
<child type="tab">
<object class="GtkLabel" id="label47">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="label" translatable="yes">preferencesPDFTabtitle</property>
</object>
<packing>
@@ -2365,48 +2771,11 @@
</child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
- <child internal-child="action_area">
- <object class="GtkHButtonBox" id="dialog-action_area1">
- <property name="visible">True</property>
- <property name="layout_style">edge</property>
- <child>
- <object class="GtkButton" id="help">
- <property name="label">gtk-help</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="use_stock">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="close">
- <property name="label">gtk-close</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="use_stock">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="pack_type">end</property>
- <property name="position">0</property>
- </packing>
- </child>
</object>
</child>
<action-widgets>
@@ -2421,67 +2790,67 @@
</columns>
<data>
<row>
- <col id="0" translatable="no">Google</col>
+ <col id="0">Google</col>
</row>
<row>
- <col id="0" translatable="no">Yahoo!</col>
+ <col id="0">Yahoo!</col>
</row>
<row>
- <col id="0" translatable="no">Microsoft Live</col>
+ <col id="0">Microsoft Live</col>
</row>
<row>
- <col id="0" translatable="no">Buisiness.com</col>
+ <col id="0">Buisiness.com</col>
</row>
<row>
- <col id="0" translatable="no">Omgili</col>
+ <col id="0">Omgili</col>
</row>
<row>
- <col id="0" translatable="no">BBC News</col>
+ <col id="0">BBC News</col>
</row>
<row>
- <col id="0" translatable="no">Ubuntu Packages</col>
+ <col id="0">Ubuntu Packages</col>
</row>
<row>
- <col id="0" translatable="no">Creative Commons</col>
+ <col id="0">Creative Commons</col>
</row>
<row>
- <col id="0" translatable="no">Ask</col>
+ <col id="0">Ask</col>
</row>
<row>
- <col id="0" translatable="no">Answers</col>
+ <col id="0">Answers</col>
</row>
<row>
- <col id="0" translatable="no">Dictionary.com</col>
+ <col id="0">Dictionary.com</col>
</row>
<row>
- <col id="0" translatable="no">YouTube</col>
+ <col id="0">YouTube</col>
</row>
<row>
- <col id="0" translatable="no">AeroMP3</col>
+ <col id="0">AeroMP3</col>
</row>
<row>
- <col id="0" translatable="no">AOL</col>
+ <col id="0">AOL</col>
</row>
<row>
- <col id="0" translatable="no">Baidu</col>
+ <col id="0">Baidu</col>
</row>
<row>
- <col id="0" translatable="no">Amazon</col>
+ <col id="0">Amazon</col>
</row>
<row>
- <col id="0" translatable="no">Ebay</col>
+ <col id="0">Ebay</col>
</row>
<row>
- <col id="0" translatable="no">IMBD</col>
+ <col id="0">IMBD</col>
</row>
<row>
- <col id="0" translatable="no">ESPN</col>
+ <col id="0">ESPN</col>
</row>
<row>
- <col id="0" translatable="no">Wikipedia</col>
+ <col id="0">Wikipedia</col>
</row>
<row>
- <col id="0" translatable="no">DuckDuckGo</col>
+ <col id="0">DuckDuckGo</col>
</row>
</data>
</object>
@@ -2570,6 +2939,7 @@
</object>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="xpad">3</property>
<property name="stock">gtk-apply</property>
</object>
@@ -2623,10 +2993,10 @@
<property name="page_increment">16</property>
</object>
<object class="GtkAdjustment" id="adjustment_cache_disc_size">
- <property name="value">16</property>
- <property name="upper">2048</property>
- <property name="step_increment">4</property>
- <property name="page_increment">16</property>
+ <property name="value">1024</property>
+ <property name="upper">4096</property>
+ <property name="step_increment">32</property>
+ <property name="page_increment">256</property>
</object>
<object class="GtkAdjustment" id="adjustment_disc_cache_age">
<property name="value">28</property>
@@ -2698,4 +3068,21 @@
</row>
</data>
</object>
+ <object class="GtkListStore" id="liststore_developer_view">
+ <columns>
+ <!-- column-name Type -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">preferencesDeveloperViewWindow</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesDeveloperViewTab</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesDeveloperViewEditor</col>
+ </row>
+ </data>
+ </object>
</interface>
diff --git a/gtk/res/options.gtk3.ui b/gtk/res/options.gtk3.ui
index a795c2bf5..ac435834a 100644
--- a/gtk/res/options.gtk3.ui
+++ b/gtk/res/options.gtk3.ui
@@ -9,13 +9,13 @@
<property name="page_increment">1</property>
</object>
<object class="GtkAdjustment" id="adjustment_cache_disc_size">
- <property name="upper">2048</property>
- <property name="value">16</property>
+ <property name="upper">4096</property>
+ <property name="value">1024</property>
<property name="step_increment">4</property>
<property name="page_increment">16</property>
</object>
<object class="GtkAdjustment" id="adjustment_cache_memory_size">
- <property name="upper">2048</property>
+ <property name="upper">1024</property>
<property name="value">16</property>
<property name="step_increment">4</property>
<property name="page_increment">16</property>
@@ -736,7 +736,7 @@
</packing>
</child>
<child>
- <object class="GtkFrame" id="frame_appearance_source">
+ <object class="GtkFrame" id="frame_appearance_tools">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
@@ -754,58 +754,36 @@
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
- <object class="GtkLabel" id="label13">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">preferencesSourceOpen</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
<object class="GtkHBox" id="hbox6">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="spacing">12</property>
<child>
- <object class="GtkRadioButton" id="sourceButtonWindow">
- <property name="label" translatable="yes">preferencesSourceWindow</property>
- <property name="use_action_appearance">False</property>
+ <object class="GtkLabel" id="label13">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="halign">start</property>
- <property name="use_action_appearance">False</property>
- <property name="xalign">0.5</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <property name="group">sourceButtonTab</property>
- <signal name="toggled" handler="nsgtk_preferences_sourceButtonWindow_toggled" swapped="no"/>
- <signal name="realize" handler="nsgtk_preferences_sourceButtonWindow_realize" swapped="no"/>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">preferencesDeveloperView</property>
</object>
<packing>
- <property name="expand">True</property>
+ <property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
- <object class="GtkRadioButton" id="sourceButtonTab">
- <property name="label" translatable="yes">preferencesSourceTab</property>
- <property name="use_action_appearance">False</property>
+ <object class="GtkComboBox" id="comboboxDeveloperView">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
+ <property name="can_focus">False</property>
<property name="halign">start</property>
- <property name="use_action_appearance">False</property>
- <property name="xalign">0.5</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <signal name="toggled" handler="nsgtk_preferences_sourceButtonTab_toggled" swapped="no"/>
- <signal name="realize" handler="nsgtk_preferences_sourceButtonTab_realize" swapped="no"/>
+ <property name="model">liststore_developer_view</property>
+ <signal name="changed" handler="nsgtk_preferences_comboDeveloperView_changed" swapped="no"/>
+ <signal name="realize" handler="nsgtk_preferences_comboDeveloperView_realize" swapped="no"/>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext10"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
</object>
<packing>
<property name="expand">True</property>
@@ -828,7 +806,7 @@
<object class="GtkLabel" id="label12">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="label" translatable="yes">preferencesSource</property>
+ <property name="label" translatable="yes">preferencesTools</property>
<property name="use_markup">True</property>
</object>
</child>
@@ -2982,6 +2960,23 @@
</row>
</data>
</object>
+ <object class="GtkListStore" id="liststore_developer_view">
+ <columns>
+ <!-- column-name Type -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">preferencesDeveloperViewWindow</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesDeveloperViewTab</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">preferencesDeveloperViewEditor</col>
+ </row>
+ </data>
+ </object>
<object class="GtkListStore" id="liststore_image_loading">
<columns>
<!-- column-name Type -->
diff --git a/gtk/res/source.gtk2.ui b/gtk/res/viewdata.gtk2.ui
index 84c3e0cf5..c54545415 100644
--- a/gtk/res/source.gtk2.ui
+++ b/gtk/res/viewdata.gtk2.ui
@@ -2,7 +2,7 @@
<interface>
<!-- interface-requires gtk+ 2.12 -->
<!-- interface-naming-policy toplevel-contextual -->
- <object class="GtkWindow" id="wndSource">
+ <object class="GtkWindow" id="ViewDataWindow">
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
@@ -19,7 +19,7 @@
<object class="GtkMenu" id="menu1">
<property name="visible">True</property>
<child>
- <object class="GtkImageMenuItem" id="source_save_as">
+ <object class="GtkImageMenuItem" id="viewdata_save_as">
<property name="label">gtk-save-as</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
@@ -28,7 +28,7 @@
</object>
</child>
<child>
- <object class="GtkImageMenuItem" id="source_print">
+ <object class="GtkImageMenuItem" id="viewdata_print">
<property name="label">gtk-print</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
@@ -42,7 +42,7 @@
</object>
</child>
<child>
- <object class="GtkImageMenuItem" id="source_close">
+ <object class="GtkImageMenuItem" id="viewdata_close">
<property name="label">gtk-close</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
@@ -62,7 +62,7 @@
<object class="GtkMenu" id="menu2">
<property name="visible">True</property>
<child>
- <object class="GtkImageMenuItem" id="source_select_all">
+ <object class="GtkImageMenuItem" id="viewdata_select_all">
<property name="label">gtk-select-all</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
@@ -71,7 +71,7 @@
</object>
</child>
<child>
- <object class="GtkImageMenuItem" id="source_cut">
+ <object class="GtkImageMenuItem" id="viewdata_cut">
<property name="label">gtk-cut</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
@@ -79,7 +79,7 @@
</object>
</child>
<child>
- <object class="GtkImageMenuItem" id="source_copy">
+ <object class="GtkImageMenuItem" id="viewdata_copy">
<property name="label">gtk-copy</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
@@ -87,7 +87,7 @@
</object>
</child>
<child>
- <object class="GtkImageMenuItem" id="source_paste">
+ <object class="GtkImageMenuItem" id="viewdata_paste">
<property name="label">gtk-paste</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
@@ -95,7 +95,7 @@
</object>
</child>
<child>
- <object class="GtkImageMenuItem" id="source_delete">
+ <object class="GtkImageMenuItem" id="viewdata_delete">
<property name="label">gtk-delete</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
@@ -116,7 +116,7 @@
<object class="GtkMenu" id="menu4">
<property name="visible">True</property>
<child>
- <object class="GtkImageMenuItem" id="source_zoom_in">
+ <object class="GtkImageMenuItem" id="viewdata_zoom_in">
<property name="label">gtk-zoom-in</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
@@ -125,7 +125,7 @@
</object>
</child>
<child>
- <object class="GtkImageMenuItem" id="source_zoom_out">
+ <object class="GtkImageMenuItem" id="viewdata_zoom_out">
<property name="label">gtk-zoom-out</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
@@ -134,7 +134,7 @@
</object>
</child>
<child>
- <object class="GtkImageMenuItem" id="source_zoom_normal">
+ <object class="GtkImageMenuItem" id="viewdata_zoom_normal">
<property name="label">gtk-zoom-100</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
@@ -155,7 +155,7 @@
<object class="GtkMenu" id="menu3">
<property name="visible">True</property>
<child>
- <object class="GtkImageMenuItem" id="source_about">
+ <object class="GtkImageMenuItem" id="viewdata_about">
<property name="label">gtk-about</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
@@ -179,7 +179,7 @@
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
- <object class="GtkTextView" id="source_view">
+ <object class="GtkTextView" id="viewdata_view">
<property name="width_request">600</property>
<property name="height_request">400</property>
<property name="visible">True</property>
diff --git a/gtk/res/source.gtk3.ui b/gtk/res/viewdata.gtk3.ui
index b972315d3..e06aaf373 100644
--- a/gtk/res/source.gtk3.ui
+++ b/gtk/res/viewdata.gtk3.ui
@@ -37,34 +37,34 @@
</object>
</child>
<child>
- <object class="GtkAction" id="source_select_all">
+ <object class="GtkAction" id="viewdata_select_all">
<property name="stock_id" translatable="yes">gtk-select-all</property>
- <property name="name">source_select_all</property>
+ <property name="name">viewdata_select_all</property>
</object>
<accelerator key="A" modifiers="GDK_CONTROL_MASK"/>
</child>
<child>
- <object class="GtkAction" id="source_cut">
+ <object class="GtkAction" id="viewdata_cut">
<property name="stock_id" translatable="yes">gtk-cut</property>
- <property name="name">source_cut</property>
+ <property name="name">viewdata_cut</property>
</object>
</child>
<child>
- <object class="GtkAction" id="source_copy">
+ <object class="GtkAction" id="viewdata_copy">
<property name="stock_id" translatable="yes">gtk-copy</property>
- <property name="name">source_copy</property>
+ <property name="name">viewdata_copy</property>
</object>
</child>
<child>
- <object class="GtkAction" id="source_paste">
+ <object class="GtkAction" id="viewdata_paste">
<property name="stock_id" translatable="yes">gtk-paste</property>
- <property name="name">source_paste</property>
+ <property name="name">viewdata_paste</property>
</object>
</child>
<child>
- <object class="GtkAction" id="source_delete">
+ <object class="GtkAction" id="viewdata_delete">
<property name="stock_id" translatable="yes">gtk-delete</property>
- <property name="name">source_delete</property>
+ <property name="name">viewdata_delete</property>
</object>
<accelerator key="Delete" modifiers=""/>
</child>
@@ -75,23 +75,23 @@
</object>
</child>
<child>
- <object class="GtkAction" id="source_zoom_in">
+ <object class="GtkAction" id="viewdata_zoom_in">
<property name="stock_id" translatable="yes">gtk-zoom-in</property>
- <property name="name">source_zoom_in</property>
+ <property name="name">viewdata_zoom_in</property>
</object>
<accelerator key="plus" modifiers="GDK_CONTROL_MASK"/>
</child>
<child>
- <object class="GtkAction" id="source_zoom_out">
+ <object class="GtkAction" id="viewdata_zoom_out">
<property name="stock_id" translatable="yes">gtk-zoom-out</property>
- <property name="name">source_zoom_out</property>
+ <property name="name">viewdata_zoom_out</property>
</object>
<accelerator key="minus" modifiers="GDK_CONTROL_MASK"/>
</child>
<child>
- <object class="GtkAction" id="source_zoom_normal">
+ <object class="GtkAction" id="viewdata_zoom_normal">
<property name="stock_id" translatable="yes">gtk-zoom-100</property>
- <property name="name">source_zoom_normal</property>
+ <property name="name">viewdata_zoom_normal</property>
</object>
<accelerator key="0" modifiers="GDK_CONTROL_MASK"/>
</child>
@@ -102,9 +102,9 @@
</object>
</child>
<child>
- <object class="GtkAction" id="source_about">
+ <object class="GtkAction" id="viewdata_about">
<property name="stock_id" translatable="yes">gtk-about</property>
- <property name="name">source_about</property>
+ <property name="name">viewdata_about</property>
</object>
</child>
</object>
@@ -112,30 +112,30 @@
<ui>
<menubar name="menubar1">
<menu action="menuitem1">
- <menuitem action="source_save_as"/>
- <menuitem action="source_print"/>
+ <menuitem action="viewdata_save_as"/>
+ <menuitem action="viewdata_print"/>
<separator/>
- <menuitem action="source_close"/>
+ <menuitem action="viewdata_close"/>
</menu>
<menu action="menuitem2">
- <menuitem action="source_select_all"/>
- <menuitem action="source_cut"/>
- <menuitem action="source_copy"/>
- <menuitem action="source_paste"/>
- <menuitem action="source_delete"/>
+ <menuitem action="viewdata_select_all"/>
+ <menuitem action="viewdata_cut"/>
+ <menuitem action="viewdata_copy"/>
+ <menuitem action="viewdata_paste"/>
+ <menuitem action="viewdata_delete"/>
</menu>
<menu action="menuitem3">
- <menuitem action="source_zoom_in"/>
- <menuitem action="source_zoom_out"/>
- <menuitem action="source_zoom_normal"/>
+ <menuitem action="viewdata_zoom_in"/>
+ <menuitem action="viewdata_zoom_out"/>
+ <menuitem action="viewdata_zoom_normal"/>
</menu>
<menu action="menuitem4">
- <menuitem action="source_about"/>
+ <menuitem action="viewdata_about"/>
</menu>
</menubar>
</ui>
</object>
- <object class="GtkWindow" id="wndSource">
+ <object class="GtkWindow" id="ViewDataWindow">
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
@@ -154,7 +154,7 @@
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<child>
- <object class="GtkTextView" id="source_view">
+ <object class="GtkTextView" id="viewdata_view">
<property name="width_request">600</property>
<property name="height_request">400</property>
<property name="visible">True</property>
diff --git a/gtk/res/welcome.html b/gtk/res/welcome.html
new file mode 120000
index 000000000..1abdc5e8a
--- /dev/null
+++ b/gtk/res/welcome.html
@@ -0,0 +1 @@
+en/welcome.html \ No newline at end of file
diff --git a/gtk/scaffolding.c b/gtk/scaffolding.c
index b39283cc6..93cd7f768 100644
--- a/gtk/scaffolding.c
+++ b/gtk/scaffolding.c
@@ -18,26 +18,23 @@
*/
#include <assert.h>
-#include <dirent.h>
#include <stdbool.h>
#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
#include <errno.h>
-#include <unistd.h>
+#include <stdlib.h>
#include <gtk/gtk.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
-#include "gtk/scaffolding.h"
-#include "content/content.h"
-#include "content/hlcache.h"
-#include "css/utils.h"
-#include "desktop/browser_private.h"
-#include "desktop/local_history.h"
+#include "utils/filepath.h"
+#include "utils/messages.h"
+#include "utils/url.h"
+#include "utils/log.h"
+#include "utils/nsoption.h"
+#include "utils/file.h"
+#include "desktop/browser_history.h"
+#include "desktop/browser.h"
#include "desktop/hotlist.h"
-#include "desktop/gui.h"
#include "desktop/netsurf.h"
-#include "utils/nsoption.h"
#include "desktop/plotters.h"
#include "desktop/print.h"
#include "desktop/save_complete.h"
@@ -46,60 +43,51 @@
#include "desktop/save_pdf/pdf_plotters.h"
#endif
#include "desktop/save_text.h"
-#include "desktop/search.h"
#include "desktop/searchweb.h"
#include "desktop/textinput.h"
-#include "desktop/tree.h"
+#include "render/font.h"
+#include "render/html.h"
+#include "content/hlcache.h"
+
+#include "gtk/compat.h"
#include "gtk/cookies.h"
#include "gtk/completion.h"
#include "gtk/dialogs/preferences.h"
#include "gtk/dialogs/about.h"
-#include "gtk/dialogs/source.h"
+#include "gtk/viewsource.h"
#include "gtk/bitmap.h"
-#include "gtk/download.h"
#include "gtk/gui.h"
#include "gtk/history.h"
#include "gtk/hotlist.h"
+#include "gtk/download.h"
#include "gtk/menu.h"
#include "gtk/plotters.h"
#include "gtk/print.h"
-#include "gtk/schedule.h"
#include "gtk/search.h"
-#include "gtk/tabs.h"
#include "gtk/theme.h"
#include "gtk/throbber.h"
#include "gtk/toolbar.h"
-#include "gtk/treeview.h"
#include "gtk/window.h"
-#include "gtk/compat.h"
#include "gtk/gdk.h"
-#include "image/ico.h"
-#include "render/font.h"
-#include "render/form.h"
-#include "render/html.h"
-#include "utils/messages.h"
-#include "utils/schedule.h"
-#include "utils/utils.h"
-#include "utils/url.h"
-
-#include "utils/log.h"
-
-
+#include "gtk/scaffolding.h"
+#include "gtk/tabs.h"
+#include "gtk/schedule.h"
+#include "gtk/viewdata.h"
/** Macro to define a handler for menu, button and activate events. */
#define MULTIHANDLER(q)\
-static gboolean nsgtk_on_##q##_activate(struct gtk_scaffolding *g);\
+static gboolean nsgtk_on_##q##_activate(struct nsgtk_scaffolding *g);\
static gboolean nsgtk_on_##q##_activate_menu(GtkMenuItem *widget, gpointer data)\
{\
- struct gtk_scaffolding *g = (struct gtk_scaffolding *)data;\
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;\
return nsgtk_on_##q##_activate(g);\
}\
static gboolean nsgtk_on_##q##_activate_button(GtkButton *widget, gpointer data)\
{\
- struct gtk_scaffolding *g = (struct gtk_scaffolding *)data;\
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;\
return nsgtk_on_##q##_activate(g);\
}\
-static gboolean nsgtk_on_##q##_activate(struct gtk_scaffolding *g)
+static gboolean nsgtk_on_##q##_activate(struct nsgtk_scaffolding *g)
/** Macro to define a handler for menu events. */
#define MENUHANDLER(q)\
@@ -110,7 +98,7 @@ static gboolean nsgtk_on_##q##_activate_menu(GtkMenuItem *widget, gpointer data)
static gboolean nsgtk_on_##q##_activate(GtkButton *widget, gpointer data)
/** Core scaffolding structure. */
-struct gtk_scaffolding {
+struct nsgtk_scaffolding {
GtkWindow *window;
GtkNotebook *notebook;
GtkWidget *url_bar;
@@ -120,7 +108,10 @@ struct gtk_scaffolding {
struct nsgtk_bar_submenu *menu_bar;
/** right click popup menu hierarchy */
- struct nsgtk_popup_submenu *menu_popup;
+ struct nsgtk_popup_menu *menu_popup;
+
+ /** link popup menu */
+ struct nsgtk_link_menu *link_menu;
GtkToolbar *tool_bar;
struct nsgtk_button_connect *buttons[PLACEHOLDER_BUTTON];
@@ -143,14 +134,14 @@ struct gtk_scaffolding {
bool fullscreen;
/* keep global linked list for gui interface adjustments */
- struct gtk_scaffolding *next, *prev;
+ struct nsgtk_scaffolding *next, *prev;
};
-/** current window for model dialogue use */
-static struct gtk_scaffolding *current_model;
+/** current scaffold for model dialogue use */
+static struct nsgtk_scaffolding *scaf_current;
/** global list for interface changes */
-nsgtk_scaffolding *scaf_list = NULL;
+static struct nsgtk_scaffolding *scaf_list = NULL;
/** holds the context data for what's under the pointer, when the contextual
* menu is opened. */
@@ -160,8 +151,8 @@ static struct contextual_content current_menu_ctx;
/**
* Helper to hide popup menu entries by grouping
*/
-static void popup_menu_hide(struct nsgtk_popup_submenu *menu, bool submenu,
- bool link, bool nav, bool cnp, bool custom)
+static void popup_menu_hide(struct nsgtk_popup_menu *menu, bool submenu,
+ bool nav, bool cnp, bool custom)
{
if (submenu){
gtk_widget_hide(GTK_WIDGET(menu->file_menuitem));
@@ -173,14 +164,6 @@ static void popup_menu_hide(struct nsgtk_popup_submenu *menu, bool submenu,
gtk_widget_hide(menu->first_separator);
}
- if (link) {
- gtk_widget_hide(GTK_WIDGET(menu->opentab_menuitem));
- gtk_widget_hide(GTK_WIDGET(menu->openwin_menuitem));
- gtk_widget_hide(GTK_WIDGET(menu->savelink_menuitem));
-
- gtk_widget_hide(menu->second_separator);
- }
-
if (nav) {
gtk_widget_hide(GTK_WIDGET(menu->back_menuitem));
gtk_widget_hide(GTK_WIDGET(menu->forward_menuitem));
@@ -203,8 +186,8 @@ static void popup_menu_hide(struct nsgtk_popup_submenu *menu, bool submenu,
/**
* Helper to show popup menu entries by grouping
*/
-static void popup_menu_show(struct nsgtk_popup_submenu *menu, bool submenu,
- bool link, bool nav, bool cnp, bool custom)
+static void popup_menu_show(struct nsgtk_popup_menu *menu, bool submenu,
+ bool nav, bool cnp, bool custom)
{
if (submenu){
gtk_widget_show(GTK_WIDGET(menu->file_menuitem));
@@ -216,14 +199,6 @@ static void popup_menu_show(struct nsgtk_popup_submenu *menu, bool submenu,
gtk_widget_show(menu->first_separator);
}
- if (link) {
- gtk_widget_show(GTK_WIDGET(menu->opentab_menuitem));
- gtk_widget_show(GTK_WIDGET(menu->openwin_menuitem));
- gtk_widget_show(GTK_WIDGET(menu->savelink_menuitem));
-
- gtk_widget_show(menu->second_separator);
- }
-
if (nav) {
gtk_widget_show(GTK_WIDGET(menu->back_menuitem));
gtk_widget_show(GTK_WIDGET(menu->forward_menuitem));
@@ -251,7 +226,7 @@ static void popup_menu_show(struct nsgtk_popup_submenu *menu, bool submenu,
*/
static void scaffolding_window_destroy(GtkWidget *widget, gpointer data)
{
- struct gtk_scaffolding *gs = data;
+ struct nsgtk_scaffolding *gs = data;
LOG(("scaffold:%p", gs));
@@ -282,7 +257,7 @@ static void scaffolding_window_destroy(GtkWidget *widget, gpointer data)
static gboolean scaffolding_window_delete_event(GtkWidget *widget,
GdkEvent *event, gpointer data)
{
- struct gtk_scaffolding *g = data;
+ struct nsgtk_scaffolding *g = data;
if (nsgtk_check_for_downloads(GTK_WINDOW(widget)) == false) {
gtk_widget_destroy(GTK_WIDGET(g->window));
@@ -290,42 +265,28 @@ static gboolean scaffolding_window_delete_event(GtkWidget *widget,
return TRUE;
}
-/* exported interface documented in gtk_scaffold.h */
-void nsgtk_scaffolding_destroy(nsgtk_scaffolding *gs)
-{
- LOG(("scaffold: %p", gs));
-
- if (gtk_widget_in_destruction(GTK_WIDGET(gs->window)) != TRUE) {
- gtk_widget_destroy(GTK_WIDGET(gs->window));
- }
-}
-
/**
* Update the back and forward button sensitivity.
*/
-static void nsgtk_window_update_back_forward(struct gtk_scaffolding *g)
+static void nsgtk_window_update_back_forward(struct nsgtk_scaffolding *g)
{
int width, height;
struct browser_window *bw = nsgtk_get_browser_window(g->top_level);
g->buttons[BACK_BUTTON]->sensitivity =
- history_back_available(bw->history);
- g->buttons[FORWARD_BUTTON]->sensitivity = history_forward_available(
- bw->history);
+ browser_window_history_back_available(bw);
+ g->buttons[FORWARD_BUTTON]->sensitivity =
+ browser_window_history_forward_available(bw);
nsgtk_scaffolding_set_sensitivity(g);
/* update the url bar, particularly necessary when tabbing */
- if (bw->current_content != NULL &&
- hlcache_handle_get_url(bw->current_content) != NULL)
- browser_window_refresh_url_bar(bw,
- hlcache_handle_get_url(bw->current_content),
- bw->frag_id);
+ browser_window_refresh_url_bar(bw);
/* update the local history window, as well as queuing a redraw
* for it.
*/
- history_size(bw->history, &width, &height);
+ browser_window_history_size(bw, &width, &height);
gtk_widget_set_size_request(GTK_WIDGET(g->history_window->drawing_area),
width, height);
gtk_widget_queue_draw(GTK_WIDGET(g->history_window->drawing_area));
@@ -336,7 +297,7 @@ static void nsgtk_window_update_back_forward(struct gtk_scaffolding *g)
*/
static void nsgtk_throb(void *p)
{
- struct gtk_scaffolding *g = p;
+ struct nsgtk_scaffolding *g = p;
if (g->throb_frame >= (nsgtk_throbber->nframes - 1))
g->throb_frame = 1;
@@ -346,11 +307,11 @@ static void nsgtk_throb(void *p)
gtk_image_set_from_pixbuf(g->throbber, nsgtk_throbber->framedata[
g->throb_frame]);
- schedule(10, nsgtk_throb, p);
+ nsgtk_schedule(100, nsgtk_throb, p);
}
static guint nsgtk_scaffolding_update_edit_actions_sensitivity(
- struct gtk_scaffolding *g)
+ struct nsgtk_scaffolding *g)
{
GtkWidget *widget = gtk_window_get_focus(g->window);
gboolean has_selection;
@@ -382,20 +343,9 @@ static guint nsgtk_scaffolding_update_edit_actions_sensitivity(
(g->buttons[PASTE_BUTTON]->sensitivity));
}
-static void nsgtk_scaffolding_enable_link_operations_sensitivity(
- struct gtk_scaffolding *g)
-{
-
- gtk_widget_set_sensitive(GTK_WIDGET(g->menu_popup->savelink_menuitem), TRUE);
- gtk_widget_set_sensitive(GTK_WIDGET(g->menu_popup->opentab_menuitem), TRUE);
- gtk_widget_set_sensitive(GTK_WIDGET(g->menu_popup->openwin_menuitem), TRUE);
-
- popup_menu_show(g->menu_popup, false, true, false, false, false);
-
-}
static void nsgtk_scaffolding_enable_edit_actions_sensitivity(
- struct gtk_scaffolding *g)
+ struct nsgtk_scaffolding *g)
{
g->buttons[PASTE_BUTTON]->sensitivity = true;
@@ -403,12 +353,12 @@ static void nsgtk_scaffolding_enable_edit_actions_sensitivity(
g->buttons[CUT_BUTTON]->sensitivity = true;
nsgtk_scaffolding_set_sensitivity(g);
- popup_menu_show(g->menu_popup, false, false, false, true, false);
+ popup_menu_show(g->menu_popup, false, false, true, false);
}
/* signal handling functions for the toolbar, URL bar, and menu bar */
static gboolean nsgtk_window_edit_menu_clicked(GtkWidget *widget,
- struct gtk_scaffolding *g)
+ struct nsgtk_scaffolding *g)
{
nsgtk_scaffolding_update_edit_actions_sensitivity(g);
@@ -416,7 +366,7 @@ static gboolean nsgtk_window_edit_menu_clicked(GtkWidget *widget,
}
static gboolean nsgtk_window_edit_menu_hidden(GtkWidget *widget,
- struct gtk_scaffolding *g)
+ struct nsgtk_scaffolding *g)
{
nsgtk_scaffolding_enable_edit_actions_sensitivity(g);
@@ -424,44 +374,29 @@ static gboolean nsgtk_window_edit_menu_hidden(GtkWidget *widget,
}
static gboolean nsgtk_window_popup_menu_hidden(GtkWidget *widget,
- struct gtk_scaffolding *g)
+ struct nsgtk_scaffolding *g)
{
- nsgtk_scaffolding_enable_link_operations_sensitivity(g);
nsgtk_scaffolding_enable_edit_actions_sensitivity(g);
return TRUE;
}
gboolean nsgtk_window_url_activate_event(GtkWidget *widget, gpointer data)
{
- struct gtk_scaffolding *g = data;
- struct browser_window *bw = nsgtk_get_browser_window(g->top_level);
- char *urltxt;
+ struct nsgtk_scaffolding *g = data;
+ nserror ret;
nsurl *url;
- nserror error;
- if (search_is_url(gtk_entry_get_text(GTK_ENTRY(g->url_bar))) == false) {
- urltxt = search_web_from_term(gtk_entry_get_text(GTK_ENTRY(
- g->url_bar)));
- } else {
- urltxt = strdup(gtk_entry_get_text(GTK_ENTRY(g->url_bar)));
+ ret = search_web_omni(gtk_entry_get_text(GTK_ENTRY(g->url_bar)),
+ SEARCH_WEB_OMNI_NONE,
+ &url);
+ if (ret == NSERROR_OK) {
+ ret = browser_window_navigate(nsgtk_get_browser_window(g->top_level),
+ url, NULL, BW_NAVIGATE_HISTORY,
+ NULL, NULL, NULL);
+ nsurl_unref(url);
}
-
- if (urltxt != NULL) {
- error = nsurl_create(urltxt, &url);
- if (error != NSERROR_OK) {
- warn_user(messages_get_errorcode(error), 0);
- } else {
- browser_window_navigate(bw,
- url,
- NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
- NULL,
- NULL,
- NULL);
- nsurl_unref(url);
- }
- free(urltxt);
+ if (ret != NSERROR_OK) {
+ warn_user(messages_get_errorcode(ret), 0);
}
return TRUE;
@@ -485,11 +420,11 @@ gboolean nsgtk_window_url_changed(GtkWidget *widget, GdkEventKey *event,
static gboolean nsgtk_window_tool_bar_clicked(GtkToolbar *toolbar,
gint x, gint y, gint button, gpointer data)
{
- struct gtk_scaffolding *g = (struct gtk_scaffolding *)data;
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
/* set visibility for right-click popup menu */
- popup_menu_hide(g->menu_popup, true, true, false, true, false);
- popup_menu_show(g->menu_popup, false, false, false, false, true);
+ popup_menu_hide(g->menu_popup, true, false, true, false);
+ popup_menu_show(g->menu_popup, false, false, false, true);
gtk_menu_popup(g->menu_popup->popup_menu, NULL, NULL, NULL, NULL, 0,
gtk_get_current_event_time());
@@ -501,7 +436,7 @@ static gboolean nsgtk_window_tool_bar_clicked(GtkToolbar *toolbar,
* Update the menus when the number of tabs changes.
*/
static void nsgtk_window_tabs_add(GtkNotebook *notebook,
- GtkWidget *page, guint page_num, struct gtk_scaffolding *g)
+ GtkWidget *page, guint page_num, struct nsgtk_scaffolding *g)
{
gboolean visible = gtk_notebook_get_show_tabs(g->notebook);
g_object_set(g->menu_bar->view_submenu->tabs_menuitem, "visible", visible, NULL);
@@ -519,7 +454,7 @@ static void
nsgtk_window_tabs_remove(GtkNotebook *notebook,
GtkWidget *page,
guint page_num,
- struct gtk_scaffolding *gs)
+ struct nsgtk_scaffolding *gs)
{
/* if the scaffold is being destroyed it is not useful to
* update the state, futher many of the widgets may have
@@ -529,8 +464,9 @@ nsgtk_window_tabs_remove(GtkNotebook *notebook,
return;
}
+ /* if this is the last tab destroy the scaffold in addition */
if (gtk_notebook_get_n_pages(notebook) == 1) {
- nsgtk_scaffolding_destroy(gs);
+ gtk_widget_destroy(GTK_WIDGET(gs->window));
return;
}
@@ -553,7 +489,7 @@ static void nsgtk_openfile_open(const char *filename)
nsurl *url;
nserror error;
- bw = nsgtk_get_browser_window(current_model->top_level);
+ bw = nsgtk_get_browser_window(scaf_current->top_level);
urltxt = malloc(strlen(filename) + FILE_SCHEME_PREFIX_LEN + 1);
@@ -567,8 +503,7 @@ static void nsgtk_openfile_open(const char *filename)
browser_window_navigate(bw,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -595,7 +530,7 @@ MULTIHANDLER(newwindow)
error = nsurl_create(addr, &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
bw,
@@ -628,8 +563,8 @@ nserror nsgtk_scaffolding_new_tab(struct gui_window *gw)
}
}
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_TAB,
+ error = browser_window_create(BW_CREATE_HISTORY |
+ BW_CREATE_TAB,
url,
NULL,
bw,
@@ -653,9 +588,9 @@ MULTIHANDLER(newtab)
MULTIHANDLER(openfile)
{
- current_model = g;
+ scaf_current = g;
GtkWidget *dlgOpen = gtk_file_chooser_dialog_new("Open File",
- current_model->window, GTK_FILE_CHOOSER_ACTION_OPEN,
+ scaf_current->window, GTK_FILE_CHOOSER_ACTION_OPEN,
GTK_STOCK_CANCEL, -6, GTK_STOCK_OPEN, -5, NULL);
gint response = gtk_dialog_run(GTK_DIALOG(dlgOpen));
@@ -684,8 +619,7 @@ static gboolean nsgtk_filter_directory(const GtkFileFilterInfo *info,
MULTIHANDLER(savepage)
{
- if (nsgtk_get_browser_window(g->top_level)->current_content
- == NULL)
+ if (!browser_window_has_content(nsgtk_get_browser_window(g->top_level)))
return FALSE;
GtkWidget *fc = gtk_file_chooser_dialog_new(
@@ -696,7 +630,7 @@ MULTIHANDLER(savepage)
NULL);
DIR *d;
char *path;
- url_func_result res;
+ nserror res;
GtkFileFilter *filter = gtk_file_filter_new();
gtk_file_filter_set_name(filter, "Directories");
gtk_file_filter_add_custom(filter, GTK_FILE_FILTER_FILENAME,
@@ -704,9 +638,9 @@ MULTIHANDLER(savepage)
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(fc), filter);
gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(fc), filter);
- res = url_nice(nsurl_access(hlcache_handle_get_url(nsgtk_get_browser_window(
- g->top_level)->current_content)), &path, false);
- if (res != URL_FUNC_OK) {
+ res = url_nice(nsurl_access(browser_window_get_url(
+ nsgtk_get_browser_window(g->top_level))), &path, false);
+ if (res != NSERROR_OK) {
path = strdup(messages_get("SaveText"));
if (path == NULL) {
warn_user("NoMemory", 0);
@@ -740,8 +674,8 @@ MULTIHANDLER(savepage)
return TRUE;
}
closedir(d);
- save_complete(nsgtk_get_browser_window(
- g->top_level)->current_content, path, NULL);
+ save_complete(browser_window_get_content(nsgtk_get_browser_window(
+ g->top_level)), path, NULL);
g_free(path);
gtk_widget_destroy(fc);
@@ -760,15 +694,14 @@ MULTIHANDLER(pdf)
char filename[PATH_MAX];
char dirname[PATH_MAX];
char *url_name;
- url_func_result res;
+ nserror res;
LOG(("Print preview (generating PDF) started."));
- res = url_nice(nsurl_access(hlcache_handle_get_url(bw->current_content)),
+ res = url_nice(nsurl_access(browser_window_get_url(bw)),
&url_name, true);
- if (res != URL_FUNC_OK) {
- warn_user(messages_get(res == URL_FUNC_NOMEM ? "NoMemory"
- : "URIError"), 0);
+ if (res != NSERROR_OK) {
+ warn_user(messages_get_errorcode(res), 0);
return TRUE;
}
@@ -814,7 +747,8 @@ MULTIHANDLER(pdf)
}
/* This will clean up the print_settings object for us */
- print_basic_run(bw->current_content, &pdf_printer, settings);
+ print_basic_run(browser_window_get_content(bw),
+ &pdf_printer, settings);
}
gtk_widget_destroy(save_dialog);
@@ -826,8 +760,7 @@ MULTIHANDLER(pdf)
MULTIHANDLER(plaintext)
{
- if (nsgtk_get_browser_window(g->top_level)->current_content
- == NULL)
+ if (!browser_window_has_content(nsgtk_get_browser_window(g->top_level)))
return FALSE;
GtkWidget *fc = gtk_file_chooser_dialog_new(
@@ -837,11 +770,12 @@ MULTIHANDLER(plaintext)
GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
NULL);
char *filename;
- url_func_result res;
+ nserror res;
- res = url_nice(nsurl_access(hlcache_handle_get_url(nsgtk_get_browser_window(
- g->top_level)->current_content)), &filename, false);
- if (res != URL_FUNC_OK) {
+ res = url_nice(nsurl_access(browser_window_get_url(
+ nsgtk_get_browser_window(g->top_level))),
+ &filename, false);
+ if (res != NSERROR_OK) {
filename = strdup(messages_get("SaveText"));
if (filename == NULL) {
warn_user("NoMemory", 0);
@@ -857,8 +791,9 @@ MULTIHANDLER(plaintext)
if (gtk_dialog_run(GTK_DIALOG(fc)) == GTK_RESPONSE_ACCEPT) {
filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fc));
- save_as_text(nsgtk_get_browser_window(
- g->top_level)->current_content, filename);
+ save_as_text(browser_window_get_content(
+ nsgtk_get_browser_window(
+ g->top_level)), filename);
g_free(filename);
}
@@ -888,9 +823,10 @@ MULTIHANDLER(print)
GtkPrintOperation *print_op;
GtkPageSetup *page_setup;
- GtkPrintSettings *gtk_print_settings;
+ GtkPrintSettings *print_settings;
GtkPrintOperationResult res = GTK_PRINT_OPERATION_RESULT_ERROR;
- struct print_settings *settings;
+ struct print_settings *nssettings;
+ char *settings_fname = NULL;
print_op = gtk_print_operation_new();
if (print_op == NULL) {
@@ -899,48 +835,58 @@ MULTIHANDLER(print)
}
/* use previously saved settings if any */
- gtk_print_settings = gtk_print_settings_new_from_file(
- print_options_file_location, NULL);
- if (gtk_print_settings != NULL) {
- gtk_print_operation_set_print_settings(print_op,
- gtk_print_settings);
-
- /* We're not interested in the settings any more */
- g_object_unref(gtk_print_settings);
+ netsurf_mkpath(&settings_fname, NULL, 2, nsgtk_config_home, "Print");
+ if (settings_fname != NULL) {
+ print_settings = gtk_print_settings_new_from_file(settings_fname, NULL);
+ if (print_settings != NULL) {
+ gtk_print_operation_set_print_settings(print_op,
+ print_settings);
+
+ /* We're not interested in the settings any more */
+ g_object_unref(print_settings);
+ }
}
- content_to_print = bw->current_content;
+ content_to_print = browser_window_get_content(bw);
page_setup = gtk_print_run_page_setup_dialog(g->window, NULL, NULL);
if (page_setup == NULL) {
warn_user(messages_get("NoMemory"), 0);
+ free(settings_fname);
g_object_unref(print_op);
return TRUE;
}
gtk_print_operation_set_default_page_setup(print_op, page_setup);
- settings = print_make_settings(PRINT_DEFAULT, NULL, &nsfont);
+ nssettings = print_make_settings(PRINT_DEFAULT, NULL, &nsfont);
g_signal_connect(print_op, "begin_print",
- G_CALLBACK(gtk_print_signal_begin_print), settings);
+ G_CALLBACK(gtk_print_signal_begin_print), nssettings);
g_signal_connect(print_op, "draw_page",
G_CALLBACK(gtk_print_signal_draw_page), NULL);
g_signal_connect(print_op, "end_print",
- G_CALLBACK(gtk_print_signal_end_print), settings);
- if (content_get_type(bw->current_content) != CONTENT_TEXTPLAIN)
+ G_CALLBACK(gtk_print_signal_end_print), nssettings);
+
+ if (content_get_type(browser_window_get_content(bw)) !=
+ CONTENT_TEXTPLAIN) {
res = gtk_print_operation_run(print_op,
GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
g->window,
NULL);
+ }
/* if the settings were used save them for future use */
- if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
- /* Don't ref the settings, as we don't want to own them */
- gtk_print_settings = gtk_print_operation_get_print_settings(
- print_op);
-
- gtk_print_settings_to_file(gtk_print_settings,
- print_options_file_location, NULL);
+ if (settings_fname != NULL) {
+ if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
+ /* Do not increment the settings reference */
+ print_settings =
+ gtk_print_operation_get_print_settings(print_op);
+
+ gtk_print_settings_to_file(print_settings,
+ settings_fname,
+ NULL);
+ }
+ free(settings_fname);
}
/* Our print_settings object is destroyed by the end print handler */
@@ -958,15 +904,23 @@ MULTIHANDLER(closewindow)
MULTIHANDLER(quit)
{
- if (nsgtk_check_for_downloads(g->window) == false)
- netsurf_quit = true;
+ struct nsgtk_scaffolding *gs;
+
+ if (nsgtk_check_for_downloads(g->window) == false) {
+ gs = scaf_list;
+ while (gs != NULL) {
+ gtk_widget_destroy(GTK_WIDGET(gs->window));
+ gs = gs->next;
+ }
+ }
+
return TRUE;
}
MENUHANDLER(savelink)
{
nsurl *url;
- struct gtk_scaffolding *g = (struct gtk_scaffolding *) data;
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *) data;
struct gui_window *gui = g->top_level;
struct browser_window *bw = nsgtk_get_browser_window(gui);
@@ -977,8 +931,7 @@ MENUHANDLER(savelink)
browser_window_navigate(bw,
url,
NULL,
- BROWSER_WINDOW_DOWNLOAD |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_DOWNLOAD,
NULL,
NULL,
NULL);
@@ -993,7 +946,7 @@ MENUHANDLER(savelink)
*/
MENUHANDLER(link_openwin)
{
- struct gtk_scaffolding *g = (struct gtk_scaffolding *) data;
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *) data;
struct gui_window *gui = g->top_level;
struct browser_window *bw = nsgtk_get_browser_window(gui);
nsurl *url;
@@ -1004,12 +957,9 @@ MENUHANDLER(link_openwin)
error = nsurl_create(current_menu_ctx.link_url, &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
- url,
- NULL,
- bw,
- NULL);
+ error = browser_window_create(
+ BW_CREATE_CLONE | BW_CREATE_HISTORY,
+ url, NULL, bw, NULL);
nsurl_unref(url);
}
if (error != NSERROR_OK) {
@@ -1024,7 +974,7 @@ MENUHANDLER(link_openwin)
*/
MENUHANDLER(link_opentab)
{
- struct gtk_scaffolding *g = (struct gtk_scaffolding *) data;
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *) data;
struct gui_window *gui = g->top_level;
struct browser_window *bw = nsgtk_get_browser_window(gui);
nsurl *url;
@@ -1037,13 +987,9 @@ MENUHANDLER(link_opentab)
error = nsurl_create(current_menu_ctx.link_url, &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_TAB,
- url,
- NULL,
- bw,
- NULL);
+ error = browser_window_create(BW_CREATE_CLONE |
+ BW_CREATE_HISTORY | BW_CREATE_TAB,
+ url, NULL, bw, NULL);
nsurl_unref(url);
}
if (error != NSERROR_OK) {
@@ -1055,6 +1001,44 @@ MENUHANDLER(link_opentab)
return TRUE;
}
+/**
+ * Handler for bookmarking a link. attached to the popup menu.
+ */
+MENUHANDLER(link_bookmark)
+{
+ nsurl *url;
+ nserror error;
+
+ if (current_menu_ctx.link_url == NULL)
+ return FALSE;
+
+ error = nsurl_create(current_menu_ctx.link_url, &url);
+ if (error == NSERROR_OK) {
+ hotlist_add_url(url);
+ nsurl_unref(url);
+ }
+ if (error != NSERROR_OK) {
+ warn_user(messages_get_errorcode(error), 0);
+ }
+
+ return TRUE;
+}
+
+/**
+ * Handler for copying a link. attached to the popup menu.
+ */
+MENUHANDLER(link_copy)
+{
+ GtkClipboard *clipboard;
+
+ if (current_menu_ctx.link_url == NULL)
+ return FALSE;
+
+ clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
+ gtk_clipboard_set_text(clipboard, current_menu_ctx.link_url, -1);
+ return TRUE;
+}
+
MULTIHANDLER(cut)
{
@@ -1105,7 +1089,7 @@ MULTIHANDLER(delete)
MENUHANDLER(customize)
{
- struct gtk_scaffolding *g = (struct gtk_scaffolding *)data;
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
nsgtk_toolbar_customization_init(g);
return TRUE;
}
@@ -1188,15 +1172,14 @@ MULTIHANDLER(fullscreen)
MULTIHANDLER(viewsource)
{
- nsgtk_source_dialog_init(g->window,
- nsgtk_get_browser_window(g->top_level));
+ nsgtk_viewsource(g->window, nsgtk_get_browser_window(g->top_level));
return TRUE;
}
MENUHANDLER(menubar)
{
GtkWidget *w;
- struct gtk_scaffolding *g = (struct gtk_scaffolding *)data;
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
/* if the menubar is not being shown the popup menu shows the
* menubar entries instead.
@@ -1218,8 +1201,8 @@ MENUHANDLER(menubar)
gtk_widget_show(GTK_WIDGET(g->menu_bar->bar_menu));
- popup_menu_show(g->menu_popup, false, true, true, true, true);
- popup_menu_hide(g->menu_popup, true, false, false, false, false);
+ popup_menu_show(g->menu_popup, false, true, true, true);
+ popup_menu_hide(g->menu_popup, true, false, false, false);
} else {
w = GTK_WIDGET(g->menu_popup->view_submenu->toolbars_submenu->menubar_menuitem);
if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(w)))
@@ -1233,7 +1216,7 @@ MENUHANDLER(menubar)
gtk_widget_hide(GTK_WIDGET(g->menu_bar->bar_menu));
- popup_menu_show(g->menu_popup, true, true, true, true, true);
+ popup_menu_show(g->menu_popup, true, true, true, true);
}
return TRUE;
@@ -1242,7 +1225,7 @@ MENUHANDLER(menubar)
MENUHANDLER(toolbar)
{
GtkWidget *w;
- struct gtk_scaffolding *g = (struct gtk_scaffolding *)data;
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) {
w = GTK_WIDGET(g->menu_popup->view_submenu->toolbars_submenu->toolbar_menuitem);
@@ -1282,6 +1265,7 @@ MULTIHANDLER(downloads)
MULTIHANDLER(savewindowsize)
{
int x,y,w,h;
+ char *choices = NULL;
gtk_window_get_position(g->window, &x, &y);
gtk_window_get_size(g->window, &w, &h);
@@ -1291,7 +1275,11 @@ MULTIHANDLER(savewindowsize)
nsoption_set_int(window_x, x);
nsoption_set_int(window_y, y);
- nsoption_write(options_file_location, NULL, NULL);
+ netsurf_mkpath(&choices, NULL, 2, nsgtk_config_home, "Choices");
+ if (choices != NULL) {
+ nsoption_write(choices, NULL, NULL);
+ free(choices);
+ }
return TRUE;
}
@@ -1303,96 +1291,72 @@ MULTIHANDLER(toggledebugging)
return TRUE;
}
-MULTIHANDLER(saveboxtree)
+MULTIHANDLER(debugboxtree)
{
- GtkWidget *save_dialog;
-
- save_dialog = gtk_file_chooser_dialog_new("Save File", g->window,
- GTK_FILE_CHOOSER_ACTION_SAVE,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
- NULL);
-
- gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(save_dialog),
- getenv("HOME") ? getenv("HOME") : "/");
-
- gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(save_dialog),
- "boxtree.txt");
+ gchar *fname;
+ gint handle;
+ FILE *f;
+ struct browser_window *bw;
- if (gtk_dialog_run(GTK_DIALOG(save_dialog)) == GTK_RESPONSE_ACCEPT) {
- gchar *filename = gtk_file_chooser_get_filename(
- GTK_FILE_CHOOSER(save_dialog));
- FILE *fh;
+ handle = g_file_open_tmp("nsgtkboxtreeXXXXXX", &fname, NULL);
+ if ((handle == -1) || (fname == NULL)) {
+ return TRUE;
+ }
+ close(handle); /* in case it was binary mode */
- LOG(("Saving box tree dump to %s...\n", filename));
+ /* save data to temporary file */
+ f = fopen(fname, "w");
+ if (f == NULL) {
+ warn_user("Error saving box tree dump.",
+ "Unable to open file for writing.");
+ unlink(fname);
+ return TRUE;
+ }
- fh = fopen((const char *) filename, "w");
- if (fh == NULL) {
- warn_user("Error saving box tree dump.",
- "Unable to open file for writing.");
- } else {
- struct browser_window *bw;
- bw = nsgtk_get_browser_window(g->top_level);
+ bw = nsgtk_get_browser_window(g->top_level);
- browser_window_debug_dump(bw, fh);
+ browser_window_debug_dump(bw, f, CONTENT_DEBUG_RENDER);
- fclose(fh);
- }
+ fclose(f);
- g_free(filename);
- }
+ nsgtk_viewfile("Box Tree Debug", "boxtree", fname);
- gtk_widget_destroy(save_dialog);
+ g_free(fname);
return TRUE;
}
-MULTIHANDLER(savedomtree)
+MULTIHANDLER(debugdomtree)
{
- GtkWidget *save_dialog;
-
- save_dialog = gtk_file_chooser_dialog_new("Save File", g->window,
- GTK_FILE_CHOOSER_ACTION_SAVE,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
- NULL);
+ gchar *fname;
+ gint handle;
+ FILE *f;
+ struct browser_window *bw;
- gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(save_dialog),
- getenv("HOME") ? getenv("HOME") : "/");
+ handle = g_file_open_tmp("nsgtkdomtreeXXXXXX", &fname, NULL);
+ if ((handle == -1) || (fname == NULL)) {
+ return TRUE;
+ }
+ close(handle); /* in case it was binary mode */
- gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(save_dialog),
- "domtree.txt");
+ /* save data to temporary file */
+ f = fopen(fname, "w");
+ if (f == NULL) {
+ warn_user("Error saving box tree dump.",
+ "Unable to open file for writing.");
+ unlink(fname);
+ return TRUE;
+ }
- if (gtk_dialog_run(GTK_DIALOG(save_dialog)) == GTK_RESPONSE_ACCEPT) {
- gchar *filename = gtk_file_chooser_get_filename(
- GTK_FILE_CHOOSER(save_dialog));
- FILE *fh;
- LOG(("Saving dom tree to %s...\n", filename));
+ bw = nsgtk_get_browser_window(g->top_level);
- fh = fopen((const char *) filename, "w");
- if (fh == NULL) {
- warn_user("Error saving box tree dump.",
- "Unable to open file for writing.");
- } else {
- struct browser_window *bw;
- bw = nsgtk_get_browser_window(g->top_level);
-
- if (bw->current_content &&
- content_get_type(bw->current_content) ==
- CONTENT_HTML) {
-#ifdef FIXME
- xmlDebugDumpDocument(fh,
- html_get_document(bw->current_content));
-#endif
- }
+ browser_window_debug_dump(bw, f, CONTENT_DEBUG_DOM);
- fclose(fh);
- }
+ fclose(f);
- g_free(filename);
- }
+ nsgtk_viewfile("DOM Tree Debug", "domtree", fname);
- gtk_widget_destroy(save_dialog);
+ g_free(fname);
return TRUE;
}
@@ -1418,9 +1382,6 @@ MULTIHANDLER(reload)
/* clear potential search effects */
browser_window_search_clear(bw);
- nsgtk_search_set_forward_state(true, bw);
- nsgtk_search_set_back_state(true, bw);
-
browser_window_reload(bw, true);
return TRUE;
@@ -1431,16 +1392,13 @@ MULTIHANDLER(back)
struct browser_window *bw =
nsgtk_get_browser_window(g->top_level);
- if ((bw == NULL) || (!history_back_available(bw->history)))
+ if ((bw == NULL) || (!browser_window_history_back_available(bw)))
return TRUE;
/* clear potential search effects */
browser_window_search_clear(bw);
- nsgtk_search_set_forward_state(true, bw);
- nsgtk_search_set_back_state(true, bw);
-
- history_back(bw, bw->history);
+ browser_window_history_back(bw, false);
nsgtk_window_update_back_forward(g);
return TRUE;
@@ -1451,16 +1409,13 @@ MULTIHANDLER(forward)
struct browser_window *bw =
nsgtk_get_browser_window(g->top_level);
- if ((bw == NULL) || (!history_forward_available(bw->history)))
+ if ((bw == NULL) || (!browser_window_history_forward_available(bw)))
return TRUE;
/* clear potential search effects */
browser_window_search_clear(bw);
- nsgtk_search_set_forward_state(true, bw);
- nsgtk_search_set_back_state(true, bw);
-
- history_forward(bw, bw->history);
+ browser_window_history_forward(bw, false);
nsgtk_window_update_back_forward(g);
return TRUE;
@@ -1484,8 +1439,7 @@ MULTIHANDLER(home)
browser_window_navigate(bw,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -1503,7 +1457,7 @@ MULTIHANDLER(localhistory)
/* if entries of the same url but different frag_ids have been added
* the history needs redrawing (what throbber code normally does)
*/
- history_size(bw->history, &width, &height);
+ browser_window_history_size(bw, &width, &height);
nsgtk_window_update_back_forward(g);
gtk_window_get_position(g->window, &x, &y);
gtk_window_get_size(g->window, &mainwidth, &mainheight);
@@ -1537,10 +1491,9 @@ MULTIHANDLER(addbookmarks)
{
struct browser_window *bw = nsgtk_get_browser_window(g->top_level);
- if (bw == NULL || bw->current_content == NULL ||
- hlcache_handle_get_url(bw->current_content) == NULL)
+ if (bw == NULL || !browser_window_has_content(bw))
return TRUE;
- hotlist_add_url(hlcache_handle_get_url(bw->current_content));
+ hotlist_add_url(browser_window_get_url(bw));
return TRUE;
}
@@ -1602,8 +1555,7 @@ MULTIHANDLER(contents)
browser_window_navigate(bw,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -1624,8 +1576,7 @@ MULTIHANDLER(guide)
browser_window_navigate(bw,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -1646,8 +1597,7 @@ MULTIHANDLER(info)
browser_window_navigate(bw,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -1659,15 +1609,13 @@ MULTIHANDLER(info)
MULTIHANDLER(about)
{
- nsgtk_about_dialog_init(g->window,
- nsgtk_get_browser_window(g->top_level),
- netsurf_version);
+ nsgtk_about_dialog_init(g->window, netsurf_version);
return TRUE;
}
BUTTONHANDLER(history)
{
- struct gtk_scaffolding *g = (struct gtk_scaffolding *)data;
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
return nsgtk_on_localhistory_activate(g);
}
@@ -1707,7 +1655,7 @@ nsgtk_history_draw_event(GtkWidget *widget, cairo_t *cr, gpointer data)
ctx.plot->clip(&clip);
- history_redraw(bw->history, &ctx);
+ browser_window_history_redraw(bw, &ctx);
current_widget = NULL;
@@ -1740,7 +1688,7 @@ nsgtk_history_draw_event(GtkWidget *widget, GdkEventExpose *event, gpointer g)
clip.y1 = event->area.y + event->area.height;
ctx.plot->clip(&clip);
- history_redraw(bw->history, &ctx);
+ browser_window_history_redraw(bw, &ctx);
cairo_destroy(current_cr);
@@ -1760,15 +1708,14 @@ static gboolean nsgtk_history_button_press_event(GtkWidget *widget,
LOG(("X=%g, Y=%g", event->x, event->y));
- history_click(bw, bw->history,
- event->x, event->y, false);
+ browser_window_history_click(bw, event->x, event->y, false);
return TRUE;
}
-static void nsgtk_attach_menu_handlers(struct gtk_scaffolding *g)
+static void nsgtk_attach_menu_handlers(struct nsgtk_scaffolding *g)
{
for (int i = BACK_BUTTON; i < PLACEHOLDER_BUTTON; i++) {
if (g->buttons[i]->main != NULL) {
@@ -1797,25 +1744,58 @@ static void nsgtk_attach_menu_handlers(struct gtk_scaffolding *g)
* Create and connect handlers to popup menu.
*
* \param g scaffoliding to attach popup menu to.
- * \return true on success or false on error.
+ * \return menu structure on sucess or NULL on error.
*/
-static bool nsgtk_new_scaffolding_popup(struct gtk_scaffolding *g, GtkAccelGroup *group)
+static struct nsgtk_popup_menu *
+nsgtk_new_scaffolding_popup(struct nsgtk_scaffolding *g, GtkAccelGroup *group)
{
- struct nsgtk_popup_submenu *nmenu;
+ struct nsgtk_popup_menu *nmenu;
- nmenu = nsgtk_menu_popup_create(group);
+ nmenu = nsgtk_popup_menu_create(group);
- if (nmenu == NULL)
- return false;
+ if (nmenu == NULL) {
+ return NULL;
+ }
-/** Connect a GTK signal handler to a widget */
-#define SIG_CONNECT(obj, sig, callback, ptr) \
- g_signal_connect(G_OBJECT(obj), (sig), G_CALLBACK(callback), (ptr))
+ g_signal_connect(nmenu->popup_menu, "hide",
+ G_CALLBACK(nsgtk_window_popup_menu_hidden), g);
- SIG_CONNECT(nmenu->popup_menu, "hide",
- nsgtk_window_popup_menu_hidden, g);
+ g_signal_connect(nmenu->cut_menuitem, "activate",
+ G_CALLBACK(nsgtk_on_cut_activate_menu), g);
+
+ g_signal_connect(nmenu->copy_menuitem, "activate",
+ G_CALLBACK(nsgtk_on_copy_activate_menu), g);
+
+ g_signal_connect(nmenu->paste_menuitem, "activate",
+ G_CALLBACK(nsgtk_on_paste_activate_menu), g);
+
+ g_signal_connect(nmenu->customize_menuitem, "activate",
+ G_CALLBACK(nsgtk_on_customize_activate_menu), g);
- g_signal_connect(nmenu->savelink_menuitem, "activate",
+ /* set initial popup menu visibility */
+ popup_menu_hide(nmenu, true, false, false, true);
+
+ return nmenu;
+}
+
+/**
+ * Create and connect handlers to link popup menu.
+ *
+ * \param g scaffoliding to attach popup menu to.
+ * \return true on success or false on error.
+ */
+static struct nsgtk_link_menu *
+nsgtk_new_scaffolding_link_popup(struct nsgtk_scaffolding *g, GtkAccelGroup *group)
+{
+ struct nsgtk_link_menu *nmenu;
+
+ nmenu = nsgtk_link_menu_create(group);
+
+ if (nmenu == NULL) {
+ return NULL;
+ }
+
+ g_signal_connect(nmenu->save_menuitem, "activate",
G_CALLBACK(nsgtk_on_savelink_activate_menu), g);
g_signal_connect(nmenu->opentab_menuitem, "activate",
@@ -1824,30 +1804,182 @@ static bool nsgtk_new_scaffolding_popup(struct gtk_scaffolding *g, GtkAccelGroup
g_signal_connect(nmenu->openwin_menuitem, "activate",
G_CALLBACK(nsgtk_on_link_openwin_activate_menu), g);
- g_signal_connect(nmenu->cut_menuitem, "activate",
- G_CALLBACK(nsgtk_on_cut_activate_menu), g);
+ g_signal_connect(nmenu->bookmark_menuitem, "activate",
+ G_CALLBACK(nsgtk_on_link_bookmark_activate_menu), g);
g_signal_connect(nmenu->copy_menuitem, "activate",
- G_CALLBACK(nsgtk_on_copy_activate_menu), g);
+ G_CALLBACK(nsgtk_on_link_copy_activate_menu), g);
- g_signal_connect(nmenu->paste_menuitem, "activate",
- G_CALLBACK(nsgtk_on_paste_activate_menu), g);
+ return nmenu;
+}
- g_signal_connect(nmenu->customize_menuitem, "activate",
- G_CALLBACK(nsgtk_on_customize_activate_menu), g);
+/* exported interface documented in gtk/scaffolding.h */
+struct nsgtk_scaffolding *nsgtk_current_scaffolding(void)
+{
+ if (scaf_current == NULL) {
+ scaf_current = scaf_list;
+ }
+ return scaf_current;
+}
- /* set initial popup menu visibility */
- popup_menu_hide(nmenu, true, false, false, false, true);
+/**
+ * init the array g->buttons[]
+ */
+static void nsgtk_scaffolding_toolbar_init(struct nsgtk_scaffolding *g)
+{
+#define ITEM_MAIN(p, q, r)\
+ g->buttons[p##_BUTTON]->main = g->menu_bar->q->r##_menuitem;\
+ g->buttons[p##_BUTTON]->rclick = g->menu_popup->q->r##_menuitem;\
+ g->buttons[p##_BUTTON]->mhandler = nsgtk_on_##r##_activate_menu;\
+ g->buttons[p##_BUTTON]->bhandler = nsgtk_on_##r##_activate_button;\
+ g->buttons[p##_BUTTON]->dataplus = nsgtk_toolbar_##r##_button_data;\
+ g->buttons[p##_BUTTON]->dataminus = nsgtk_toolbar_##r##_toolbar_button_data
+
+#define ITEM_SUB(p, q, r, s)\
+ g->buttons[p##_BUTTON]->main =\
+ g->menu_bar->q->r##_submenu->s##_menuitem;\
+ g->buttons[p##_BUTTON]->rclick =\
+ g->menu_popup->q->r##_submenu->s##_menuitem;\
+ g->buttons[p##_BUTTON]->mhandler =\
+ nsgtk_on_##s##_activate_menu;\
+ g->buttons[p##_BUTTON]->bhandler =\
+ nsgtk_on_##s##_activate_button;\
+ g->buttons[p##_BUTTON]->dataplus =\
+ nsgtk_toolbar_##s##_button_data;\
+ g->buttons[p##_BUTTON]->dataminus =\
+ nsgtk_toolbar_##s##_toolbar_button_data
+
+#define ITEM_BUTTON(p, q)\
+ g->buttons[p##_BUTTON]->bhandler =\
+ nsgtk_on_##q##_activate;\
+ g->buttons[p##_BUTTON]->dataplus =\
+ nsgtk_toolbar_##q##_button_data;\
+ g->buttons[p##_BUTTON]->dataminus =\
+ nsgtk_toolbar_##q##_toolbar_button_data
+
+#define ITEM_POP(p, q) \
+ g->buttons[p##_BUTTON]->popup = GTK_IMAGE_MENU_ITEM(\
+ g->menu_popup->q##_menuitem)
+
+#define SENSITIVITY(q) \
+ g->buttons[q##_BUTTON]->sensitivity = false
- g->menu_popup = nmenu;
+#define ITEM_ITEM(p, q)\
+ g->buttons[p##_ITEM]->dataplus =\
+ nsgtk_toolbar_##q##_button_data;\
+ g->buttons[p##_ITEM]->dataminus =\
+ nsgtk_toolbar_##q##_toolbar_button_data
+
+ ITEM_ITEM(WEBSEARCH, websearch);
+ ITEM_ITEM(THROBBER, throbber);
+ ITEM_MAIN(NEWWINDOW, file_submenu, newwindow);
+ ITEM_MAIN(NEWTAB, file_submenu, newtab);
+ ITEM_MAIN(OPENFILE, file_submenu, openfile);
+ ITEM_MAIN(PRINT, file_submenu, print);
+ ITEM_MAIN(CLOSEWINDOW, file_submenu, closewindow);
+ ITEM_MAIN(SAVEPAGE, file_submenu, savepage);
+ ITEM_MAIN(PRINTPREVIEW, file_submenu, printpreview);
+ ITEM_MAIN(PRINT, file_submenu, print);
+ ITEM_MAIN(QUIT, file_submenu, quit);
+ ITEM_MAIN(CUT, edit_submenu, cut);
+ ITEM_MAIN(COPY, edit_submenu, copy);
+ ITEM_MAIN(PASTE, edit_submenu, paste);
+ ITEM_MAIN(DELETE, edit_submenu, delete);
+ ITEM_MAIN(SELECTALL, edit_submenu, selectall);
+ ITEM_MAIN(FIND, edit_submenu, find);
+ ITEM_MAIN(PREFERENCES, edit_submenu, preferences);
+ ITEM_MAIN(STOP, view_submenu, stop);
+ ITEM_POP(STOP, stop);
+ ITEM_MAIN(RELOAD, view_submenu, reload);
+ ITEM_POP(RELOAD, reload);
+ ITEM_MAIN(FULLSCREEN, view_submenu, fullscreen);
+ ITEM_MAIN(DOWNLOADS, tools_submenu, downloads);
+ ITEM_MAIN(SAVEWINDOWSIZE, view_submenu, savewindowsize);
+ ITEM_MAIN(BACK, nav_submenu, back);
+ ITEM_POP(BACK, back);
+ ITEM_MAIN(FORWARD, nav_submenu, forward);
+ ITEM_POP(FORWARD, forward);
+ ITEM_MAIN(HOME, nav_submenu, home);
+ ITEM_MAIN(LOCALHISTORY, nav_submenu, localhistory);
+ ITEM_MAIN(GLOBALHISTORY, nav_submenu, globalhistory);
+ ITEM_MAIN(ADDBOOKMARKS, nav_submenu, addbookmarks);
+ ITEM_MAIN(SHOWBOOKMARKS, nav_submenu, showbookmarks);
+ ITEM_MAIN(SHOWCOOKIES, tools_submenu, showcookies);
+ ITEM_MAIN(OPENLOCATION, nav_submenu, openlocation);
+ ITEM_MAIN(CONTENTS, help_submenu, contents);
+ ITEM_MAIN(INFO, help_submenu, info);
+ ITEM_MAIN(GUIDE, help_submenu, guide);
+ ITEM_MAIN(ABOUT, help_submenu, about);
+ ITEM_SUB(PLAINTEXT, file_submenu, export, plaintext);
+ ITEM_SUB(PDF, file_submenu, export, pdf);
+ ITEM_SUB(DRAWFILE, file_submenu, export, drawfile);
+ ITEM_SUB(POSTSCRIPT, file_submenu, export, postscript);
+ ITEM_SUB(ZOOMPLUS, view_submenu, scaleview, zoomplus);
+ ITEM_SUB(ZOOMMINUS, view_submenu, scaleview, zoomminus);
+ ITEM_SUB(ZOOMNORMAL, view_submenu, scaleview, zoomnormal);
+ ITEM_SUB(NEXTTAB, view_submenu, tabs, nexttab);
+ ITEM_SUB(PREVTAB, view_submenu, tabs, prevtab);
+ ITEM_SUB(CLOSETAB, view_submenu, tabs, closetab);
+
+ /* development submenu */
+ ITEM_SUB(VIEWSOURCE, tools_submenu, developer, viewsource);
+ ITEM_SUB(TOGGLEDEBUGGING, tools_submenu, developer, toggledebugging);
+ ITEM_SUB(SAVEBOXTREE, tools_submenu, developer, debugboxtree);
+ ITEM_SUB(SAVEDOMTREE, tools_submenu, developer, debugdomtree);
+ ITEM_BUTTON(HISTORY, history);
+
+ /* disable items that make no sense initially, as well as
+ * as-yet-unimplemented items */
+ SENSITIVITY(BACK);
+ SENSITIVITY(FORWARD);
+ SENSITIVITY(STOP);
+ SENSITIVITY(PRINTPREVIEW);
+ SENSITIVITY(DELETE);
+ SENSITIVITY(DRAWFILE);
+ SENSITIVITY(POSTSCRIPT);
+ SENSITIVITY(NEXTTAB);
+ SENSITIVITY(PREVTAB);
+ SENSITIVITY(CLOSETAB);
+#ifndef WITH_PDF_EXPORT
+ SENSITIVITY(PDF);
+#endif
+
+#undef ITEM_MAIN
+#undef ITEM_SUB
+#undef ITEM_BUTTON
+#undef ITEM_POP
+#undef SENSITIVITY
- return true;
}
-nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel)
+static void nsgtk_scaffolding_initial_sensitivity(struct nsgtk_scaffolding *g)
{
- struct gtk_scaffolding *g;
- char *searchname;
+ for (int i = BACK_BUTTON; i < PLACEHOLDER_BUTTON; i++) {
+ if (g->buttons[i]->main != NULL)
+ gtk_widget_set_sensitive(GTK_WIDGET(
+ g->buttons[i]->main),
+ g->buttons[i]->sensitivity);
+ if (g->buttons[i]->rclick != NULL)
+ gtk_widget_set_sensitive(GTK_WIDGET(
+ g->buttons[i]->rclick),
+ g->buttons[i]->sensitivity);
+ if ((g->buttons[i]->location != -1) &&
+ (g->buttons[i]->button != NULL))
+ gtk_widget_set_sensitive(GTK_WIDGET(
+ g->buttons[i]->button),
+ g->buttons[i]->sensitivity);
+ if (g->buttons[i]->popup != NULL)
+ gtk_widget_set_sensitive(GTK_WIDGET(
+ g->buttons[i]->popup),
+ g->buttons[i]->sensitivity);
+ }
+ gtk_widget_set_sensitive(GTK_WIDGET(g->menu_bar->view_submenu->images_menuitem), FALSE);
+}
+
+/* exported interface documented in gtk/scaffolding.h */
+struct nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel)
+{
+ struct nsgtk_scaffolding *g;
int i;
GtkAccelGroup *group;
GError* error = NULL;
@@ -2104,37 +2236,19 @@ nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel)
nsgtk_window_tool_bar_clicked, g);
/* create popup menu */
- nsgtk_new_scaffolding_popup(g, group);
+ g->menu_popup = nsgtk_new_scaffolding_popup(g, group);
+
+ g->link_menu = nsgtk_new_scaffolding_link_popup(g, group);
/* set up the menu signal handlers */
nsgtk_scaffolding_toolbar_init(g);
nsgtk_toolbar_connect_all(g);
nsgtk_attach_menu_handlers(g);
- /* prepare to set the web search ico */
-
- /* init web search prefs from file */
- search_web_provider_details(nsoption_int(search_provider));
-
- /* potentially retrieve ico */
- if (search_web_ico() == NULL) {
- search_web_retrieve_ico(false);
- }
-
- /* set entry */
- searchname = search_web_provider_name();
- if (searchname != NULL) {
- char searchcontent[strlen(searchname) + SLEN("Search ") + 1];
- sprintf(searchcontent, "Search %s", searchname);
- nsgtk_scaffolding_set_websearch(g, searchcontent);
- free(searchname);
- }
-
nsgtk_scaffolding_initial_sensitivity(g);
g->fullscreen = false;
-
/* attach to the list */
if (scaf_list)
scaf_list->prev = g;
@@ -2146,9 +2260,8 @@ nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel)
nsgtk_theme_init();
nsgtk_theme_implement(g);
- /* set web search ico */
- if (search_web_ico() != NULL)
- gui_window_set_search_ico(search_web_ico());
+ /* set web search provider */
+ search_web_select_provider(nsoption_int(search_provider));
/* finally, show the window. */
gtk_widget_show(GTK_WIDGET(g->window));
@@ -2165,7 +2278,7 @@ nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel)
*/
void gui_window_set_title(struct gui_window *gw, const char *title)
{
- struct gtk_scaffolding *gs = nsgtk_get_scaffold(gw);
+ struct nsgtk_scaffolding *gs = nsgtk_get_scaffold(gw);
int title_len;
char *newtitle;
@@ -2199,7 +2312,7 @@ void gui_window_set_title(struct gui_window *gw, const char *title)
void gui_window_set_url(struct gui_window *_g, const char *url)
{
- struct gtk_scaffolding *g = nsgtk_get_scaffold(_g);
+ struct nsgtk_scaffolding *g = nsgtk_get_scaffold(_g);
if (g->top_level != _g) return;
gtk_entry_set_text(GTK_ENTRY(g->url_bar), url);
gtk_editable_set_position(GTK_EDITABLE(g->url_bar), -1);
@@ -2207,23 +2320,23 @@ void gui_window_set_url(struct gui_window *_g, const char *url)
void gui_window_start_throbber(struct gui_window* _g)
{
- struct gtk_scaffolding *g = nsgtk_get_scaffold(_g);
+ struct nsgtk_scaffolding *g = nsgtk_get_scaffold(_g);
g->buttons[STOP_BUTTON]->sensitivity = true;
g->buttons[RELOAD_BUTTON]->sensitivity = false;
nsgtk_scaffolding_set_sensitivity(g);
nsgtk_window_update_back_forward(g);
- schedule(10, nsgtk_throb, g);
+ nsgtk_schedule(100, nsgtk_throb, g);
}
void gui_window_stop_throbber(struct gui_window* _g)
{
- struct gtk_scaffolding *g = nsgtk_get_scaffold(_g);
+ struct nsgtk_scaffolding *g = nsgtk_get_scaffold(_g);
if (g == NULL)
return;
nsgtk_window_update_back_forward(g);
- schedule_remove(nsgtk_throb, g);
+ nsgtk_schedule(-1, nsgtk_throb, g);
if (g->buttons[STOP_BUTTON] != NULL)
g->buttons[STOP_BUTTON]->sensitivity = false;
if (g->buttons[RELOAD_BUTTON] != NULL)
@@ -2245,7 +2358,7 @@ void gui_window_stop_throbber(struct gui_window* _g)
void
nsgtk_scaffolding_set_icon(struct gui_window *gw)
{
- struct gtk_scaffolding *sc = nsgtk_get_scaffold(gw);
+ struct nsgtk_scaffolding *sc = nsgtk_get_scaffold(gw);
GdkPixbuf *icon_pixbuf = nsgtk_get_icon(gw);
/* check icon needs to be shown */
@@ -2261,103 +2374,200 @@ nsgtk_scaffolding_set_icon(struct gui_window *gw)
gtk_widget_show_all(GTK_WIDGET(sc->buttons[URL_BAR_ITEM]->button));
}
-void gui_window_set_search_ico(hlcache_handle *ico)
+static void
+nsgtk_scaffolding_set_websearch(struct nsgtk_scaffolding *g, const char *content)
{
- struct bitmap *srch_bitmap;
- nsgtk_scaffolding *current;
- GdkPixbuf *srch_pixbuf;
+ /** \todo this code appears technically correct, though
+ * currently has no effect at all.
+ */
+ PangoLayout *lo = gtk_entry_get_layout(GTK_ENTRY(g->webSearchEntry));
+ if (lo != NULL) {
+ pango_layout_set_font_description(lo, NULL);
+ PangoFontDescription *desc = pango_font_description_new();
+ if (desc != NULL) {
+ pango_font_description_set_style(desc,
+ PANGO_STYLE_ITALIC);
+ pango_font_description_set_family(desc, "Arial");
+ pango_font_description_set_weight(desc,
+ PANGO_WEIGHT_ULTRALIGHT);
+ pango_font_description_set_size(desc,
+ 10 * PANGO_SCALE);
+ pango_layout_set_font_description(lo, desc);
+ }
- if ((ico == NULL) &&
- (ico = search_web_ico()) == NULL) {
- return;
+ PangoAttrList *list = pango_attr_list_new();
+ if (list != NULL) {
+ PangoAttribute *italic = pango_attr_style_new(
+ PANGO_STYLE_ITALIC);
+ if (italic != NULL) {
+ italic->start_index = 0;
+ italic->end_index = strlen(content);
+ }
+ PangoAttribute *grey = pango_attr_foreground_new(
+ 0x7777, 0x7777, 0x7777);
+ if (grey != NULL) {
+ grey->start_index = 0;
+ grey->end_index = strlen(content);
+ }
+ pango_attr_list_insert(list, italic);
+ pango_attr_list_insert(list, grey);
+ pango_layout_set_attributes(lo, list);
+ pango_attr_list_unref(list);
+ }
+ pango_layout_set_text(lo, content, -1);
}
+/* an alternative method */
+/* char *parse = malloc(strlen(content) + 1);
+ PangoAttrList *list = pango_layout_get_attributes(lo);
+ char *markup = g_strconcat("<span foreground='#777777'><i>", content,
+ "</i></span>", NULL);
+ pango_parse_markup(markup, -1, 0, &list, &parse, NULL, NULL);
+ gtk_widget_show_all(g->webSearchEntry);
+*/
+ gtk_entry_set_visibility(GTK_ENTRY(g->webSearchEntry), TRUE);
+ gtk_entry_set_text(GTK_ENTRY(g->webSearchEntry), content);
+}
- srch_bitmap = content_get_bitmap(ico);
- if (srch_bitmap == NULL) {
- return;
- }
+/**
+ * GTK UI callback when search provider details are updated.
+ *
+ * \param provider_name The providers name.
+ * \param ico_bitmap The icon bitmap representing the provider.
+ * \return NSERROR_OK on success else error code.
+ */
+static nserror
+gui_search_web_provider_update(const char *provider_name,
+ struct bitmap *provider_bitmap)
+{
+ struct nsgtk_scaffolding *current;
+ GdkPixbuf *srch_pixbuf = NULL;
+ char *searchcontent;
- srch_pixbuf = nsgdk_pixbuf_get_from_surface(srch_bitmap->surface, 16, 16);
+ LOG(("name:%s bitmap %p", provider_name, provider_bitmap));
- if (srch_pixbuf == NULL) {
- return;
+ if (provider_bitmap != NULL) {
+ srch_pixbuf = nsgdk_pixbuf_get_from_surface(provider_bitmap->surface, 16, 16);
+
+ if (srch_pixbuf == NULL) {
+ return NSERROR_NOMEM;
+ }
}
- /* add ico to each window's toolbar */
+ /* setup the search content name */
+ searchcontent = malloc(strlen(provider_name) + SLEN("Search ") + 1);
+ if (searchcontent != NULL) {
+ sprintf(searchcontent, "Search %s", provider_name);
+ }
+
+ /* set the search provider parameters up in each scaffold */
for (current = scaf_list; current != NULL; current = current->next) {
- nsgtk_entry_set_icon_from_pixbuf(current->webSearchEntry,
- GTK_ENTRY_ICON_PRIMARY,
- srch_pixbuf);
+ /* add ico to each window's toolbar */
+ if (srch_pixbuf != NULL) {
+ nsgtk_entry_set_icon_from_pixbuf(current->webSearchEntry,
+ GTK_ENTRY_ICON_PRIMARY,
+ srch_pixbuf);
+ } else {
+ nsgtk_entry_set_icon_from_stock(current->webSearchEntry,
+ GTK_ENTRY_ICON_PRIMARY,
+ "gtk-find");
+ }
+
+ /* set search entry text */
+ if (searchcontent != NULL) {
+ nsgtk_scaffolding_set_websearch(current, searchcontent);
+ } else {
+ nsgtk_scaffolding_set_websearch(current, provider_name);
+ }
}
- g_object_unref(srch_pixbuf);
-}
+ free(searchcontent);
-bool nsgtk_scaffolding_is_busy(nsgtk_scaffolding *g)
-{
- /* We are considered "busy" if the stop button is sensitive */
- return g->buttons[STOP_BUTTON]->sensitivity;
+ if (srch_pixbuf != NULL) {
+ g_object_unref(srch_pixbuf);
+ }
+
+ return NSERROR_OK;
}
-GtkWindow* nsgtk_scaffolding_window(nsgtk_scaffolding *g)
+static struct gui_search_web_table search_web_table = {
+ .provider_update = gui_search_web_provider_update,
+};
+
+struct gui_search_web_table *nsgtk_search_web_table = &search_web_table;
+
+/* exported interface documented in gtk/scaffolding.h */
+GtkWindow* nsgtk_scaffolding_window(struct nsgtk_scaffolding *g)
{
return g->window;
}
-GtkNotebook* nsgtk_scaffolding_notebook(nsgtk_scaffolding *g)
+/* exported interface documented in gtk/scaffolding.h */
+GtkNotebook* nsgtk_scaffolding_notebook(struct nsgtk_scaffolding *g)
{
return g->notebook;
}
-GtkWidget *nsgtk_scaffolding_urlbar(nsgtk_scaffolding *g)
+/* exported interface documented in gtk/scaffolding.h */
+GtkWidget *nsgtk_scaffolding_urlbar(struct nsgtk_scaffolding *g)
{
return g->url_bar;
}
-GtkWidget *nsgtk_scaffolding_websearch(nsgtk_scaffolding *g)
+/* exported interface documented in gtk/scaffolding.h */
+GtkWidget *nsgtk_scaffolding_websearch(struct nsgtk_scaffolding *g)
{
return g->webSearchEntry;
}
-
-GtkToolbar *nsgtk_scaffolding_toolbar(nsgtk_scaffolding *g)
+/* exported interface documented in gtk/scaffolding.h */
+GtkToolbar *nsgtk_scaffolding_toolbar(struct nsgtk_scaffolding *g)
{
return g->tool_bar;
}
-struct nsgtk_button_connect *nsgtk_scaffolding_button(nsgtk_scaffolding *g,
- int i)
+/* exported interface documented in gtk/scaffolding.h */
+struct nsgtk_button_connect *
+nsgtk_scaffolding_button(struct nsgtk_scaffolding *g, int i)
{
return g->buttons[i];
}
-struct gtk_search *nsgtk_scaffolding_search(nsgtk_scaffolding *g)
+/* exported interface documented in gtk/scaffolding.h */
+struct gtk_search *nsgtk_scaffolding_search(struct nsgtk_scaffolding *g)
{
return g->search;
}
-GtkMenuBar *nsgtk_scaffolding_menu_bar(nsgtk_scaffolding *g)
+/* exported interface documented in gtk/scaffolding.h */
+GtkMenuBar *nsgtk_scaffolding_menu_bar(struct nsgtk_scaffolding *g)
{
return g->menu_bar->bar_menu;
}
-struct gtk_history_window *nsgtk_scaffolding_history_window(nsgtk_scaffolding
- *g)
+/* exported interface documented in gtk/scaffolding.h */
+struct gtk_history_window *
+nsgtk_scaffolding_history_window(struct nsgtk_scaffolding *g)
{
return g->history_window;
}
-nsgtk_scaffolding *nsgtk_scaffolding_iterate(nsgtk_scaffolding *g)
+/* exported interface documented in gtk/scaffolding.h */
+struct nsgtk_scaffolding *nsgtk_scaffolding_iterate(struct nsgtk_scaffolding *g)
{
+ if (g == NULL) {
+ return scaf_list;
+ }
return g->next;
}
-void nsgtk_scaffolding_reset_offset(nsgtk_scaffolding *g)
+/* exported interface documented in gtk/scaffolding.h */
+void nsgtk_scaffolding_reset_offset(struct nsgtk_scaffolding *g)
{
g->offset = 0;
}
-void nsgtk_scaffolding_update_url_bar_ref(nsgtk_scaffolding *g)
+/* exported interface documented in gtk/scaffolding.h */
+void nsgtk_scaffolding_update_url_bar_ref(struct nsgtk_scaffolding *g)
{
g->url_bar = GTK_WIDGET(gtk_bin_get_child(GTK_BIN(
nsgtk_scaffolding_button(g, URL_BAR_ITEM)->button)));
@@ -2365,81 +2575,33 @@ void nsgtk_scaffolding_update_url_bar_ref(nsgtk_scaffolding *g)
gtk_entry_set_completion(GTK_ENTRY(g->url_bar),
g->url_bar_completion);
}
-void nsgtk_scaffolding_update_throbber_ref(nsgtk_scaffolding *g)
+
+/* exported interface documented in gtk/scaffolding.h */
+void nsgtk_scaffolding_update_throbber_ref(struct nsgtk_scaffolding *g)
{
g->throbber = GTK_IMAGE(gtk_bin_get_child(GTK_BIN(gtk_bin_get_child(
GTK_BIN(g->buttons[THROBBER_ITEM]->button)))));
}
-void nsgtk_scaffolding_update_websearch_ref(nsgtk_scaffolding *g)
+/* exported interface documented in gtk/scaffolding.h */
+void nsgtk_scaffolding_update_websearch_ref(struct nsgtk_scaffolding *g)
{
g->webSearchEntry = gtk_bin_get_child(GTK_BIN(
g->buttons[WEBSEARCH_ITEM]->button));
}
-void nsgtk_scaffolding_set_websearch(nsgtk_scaffolding *g, const char *content)
-{
- /* this code appears technically correct, though currently has no
- * effect at all - tinkering encouraged */
- PangoLayout *lo = gtk_entry_get_layout(GTK_ENTRY(g->webSearchEntry));
- if (lo != NULL) {
- pango_layout_set_font_description(lo, NULL);
- PangoFontDescription *desc = pango_font_description_new();
- if (desc != NULL) {
- pango_font_description_set_style(desc,
- PANGO_STYLE_ITALIC);
- pango_font_description_set_family(desc, "Arial");
- pango_font_description_set_weight(desc,
- PANGO_WEIGHT_ULTRALIGHT);
- pango_font_description_set_size(desc,
- 10 * PANGO_SCALE);
- pango_layout_set_font_description(lo, desc);
- }
-
- PangoAttrList *list = pango_attr_list_new();
- if (list != NULL) {
- PangoAttribute *italic = pango_attr_style_new(
- PANGO_STYLE_ITALIC);
- if (italic != NULL) {
- italic->start_index = 0;
- italic->end_index = strlen(content);
- }
- PangoAttribute *grey = pango_attr_foreground_new(
- 0x7777, 0x7777, 0x7777);
- if (grey != NULL) {
- grey->start_index = 0;
- grey->end_index = strlen(content);
- }
- pango_attr_list_insert(list, italic);
- pango_attr_list_insert(list, grey);
- pango_layout_set_attributes(lo, list);
- pango_attr_list_unref(list);
- }
- pango_layout_set_text(lo, content, -1);
- }
-/* an alternative method */
-/* char *parse = malloc(strlen(content) + 1);
- PangoAttrList *list = pango_layout_get_attributes(lo);
- char *markup = g_strconcat("<span foreground='#777777'><i>", content,
- "</i></span>", NULL);
- pango_parse_markup(markup, -1, 0, &list, &parse, NULL, NULL);
- gtk_widget_show_all(g->webSearchEntry);
-*/
- gtk_entry_set_visibility(GTK_ENTRY(g->webSearchEntry), TRUE);
- gtk_entry_set_text(GTK_ENTRY(g->webSearchEntry), content);
-}
-
-void nsgtk_scaffolding_toggle_search_bar_visibility(nsgtk_scaffolding *g)
+/* exported interface documented in gtk/scaffolding.h */
+void nsgtk_scaffolding_toggle_search_bar_visibility(struct nsgtk_scaffolding *g)
{
gboolean vis;
- struct browser_window *bw =
- nsgtk_get_browser_window(g->top_level);
+ struct browser_window *bw = nsgtk_get_browser_window(g->top_level);
+
g_object_get(G_OBJECT(g->search->bar), "visible", &vis, NULL);
if (vis) {
- if (bw != NULL)
+ if (bw != NULL) {
browser_window_search_clear(bw);
- nsgtk_search_set_forward_state(true, bw);
- nsgtk_search_set_back_state(true, bw);
+ }
+
gtk_widget_hide(GTK_WIDGET(g->search->bar));
} else {
gtk_widget_show(GTK_WIDGET(g->search->bar));
@@ -2447,17 +2609,17 @@ void nsgtk_scaffolding_toggle_search_bar_visibility(nsgtk_scaffolding *g)
}
}
-
-struct gui_window *nsgtk_scaffolding_top_level(nsgtk_scaffolding *g)
+/* exported interface documented in gtk/scaffolding.h */
+struct gui_window *nsgtk_scaffolding_top_level(struct nsgtk_scaffolding *g)
{
return g->top_level;
}
-/* set the current active top level gui window */
+/* exported interface documented in gtk/scaffolding.h */
void nsgtk_scaffolding_set_top_level(struct gui_window *gw)
{
struct browser_window *bw;
- nsgtk_scaffolding *sc;
+ struct nsgtk_scaffolding *sc;
assert(gw != NULL);
@@ -2476,19 +2638,15 @@ void nsgtk_scaffolding_set_top_level(struct gui_window *gw)
/* clear effects of potential searches */
browser_window_search_clear(bw);
- nsgtk_search_set_forward_state(true, bw);
- nsgtk_search_set_back_state(true, bw);
-
nsgtk_scaffolding_set_icon(gw);
/* Ensure the window's title bar is updated */
- if (bw->current_content != NULL) {
- gui_window_set_title(gw, content_get_title(bw->current_content));
- }
+ gui_window_set_title(gw, browser_window_get_title(bw));
+
}
/* exported interface documented in scaffolding.h */
-void nsgtk_scaffolding_set_sensitivity(struct gtk_scaffolding *g)
+void nsgtk_scaffolding_set_sensitivity(struct nsgtk_scaffolding *g)
{
int i;
#define SENSITIVITY(q)\
@@ -2524,81 +2682,52 @@ void nsgtk_scaffolding_set_sensitivity(struct gtk_scaffolding *g)
#undef SENSITIVITY
}
-void nsgtk_scaffolding_initial_sensitivity(struct gtk_scaffolding *g)
-{
- for (int i = BACK_BUTTON; i < PLACEHOLDER_BUTTON; i++) {
- if (g->buttons[i]->main != NULL)
- gtk_widget_set_sensitive(GTK_WIDGET(
- g->buttons[i]->main),
- g->buttons[i]->sensitivity);
- if (g->buttons[i]->rclick != NULL)
- gtk_widget_set_sensitive(GTK_WIDGET(
- g->buttons[i]->rclick),
- g->buttons[i]->sensitivity);
- if ((g->buttons[i]->location != -1) &&
- (g->buttons[i]->button != NULL))
- gtk_widget_set_sensitive(GTK_WIDGET(
- g->buttons[i]->button),
- g->buttons[i]->sensitivity);
- if (g->buttons[i]->popup != NULL)
- gtk_widget_set_sensitive(GTK_WIDGET(
- g->buttons[i]->popup),
- g->buttons[i]->sensitivity);
- }
- gtk_widget_set_sensitive(GTK_WIDGET(g->menu_bar->view_submenu->images_menuitem), FALSE);
-}
-/**
- * Checks if a location is over a link.
- *
- * Side effect of this function is to set the global current_menu_ctx
- */
-static bool is_menu_over_link(struct gtk_scaffolding *g, gdouble x, gdouble y)
+/* exported interface documented in gtk/scaffolding.h */
+void nsgtk_scaffolding_context_menu(struct nsgtk_scaffolding *g,
+ gdouble x,
+ gdouble y)
{
- struct browser_window *bw = nsgtk_get_browser_window(g->top_level);
-
- if ((bw->current_content != NULL) &&
- (content_get_type(bw->current_content) == CONTENT_HTML)) {
- browser_window_get_contextual_content(bw, x, y,
- &current_menu_ctx);
- }
+ GtkMenu *gtkmenu;
- if (current_menu_ctx.link_url == NULL)
- return false;
+ /* update the global current_menu_ctx */
+ browser_window_get_contextual_content(
+ nsgtk_get_browser_window(g->top_level),
+ x, y, &current_menu_ctx);
- return true;
-}
-void nsgtk_scaffolding_popup_menu(struct gtk_scaffolding *g, gdouble x, gdouble y)
-{
- if (is_menu_over_link(g, x, y)) {
- popup_menu_show(g->menu_popup, false, true, false, false, false);
+ if (current_menu_ctx.link_url != NULL) {
+ /* menu is opening over a link */
+ gtkmenu = g->link_menu->link_menu;
} else {
- popup_menu_hide(g->menu_popup, false, true, false, false, false);
- }
+ gtkmenu = g->menu_popup->popup_menu;
- nsgtk_scaffolding_update_edit_actions_sensitivity(g);
+ nsgtk_scaffolding_update_edit_actions_sensitivity(g);
- if (!(g->buttons[COPY_BUTTON]->sensitivity))
- gtk_widget_hide(GTK_WIDGET(g->menu_popup->copy_menuitem));
- else
- gtk_widget_show(GTK_WIDGET(g->menu_popup->copy_menuitem));
+ if (!(g->buttons[COPY_BUTTON]->sensitivity)) {
+ gtk_widget_hide(GTK_WIDGET(g->menu_popup->copy_menuitem));
+ } else {
+ gtk_widget_show(GTK_WIDGET(g->menu_popup->copy_menuitem));
+ }
- if (!(g->buttons[CUT_BUTTON]->sensitivity))
- gtk_widget_hide(GTK_WIDGET(g->menu_popup->cut_menuitem));
- else
- gtk_widget_show(GTK_WIDGET(g->menu_popup->cut_menuitem));
+ if (!(g->buttons[CUT_BUTTON]->sensitivity)) {
+ gtk_widget_hide(GTK_WIDGET(g->menu_popup->cut_menuitem));
+ } else {
+ gtk_widget_show(GTK_WIDGET(g->menu_popup->cut_menuitem));
+ }
- if (!(g->buttons[PASTE_BUTTON]->sensitivity))
- gtk_widget_hide(GTK_WIDGET(g->menu_popup->paste_menuitem));
- else
- gtk_widget_show(GTK_WIDGET(g->menu_popup->paste_menuitem));
+ if (!(g->buttons[PASTE_BUTTON]->sensitivity)) {
+ gtk_widget_hide(GTK_WIDGET(g->menu_popup->paste_menuitem));
+ } else {
+ gtk_widget_show(GTK_WIDGET(g->menu_popup->paste_menuitem));
+ }
- /* hide customize */
- popup_menu_hide(g->menu_popup, false, false, false, false, true);
+ /* hide customize */
+ popup_menu_hide(g->menu_popup, false, false, false, true);
+ }
- gtk_menu_popup(g->menu_popup->popup_menu, NULL, NULL, NULL, NULL, 0,
- gtk_get_current_event_time());
+ gtk_menu_popup(gtkmenu, NULL, NULL, NULL, NULL, 0,
+ gtk_get_current_event_time());
}
/**
@@ -2608,7 +2737,7 @@ void nsgtk_scaffolding_popup_menu(struct gtk_scaffolding *g, gdouble x, gdouble
void nsgtk_scaffolding_toolbar_size_allocate(GtkWidget *widget,
GtkAllocation *alloc, gpointer data)
{
- struct gtk_scaffolding *g = (struct gtk_scaffolding *)data;
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
int i = nsgtk_toolbar_get_id_from_widget(widget, g);
if (i == -1)
return;
@@ -2640,134 +2769,3 @@ void nsgtk_scaffolding_toolbar_size_allocate(GtkWidget *widget,
-/**
- * init the array g->buttons[]
- */
-void nsgtk_scaffolding_toolbar_init(struct gtk_scaffolding *g)
-{
-#define ITEM_MAIN(p, q, r)\
- g->buttons[p##_BUTTON]->main =\
- g->menu_bar->q->r##_menuitem;\
- g->buttons[p##_BUTTON]->rclick =\
- g->menu_popup->q->r##_menuitem;\
- g->buttons[p##_BUTTON]->mhandler =\
- nsgtk_on_##r##_activate_menu;\
- g->buttons[p##_BUTTON]->bhandler =\
- nsgtk_on_##r##_activate_button;\
- g->buttons[p##_BUTTON]->dataplus =\
- nsgtk_toolbar_##r##_button_data;\
- g->buttons[p##_BUTTON]->dataminus =\
- nsgtk_toolbar_##r##_toolbar_button_data
-
-#define ITEM_SUB(p, q, r, s)\
- g->buttons[p##_BUTTON]->main =\
- g->menu_bar->q->r##_submenu->s##_menuitem;\
- g->buttons[p##_BUTTON]->rclick =\
- g->menu_popup->q->r##_submenu->s##_menuitem;\
- g->buttons[p##_BUTTON]->mhandler =\
- nsgtk_on_##s##_activate_menu;\
- g->buttons[p##_BUTTON]->bhandler =\
- nsgtk_on_##s##_activate_button;\
- g->buttons[p##_BUTTON]->dataplus =\
- nsgtk_toolbar_##s##_button_data;\
- g->buttons[p##_BUTTON]->dataminus =\
- nsgtk_toolbar_##s##_toolbar_button_data
-
-#define ITEM_BUTTON(p, q)\
- g->buttons[p##_BUTTON]->bhandler =\
- nsgtk_on_##q##_activate;\
- g->buttons[p##_BUTTON]->dataplus =\
- nsgtk_toolbar_##q##_button_data;\
- g->buttons[p##_BUTTON]->dataminus =\
- nsgtk_toolbar_##q##_toolbar_button_data
-
-#define ITEM_POP(p, q) \
- g->buttons[p##_BUTTON]->popup = GTK_IMAGE_MENU_ITEM(\
- g->menu_popup->q##_menuitem)
-
-#define SENSITIVITY(q) \
- g->buttons[q##_BUTTON]->sensitivity = false
-
-#define ITEM_ITEM(p, q)\
- g->buttons[p##_ITEM]->dataplus =\
- nsgtk_toolbar_##q##_button_data;\
- g->buttons[p##_ITEM]->dataminus =\
- nsgtk_toolbar_##q##_toolbar_button_data
- ITEM_ITEM(WEBSEARCH, websearch);
- ITEM_ITEM(THROBBER, throbber);
- ITEM_MAIN(NEWWINDOW, file_submenu, newwindow);
- ITEM_MAIN(NEWTAB, file_submenu, newtab);
- ITEM_MAIN(OPENFILE, file_submenu, openfile);
- ITEM_MAIN(PRINT, file_submenu, print);
- ITEM_MAIN(CLOSEWINDOW, file_submenu, closewindow);
- ITEM_MAIN(SAVEPAGE, file_submenu, savepage);
- ITEM_MAIN(PRINTPREVIEW, file_submenu, printpreview);
- ITEM_MAIN(PRINT, file_submenu, print);
- ITEM_MAIN(QUIT, file_submenu, quit);
- ITEM_MAIN(CUT, edit_submenu, cut);
- ITEM_MAIN(COPY, edit_submenu, copy);
- ITEM_MAIN(PASTE, edit_submenu, paste);
- ITEM_MAIN(DELETE, edit_submenu, delete);
- ITEM_MAIN(SELECTALL, edit_submenu, selectall);
- ITEM_MAIN(FIND, edit_submenu, find);
- ITEM_MAIN(PREFERENCES, edit_submenu, preferences);
- ITEM_MAIN(STOP, view_submenu, stop);
- ITEM_POP(STOP, stop);
- ITEM_MAIN(RELOAD, view_submenu, reload);
- ITEM_POP(RELOAD, reload);
- ITEM_MAIN(FULLSCREEN, view_submenu, fullscreen);
- ITEM_MAIN(VIEWSOURCE, view_submenu, viewsource);
- ITEM_MAIN(DOWNLOADS, view_submenu, downloads);
- ITEM_MAIN(SAVEWINDOWSIZE, view_submenu, savewindowsize);
- ITEM_MAIN(BACK, nav_submenu, back);
- ITEM_POP(BACK, back);
- ITEM_MAIN(FORWARD, nav_submenu, forward);
- ITEM_POP(FORWARD, forward);
- ITEM_MAIN(HOME, nav_submenu, home);
- ITEM_MAIN(LOCALHISTORY, nav_submenu, localhistory);
- ITEM_MAIN(GLOBALHISTORY, nav_submenu, globalhistory);
- ITEM_MAIN(ADDBOOKMARKS, nav_submenu, addbookmarks);
- ITEM_MAIN(SHOWBOOKMARKS, nav_submenu, showbookmarks);
- ITEM_MAIN(SHOWCOOKIES, nav_submenu, showcookies);
- ITEM_MAIN(OPENLOCATION, nav_submenu, openlocation);
- ITEM_MAIN(CONTENTS, help_submenu, contents);
- ITEM_MAIN(INFO, help_submenu, info);
- ITEM_MAIN(GUIDE, help_submenu, guide);
- ITEM_MAIN(ABOUT, help_submenu, about);
- ITEM_SUB(PLAINTEXT, file_submenu, export, plaintext);
- ITEM_SUB(PDF, file_submenu, export, pdf);
- ITEM_SUB(DRAWFILE, file_submenu, export, drawfile);
- ITEM_SUB(POSTSCRIPT, file_submenu, export, postscript);
- ITEM_SUB(ZOOMPLUS, view_submenu, scaleview, zoomplus);
- ITEM_SUB(ZOOMMINUS, view_submenu, scaleview, zoomminus);
- ITEM_SUB(ZOOMNORMAL, view_submenu, scaleview, zoomnormal);
- ITEM_SUB(NEXTTAB, view_submenu, tabs, nexttab);
- ITEM_SUB(PREVTAB, view_submenu, tabs, prevtab);
- ITEM_SUB(CLOSETAB, view_submenu, tabs, closetab);
- ITEM_SUB(TOGGLEDEBUGGING, view_submenu, debugging, toggledebugging);
- ITEM_SUB(SAVEBOXTREE, view_submenu, debugging, saveboxtree);
- ITEM_SUB(SAVEDOMTREE, view_submenu, debugging, savedomtree);
- ITEM_BUTTON(HISTORY, history);
- /* disable items that make no sense initially, as well as
- * as-yet-unimplemented items */
- SENSITIVITY(BACK);
- SENSITIVITY(FORWARD);
- SENSITIVITY(STOP);
- SENSITIVITY(PRINTPREVIEW);
- SENSITIVITY(DELETE);
- SENSITIVITY(DRAWFILE);
- SENSITIVITY(POSTSCRIPT);
- SENSITIVITY(NEXTTAB);
- SENSITIVITY(PREVTAB);
- SENSITIVITY(CLOSETAB);
-#ifndef WITH_PDF_EXPORT
- SENSITIVITY(PDF);
-#endif
-
-#undef ITEM_MAIN
-#undef ITEM_SUB
-#undef ITEM_BUTTON
-#undef ITEM_POP
-#undef SENSITIVITY
-
-}
diff --git a/gtk/scaffolding.h b/gtk/scaffolding.h
index 79e3fa0df..e7d945ebc 100644
--- a/gtk/scaffolding.h
+++ b/gtk/scaffolding.h
@@ -19,16 +19,15 @@
#ifndef NETSURF_GTK_SCAFFOLDING_H
#define NETSURF_GTK_SCAFFOLDING_H 1
-#include <gtk/gtk.h>
-//#include <glade/glade.h>
-#include <glib.h>
+#include <stdbool.h>
+#include "utils/errors.h"
-#include "desktop/gui.h"
-#include "desktop/plotters.h"
-#include "gtk/menu.h"
-#include "gtk/sexy_icon_entry.h"
+struct bitmap;
+struct hlcache_handle;
+struct gui_window;
+struct gui_search_web_table;
-typedef struct gtk_scaffolding nsgtk_scaffolding;
+extern struct gui_search_web_table *nsgtk_search_web_table;
typedef enum {
BACK_BUTTON = 0,
@@ -86,7 +85,7 @@ typedef enum {
} nsgtk_toolbar_button; /* PLACEHOLDER_BUTTON - 1 */
struct gtk_history_window {
- struct gtk_scaffolding *g;
+ struct nsgtk_scaffolding *g;
GtkWindow *window;
GtkScrolledWindow *scrolled;
GtkDrawingArea *drawing_area;
@@ -113,38 +112,88 @@ struct nsgtk_button_connect {
void *dataminus; /* customization -> store */
};
-extern nsgtk_scaffolding *scaf_list;
-
-nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel);
-
-bool nsgtk_scaffolding_is_busy(nsgtk_scaffolding *g);
-
-GtkWindow *nsgtk_scaffolding_window(nsgtk_scaffolding *g);
-GtkNotebook *nsgtk_scaffolding_notebook(nsgtk_scaffolding *g);
-GtkWidget *nsgtk_scaffolding_urlbar(nsgtk_scaffolding *g);
-GtkWidget *nsgtk_scaffolding_websearch(nsgtk_scaffolding *g);
-GtkToolbar *nsgtk_scaffolding_toolbar(nsgtk_scaffolding *g);
-struct nsgtk_button_connect *nsgtk_scaffolding_button(nsgtk_scaffolding *g,
- int i);
-struct gtk_search *nsgtk_scaffolding_search(nsgtk_scaffolding *g);
-GtkMenuBar *nsgtk_scaffolding_menu_bar(nsgtk_scaffolding *g);
-struct gtk_history_window *nsgtk_scaffolding_history_window(nsgtk_scaffolding
- *g);
-struct gui_window *nsgtk_scaffolding_top_level(nsgtk_scaffolding *g);
-void nsgtk_scaffolding_reset_offset(nsgtk_scaffolding *g);
-nsgtk_scaffolding *nsgtk_scaffolding_iterate(nsgtk_scaffolding *g);
-void nsgtk_scaffolding_toolbar_init(struct gtk_scaffolding *g);
-void nsgtk_scaffolding_update_url_bar_ref(nsgtk_scaffolding *g);
-void nsgtk_scaffolding_update_throbber_ref(nsgtk_scaffolding *g);
-void nsgtk_scaffolding_update_websearch_ref(nsgtk_scaffolding *g);
-void nsgtk_scaffolding_set_websearch(nsgtk_scaffolding *g, const char
- *content);
-void nsgtk_scaffolding_toggle_search_bar_visibility(nsgtk_scaffolding *g);
-void nsgtk_scaffolding_set_top_level(struct gui_window *g);
+/**
+ * create a new scaffolding for a window.
+ *
+ * \param gw The gui window to create the new scaffold around.
+ * \return The newly constructed scaffold or NULL on error.
+ */
+struct nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *gw);
+
+/**
+ * Obtain the most recently used scaffolding element.
+ *
+ * This allows tabs to be opened in the most recently used window
+ */
+struct nsgtk_scaffolding *nsgtk_current_scaffolding(void);
+
+/* acessors for gtk elements withing a scaffold */
+
+/**
+ * Get the gtk window for a scaffolding.
+ */
+GtkWindow *nsgtk_scaffolding_window(struct nsgtk_scaffolding *g);
+
+/**
+ * Get the gtk notebook from a scaffold.
+ */
+GtkNotebook *nsgtk_scaffolding_notebook(struct nsgtk_scaffolding *g);
+
+/**
+ * Get the gtk url bar from a scaffold.
+ */
+GtkWidget *nsgtk_scaffolding_urlbar(struct nsgtk_scaffolding *g);
+
+/**
+ * Get the gtk web search entry from a scaffold.
+ */
+GtkWidget *nsgtk_scaffolding_websearch(struct nsgtk_scaffolding *g);
+
+/**
+ * Get the gtk toolbar from a scaffold.
+ */
+GtkToolbar *nsgtk_scaffolding_toolbar(struct nsgtk_scaffolding *g);
+
+
+struct nsgtk_button_connect *nsgtk_scaffolding_button(struct nsgtk_scaffolding *g, int i);
+
+struct gtk_search *nsgtk_scaffolding_search(struct nsgtk_scaffolding *g);
+
+GtkMenuBar *nsgtk_scaffolding_menu_bar(struct nsgtk_scaffolding *g);
-void nsgtk_scaffolding_destroy(nsgtk_scaffolding *g);
+struct gtk_history_window *nsgtk_scaffolding_history_window(struct nsgtk_scaffolding *g);
-/** update the sensitivity of context sensitive UI elements
+struct gui_window *nsgtk_scaffolding_top_level(struct nsgtk_scaffolding *g);
+
+/**
+ * reset the scaffold offset value to 0.
+ *
+ * \todo The value is only ever altered in
+ * nsgtk_scaffolding_toolbar_size_allocate and is something to do with
+ * the history button either clarify or remove!
+ */
+void nsgtk_scaffolding_reset_offset(struct nsgtk_scaffolding *g);
+
+/**
+ * Iterate through available scaffolding.
+ */
+struct nsgtk_scaffolding *nsgtk_scaffolding_iterate(struct nsgtk_scaffolding *g);
+
+void nsgtk_scaffolding_update_url_bar_ref(struct nsgtk_scaffolding *g);
+
+void nsgtk_scaffolding_update_throbber_ref(struct nsgtk_scaffolding *g);
+
+void nsgtk_scaffolding_update_websearch_ref(struct nsgtk_scaffolding *g);
+
+void nsgtk_scaffolding_toggle_search_bar_visibility(struct nsgtk_scaffolding *g);
+
+/**
+ * Set the current active top level gui window.
+ */
+void nsgtk_scaffolding_set_top_level(struct gui_window *g);
+
+/**
+ * update the sensitivity of context sensitive UI elements
*
* widgets altered in arrays:
* main
@@ -163,18 +212,32 @@ void nsgtk_scaffolding_destroy(nsgtk_scaffolding *g);
* prevtab
* closetab
*/
-void nsgtk_scaffolding_set_sensitivity(struct gtk_scaffolding *g);
+void nsgtk_scaffolding_set_sensitivity(struct nsgtk_scaffolding *g);
+
+/**
+ * Open a context sensitive menu.
+ *
+ * \param g the scaffolding containing the browser window.
+ * \param x The x co-ordinate.
+ * \param y The y co-ordinate.
+ */
+void nsgtk_scaffolding_context_menu(struct nsgtk_scaffolding *g, gdouble x, gdouble y);
+
+void nsgtk_scaffolding_toolbar_size_allocate(GtkWidget *widget, GtkAllocation *alloc, gpointer data);
-void nsgtk_scaffolding_initial_sensitivity(struct gtk_scaffolding *g);
-void nsgtk_scaffolding_popup_menu(struct gtk_scaffolding *g, gdouble x,
- gdouble y);
-void nsgtk_scaffolding_toolbar_size_allocate(GtkWidget *widget,
- GtkAllocation *alloc, gpointer data);
void nsgtk_scaffolding_set_icon(struct gui_window *gw);
gboolean nsgtk_window_url_activate_event(GtkWidget *, gpointer);
+
gboolean nsgtk_window_url_changed(GtkWidget *, GdkEventKey *, gpointer);
nserror nsgtk_scaffolding_new_tab(struct gui_window *gw);
+/* core acessors */
+void gui_window_set_title(struct gui_window *g, const char *title);
+void gui_window_set_url(struct gui_window *g, const char *url);
+void gui_window_start_throbber(struct gui_window *g);
+void gui_window_stop_throbber(struct gui_window *g);
+
+
#endif /* NETSURF_GTK_SCAFFOLDING_H */
diff --git a/gtk/schedule.c b/gtk/schedule.c
index 5b168b689..e28675a0b 100644
--- a/gtk/schedule.c
+++ b/gtk/schedule.c
@@ -20,7 +20,8 @@
#include <stdlib.h>
#include <stdbool.h>
-#include "utils/schedule.h"
+#include "utils/errors.h"
+
#include "gtk/schedule.h"
#ifdef DEBUG_GTK_SCHEDULE
@@ -71,7 +72,7 @@ nsgtk_schedule_kill_callback(void *_target, void *_match)
}
}
-void
+static void
schedule_remove(void (*callback)(void *p), void *p)
{
_nsgtk_callback_t cb_match = {
@@ -87,19 +88,27 @@ schedule_remove(void (*callback)(void *p), void *p)
nsgtk_schedule_kill_callback, &cb_match);
}
-void
-schedule(int t, void (*callback)(void *p), void *p)
+/* exported interface documented in gtk/schedule.h */
+nserror nsgtk_schedule(int t, void (*callback)(void *p), void *p)
{
- const int msec_timeout = t * 10;
- _nsgtk_callback_t *cb = malloc(sizeof(_nsgtk_callback_t));
+ _nsgtk_callback_t *cb;
+
/* Kill any pending schedule of this kind. */
schedule_remove(callback, p);
+
+ if (t < 0) {
+ return NSERROR_OK;
+ }
+
+ cb = malloc(sizeof(_nsgtk_callback_t));
cb->callback = callback;
cb->context = p;
cb->callback_killed = false;
/* Prepend is faster right now. */
queued_callbacks = g_list_prepend(queued_callbacks, cb);
- g_timeout_add(msec_timeout, nsgtk_schedule_generic_callback, cb);
+ g_timeout_add(t, nsgtk_schedule_generic_callback, cb);
+
+ return NSERROR_OK;
}
bool
diff --git a/gtk/schedule.h b/gtk/schedule.h
index c63215e88..0a2d724d4 100644
--- a/gtk/schedule.h
+++ b/gtk/schedule.h
@@ -19,7 +19,8 @@
#ifndef NETSURF_GTK_CALLBACK_H
#define NETSURF_GTK_CALLBACK_H 1
-typedef void (*gtk_callback)(void *p);
+nserror nsgtk_schedule(int t, void (*callback)(void *p), void *p);
+
bool schedule_run(void);
#endif /* NETSURF_GTK_CALLBACK_H */
diff --git a/gtk/search.c b/gtk/search.c
index d4fbadcc8..02bfed713 100644
--- a/gtk/search.c
+++ b/gtk/search.c
@@ -25,14 +25,10 @@
#include <string.h>
#include <gdk/gdkkeysyms.h>
-#include "gtk/compat.h"
-#include "gtk/search.h"
-#include "gtk/scaffolding.h"
-#include "gtk/window.h"
#include "utils/config.h"
#include "content/content.h"
#include "content/hlcache.h"
-#include "desktop/browser_private.h"
+#include "desktop/browser.h"
#include "desktop/gui.h"
#include "desktop/search.h"
#include "desktop/searchweb.h"
@@ -40,25 +36,49 @@
#include "utils/messages.h"
#include "utils/utils.h"
-static void nsgtk_search_set_status(bool found, void *p);
-static void nsgtk_search_set_hourglass(bool active, void *p);
-static void nsgtk_search_add_recent(const char *string, void *p);
+#include "gtk/compat.h"
+#include "gtk/search.h"
+#include "gtk/scaffolding.h"
+#include "gtk/window.h"
-static struct gui_search_callbacks nsgtk_search_callbacks = {
- nsgtk_search_set_forward_state,
- nsgtk_search_set_back_state,
- nsgtk_search_set_status,
- nsgtk_search_set_hourglass,
- nsgtk_search_add_recent
-};
+/**
+ * activate search forwards button in gui.
+ *
+ * \param active activate/inactivate
+ * \param p the pointer sent to search_verify_new() / search_create_context()
+ */
+static void nsgtk_search_set_forward_state(bool active, struct gui_window *gw)
+{
+ if (gw != NULL && nsgtk_get_browser_window(gw) != NULL) {
+ struct nsgtk_scaffolding *g = nsgtk_get_scaffold(gw);
+ gtk_widget_set_sensitive(
+ GTK_WIDGET(nsgtk_scaffolding_search(g)->buttons[1]),
+ active);
+ }
+}
+
+/**
+ * activate search back button in gui.
+ *
+ * \param active activate/inactivate
+ * \param p the pointer sent to search_verify_new() / search_create_context()
+ */
+static void nsgtk_search_set_back_state(bool active, struct gui_window *gw)
+{
+ if (gw != NULL && nsgtk_get_browser_window(gw) != NULL) {
+ struct nsgtk_scaffolding *g = nsgtk_get_scaffold(gw);
+ gtk_widget_set_sensitive(GTK_WIDGET(nsgtk_scaffolding_search(
+ g)->buttons[0]), active);
+ }
+}
/** connected to the search forward button */
gboolean nsgtk_search_forward_button_clicked(GtkWidget *widget, gpointer data)
{
- struct gtk_scaffolding *g = (struct gtk_scaffolding *)data;
- struct browser_window *bw = nsgtk_get_browser_window(
- nsgtk_scaffolding_top_level(g));
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
+ struct gui_window *gw = nsgtk_scaffolding_top_level(g);
+ struct browser_window *bw = nsgtk_get_browser_window(gw);
assert(bw);
@@ -70,7 +90,7 @@ gboolean nsgtk_search_forward_button_clicked(GtkWidget *widget, gpointer data)
nsgtk_scaffolding_search(g)->checkAll)) ?
SEARCH_FLAG_SHOWALL : 0);
- browser_window_search(bw, &nsgtk_search_callbacks, (void *)bw, flags,
+ browser_window_search(bw, gw, flags,
gtk_entry_get_text(nsgtk_scaffolding_search(g)->entry));
return TRUE;
}
@@ -79,9 +99,9 @@ gboolean nsgtk_search_forward_button_clicked(GtkWidget *widget, gpointer data)
gboolean nsgtk_search_back_button_clicked(GtkWidget *widget, gpointer data)
{
- struct gtk_scaffolding *g = (struct gtk_scaffolding *)data;
- struct browser_window *bw = nsgtk_get_browser_window(
- nsgtk_scaffolding_top_level(g));
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
+ struct gui_window *gw = nsgtk_scaffolding_top_level(g);
+ struct browser_window *bw = nsgtk_get_browser_window(gw);
assert(bw);
@@ -93,7 +113,7 @@ gboolean nsgtk_search_back_button_clicked(GtkWidget *widget, gpointer data)
nsgtk_scaffolding_search(g)->checkAll)) ?
SEARCH_FLAG_SHOWALL : 0);
- browser_window_search(bw, &nsgtk_search_callbacks, (void *)bw, flags,
+ browser_window_search(bw, gw, flags,
gtk_entry_get_text(nsgtk_scaffolding_search(g)->entry));
return TRUE;
}
@@ -102,7 +122,7 @@ gboolean nsgtk_search_back_button_clicked(GtkWidget *widget, gpointer data)
gboolean nsgtk_search_close_button_clicked(GtkWidget *widget, gpointer data)
{
- struct gtk_scaffolding *g = (struct gtk_scaffolding *)data;
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
nsgtk_scaffolding_toggle_search_bar_visibility(g);
return TRUE;
}
@@ -111,24 +131,25 @@ gboolean nsgtk_search_close_button_clicked(GtkWidget *widget, gpointer data)
gboolean nsgtk_search_entry_changed(GtkWidget *widget, gpointer data)
{
- nsgtk_scaffolding *g = (nsgtk_scaffolding *)data;
- struct browser_window *bw = nsgtk_get_browser_window(
- nsgtk_scaffolding_top_level(g));
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
+ struct gui_window *gw = nsgtk_scaffolding_top_level(g);
+ struct browser_window *bw = nsgtk_get_browser_window(gw);
+ search_flags_t flags;
assert(bw != NULL);
- nsgtk_search_set_forward_state(true, (void *)bw);
- nsgtk_search_set_back_state(true, (void *)bw);
+ nsgtk_search_set_forward_state(true, gw);
+ nsgtk_search_set_back_state(true, gw);
- search_flags_t flags = SEARCH_FLAG_FORWARDS |
- (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
+ flags = SEARCH_FLAG_FORWARDS |
+ (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
nsgtk_scaffolding_search(g)->caseSens)) ?
SEARCH_FLAG_CASE_SENSITIVE : 0) |
- (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
+ (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
nsgtk_scaffolding_search(g)->checkAll)) ?
SEARCH_FLAG_SHOWALL : 0);
- browser_window_search(bw, &nsgtk_search_callbacks, (void *)bw, flags,
+ browser_window_search(bw, gw, flags,
gtk_entry_get_text(nsgtk_scaffolding_search(g)->entry));
return TRUE;
}
@@ -137,32 +158,33 @@ gboolean nsgtk_search_entry_changed(GtkWidget *widget, gpointer data)
gboolean nsgtk_search_entry_activate(GtkWidget *widget, gpointer data)
{
- nsgtk_scaffolding *g = (nsgtk_scaffolding *)data;
- struct browser_window *bw = nsgtk_get_browser_window(
- nsgtk_scaffolding_top_level(g));
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
+ struct gui_window *gw = nsgtk_scaffolding_top_level(g);
+ struct browser_window *bw = nsgtk_get_browser_window(gw);
+ search_flags_t flags;
assert(bw);
- search_flags_t flags = SEARCH_FLAG_FORWARDS |
- (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
+ flags = SEARCH_FLAG_FORWARDS |
+ (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
nsgtk_scaffolding_search(g)->caseSens)) ?
SEARCH_FLAG_CASE_SENSITIVE : 0) |
- (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
+ (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
nsgtk_scaffolding_search(g)->checkAll)) ?
SEARCH_FLAG_SHOWALL : 0);
- browser_window_search(bw, &nsgtk_search_callbacks, (void *)bw, flags,
+ browser_window_search(bw, gw, flags,
gtk_entry_get_text(nsgtk_scaffolding_search(g)->entry));
return FALSE;
}
/** allows escape key to close search bar too */
-gboolean nsgtk_search_entry_key(GtkWidget *widget, GdkEventKey *event,
- gpointer data)
+gboolean
+nsgtk_search_entry_key(GtkWidget *widget, GdkEventKey *event, gpointer data)
{
if (event->keyval == GDK_KEY(Escape)) {
- struct gtk_scaffolding *g = (struct gtk_scaffolding *)data;
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
nsgtk_scaffolding_toggle_search_bar_visibility(g);
}
return FALSE;
@@ -172,13 +194,29 @@ gboolean nsgtk_search_entry_key(GtkWidget *widget, GdkEventKey *event,
gboolean nsgtk_websearch_activate(GtkWidget *widget, gpointer data)
{
- struct gtk_scaffolding *g = (struct gtk_scaffolding *)data;
- temp_open_background = 0;
- search_web_new_window(nsgtk_get_browser_window(
- nsgtk_scaffolding_top_level(g)),
- (char *)gtk_entry_get_text(GTK_ENTRY(
- nsgtk_scaffolding_websearch(g))));
- temp_open_background = -1;
+ struct nsgtk_scaffolding *g = data;
+ nserror ret;
+ nsurl *url;
+
+ ret = search_web_omni(
+ gtk_entry_get_text(GTK_ENTRY(nsgtk_scaffolding_websearch(g))),
+ SEARCH_WEB_OMNI_SEARCHONLY,
+ &url);
+ if (ret == NSERROR_OK) {
+ temp_open_background = 0;
+ ret = browser_window_create(
+ BW_CREATE_HISTORY | BW_CREATE_TAB,
+ url,
+ NULL,
+ nsgtk_get_browser_window(nsgtk_scaffolding_top_level(g)),
+ NULL);
+ temp_open_background = -1;
+ nsurl_unref(url);
+ }
+ if (ret != NSERROR_OK) {
+ warn_user(messages_get_errorcode(ret), 0);
+ }
+
return TRUE;
}
@@ -190,74 +228,18 @@ gboolean nsgtk_websearch_activate(GtkWidget *widget, gpointer data)
gboolean nsgtk_websearch_clear(GtkWidget *widget, GdkEventFocus *f,
gpointer data)
{
- struct gtk_scaffolding *g = (struct gtk_scaffolding *)data;
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
gtk_editable_select_region(GTK_EDITABLE(
nsgtk_scaffolding_websearch(g)), 0, -1);
gtk_widget_grab_focus(GTK_WIDGET(nsgtk_scaffolding_websearch(g)));
return TRUE;
}
-/**
-* Change the displayed search status.
-* \param found search pattern matched in text
-* \param p the pointer sent to search_verify_new() / search_create_context()
-*/
-
-void nsgtk_search_set_status(bool found, void *p)
-{
-}
-
-/**
-* display hourglass while searching
-* \param active start/stop indicator
-* \param p the pointer sent to search_verify_new() / search_create_context()
-*/
-
-void nsgtk_search_set_hourglass(bool active, void *p)
-{
-}
-
-/**
-* add search string to recent searches list
-* front is at liberty how to implement the bare notification
-* should normally store a strdup() of the string;
-* core gives no guarantee of the integrity of the const char *
-* \param string search pattern
-* \param p the pointer sent to search_verify_new() / search_create_context()
-*/
-
-void nsgtk_search_add_recent(const char *string, void *p)
-{
-}
-
-/**
-* activate search forwards button in gui
-* \param active activate/inactivate
-* \param p the pointer sent to search_verify_new() / search_create_context()
-*/
-void nsgtk_search_set_forward_state(bool active, void *p)
-{
- struct browser_window *bw = (struct browser_window *)p;
- if ((bw != NULL) && (bw->window != NULL)) {
- struct gtk_scaffolding *g = nsgtk_get_scaffold(bw->window);
- gtk_widget_set_sensitive(GTK_WIDGET(nsgtk_scaffolding_search(
- g)->buttons[1]), active);
- }
-}
-/**
-* activate search back button in gui
-* \param active activate/inactivate
-* \param p the pointer sent to search_verify_new() / search_create_context()
-*/
+static struct gui_search_table search_table = {
+ .forward_state = (void *)nsgtk_search_set_forward_state,
+ .back_state = (void *)nsgtk_search_set_back_state,
+};
-void nsgtk_search_set_back_state(bool active, void *p)
-{
- struct browser_window *bw = (struct browser_window *)p;
- if ((bw != NULL) && (bw->window != NULL)) {
- struct gtk_scaffolding *g = nsgtk_get_scaffold(bw->window);
- gtk_widget_set_sensitive(GTK_WIDGET(nsgtk_scaffolding_search(
- g)->buttons[0]), active);
- }
-}
+struct gui_search_table *nsgtk_search_table = &search_table;
diff --git a/gtk/search.h b/gtk/search.h
index 869a3cd8a..dd8c60d0f 100644
--- a/gtk/search.h
+++ b/gtk/search.h
@@ -19,21 +19,18 @@
#ifndef _NETSURF_GTK_SEARCH_H_
#define _NETSURF_GTK_SEARCH_H_
-#include <gtk/gtk.h>
-#include "gtk/scaffolding.h"
+struct gui_search_table *nsgtk_search_table;
-void nsgtk_search_bar_toggle_visibility(struct gtk_scaffolding * g);
+struct nsgtk_scaffolding;
+
+void nsgtk_search_bar_toggle_visibility(struct nsgtk_scaffolding * g);
gboolean nsgtk_search_entry_changed(GtkWidget *widget, gpointer data);
gboolean nsgtk_search_entry_activate(GtkWidget *widget, gpointer data);
-gboolean nsgtk_search_entry_key(GtkWidget *widget, GdkEventKey *event,
- gpointer data);
+gboolean nsgtk_search_entry_key(GtkWidget *widget, GdkEventKey *event, gpointer data);
gboolean nsgtk_search_forward_button_clicked(GtkWidget *widget, gpointer data);
gboolean nsgtk_search_back_button_clicked(GtkWidget *widget, gpointer data);
gboolean nsgtk_search_close_button_clicked(GtkWidget *widget, gpointer data);
gboolean nsgtk_websearch_activate(GtkWidget *widget, gpointer data);
-gboolean nsgtk_websearch_clear(GtkWidget *widget, GdkEventFocus *f,
- gpointer data);
-void nsgtk_search_set_forward_state(bool active, void *p);
-void nsgtk_search_set_back_state(bool active, void *p);
+gboolean nsgtk_websearch_clear(GtkWidget *widget, GdkEventFocus *f, gpointer data);
#endif
diff --git a/gtk/selection.c b/gtk/selection.c
index b0978b385..231e5fd0d 100644
--- a/gtk/selection.c
+++ b/gtk/selection.c
@@ -18,36 +18,25 @@
#include <string.h>
#include <gtk/gtk.h>
+#include <stdlib.h>
#include "utils/log.h"
-
-#include "desktop/gui.h"
#include "desktop/browser.h"
-#include "gtk/selection.h"
+#include "desktop/gui.h"
+
#include "gtk/window.h"
static GString *current_selection = NULL;
static GtkClipboard *clipboard;
-
-
-void gui_start_selection(struct gui_window *g)
-{
- gtk_widget_grab_focus(GTK_WIDGET(nsgtk_window_get_layout(g)));
-}
-
-void gui_clear_selection(struct gui_window *g)
-{
-}
-
/**
* Core asks front end for clipboard contents.
*
* \param buffer UTF-8 text, allocated by front end, ownership yeilded to core
* \param length Byte length of UTF-8 text in buffer
*/
-void gui_get_clipboard(char **buffer, size_t *length)
+static void gui_get_clipboard(char **buffer, size_t *length)
{
gchar *gtext;
@@ -83,7 +72,7 @@ void gui_get_clipboard(char **buffer, size_t *length)
* \param styles Array of styles given to text runs, owned by core, or NULL
* \param n_styles Number of text run styles in array
*/
-void gui_set_clipboard(const char *buffer, size_t length,
+static void gui_set_clipboard(const char *buffer, size_t length,
nsclipboard_styles styles[], int n_styles)
{
clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
@@ -99,3 +88,9 @@ void gui_set_clipboard(const char *buffer, size_t length,
gtk_clipboard_set_text(clipboard, current_selection->str, -1);
}
+static struct gui_clipboard_table clipboard_table = {
+ .get = gui_get_clipboard,
+ .set = gui_set_clipboard,
+};
+
+struct gui_clipboard_table *nsgtk_clipboard_table = &clipboard_table;
diff --git a/gtk/selection.h b/gtk/selection.h
index c2a0b35f4..6463692cf 100644
--- a/gtk/selection.h
+++ b/gtk/selection.h
@@ -19,7 +19,6 @@
#ifndef GTK_SELECTION_H
#define GTK_SELECTION_H
-#include <gtk/gtk.h>
-#include "desktop/gui.h"
+struct gui_clipboard_table *nsgtk_clipboard_table;
#endif
diff --git a/gtk/tabs.c b/gtk/tabs.c
index 62a864ed1..f8d560cf1 100644
--- a/gtk/tabs.c
+++ b/gtk/tabs.c
@@ -266,7 +266,7 @@ void nsgtk_tab_options_changed(GtkNotebook *notebook)
/* exported interface documented in gtk/tabs.h */
-void nsgtk_tab_init(struct gtk_scaffolding *gs)
+void nsgtk_tab_init(struct nsgtk_scaffolding *gs)
{
GtkNotebook *notebook;
diff --git a/gtk/tabs.h b/gtk/tabs.h
index caa683e40..036efb1e5 100644
--- a/gtk/tabs.h
+++ b/gtk/tabs.h
@@ -21,7 +21,7 @@
struct gui_window;
-void nsgtk_tab_init(struct gtk_scaffolding *gs);
+void nsgtk_tab_init(struct nsgtk_scaffolding *gs);
void nsgtk_tab_add(struct gui_window *window, GtkWidget *tab_contents, bool background);
/** set the tab title
diff --git a/gtk/theme.c b/gtk/theme.c
index 9d50c5931..dd034ac8b 100644
--- a/gtk/theme.c
+++ b/gtk/theme.c
@@ -22,21 +22,24 @@
#include <sys/stat.h>
#include <unistd.h>
+#include "utils/config.h"
+#include "utils/nsoption.h"
+#include "utils/container.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/utils.h"
+#include "desktop/browser.h"
#include "content/content.h"
#include "content/content_type.h"
#include "content/hlcache.h"
+
#include "gtk/compat.h"
#include "gtk/gui.h"
#include "gtk/scaffolding.h"
#include "gtk/menu.h"
#include "gtk/theme.h"
#include "gtk/window.h"
-#include "utils/nsoption.h"
#include "gtk/dialogs/preferences.h"
-#include "utils/container.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/utils.h"
enum image_sets {
IMAGE_SET_MAIN_MENU = 0,
@@ -158,7 +161,7 @@ static bool nsgtk_theme_verify(const char *themename)
void nsgtk_theme_init(void)
{
int theme;
- nsgtk_scaffolding *list = scaf_list;
+ struct nsgtk_scaffolding *list;
FILE *fp;
char buf[50];
int row_count = 0;
@@ -191,6 +194,7 @@ void nsgtk_theme_init(void)
}
fclose(fp);
+ list = nsgtk_scaffolding_iterate(NULL);
while (list != NULL) {
nsgtk_theme_implement(list);
list = nsgtk_scaffolding_iterate(list);
@@ -284,7 +288,7 @@ void nsgtk_theme_add(const char *themename)
* sets the images for a particular scaffolding according to the current theme
*/
-void nsgtk_theme_implement(struct gtk_scaffolding *g)
+void nsgtk_theme_implement(struct nsgtk_scaffolding *g)
{
struct nsgtk_theme *theme[IMAGE_SET_COUNT];
int i;
@@ -793,11 +797,8 @@ theme_install_callback(hlcache_handle *c,
const hlcache_event *event, void *pw)
{
switch (event->type) {
- case CONTENT_MSG_READY:
- break;
- case CONTENT_MSG_DONE:
- {
+ case CONTENT_MSG_DONE: {
const char *source_data;
unsigned long source_size;
@@ -807,21 +808,14 @@ theme_install_callback(hlcache_handle *c,
warn_user("ThemeInvalid", 0);
hlcache_handle_release(c);
+ break;
}
- break;
case CONTENT_MSG_ERROR:
warn_user(event->data.error, 0);
break;
- case CONTENT_MSG_STATUS:
- break;
-
- case CONTENT_MSG_LOADING:
- case CONTENT_MSG_REFORMAT:
- case CONTENT_MSG_REDRAW:
default:
- assert(0);
break;
}
diff --git a/gtk/theme.h b/gtk/theme.h
index 4aedad23f..175757b4a 100644
--- a/gtk/theme.h
+++ b/gtk/theme.h
@@ -39,7 +39,7 @@ struct nsgtk_theme *nsgtk_theme_load(GtkIconSize s);
void nsgtk_theme_add(const char *themename);
void nsgtk_theme_init(void);
void nsgtk_theme_prepare(void);
-void nsgtk_theme_implement(struct gtk_scaffolding *g);
+void nsgtk_theme_implement(struct nsgtk_scaffolding *g);
char *nsgtk_theme_name(void);
void nsgtk_theme_set_name(const char *name);
diff --git a/gtk/toolbar.c b/gtk/toolbar.c
index d543ca5fd..845344757 100644
--- a/gtk/toolbar.c
+++ b/gtk/toolbar.c
@@ -16,9 +16,10 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <string.h>
#include <gtk/gtk.h>
-#include "desktop/browser_private.h"
+#include "desktop/browser.h"
#include "desktop/searchweb.h"
#include "utils/log.h"
#include "utils/messages.h"
@@ -66,11 +67,10 @@ possible into the store */
static struct nsgtk_toolbar_custom_store store;
static struct nsgtk_toolbar_custom_store *window = &store;
-static void nsgtk_toolbar_close(nsgtk_scaffolding *g);
-static void nsgtk_toolbar_window_open(nsgtk_scaffolding *g);
-static void nsgtk_toolbar_customization_save(nsgtk_scaffolding *g);
-static void nsgtk_toolbar_add_item_to_toolbar(nsgtk_scaffolding *g, int i,
- struct nsgtk_theme *theme);
+static void nsgtk_toolbar_close(struct nsgtk_scaffolding *g);
+static void nsgtk_toolbar_window_open(struct nsgtk_scaffolding *g);
+static void nsgtk_toolbar_customization_save(struct nsgtk_scaffolding *g);
+static void nsgtk_toolbar_add_item_to_toolbar(struct nsgtk_scaffolding *g, int i, struct nsgtk_theme *theme);
static bool nsgtk_toolbar_add_store_widget(GtkWidget *widget);
static gboolean nsgtk_toolbar_data(GtkWidget *widget, GdkDragContext *context,
gint x, gint y, guint time, gpointer data);
@@ -89,28 +89,30 @@ static gboolean nsgtk_toolbar_delete(GtkWidget *widget, GdkEvent *event,
static gboolean nsgtk_toolbar_cancel_clicked(GtkWidget *widget, gpointer data);
static gboolean nsgtk_toolbar_reset(GtkWidget *widget, gpointer data);
static gboolean nsgtk_toolbar_persist(GtkWidget *widget, gpointer data);
-static void nsgtk_toolbar_cast(nsgtk_scaffolding *g);
-static GtkWidget *nsgtk_toolbar_make_widget(nsgtk_scaffolding *g,
+static void nsgtk_toolbar_cast(struct nsgtk_scaffolding *g);
+static GtkWidget *nsgtk_toolbar_make_widget(struct nsgtk_scaffolding *g,
nsgtk_toolbar_button i, struct nsgtk_theme *theme);
-static void nsgtk_toolbar_set_handler(nsgtk_scaffolding *g,
+static void nsgtk_toolbar_set_handler(struct nsgtk_scaffolding *g,
nsgtk_toolbar_button i);
-static void nsgtk_toolbar_temp_connect(nsgtk_scaffolding *g,
+static void nsgtk_toolbar_temp_connect(struct nsgtk_scaffolding *g,
nsgtk_toolbar_button i);
static void nsgtk_toolbar_clear_toolbar(GtkWidget *widget, gpointer data);
static nsgtk_toolbar_button nsgtk_toolbar_get_id_at_location(
- nsgtk_scaffolding *g, int i);
+ struct nsgtk_scaffolding *g, int i);
/**
- * change behaviour of scaffoldings while editing toolbar; all buttons as
- * well as window clicks are desensitized; then buttons in the front window
- * are changed to movable buttons
+ * change behaviour of scaffoldings while editing toolbar
+ *
+ * All buttons as well as window clicks are desensitized; then buttons
+ * in the front window are changed to movable buttons
*/
-void nsgtk_toolbar_customization_init(nsgtk_scaffolding *g)
+void nsgtk_toolbar_customization_init(struct nsgtk_scaffolding *g)
{
int i;
- nsgtk_scaffolding *list = scaf_list;
+ struct nsgtk_scaffolding *list;
edit_mode = true;
+ list = nsgtk_scaffolding_iterate(NULL);
while (list) {
g_signal_handler_block(GTK_WIDGET(
nsgtk_window_get_layout(
@@ -186,7 +188,7 @@ void nsgtk_toolbar_customization_init(nsgtk_scaffolding *g)
/**
* create store window
*/
-void nsgtk_toolbar_window_open(nsgtk_scaffolding *g)
+void nsgtk_toolbar_window_open(struct nsgtk_scaffolding *g)
{
int x = 0, y = 0;
GError* error = NULL;
@@ -285,7 +287,7 @@ gboolean nsgtk_toolbar_delete(GtkWidget *widget, GdkEvent *event,
gpointer data)
{
edit_mode = false;
- nsgtk_scaffolding *g = (nsgtk_scaffolding *)data;
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
/* reset g->buttons->location */
for (int i = BACK_BUTTON; i < PLACEHOLDER_BUTTON; i++) {
nsgtk_scaffolding_button(g, i)->location =
@@ -305,7 +307,7 @@ gboolean nsgtk_toolbar_delete(GtkWidget *widget, GdkEvent *event,
gboolean nsgtk_toolbar_cancel_clicked(GtkWidget *widget, gpointer data)
{
edit_mode = false;
- nsgtk_scaffolding *g = (nsgtk_scaffolding *)data;
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
/* reset g->buttons->location */
for (int i = BACK_BUTTON; i < PLACEHOLDER_BUTTON; i++) {
nsgtk_scaffolding_button(g, i)->location =
@@ -325,7 +327,7 @@ gboolean nsgtk_toolbar_cancel_clicked(GtkWidget *widget, gpointer data)
gboolean nsgtk_toolbar_persist(GtkWidget *widget, gpointer data)
{
edit_mode = false;
- nsgtk_scaffolding *g = (nsgtk_scaffolding *)data;
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
/* save state to file, update toolbars for all windows */
nsgtk_toolbar_customization_save(g);
nsgtk_toolbar_cast(g);
@@ -340,7 +342,7 @@ gboolean nsgtk_toolbar_persist(GtkWidget *widget, gpointer data)
*/
gboolean nsgtk_toolbar_reset(GtkWidget *widget, gpointer data)
{
- nsgtk_scaffolding *g = (nsgtk_scaffolding *)data;
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
int i;
for (i = BACK_BUTTON; i < PLACEHOLDER_BUTTON; i++)
nsgtk_scaffolding_button(g, i)->location =
@@ -364,7 +366,7 @@ gboolean nsgtk_toolbar_reset(GtkWidget *widget, gpointer data)
* to correspond to the logically stored schema in terms of location
* visibility etc
*/
-void nsgtk_toolbar_set_physical(nsgtk_scaffolding *g)
+void nsgtk_toolbar_set_physical(struct nsgtk_scaffolding *g)
{
int i;
struct nsgtk_theme *theme =
@@ -386,13 +388,16 @@ void nsgtk_toolbar_set_physical(nsgtk_scaffolding *g)
* cleanup code physical update of all toolbars; resensitize
* \param g the 'front' scaffolding that called customize
*/
-void nsgtk_toolbar_close(nsgtk_scaffolding *g)
+void nsgtk_toolbar_close(struct nsgtk_scaffolding *g)
{
int i;
- nsgtk_scaffolding *list = scaf_list;
+
+ struct nsgtk_scaffolding *list;
+ struct nsgtk_theme *theme;
+
+ list = nsgtk_scaffolding_iterate(NULL);
while (list) {
- struct nsgtk_theme *theme =
- nsgtk_theme_load(GTK_ICON_SIZE_LARGE_TOOLBAR);
+ theme = nsgtk_theme_load(GTK_ICON_SIZE_LARGE_TOOLBAR);
if (theme == NULL) {
warn_user(messages_get("NoMemory"), 0);
continue;
@@ -421,21 +426,9 @@ void nsgtk_toolbar_close(nsgtk_scaffolding *g)
nsgtk_window_get_signalhandler(
nsgtk_scaffolding_top_level(list),
NSGTK_WINDOW_SIGNAL_REDRAW));
- if ((nsgtk_get_browser_window(nsgtk_scaffolding_top_level(
- list))->current_content != NULL) &&
- (hlcache_handle_get_url(nsgtk_get_browser_window(
- nsgtk_scaffolding_top_level(list))->
- current_content) != NULL))
- browser_window_refresh_url_bar(
- nsgtk_get_browser_window(
- nsgtk_scaffolding_top_level(list)),
- hlcache_handle_get_url(
- nsgtk_get_browser_window(
- nsgtk_scaffolding_top_level(list))->
- current_content),
- nsgtk_get_browser_window(
- nsgtk_scaffolding_top_level(list))->
- frag_id);
+ browser_window_refresh_url_bar(
+ nsgtk_get_browser_window(
+ nsgtk_scaffolding_top_level(list)));
if (list != g)
gtk_widget_set_sensitive(GTK_WIDGET(
@@ -449,8 +442,8 @@ void nsgtk_toolbar_close(nsgtk_scaffolding *g)
TRUE);
/* update favicon etc */
nsgtk_scaffolding_set_top_level(nsgtk_scaffolding_top_level(g));
- if (search_web_ico())
- gui_window_set_search_ico(search_web_ico());
+
+ search_web_select_provider(-1);
}
/**
@@ -458,7 +451,7 @@ void nsgtk_toolbar_close(nsgtk_scaffolding *g)
*/
void nsgtk_toolbar_clear_toolbar(GtkWidget *widget, gpointer data)
{
- nsgtk_scaffolding *g = (nsgtk_scaffolding *)data;
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
gtk_container_remove(GTK_CONTAINER(nsgtk_scaffolding_toolbar(g)), widget);
}
@@ -469,7 +462,7 @@ void nsgtk_toolbar_clear_toolbar(GtkWidget *widget, gpointer data)
* the function should be called, when multiple items are being added,
* in ascending order
*/
-void nsgtk_toolbar_add_item_to_toolbar(nsgtk_scaffolding *g, int i,
+void nsgtk_toolbar_add_item_to_toolbar(struct nsgtk_scaffolding *g, int i,
struct nsgtk_theme *theme)
{
int q;
@@ -521,7 +514,7 @@ bool nsgtk_toolbar_add_store_widget(GtkWidget *widget)
gboolean nsgtk_toolbar_data(GtkWidget *widget, GdkDragContext *gdc, gint x,
gint y, guint time, gpointer data)
{
- nsgtk_scaffolding *g = (nsgtk_scaffolding *)data;
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
int ind = gtk_toolbar_get_drop_index(nsgtk_scaffolding_toolbar(g),
x, y);
int q, i;
@@ -613,7 +606,7 @@ gboolean nsgtk_toolbar_move_complete(GtkWidget *widget, GdkDragContext *gdc,
gboolean nsgtk_toolbar_store_return(GtkWidget *widget, GdkDragContext *gdc,
gint x, gint y, guint time, gpointer data)
{
- nsgtk_scaffolding *g = (nsgtk_scaffolding *)data;
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
int q, i;
if ((window->fromstore) || (window->currentbutton == -1)) {
@@ -648,7 +641,7 @@ gboolean nsgtk_toolbar_store_return(GtkWidget *widget, GdkDragContext *gdc,
gboolean nsgtk_toolbar_action(GtkWidget *widget, GdkDragContext *gdc, gint x,
gint y, guint time, gpointer data)
{
- nsgtk_scaffolding *g = (nsgtk_scaffolding *)data;
+ struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
GtkToolItem *item = gtk_tool_button_new(NULL, NULL);
if (item != NULL)
gtk_toolbar_set_drop_highlight_item(
@@ -682,7 +675,7 @@ void nsgtk_toolbar_clear(GtkWidget *widget, GdkDragContext *gdc, guint time,
* \param i the id of the widget
* \param theme the theme to make the widgets from
*/
-GtkWidget *nsgtk_toolbar_make_widget(nsgtk_scaffolding *g,
+GtkWidget *nsgtk_toolbar_make_widget(struct nsgtk_scaffolding *g,
nsgtk_toolbar_button i, struct nsgtk_theme *theme)
{
switch(i) {
@@ -818,8 +811,8 @@ GtkWidget *nsgtk_toolbar_make_widget(nsgtk_scaffolding *g,
MAKE_MENUBUTTON(DOWNLOADS, gtkDownloads)
MAKE_MENUBUTTON(SAVEWINDOWSIZE, gtkSaveWindowSize)
MAKE_MENUBUTTON(TOGGLEDEBUGGING, gtkToggleDebugging)
- MAKE_MENUBUTTON(SAVEBOXTREE, gtkSaveBoxTree)
- MAKE_MENUBUTTON(SAVEDOMTREE, gtkSaveDomTree)
+ MAKE_MENUBUTTON(SAVEBOXTREE, gtkDebugBoxTree)
+ MAKE_MENUBUTTON(SAVEDOMTREE, gtkDebugDomTree)
MAKE_MENUBUTTON(LOCALHISTORY, gtkLocalHistory)
MAKE_MENUBUTTON(GLOBALHISTORY, gtkGlobalHistory)
MAKE_MENUBUTTON(ADDBOOKMARKS, gtkAddBookMarks)
@@ -840,7 +833,7 @@ GtkWidget *nsgtk_toolbar_make_widget(nsgtk_scaffolding *g,
* \return toolbar item id when a widget is an element of the scaffolding
* else -1
*/
-int nsgtk_toolbar_get_id_from_widget(GtkWidget *widget, nsgtk_scaffolding *g)
+int nsgtk_toolbar_get_id_from_widget(GtkWidget *widget, struct nsgtk_scaffolding *g)
{
int i;
for (i = BACK_BUTTON; i < PLACEHOLDER_BUTTON; i++) {
@@ -857,8 +850,8 @@ int nsgtk_toolbar_get_id_from_widget(GtkWidget *widget, nsgtk_scaffolding *g)
* \return toolbar item id from location when there is an item at that logical
* location; else -1
*/
-nsgtk_toolbar_button nsgtk_toolbar_get_id_at_location(nsgtk_scaffolding *g,
- int i)
+nsgtk_toolbar_button
+nsgtk_toolbar_get_id_at_location(struct nsgtk_scaffolding *g, int i)
{
int q;
for (q = BACK_BUTTON; q < PLACEHOLDER_BUTTON; q++)
@@ -871,7 +864,7 @@ nsgtk_toolbar_button nsgtk_toolbar_get_id_at_location(nsgtk_scaffolding *g,
* connect 'normal' handlers to toolbar buttons
*/
-void nsgtk_toolbar_connect_all(nsgtk_scaffolding *g)
+void nsgtk_toolbar_connect_all(struct nsgtk_scaffolding *g)
{
int q, i;
for (i = BACK_BUTTON; i < PLACEHOLDER_BUTTON; i++) {
@@ -893,7 +886,8 @@ void nsgtk_toolbar_connect_all(nsgtk_scaffolding *g)
* \param g the scaffolding to attach handlers to
* \param i the toolbar item id
*/
-void nsgtk_toolbar_set_handler(nsgtk_scaffolding *g, nsgtk_toolbar_button i)
+void
+nsgtk_toolbar_set_handler(struct nsgtk_scaffolding *g, nsgtk_toolbar_button i)
{
switch(i){
case URL_BAR_ITEM:
@@ -983,8 +977,8 @@ DATAHANDLER(find, FIND, window)
DATAHANDLER(downloads, DOWNLOADS, window)
DATAHANDLER(savewindowsize, SAVEWINDOWSIZE, window)
DATAHANDLER(toggledebugging, TOGGLEDEBUGGING, window)
-DATAHANDLER(saveboxtree, SAVEBOXTREE, window)
-DATAHANDLER(savedomtree, SAVEDOMTREE, window)
+DATAHANDLER(debugboxtree, SAVEBOXTREE, window)
+DATAHANDLER(debugdomtree, SAVEDOMTREE, window)
DATAHANDLER(localhistory, LOCALHISTORY, window)
DATAHANDLER(globalhistory, GLOBALHISTORY, window)
DATAHANDLER(addbookmarks, ADDBOOKMARKS, window)
@@ -1021,7 +1015,7 @@ DATAHANDLER(websearch, WEBSEARCH, window)
/**
* connect temporary handler for toolbar edit events
*/
-void nsgtk_toolbar_temp_connect(nsgtk_scaffolding *g, nsgtk_toolbar_button i)
+void nsgtk_toolbar_temp_connect(struct nsgtk_scaffolding *g, nsgtk_toolbar_button i)
{
if ((i == URL_BAR_ITEM) ||
(nsgtk_scaffolding_button(g, i)->button == NULL) ||
@@ -1036,7 +1030,7 @@ void nsgtk_toolbar_temp_connect(nsgtk_scaffolding *g, nsgtk_toolbar_button i)
* load toolbar settings from file; file is a set of fields arranged as
* [itemreference];[itemlocation]|[itemreference];[itemlocation]| etc
*/
-void nsgtk_toolbar_customization_load(nsgtk_scaffolding *g)
+void nsgtk_toolbar_customization_load(struct nsgtk_scaffolding *g)
{
int i, ii;
char *val;
@@ -1077,17 +1071,21 @@ void nsgtk_toolbar_customization_load(nsgtk_scaffolding *g)
* cast toolbar settings to all scaffoldings referenced from the global linked
* list of gui_windows
*/
-void nsgtk_toolbar_cast(nsgtk_scaffolding *g)
+void nsgtk_toolbar_cast(struct nsgtk_scaffolding *g)
{
int i;
- nsgtk_scaffolding *list = scaf_list;
- for (i = BACK_BUTTON; i < PLACEHOLDER_BUTTON; i++)
+ struct nsgtk_scaffolding *list;
+
+ for (i = BACK_BUTTON; i < PLACEHOLDER_BUTTON; i++) {
window->buttonlocations[i] =
((nsgtk_scaffolding_button(g, i)->location
>= -1) &&
(nsgtk_scaffolding_button(g, i)->location
< PLACEHOLDER_BUTTON)) ?
nsgtk_scaffolding_button(g, i)->location : -1;
+ }
+
+ list = nsgtk_scaffolding_iterate(NULL);
while (list) {
if (list != g)
for (i = BACK_BUTTON; i < PLACEHOLDER_BUTTON; i++)
@@ -1100,7 +1098,7 @@ void nsgtk_toolbar_cast(nsgtk_scaffolding *g)
/**
* save toolbar settings to file
*/
-void nsgtk_toolbar_customization_save(nsgtk_scaffolding *g)
+void nsgtk_toolbar_customization_save(struct nsgtk_scaffolding *g)
{
int i;
FILE *f = fopen(toolbar_indices_file_location, "w");
diff --git a/gtk/toolbar.h b/gtk/toolbar.h
index bcad5cd7e..d0af4f9da 100644
--- a/gtk/toolbar.h
+++ b/gtk/toolbar.h
@@ -23,13 +23,12 @@
#include "gtk/scaffolding.h"
-void nsgtk_toolbar_customization_init(nsgtk_scaffolding *g);
-void nsgtk_toolbar_init(nsgtk_scaffolding *g);
-void nsgtk_toolbar_customization_load(nsgtk_scaffolding *g);
-void nsgtk_toolbar_set_physical(nsgtk_scaffolding *g);
-void nsgtk_toolbar_connect_all(nsgtk_scaffolding *g);
-int nsgtk_toolbar_get_id_from_widget(GtkWidget *widget, nsgtk_scaffolding
- *g);
+void nsgtk_toolbar_customization_init(struct nsgtk_scaffolding *g);
+void nsgtk_toolbar_init(struct nsgtk_scaffolding *g);
+void nsgtk_toolbar_customization_load(struct nsgtk_scaffolding *g);
+void nsgtk_toolbar_set_physical(struct nsgtk_scaffolding *g);
+void nsgtk_toolbar_connect_all(struct nsgtk_scaffolding *g);
+int nsgtk_toolbar_get_id_from_widget(GtkWidget *widget, struct nsgtk_scaffolding *g);
#define TOOLPROTO(q) gboolean nsgtk_toolbar_##q##_button_data(\
GtkWidget *widget, GdkDragContext *cont, GtkSelectionData\
@@ -81,8 +80,8 @@ TOOLPROTO(nexttab);
TOOLPROTO(prevtab);
TOOLPROTO(savewindowsize);
TOOLPROTO(toggledebugging);
-TOOLPROTO(saveboxtree);
-TOOLPROTO(savedomtree);
+TOOLPROTO(debugboxtree);
+TOOLPROTO(debugdomtree);
TOOLPROTO(contents);
TOOLPROTO(guide);
TOOLPROTO(info);
diff --git a/gtk/treeview.c b/gtk/treeview.c
index 2a4732a87..fa8bd8f3c 100644
--- a/gtk/treeview.c
+++ b/gtk/treeview.c
@@ -24,23 +24,26 @@
#include <assert.h>
#include <stdio.h>
#include <limits.h>
-
+#include <string.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
+#include "utils/log.h"
+#include "utils/utf8.h"
+#include "utils/utils.h"
#include "desktop/tree.h"
#include "desktop/plotters.h"
+
#include "gtk/compat.h"
#include "gtk/gui.h"
#include "gtk/plotters.h"
#include "gtk/treeview.h"
-#include "utils/log.h"
-#include "utils/utils.h"
struct nsgtk_treeview {
GtkWindow *window;
GtkScrolledWindow *scrolled;
GtkDrawingArea *drawing_area;
+ GtkIMContext *input_method;
bool mouse_pressed;
int mouse_pressed_x;
int mouse_pressed_y;
@@ -52,6 +55,7 @@ struct nsgtk_treeview {
void nsgtk_treeview_destroy(struct nsgtk_treeview *tv)
{
tree_delete(tv->tree);
+ g_object_unref(tv->input_method);
gtk_widget_destroy(GTK_WIDGET(tv->window));
free(tv);
}
@@ -206,12 +210,14 @@ void nsgtk_tree_window_hide(GtkWidget *widget, gpointer g)
{
}
-gboolean nsgtk_tree_window_button_press_event(GtkWidget *widget,
+static gboolean
+nsgtk_tree_window_button_press_event(GtkWidget *widget,
GdkEventButton *event, gpointer g)
{
struct nsgtk_treeview *tw = g;
struct tree *tree = tw->tree;
+ gtk_im_context_reset(tw->input_method);
gtk_widget_grab_focus(GTK_WIDGET(tw->drawing_area));
tw->mouse_pressed = true;
@@ -243,7 +249,8 @@ gboolean nsgtk_tree_window_button_press_event(GtkWidget *widget,
return TRUE;
}
-gboolean nsgtk_tree_window_button_release_event(GtkWidget *widget,
+static gboolean
+nsgtk_tree_window_button_release_event(GtkWidget *widget,
GdkEventButton *event, gpointer g)
{
bool shift = event->state & GDK_SHIFT_MASK;
@@ -307,7 +314,8 @@ gboolean nsgtk_tree_window_button_release_event(GtkWidget *widget,
return TRUE;
}
-gboolean nsgtk_tree_window_motion_notify_event(GtkWidget *widget,
+static gboolean
+nsgtk_tree_window_motion_notify_event(GtkWidget *widget,
GdkEventMotion *event, gpointer g)
{
bool shift = event->state & GDK_SHIFT_MASK;
@@ -369,7 +377,8 @@ gboolean nsgtk_tree_window_motion_notify_event(GtkWidget *widget,
}
-gboolean nsgtk_tree_window_keypress_event(GtkWidget *widget, GdkEventKey *event,
+static gboolean
+nsgtk_tree_window_keypress_event(GtkWidget *widget, GdkEventKey *event,
gpointer g)
{
struct nsgtk_treeview *tw = (struct nsgtk_treeview *) g;
@@ -381,6 +390,9 @@ gboolean nsgtk_tree_window_keypress_event(GtkWidget *widget, GdkEventKey *event,
GtkAdjustment *scroll = NULL;
gdouble hpage, vpage;
+ if (gtk_im_context_filter_keypress(tw->input_method, event))
+ return TRUE;
+
nskey = gtk_gui_gdkkey_to_nskey(event);
if (tree_keypress(tree, nskey) == true)
@@ -473,6 +485,32 @@ gboolean nsgtk_tree_window_keypress_event(GtkWidget *widget, GdkEventKey *event,
return TRUE;
}
+static gboolean
+nsgtk_tree_window_keyrelease_event(GtkWidget *widget, GdkEventKey *event,
+ gpointer g)
+{
+ struct nsgtk_treeview *tw = (struct nsgtk_treeview *) g;
+
+ return gtk_im_context_filter_keypress(tw->input_method, event);
+}
+
+static void
+nsgtk_tree_window_input_method_commit(GtkIMContext *ctx,
+ const gchar *str, gpointer data)
+{
+ struct nsgtk_treeview *tw = (struct nsgtk_treeview *) data;
+ size_t len = strlen(str), offset = 0;
+
+ while (offset < len) {
+ uint32_t nskey = utf8_to_ucs4(str + offset, len - offset);
+
+ tree_keypress(tw->tree, nskey);
+
+ offset = utf8_next(str, len, offset);
+ }
+}
+
+
static const struct treeview_table nsgtk_tree_callbacks = {
.redraw_request = nsgtk_tree_redraw_request,
.resized = nsgtk_tree_resized,
@@ -498,6 +536,7 @@ struct nsgtk_treeview *nsgtk_treeview_create(unsigned int flags,
tv->window = window;
tv->scrolled = scrolled;
tv->drawing_area = drawing_area;
+ tv->input_method = gtk_im_multicontext_new();
tv->tree = tree_create(flags, &nsgtk_tree_callbacks, tv);
tv->mouse_state = 0;
tv->mouse_pressed = false;
@@ -510,17 +549,31 @@ struct nsgtk_treeview *nsgtk_treeview_create(unsigned int flags,
#define CONNECT(obj, sig, callback, ptr) \
g_signal_connect(G_OBJECT(obj), (sig), G_CALLBACK(callback), (ptr))
- CONNECT(drawing_area, "button_press_event",
+ CONNECT(drawing_area, "button-press-event",
nsgtk_tree_window_button_press_event,
tv);
- CONNECT(drawing_area, "button_release_event",
+ CONNECT(drawing_area, "button-release-event",
nsgtk_tree_window_button_release_event,
tv);
- CONNECT(drawing_area, "motion_notify_event",
+ CONNECT(drawing_area, "motion-notify-event",
nsgtk_tree_window_motion_notify_event,
tv);
- CONNECT(drawing_area, "key_press_event",
+ CONNECT(drawing_area, "key-press-event",
nsgtk_tree_window_keypress_event,
tv);
+ CONNECT(drawing_area, "key-release-event",
+ nsgtk_tree_window_keyrelease_event,
+ tv);
+
+
+ /* input method */
+ gtk_im_context_set_client_window(tv->input_method,
+ nsgtk_widget_get_window(GTK_WIDGET(tv->window)));
+ gtk_im_context_set_use_preedit(tv->input_method, FALSE);
+ /* input method signals */
+ CONNECT(tv->input_method, "commit",
+ nsgtk_tree_window_input_method_commit,
+ tv);
+
return tv;
}
diff --git a/gtk/treeview.h b/gtk/treeview.h
index 12eb18096..ad8180f33 100644
--- a/gtk/treeview.h
+++ b/gtk/treeview.h
@@ -24,8 +24,6 @@
#ifndef __NSGTK_TREEVIEW_H__
#define __NSGTK_TREEVIEW_H__
-#include "desktop/browser.h"
-
struct nsgtk_treeview;
struct nsgtk_treeview *nsgtk_treeview_create(unsigned int flags,
@@ -35,16 +33,6 @@ void nsgtk_treeview_destroy(struct nsgtk_treeview *tv);
struct tree *nsgtk_treeview_get_tree(struct nsgtk_treeview *tv);
-gboolean nsgtk_tree_window_expose_event(GtkWidget *, GdkEventExpose *,
- gpointer g);
void nsgtk_tree_window_hide(GtkWidget *widget, gpointer g);
-gboolean nsgtk_tree_window_button_press_event(GtkWidget *widget,
- GdkEventButton *event, gpointer g);
-gboolean nsgtk_tree_window_button_release_event(GtkWidget *widget,
- GdkEventButton *event, gpointer g);
-gboolean nsgtk_tree_window_motion_notify_event(GtkWidget *widget,
- GdkEventMotion *event, gpointer g);
-gboolean nsgtk_tree_window_keypress_event(GtkWidget *widget, GdkEventKey *event,
- gpointer g);
#endif /*__NSGTK_TREEVIEW_H__*/
diff --git a/gtk/viewdata.c b/gtk/viewdata.c
new file mode 100644
index 000000000..1b5bfb153
--- /dev/null
+++ b/gtk/viewdata.c
@@ -0,0 +1,988 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * \file generic data viewer implementation.
+ *
+ * This viewer can be used for utf-8 encoded chunk of data. Thie data
+ * might be page source or the debugging of dom or box trees. It will
+ * show the data in a tab, window or editor as per user configuration.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <gtk/gtk.h>
+
+#include "utils/log.h"
+#include "utils/nsoption.h"
+#include "utils/utf8.h"
+#include "utils/messages.h"
+#include "utils/url.h"
+#include "utils/utils.h"
+#include "utils/file.h"
+#include "utils/filepath.h"
+
+#include "desktop/netsurf.h"
+#include "desktop/browser.h"
+#include "render/html.h"
+#include "content/hlcache.h"
+#include "content/content.h"
+
+#include "gtk/dialogs/about.h"
+#include "gtk/fetch.h"
+#include "gtk/compat.h"
+#include "gtk/gui.h"
+#include "gtk/viewdata.h"
+
+struct nsgtk_viewdata_ctx {
+ char *data;
+ size_t data_len;
+ char *filename;
+
+ GtkBuilder *builder; /**< The gtk builder that built the widgets. */
+ GtkWindow *window; /**< handle to gtk window (builder holds reference) */
+ GtkTextView *gv; /**< handle to gtk text view (builder holds reference) */
+
+ struct nsgtk_viewdata_ctx *next;
+ struct nsgtk_viewdata_ctx *prev;
+};
+
+struct menu_events {
+ const char *widget;
+ GCallback handler;
+};
+
+static struct nsgtk_viewdata_ctx *nsgtk_viewdata_list = NULL;
+static char viewdata_zoomlevel = 10;
+
+#define MENUEVENT(x) { #x, G_CALLBACK(nsgtk_on_##x##_activate) }
+#define MENUPROTO(x) static gboolean nsgtk_on_##x##_activate( \
+ GtkMenuItem *widget, gpointer g)
+
+MENUPROTO(viewdata_save_as);
+MENUPROTO(viewdata_print);
+MENUPROTO(viewdata_close);
+MENUPROTO(viewdata_select_all);
+MENUPROTO(viewdata_cut);
+MENUPROTO(viewdata_copy);
+MENUPROTO(viewdata_paste);
+MENUPROTO(viewdata_delete);
+MENUPROTO(viewdata_zoom_in);
+MENUPROTO(viewdata_zoom_out);
+MENUPROTO(viewdata_zoom_normal);
+MENUPROTO(viewdata_about);
+
+static struct menu_events viewdata_menu_events[] = {
+ MENUEVENT(viewdata_save_as),
+ MENUEVENT(viewdata_print),
+ MENUEVENT(viewdata_close),
+ MENUEVENT(viewdata_select_all),
+ MENUEVENT(viewdata_cut),
+ MENUEVENT(viewdata_copy),
+ MENUEVENT(viewdata_paste),
+ MENUEVENT(viewdata_delete),
+ MENUEVENT(viewdata_zoom_in),
+ MENUEVENT(viewdata_zoom_out),
+ MENUEVENT(viewdata_zoom_normal),
+ MENUEVENT(viewdata_about),
+ {NULL, NULL}
+};
+
+static void nsgtk_attach_viewdata_menu_handlers(GtkBuilder *xml, gpointer g)
+{
+ struct menu_events *event = viewdata_menu_events;
+
+ while (event->widget != NULL)
+ {
+ GtkWidget *w = GTK_WIDGET(gtk_builder_get_object(xml, event->widget));
+ g_signal_connect(G_OBJECT(w), "activate", event->handler, g);
+ event++;
+ }
+}
+
+static gboolean nsgtk_viewdata_destroy_event(GtkBuilder *window, gpointer g)
+{
+ struct nsgtk_viewdata_ctx *vdctx = (struct nsgtk_viewdata_ctx *)g;
+
+ if (vdctx->next != NULL) {
+ vdctx->next->prev = vdctx->prev;
+ }
+
+ if (vdctx->prev != NULL) {
+ vdctx->prev->next = vdctx->next;
+ } else {
+ nsgtk_viewdata_list = vdctx->next;
+ }
+
+ /* release the data */
+ free(vdctx->data);
+
+ /* free the builder */
+ g_object_unref(G_OBJECT(vdctx->builder));
+
+ /* free the context structure */
+ free(vdctx);
+
+ return FALSE;
+}
+
+static gboolean nsgtk_viewdata_delete_event(GtkWindow * window, gpointer g)
+{
+ return FALSE;
+}
+
+
+
+static void nsgtk_viewdata_file_save(GtkWindow *parent, const char *filename,
+ const char *data, size_t data_size)
+{
+ FILE *f;
+ GtkWidget *notif;
+ GtkWidget *label;
+
+ f = fopen(filename, "w+");
+ if (f != NULL) {
+ fwrite(data, data_size, 1, f);
+ fclose(f);
+ return;
+ }
+
+ /* inform user of faliure */
+ notif = gtk_dialog_new_with_buttons(messages_get("gtkSaveFailedTitle"),
+ parent,
+ GTK_DIALOG_MODAL, GTK_STOCK_OK,
+ GTK_RESPONSE_NONE, NULL);
+
+ g_signal_connect_swapped(notif, "response",
+ G_CALLBACK(gtk_widget_destroy), notif);
+
+ label = gtk_label_new(messages_get("gtkSaveFailed"));
+ gtk_container_add(GTK_CONTAINER(nsgtk_dialog_get_content_area(GTK_DIALOG(notif))), label);
+ gtk_widget_show_all(notif);
+
+}
+
+
+gboolean nsgtk_on_viewdata_save_as_activate(GtkMenuItem *widget, gpointer g)
+{
+ struct nsgtk_viewdata_ctx *nsg = (struct nsgtk_viewdata_ctx *) g;
+ GtkWidget *fc;
+
+ fc = gtk_file_chooser_dialog_new(messages_get("gtkSaveFile"),
+ nsg->window,
+ GTK_FILE_CHOOSER_ACTION_SAVE,
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_CANCEL,
+ GTK_STOCK_SAVE,
+ GTK_RESPONSE_ACCEPT,
+ NULL);
+
+ gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(fc), nsg->filename);
+
+ gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(fc),
+ TRUE);
+
+ if (gtk_dialog_run(GTK_DIALOG(fc)) == GTK_RESPONSE_ACCEPT) {
+ char *filename;
+ filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fc));
+ nsgtk_viewdata_file_save(nsg->window, filename, nsg->data, nsg->data_len);
+ g_free(filename);
+ }
+
+ gtk_widget_destroy(fc);
+
+ return TRUE;
+}
+
+
+gboolean nsgtk_on_viewdata_print_activate( GtkMenuItem *widget, gpointer g)
+{
+ /* correct printing */
+
+ return TRUE;
+}
+
+gboolean nsgtk_on_viewdata_close_activate( GtkMenuItem *widget, gpointer g)
+{
+ struct nsgtk_viewdata_ctx *nsg = (struct nsgtk_viewdata_ctx *) g;
+
+ gtk_widget_destroy(GTK_WIDGET(nsg->window));
+
+ return TRUE;
+}
+
+
+
+gboolean nsgtk_on_viewdata_select_all_activate (GtkMenuItem *widget, gpointer g)
+{
+ struct nsgtk_viewdata_ctx *nsg = (struct nsgtk_viewdata_ctx *) g;
+ GtkTextBuffer *buf = gtk_text_view_get_buffer(nsg->gv);
+ GtkTextIter start, end;
+
+ gtk_text_buffer_get_bounds(buf, &start, &end);
+
+ gtk_text_buffer_select_range(buf, &start, &end);
+
+ return TRUE;
+}
+
+gboolean nsgtk_on_viewdata_cut_activate(GtkMenuItem *widget, gpointer g)
+{
+ return TRUE;
+}
+
+gboolean nsgtk_on_viewdata_copy_activate(GtkMenuItem *widget, gpointer g)
+{
+ struct nsgtk_viewdata_ctx *nsg = (struct nsgtk_viewdata_ctx *) g;
+ GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(nsg->gv));
+
+ gtk_text_buffer_copy_clipboard(buf,
+ gtk_clipboard_get(GDK_SELECTION_CLIPBOARD));
+
+ return TRUE;
+}
+
+gboolean nsgtk_on_viewdata_paste_activate(GtkMenuItem *widget, gpointer g)
+{
+ return TRUE;
+}
+
+gboolean nsgtk_on_viewdata_delete_activate(GtkMenuItem *widget, gpointer g)
+{
+ return TRUE;
+}
+
+static void nsgtk_viewdata_update_zoomlevel(gpointer g)
+{
+ struct nsgtk_viewdata_ctx *nsg;
+ GtkTextBuffer *buf;
+ GtkTextTagTable *tab;
+ GtkTextTag *tag;
+
+ nsg = nsgtk_viewdata_list;
+ while (nsg) {
+ if (nsg->gv) {
+ buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(nsg->gv));
+
+ tab = gtk_text_buffer_get_tag_table(
+ GTK_TEXT_BUFFER(buf));
+
+ tag = gtk_text_tag_table_lookup(tab, "zoomlevel");
+ if (!tag) {
+ tag = gtk_text_tag_new("zoomlevel");
+ gtk_text_tag_table_add(tab, GTK_TEXT_TAG(tag));
+ }
+
+ gdouble fscale = ((gdouble) viewdata_zoomlevel) / 10;
+
+ g_object_set(GTK_TEXT_TAG(tag), "scale", fscale, NULL);
+
+ GtkTextIter start, end;
+
+ gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(buf),
+ &start, &end);
+ gtk_text_buffer_remove_all_tags(GTK_TEXT_BUFFER(buf),
+ &start, &end);
+ gtk_text_buffer_apply_tag(GTK_TEXT_BUFFER(buf),
+ GTK_TEXT_TAG(tag), &start, &end);
+ }
+ nsg = nsg->next;
+ }
+}
+
+gboolean nsgtk_on_viewdata_zoom_in_activate(GtkMenuItem *widget, gpointer g)
+{
+ viewdata_zoomlevel++;
+ nsgtk_viewdata_update_zoomlevel(g);
+
+ return TRUE;
+}
+
+gboolean nsgtk_on_viewdata_zoom_out_activate(GtkMenuItem *widget, gpointer g)
+{
+ if (viewdata_zoomlevel > 1) {
+ viewdata_zoomlevel--;
+ nsgtk_viewdata_update_zoomlevel(g);
+ }
+
+ return TRUE;
+}
+
+
+gboolean nsgtk_on_viewdata_zoom_normal_activate(GtkMenuItem *widget, gpointer g)
+{
+ viewdata_zoomlevel = 10;
+ nsgtk_viewdata_update_zoomlevel(g);
+
+ return TRUE;
+}
+
+gboolean nsgtk_on_viewdata_about_activate(GtkMenuItem *widget, gpointer g)
+{
+ struct nsgtk_viewdata_ctx *nsg = (struct nsgtk_viewdata_ctx *) g;
+
+ nsgtk_about_dialog_init(nsg->window, netsurf_version);
+
+ return TRUE;
+}
+
+/**
+ * View the data in a gtk text window.
+ */
+static nserror
+window_init(const char *title,
+ const char *filename,
+ char *ndata,
+ size_t ndata_len)
+{
+ GError* error = NULL;
+ GtkWindow *window;
+ GtkWidget *cutbutton;
+ GtkWidget *pastebutton;
+ GtkWidget *deletebutton;
+ GtkWidget *printbutton;
+ GtkTextView *dataview;
+ PangoFontDescription *fontdesc;
+ GtkTextBuffer *tb;
+ struct nsgtk_viewdata_ctx *newctx;
+
+ newctx = malloc(sizeof(struct nsgtk_viewdata_ctx));
+ if (newctx == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ newctx->builder = gtk_builder_new();
+ if (newctx->builder == NULL) {
+ free(newctx);
+ return NSERROR_INIT_FAILED;
+ }
+
+ if (!gtk_builder_add_from_file(newctx->builder,
+ glade_file_location->viewdata,
+ &error)) {
+ LOG(("Couldn't load builder file: %s", error->message));
+ g_error_free(error);
+ free(newctx);
+ return NSERROR_INIT_FAILED;
+ }
+
+
+ window = GTK_WINDOW(gtk_builder_get_object(newctx->builder, "ViewDataWindow"));
+
+ if (window == NULL) {
+ LOG(("Unable to find window in builder "));
+
+ /* free the builder */
+ g_object_unref(G_OBJECT(newctx->builder));
+
+ /* free the context structure */
+ free(newctx);
+
+ return NSERROR_INIT_FAILED;
+ }
+
+ cutbutton = GTK_WIDGET(gtk_builder_get_object(newctx->builder, "viewdata_cut"));
+ pastebutton = GTK_WIDGET(gtk_builder_get_object(newctx->builder, "viewdata_paste"));
+ deletebutton = GTK_WIDGET(gtk_builder_get_object(newctx->builder, "viewdata_delete"));
+ printbutton = GTK_WIDGET(gtk_builder_get_object(newctx->builder, "viewdata_print"));
+ gtk_widget_set_sensitive(cutbutton, FALSE);
+ gtk_widget_set_sensitive(pastebutton, FALSE);
+ gtk_widget_set_sensitive(deletebutton, FALSE);
+ /* for now */
+ gtk_widget_set_sensitive(printbutton, FALSE);
+
+
+ newctx->filename = strdup(filename);
+
+ newctx->data = ndata;
+ newctx->data_len = ndata_len;
+
+ newctx->window = window;
+
+ newctx->next = nsgtk_viewdata_list;
+ newctx->prev = NULL;
+ if (nsgtk_viewdata_list != NULL) {
+ nsgtk_viewdata_list->prev = newctx;
+ }
+ nsgtk_viewdata_list = newctx;
+
+ nsgtk_attach_viewdata_menu_handlers(newctx->builder, newctx);
+
+ gtk_window_set_title(window, title);
+
+ g_signal_connect(G_OBJECT(window), "destroy",
+ G_CALLBACK(nsgtk_viewdata_destroy_event),
+ newctx);
+ g_signal_connect(G_OBJECT(window), "delete-event",
+ G_CALLBACK(nsgtk_viewdata_delete_event),
+ newctx);
+
+ dataview = GTK_TEXT_VIEW(gtk_builder_get_object(newctx->builder,
+ "viewdata_view"));
+
+ fontdesc = pango_font_description_from_string("Monospace 8");
+
+ newctx->gv = dataview;
+ nsgtk_widget_modify_font(GTK_WIDGET(dataview), fontdesc);
+
+ tb = gtk_text_view_get_buffer(dataview);
+ gtk_text_buffer_set_text(tb, newctx->data, -1);
+
+ gtk_widget_show(GTK_WIDGET(window));
+
+ return NSERROR_OK;
+}
+
+/**
+ * open a window to dispaly an existing file.
+ */
+static nserror
+window_init_fname(const char *title,
+ const char *leafname,
+ const char *filename)
+{
+ nserror ret;
+ FILE *f;
+ char *ndata;
+ long tell_len;
+ size_t ndata_len;
+
+ f = fopen(filename, "r");
+ if (f == NULL) {
+ return NSERROR_NOT_FOUND;
+ }
+ if (fseek(f, 0, SEEK_END) != 0) {
+ fclose(f);
+ return NSERROR_BAD_SIZE;
+ }
+
+ tell_len = ftell(f);
+ if (tell_len == -1) {
+ fclose(f);
+ return NSERROR_BAD_SIZE;
+ }
+
+ if (fseek(f, 0, SEEK_SET) != 0) {
+ fclose(f);
+ return NSERROR_BAD_SIZE;
+ }
+
+ ndata = malloc(tell_len);
+
+ ndata_len = fread(ndata, 1, tell_len, f);
+
+ fclose(f);
+
+ ret = window_init(title, leafname, ndata, ndata_len);
+
+ return ret;
+}
+
+/**
+ * open a new tab from an existing file.
+ */
+static nserror
+tab_init_fname(const char *title,
+ const char *leafname,
+ const char *fname)
+{
+ nsurl *url;
+ nserror ret;
+
+ /* Open tab on temporary file */
+ ret = netsurf_path_to_nsurl(fname, &url);
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+
+ /* open tab on temportary file */
+ ret = browser_window_create(BW_CREATE_TAB | BW_CREATE_HISTORY, url, NULL, NULL, NULL);
+ nsurl_unref(url);
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+
+ return NSERROR_OK;
+}
+
+/**
+ * create a new tab from data.
+ */
+static nserror
+tab_init(const char *title,
+ const char *leafname,
+ char *ndata,
+ size_t ndata_len)
+{
+ nserror ret;
+ gchar *fname;
+ gint handle;
+ FILE *f;
+
+ handle = g_file_open_tmp("nsgtkdataXXXXXX", &fname, NULL);
+ if ((handle == -1) || (fname == NULL)) {
+ return NSERROR_SAVE_FAILED;
+ }
+ close(handle); /* in case it was binary mode */
+
+ /* save data to temporary file */
+ f = fopen(fname, "w");
+ if (f == NULL) {
+ warn_user(messages_get("gtkSourceTabError"), 0);
+ g_free(fname);
+ return NSERROR_SAVE_FAILED;
+ }
+ fprintf(f, "%s", ndata);
+ fclose(f);
+
+ ret = tab_init_fname(title, leafname, fname);
+ if (ret == NSERROR_OK) {
+ free(ndata);
+ }
+
+ g_free(fname);
+
+ return ret;
+}
+
+
+/**
+ * Build string vector of search path.
+ *
+ * ${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}
+ *
+ * $XDG_DATA_HOME if empty use $HOME/.local/share
+ *
+ * XDG_DATA_DIRS if empty use /usr/local/share/:/usr/share/
+ *
+ * \return string vector of search pathnames or NULL on error.
+ */
+static char** xdg_data_strvec(void)
+{
+ const char *xdg_data_dirs;
+ const char *xdg_data_home;
+ const char *home_dir;
+ char *xdg_data_path;
+ int xdg_data_size;
+ char **svec;
+
+ xdg_data_dirs = getenv("XDG_DATA_DIRS");
+ if ((xdg_data_dirs == NULL) ||
+ (*xdg_data_dirs == 0) ||
+ (strlen(xdg_data_dirs) > 4096)) {
+ xdg_data_dirs = "/usr/local/share/:/usr/share/";
+ }
+
+ xdg_data_home = getenv("XDG_DATA_HOME");
+ if ((xdg_data_home == NULL) ||
+ (*xdg_data_home == 0) ||
+ (strlen(xdg_data_home) > 4096)) {
+ /* $XDG_DATA_HOME is empty use $HOME/.local/share */
+
+ home_dir = getenv("HOME");
+ if ((home_dir == NULL) ||
+ (*home_dir == 0) ||
+ (strlen(home_dir) > 4096)) {
+ xdg_data_path = strdup(xdg_data_dirs);
+ } else {
+ xdg_data_size = strlen(home_dir) +
+ SLEN("/.local/share:") +
+ strlen(xdg_data_dirs) + 1;
+ xdg_data_path = malloc(xdg_data_size);
+ snprintf(xdg_data_path, xdg_data_size ,
+ "%s/.local/share/:%s",
+ home_dir, xdg_data_dirs);
+ }
+ } else {
+ xdg_data_size = strlen(xdg_data_home) +
+ strlen(xdg_data_dirs) + 2;
+ xdg_data_path = malloc(xdg_data_size);
+ snprintf(xdg_data_path, xdg_data_size , "%s:%s",
+ xdg_data_home, xdg_data_dirs);
+ }
+
+ LOG(("%s", xdg_data_path));
+
+ svec = filepath_path_to_strvec(xdg_data_path);
+ free(xdg_data_path);
+
+ return svec;
+}
+
+/**
+ * Search application defaults file for matching mime type.
+ *
+ * create filename form path and applications/defaults.list
+ *
+ * look for [Default Applications]
+ * search lines looking like mime/type=Desktop
+ *
+ * \param path The base path.
+ * \param mimetype The mimetype to search for.
+ * \return The desktop file associated with the mime type or NULL if not found.
+ */
+static char *xdg_get_default_app(const char *path, const char *mimetype)
+{
+ FILE *fp;
+ char *line = NULL;
+ size_t len = 0;
+ ssize_t rd;
+ int fname_len;
+ char *fname;
+ int mimetype_len;
+ char *ret = NULL;
+
+ fname_len = strlen(path) + SLEN("/applications/defaults.list") + 1;
+ fname = malloc(fname_len);
+ snprintf(fname, fname_len, "%s/applications/defaults.list", path);
+
+ LOG(("Checking %s", fname));
+
+ fp = fopen(fname, "r");
+ free(fname);
+ if (fp == NULL) {
+ return NULL;
+ }
+
+ mimetype_len = strlen(mimetype);
+ while ((rd = getline(&line, &len, fp)) != -1) {
+ /* line includes line endings if present, remove them */
+ while ((line[rd - 1] == '\n') || (line[rd - 1] == '\r')) {
+ rd--;
+ }
+ line[rd] = 0;
+
+ /* look for mimetype */
+ if ((rd > mimetype_len) &&
+ (line[mimetype_len] == '=') &&
+ (strncmp(line, mimetype, mimetype_len) == 0)) {
+
+ ret = strdup(line + mimetype_len + 1);
+
+ LOG(("Found line match for %s length %zu\n", mimetype, rd));
+ LOG(("Result %s", ret));
+
+ break;
+ }
+ }
+
+ free(line);
+ fclose(fp);
+
+ return ret;
+}
+
+/**
+ * Search desktop file for an Exec line.
+ *
+ * search path is combined with applications/application.desktop to
+ * create a filename.
+ *
+ * Desktop file format http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html
+ *
+ * \todo The parsing of the desktop file is badly incomplete and needs
+ * improving. For example the handling of the = delimiter is wrong and
+ * selection from the "Desktop Entry" group is completely absent.
+ *
+ */
+static char *xdg_get_exec_cmd(const char *path, const char *desktop)
+{
+ FILE *fp;
+ char *line = NULL;
+ size_t len = 0;
+ ssize_t rd;
+ int fname_len;
+ char *fname;
+ char *ret = NULL;
+
+ fname_len = strlen(path) + SLEN("/applications/") + strlen(desktop) + 1;
+ fname = malloc(fname_len);
+ snprintf(fname, fname_len, "%s/applications/%s", path, desktop);
+
+ LOG(("Checking %s", fname));
+
+ fp = fopen(fname, "r");
+ free(fname);
+ if (fp == NULL) {
+ return NULL;
+ }
+
+ while ((rd = getline(&line, &len, fp)) != -1) {
+ /* line includes line endings if present, remove them */
+ while ((line[rd - 1] == '\n') || (line[rd - 1] == '\r')) {
+ rd--;
+ }
+ line[rd] = 0;
+
+ /* look for mimetype */
+ if ((rd > (ssize_t)SLEN("Exec=")) &&
+ (strncmp(line, "Exec=", SLEN("Exec=")) == 0)) {
+
+ ret = strdup(line + SLEN("Exec="));
+
+ LOG(("Found Exec length %zu", rd));
+ LOG(("Result %s", ret));
+
+ break;
+ }
+ }
+
+ free(line);
+ fclose(fp);
+
+ return ret;
+}
+
+static char *exec_arg(const char *arg, int len, const char *fname)
+{
+ char *res = NULL;
+
+ if (*arg == '%') {
+ arg++;
+ if ((*arg == 'f') || (*arg == 'F') ||
+ (*arg == 'u') || (*arg == 'U')) {
+ res = strdup(fname);
+ }
+ } else {
+ res = calloc(1, len + 1);
+ if (res != NULL) {
+ memcpy(res, arg, len);
+ }
+ }
+
+ return res;
+}
+
+/**
+ * Build vector for executing app.
+ */
+static char **build_exec_argv(const char *fname, const char *exec_cmd)
+{
+ char **argv;
+ const char *start; /* current arguments start */
+ const char *cur; /* current ptr within exec cmd */
+ int aidx = 0; /* argv index */
+
+ argv = calloc(10, sizeof(char *));
+ if (argv == NULL) {
+ return NULL;
+ }
+
+ cur = exec_cmd;
+ while (*cur != 0) {
+ /* skip whitespace */
+ while ((*cur != 0) && (*cur == ' ')) {
+ cur++;
+ }
+ if (*cur == 0) {
+ break;
+ }
+ start = cur;
+
+ /* find end of element */
+ while ((*cur != 0) && (*cur != ' ')) {
+ cur++;
+ }
+
+ argv[aidx] = exec_arg(start, cur - start, fname);
+ if (argv[aidx] != NULL) {
+ LOG(("adding \"%s\"", argv[aidx]));
+ aidx++;
+ }
+ }
+
+ /* if no arguments were found there was nothing to execute */
+ if (aidx == 0) {
+ free(argv);
+ return NULL;
+ }
+
+ return argv;
+}
+
+
+/**
+ * open an editor from an existing file.
+ */
+static nserror
+editor_init_fname(const char *title,
+ const char *leafname,
+ const char *fname)
+{
+ char **xdg_data_vec;
+ int veci;
+ char *def_app_desktop; /* desktop file of default app for mimetype */
+ char *exec_cmd;
+ char **argv;
+
+ /* build string vector of search path */
+ xdg_data_vec = xdg_data_strvec();
+
+ /* find user configured app for opening text/plain */
+ veci = 0;
+ while (xdg_data_vec[veci] != NULL) {
+ def_app_desktop = xdg_get_default_app(xdg_data_vec[veci],
+ "text/plain");
+ if (def_app_desktop != NULL) {
+ break;
+ }
+ veci++;
+ }
+
+ if (def_app_desktop == NULL) {
+ /* no default app */
+ filepath_free_strvec(xdg_data_vec);
+ return NSERROR_NOT_FOUND;
+ }
+
+ /* find app to execute */
+ veci = 0;
+ while (xdg_data_vec[veci] != NULL) {
+ exec_cmd = xdg_get_exec_cmd(xdg_data_vec[veci], def_app_desktop);
+ if (exec_cmd != NULL) {
+ break;
+ }
+ veci++;
+ }
+ free(def_app_desktop);
+ filepath_free_strvec(xdg_data_vec);
+
+ if (exec_cmd == NULL) {
+ /* no exec entry */
+ return NSERROR_NOT_FOUND;
+ }
+
+ /* build exec vector */
+ argv = build_exec_argv(fname, exec_cmd);
+ free(exec_cmd);
+
+ /* execute target app on saved data */
+ if (g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL,
+ NULL, NULL) != TRUE) {
+ return NSERROR_NOT_FOUND;
+ }
+ filepath_free_strvec(argv);
+
+ return NSERROR_OK;
+}
+
+/**
+ * open an editor with data.
+ */
+static nserror
+editor_init(const char *title,
+ const char *leafname,
+ char *ndata,
+ size_t ndata_len)
+{
+
+ nserror ret;
+ gchar *fname;
+ gint handle;
+ FILE *f;
+
+ handle = g_file_open_tmp("nsgtkdataXXXXXX", &fname, NULL);
+ if ((handle == -1) || (fname == NULL)) {
+ return NSERROR_SAVE_FAILED;
+ }
+ close(handle); /* in case it was binary mode */
+
+ /* save data to temporary file */
+ f = fopen(fname, "w");
+ if (f == NULL) {
+ warn_user(messages_get("gtkSourceTabError"), 0);
+ g_free(fname);
+ return NSERROR_SAVE_FAILED;
+ }
+ fprintf(f, "%s", ndata);
+ fclose(f);
+
+ ret = editor_init_fname(title, leafname, fname);
+ if (ret == NSERROR_OK) {
+ free(ndata);
+ }
+
+ g_free(fname);
+
+ return ret;
+}
+
+/* exported interface documented in gtk/viewdata.h */
+nserror
+nsgtk_viewdata(const char *title,
+ const char *filename,
+ char *ndata,
+ size_t ndata_len)
+{
+ nserror ret;
+
+ switch (nsoption_int(developer_view)) {
+ case 0:
+ ret = window_init(title, filename, ndata, ndata_len);
+ break;
+
+ case 1:
+ ret = tab_init(title, filename, ndata, ndata_len);
+ break;
+
+ case 2:
+ ret = editor_init(title, filename, ndata, ndata_len);
+ break;
+
+ default:
+ ret = NSERROR_BAD_PARAMETER;
+ break;
+ }
+ if (ret != NSERROR_OK) {
+ /* release the data */
+ free(ndata);
+ }
+
+
+ return ret;
+}
+
+/* exported interface documented in gtk/viewdata.h */
+nserror
+nsgtk_viewfile(const char *title,
+ const char *leafname,
+ const char *filename)
+{
+ nserror ret;
+
+ switch (nsoption_int(developer_view)) {
+ case 0:
+ ret = window_init_fname(title, leafname, filename);
+ break;
+
+ case 1:
+ ret = tab_init_fname(title, leafname, filename);
+ break;
+
+ case 2:
+ ret = editor_init_fname(title, leafname, filename);
+ break;
+
+ default:
+ ret = NSERROR_BAD_PARAMETER;
+ break;
+ }
+
+ return ret;
+}
diff --git a/gtk/viewdata.h b/gtk/viewdata.h
new file mode 100644
index 000000000..1767b4821
--- /dev/null
+++ b/gtk/viewdata.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _NETSURF_GTK_VIEWDATA_H_
+#define _NETSURF_GTK_VIEWDATA_H_
+
+/**
+ * Display text to a user.
+ *
+ * The data is utf-8 encoded text and will be presented in a window, a
+ * tab or an editor as per the user configuration.
+ *
+ * \param title The title of the data being displayed.
+ * \param filename The suggested filename to be used.
+ * \param data The data to be shown. This data will be freed once the
+ * display is complete, the caller no longer owns the allocation.
+ * \param data_size The size of the data in data.
+ */
+nserror nsgtk_viewdata(const char *title, const char *filename, char *data, size_t data_size);
+
+/**
+ * Display file to a user.
+ *
+ * The file is interpreted as utf-8 encoded text and will be presented
+ * in a window, a tab or an editor as per the user configuration.
+ *
+ * \param title The title of the data being displayed.
+ * \param leafname The suggested leafname to be used.
+ * \param filename The filename of the data to be viewed.
+ */
+nserror nsgtk_viewfile(const char *title, const char *leafname, const char *filename);
+
+#endif
diff --git a/gtk/viewsource.c b/gtk/viewsource.c
new file mode 100644
index 000000000..9c28f6927
--- /dev/null
+++ b/gtk/viewsource.c
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2009 Mark Benjamin <MarkBenjamin@dfgh.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gtk/gtk.h>
+
+#include "utils/utils.h"
+#include "utils/url.h"
+#include "utils/utf8.h"
+#include "utils/messages.h"
+#include "desktop/browser.h"
+#include "content/content.h"
+#include "render/html.h"
+
+#include "gtk/viewdata.h"
+#include "gtk/viewsource.h"
+
+void nsgtk_viewsource(GtkWindow *parent, struct browser_window *bw)
+{
+ nserror ret;
+ struct hlcache_handle *hlcontent;
+ const char *source_data;
+ unsigned long source_size;
+ char *ndata = NULL;
+ size_t ndata_len;
+ char *filename;
+ char *title;
+
+ hlcontent = browser_window_get_content(bw);
+ if (hlcontent == NULL) {
+ return;
+ }
+
+ if (content_get_type(hlcontent) != CONTENT_HTML) {
+ return;
+ }
+
+ source_data = content_get_source_data(hlcontent, &source_size);
+
+ ret = url_nice(nsurl_access(browser_window_get_url(bw)), &filename, false);
+ if (ret != NSERROR_OK) {
+ filename = strdup(messages_get("SaveSource"));
+ if (filename == NULL) {
+ return;
+ }
+ }
+
+ title = malloc(strlen(nsurl_access(browser_window_get_url(bw))) + SLEN("Source of - NetSurf") + 1);
+ sprintf(title, "Source of %s - NetSurf", nsurl_access(browser_window_get_url(bw)));
+
+ ret = utf8_from_enc(source_data,
+ html_get_encoding(hlcontent),
+ source_size,
+ &ndata,
+ &ndata_len);
+ if (ret == NSERROR_OK) {
+ ret = nsgtk_viewdata(title, filename, ndata, ndata_len);
+ }
+
+ free(filename);
+ free(title);
+}
diff --git a/gtk/viewsource.h b/gtk/viewsource.h
new file mode 100644
index 000000000..fe85b30b5
--- /dev/null
+++ b/gtk/viewsource.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _NETSURF_GTK_VIEWSOURCE_H_
+#define _NETSURF_GTK_VIEWSOURCE_H_
+
+void nsgtk_viewsource(GtkWindow *parent, struct browser_window *bw);
+
+#endif
+
diff --git a/gtk/window.c b/gtk/window.c
index 8f449ced2..4d279fb82 100644
--- a/gtk/window.c
+++ b/gtk/window.c
@@ -26,13 +26,19 @@
#include <gdk/gdkkeysyms.h>
#include <gdk-pixbuf/gdk-pixdata.h>
+#include "utils/log.h"
+#include "utils/utf8.h"
+#include "utils/utils.h"
+#include "utils/nsoption.h"
#include "content/hlcache.h"
#include "gtk/window.h"
-#include "desktop/browser_private.h"
+#include "gtk/selection.h"
+#include "desktop/gui.h"
+#include "desktop/browser.h"
#include "desktop/mouse.h"
-#include "utils/nsoption.h"
#include "desktop/searchweb.h"
#include "desktop/textinput.h"
+
#include "gtk/compat.h"
#include "gtk/gui.h"
#include "gtk/scaffolding.h"
@@ -41,8 +47,6 @@
#include "gtk/tabs.h"
#include "gtk/bitmap.h"
#include "gtk/gdk.h"
-#include "utils/log.h"
-#include "utils/utils.h"
/* helper macro to conenct signals to callbacks */
#define CONNECT(obj, sig, callback, ptr) \
@@ -54,7 +58,7 @@ struct gui_window {
/** The gtk scaffold object containing menu, buttons, url bar, [tabs],
* drawing area, etc that may contain one or more gui_windows.
*/
- nsgtk_scaffolding *scaffold;
+ struct nsgtk_scaffolding *scaffold;
/** The 'content' window that is rendered in the gui_window */
struct browser_window *bw;
@@ -102,6 +106,9 @@ struct gui_window {
/** The icon this window should have */
GdkPixbuf *icon;
+ /** The input method to use with this window */
+ GtkIMContext *input_method;
+
/** list for cleanup */
struct gui_window *next, *prev;
};
@@ -109,7 +116,7 @@ struct gui_window {
struct gui_window *window_list = NULL; /**< first entry in win list*/
int temp_open_background = -1;
-nsgtk_scaffolding *nsgtk_get_scaffold(struct gui_window *g)
+struct nsgtk_scaffolding *nsgtk_get_scaffold(struct gui_window *g)
{
return g->scaffold;
}
@@ -152,7 +159,7 @@ struct gui_window *nsgtk_window_iterate(struct gui_window *g)
float nsgtk_get_scale_for_gui(struct gui_window *g)
{
- return g->bw->scale;
+ return browser_window_get_scale(g->bw);
}
#if GTK_CHECK_VERSION(3,0,0)
@@ -301,7 +308,8 @@ static gboolean nsgtk_window_motion_notify_event(GtkWidget *widget,
g->mouse.state ^= BROWSER_MOUSE_MOD_2;
browser_window_mouse_track(g->bw, g->mouse.state,
- event->x / g->bw->scale, event->y / g->bw->scale);
+ event->x / browser_window_get_scale(g->bw),
+ event->y / browser_window_get_scale(g->bw));
return TRUE;
}
@@ -311,12 +319,13 @@ static gboolean nsgtk_window_button_press_event(GtkWidget *widget,
{
struct gui_window *g = data;
+ gtk_im_context_reset(g->input_method);
gtk_widget_grab_focus(GTK_WIDGET(g->layout));
gtk_widget_hide(GTK_WIDGET(nsgtk_scaffolding_history_window(
g->scaffold)->window));
- g->mouse.pressed_x = event->x / g->bw->scale;
- g->mouse.pressed_y = event->y / g->bw->scale;
+ g->mouse.pressed_x = event->x / browser_window_get_scale(g->bw);
+ g->mouse.pressed_y = event->y / browser_window_get_scale(g->bw);
switch (event->button) {
case 1: /* Left button, usually. Pass to core as BUTTON 1. */
@@ -329,8 +338,9 @@ static gboolean nsgtk_window_button_press_event(GtkWidget *widget,
case 3: /* Right button, usually. Action button, context menu. */
browser_window_remove_caret(g->bw, true);
- nsgtk_scaffolding_popup_menu(g->scaffold, g->mouse.pressed_x,
- g->mouse.pressed_y);
+ nsgtk_scaffolding_context_menu(g->scaffold,
+ g->mouse.pressed_x,
+ g->mouse.pressed_y);
return TRUE;
default:
@@ -382,11 +392,12 @@ static gboolean nsgtk_window_button_release_event(GtkWidget *widget,
if (g->mouse.state & (BROWSER_MOUSE_CLICK_1 | BROWSER_MOUSE_CLICK_2)) {
browser_window_mouse_click(g->bw, g->mouse.state,
- event->x / g->bw->scale,
- event->y / g->bw->scale);
+ event->x / browser_window_get_scale(g->bw),
+ event->y / browser_window_get_scale(g->bw));
} else {
- browser_window_mouse_track(g->bw, 0, event->x / g->bw->scale,
- event->y / g->bw->scale);
+ browser_window_mouse_track(g->bw, 0,
+ event->x / browser_window_get_scale(g->bw),
+ event->y / browser_window_get_scale(g->bw));
}
g->mouse.state = 0;
@@ -437,9 +448,9 @@ nsgtk_window_scroll_event(GtkWidget *widget,
deltay *= nsgtk_adjustment_get_step_increment(vscroll);
if (browser_window_scroll_at_point(g->bw,
- event->x / g->bw->scale,
- event->y / g->bw->scale,
- deltax, deltay) != true) {
+ event->x / browser_window_get_scale(g->bw),
+ event->y / browser_window_get_scale(g->bw),
+ deltax, deltay) != true) {
/* core did not handle event so change adjustments */
@@ -485,7 +496,12 @@ static gboolean nsgtk_window_keypress_event(GtkWidget *widget,
GdkEventKey *event, gpointer data)
{
struct gui_window *g = data;
- uint32_t nskey = gtk_gui_gdkkey_to_nskey(event);
+ uint32_t nskey;
+
+ if (gtk_im_context_filter_keypress(g->input_method, event))
+ return TRUE;
+
+ nskey = gtk_gui_gdkkey_to_nskey(event);
if (browser_window_key_press(g->bw, nskey))
return TRUE;
@@ -593,14 +609,37 @@ static gboolean nsgtk_window_keypress_event(GtkWidget *widget,
return TRUE;
}
+static gboolean nsgtk_window_keyrelease_event(GtkWidget *widget,
+ GdkEventKey *event, gpointer data)
+{
+ struct gui_window *g = data;
+
+ return gtk_im_context_filter_keypress(g->input_method, event);
+}
+
+
+static void nsgtk_window_input_method_commit(GtkIMContext *ctx,
+ const gchar *str, gpointer data)
+{
+ struct gui_window *g = data;
+ size_t len = strlen(str), offset = 0;
+
+ while (offset < len) {
+ uint32_t nskey = utf8_to_ucs4(str + offset, len - offset);
+
+ browser_window_key_press(g->bw, nskey);
+
+ offset = utf8_next(str, len, offset);
+ }
+}
+
+
static gboolean nsgtk_window_size_allocate_event(GtkWidget *widget,
GtkAllocation *allocation, gpointer data)
{
struct gui_window *g = data;
- g->bw->reformat_pending = true;
- browser_reformat_pending = true;
-
+ browser_window_schedule_reformat(g->bw);
return TRUE;
}
@@ -653,14 +692,30 @@ static void window_destroy(GtkWidget *widget, gpointer data)
struct gui_window *gw = data;
browser_window_destroy(gw->bw);
+
+ g_object_unref(gw->input_method);
}
-/* Core interface docuemnted in desktop/gui.h to create a gui_window */
-struct gui_window *gui_create_browser_window(struct browser_window *bw,
- struct browser_window *clone,
- bool new_tab)
+
+/**
+ * Create and open a gtk container (window or tab) for a browsing context.
+ *
+ * \param bw The browsing context to create gui_window for.
+ * \param existing An existing gui_window, may be NULL
+ * \param flags flags to control the container creation
+ * \return gui window, or NULL on error
+ *
+ * If GW_CREATE_CLONE flag is set existing is non-NULL.
+ *
+ * Front end's gui_window must include a reference to the
+ * browser window passed in the bw param.
+ */
+static struct gui_window *
+gui_window_create(struct browser_window *bw,
+ struct gui_window *existing,
+ gui_window_create_flags flags)
{
- struct gui_window *g; /**< what we're creating to return */
+ struct gui_window *g; /* what is being creating to return */
GError* error = NULL;
bool tempback;
GtkBuilder* xml;
@@ -687,16 +742,14 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
g->bw = bw;
g->mouse.state = 0;
g->current_pointer = GUI_POINTER_DEFAULT;
- if (clone != NULL) {
- bw->scale = clone->scale;
- } else {
- bw->scale = (float) nsoption_int(scale) / 100.0;
- }
/* attach scaffold */
- if (new_tab) {
- assert(clone != NULL);
- g->scaffold = clone->window->scaffold;
+ if (flags & GW_CREATE_TAB) {
+ if (existing != NULL) {
+ g->scaffold = existing->scaffold;
+ } else {
+ g->scaffold = nsgtk_current_scaffolding();
+ }
} else {
/* Now construct and attach a scaffold */
g->scaffold = nsgtk_new_scaffolding(g);
@@ -713,6 +766,7 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
g->layout = GTK_LAYOUT(gtk_builder_get_object(xml, "layout"));
g->status_bar = GTK_LABEL(gtk_builder_get_object(xml, "status_bar"));
g->paned = GTK_PANED(gtk_builder_get_object(xml, "hpaned1"));
+ g->input_method = gtk_im_multicontext_new();
/* add new gui window to global list (push_top) */
@@ -756,6 +810,8 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
nsgtk_window_button_release_event, g);
CONNECT(g->layout, "key-press-event",
nsgtk_window_keypress_event, g);
+ CONNECT(g->layout, "key-release-event",
+ nsgtk_window_keyrelease_event, g);
CONNECT(g->layout, "size-allocate",
nsgtk_window_size_allocate_event, g);
CONNECT(g->layout, "scroll-event",
@@ -772,6 +828,14 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
CONNECT(g->container, "destroy",
window_destroy, g);
+ /* input method */
+ gtk_im_context_set_client_window(g->input_method,
+ nsgtk_layout_get_bin_window(g->layout));
+ gtk_im_context_set_use_preedit(g->input_method, FALSE);
+ /* input method signals */
+ CONNECT(g->input_method, "commit",
+ nsgtk_window_input_method_commit, g);
+
/* add the tab container to the scaffold notebook */
switch (temp_open_background) {
case -1:
@@ -799,35 +863,24 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
void nsgtk_reflow_all_windows(void)
{
for (struct gui_window *g = window_list; g; g = g->next) {
- nsgtk_tab_options_changed(
- nsgtk_scaffolding_notebook(g->scaffold));
- g->bw->reformat_pending = true;
+ nsgtk_tab_options_changed(nsgtk_scaffolding_notebook(g->scaffold));
+ browser_window_schedule_reformat(g->bw);
}
-
- browser_reformat_pending = true;
}
/**
- * Process pending reformats
+ * callback from core to reformat a window.
*/
-
-void nsgtk_window_process_reformats(void)
+static void nsgtk_window_reformat(struct gui_window *gw)
{
- struct gui_window *g;
GtkAllocation alloc;
- browser_reformat_pending = false;
- for (g = window_list; g; g = g->next) {
- if (!g->bw->reformat_pending)
- continue;
+ if (gw != NULL) {
+ /** @todo consider gtk_widget_get_allocated_width() */
+ nsgtk_widget_get_allocation(GTK_WIDGET(gw->layout), &alloc);
- g->bw->reformat_pending = false;
-
- /* @todo consider gtk_widget_get_allocated_width() */
- nsgtk_widget_get_allocation(GTK_WIDGET(g->layout), &alloc);
-
- browser_window_reformat(g->bw, false, alloc.width, alloc.height);
+ browser_window_reformat(gw->bw, false, alloc.width, alloc.height);
}
}
@@ -837,7 +890,7 @@ void nsgtk_window_destroy_browser(struct gui_window *gw)
gtk_widget_destroy(gw->container);
}
-void gui_window_destroy(struct gui_window *g)
+static void gui_window_destroy(struct gui_window *g)
{
LOG(("gui_window: %p", g));
assert(g != NULL);
@@ -860,7 +913,7 @@ void gui_window_destroy(struct gui_window *g)
/**
* set favicon
*/
-void gui_window_set_icon(struct gui_window *gw, hlcache_handle *icon)
+static void gui_window_set_icon(struct gui_window *gw, hlcache_handle *icon)
{
struct bitmap *icon_bitmap = NULL;
@@ -887,6 +940,20 @@ void gui_window_set_icon(struct gui_window *gw, hlcache_handle *icon)
nsgtk_scaffolding_set_icon(gw);
}
+static bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
+{
+ GtkAdjustment *vadj = nsgtk_layout_get_vadjustment(g->layout);
+ GtkAdjustment *hadj = nsgtk_layout_get_hadjustment(g->layout);
+
+ assert(vadj);
+ assert(hadj);
+
+ *sy = (int)(gtk_adjustment_get_value(vadj));
+ *sx = (int)(gtk_adjustment_get_value(hadj));
+
+ return true;
+}
+
static void nsgtk_redraw_caret(struct gui_window *g)
{
int sx, sy;
@@ -901,7 +968,7 @@ static void nsgtk_redraw_caret(struct gui_window *g)
}
-void gui_window_remove_caret(struct gui_window *g)
+static void gui_window_remove_caret(struct gui_window *g)
{
int sx, sy;
int oh = g->careth;
@@ -918,50 +985,38 @@ void gui_window_remove_caret(struct gui_window *g)
}
-void gui_window_redraw_window(struct gui_window *g)
+static void gui_window_redraw_window(struct gui_window *g)
{
gtk_widget_queue_draw(GTK_WIDGET(g->layout));
}
-void gui_window_update_box(struct gui_window *g, const struct rect *rect)
+static void gui_window_update_box(struct gui_window *g, const struct rect *rect)
{
int sx, sy;
- hlcache_handle *c = g->bw->current_content;
+ float scale;
- if (c == NULL)
+ if (!browser_window_has_content(g->bw))
return;
gui_window_get_scroll(g, &sx, &sy);
+ scale = browser_window_get_scale(g->bw);
gtk_widget_queue_draw_area(GTK_WIDGET(g->layout),
- rect->x0 * g->bw->scale - sx,
- rect->y0 * g->bw->scale - sy,
- (rect->x1 - rect->x0) * g->bw->scale,
- (rect->y1 - rect->y0) * g->bw->scale);
+ rect->x0 * scale - sx,
+ rect->y0 * scale - sy,
+ (rect->x1 - rect->x0) * scale,
+ (rect->y1 - rect->y0) * scale);
}
-void gui_window_set_status(struct gui_window *g, const char *text)
+static void gui_window_set_status(struct gui_window *g, const char *text)
{
assert(g);
assert(g->status_bar);
gtk_label_set_text(g->status_bar, text);
}
-bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
-{
- GtkAdjustment *vadj = nsgtk_layout_get_vadjustment(g->layout);
- GtkAdjustment *hadj = nsgtk_layout_get_hadjustment(g->layout);
-
- assert(vadj);
- assert(hadj);
-
- *sy = (int)(gtk_adjustment_get_value(vadj));
- *sx = (int)(gtk_adjustment_get_value(hadj));
-
- return true;
-}
-void gui_window_set_scroll(struct gui_window *g, int sx, int sy)
+static void gui_window_set_scroll(struct gui_window *g, int sx, int sy)
{
GtkAdjustment *vadj = nsgtk_layout_get_vadjustment(g->layout);
GtkAdjustment *hadj = nsgtk_layout_get_hadjustment(g->layout);
@@ -986,21 +1041,13 @@ void gui_window_set_scroll(struct gui_window *g, int sx, int sy)
gtk_adjustment_set_value(hadj, x);
}
-void gui_window_scroll_visible(struct gui_window *g, int x0, int y0,
- int x1, int y1)
-{
- gui_window_set_scroll(g,x0,y0);
-}
-
-
-void gui_window_update_extent(struct gui_window *g)
+static void gui_window_update_extent(struct gui_window *g)
{
- if (!g->bw->current_content)
- return;
+ int w, h;
- gtk_layout_set_size(g->layout,
- content_get_width(g->bw->current_content) * g->bw->scale,
- content_get_height(g->bw->current_content) * g->bw->scale);
+ if (browser_window_get_extents(g->bw, true, &w, &h) == NSERROR_OK) {
+ gtk_layout_set_size(g->layout, w, h);
+ }
}
static GdkCursor *nsgtk_create_menu_cursor(void)
@@ -1014,7 +1061,8 @@ static GdkCursor *nsgtk_create_menu_cursor(void)
return cursor;
}
-void gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape)
+static void gui_window_set_pointer(struct gui_window *g,
+ gui_pointer_shape shape)
{
GdkCursor *cursor = NULL;
GdkCursorType cursortype;
@@ -1098,53 +1146,35 @@ void gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape)
nsgdk_cursor_unref(cursor);
}
-void gui_window_hide_pointer(struct gui_window *g)
-{
-}
-
-void gui_window_place_caret(struct gui_window *g, int x, int y, int height,
+static void gui_window_place_caret(struct gui_window *g, int x, int y, int height,
const struct rect *clip)
{
nsgtk_redraw_caret(g);
- g->caretx = x;
- g->carety = y + 1;
- g->careth = height - 2;
-
- nsgtk_redraw_caret(g);
-
- gtk_widget_grab_focus(GTK_WIDGET(g->layout));
-}
+ y += 1;
+ height -= 1;
-void gui_window_new_content(struct gui_window *g)
-{
-
-}
+ if (y < clip->y0) {
+ height -= clip->y0 - y;
+ y = clip->y0;
+ }
-bool gui_window_scroll_start(struct gui_window *g)
-{
- return true;
-}
+ if (y + height > clip->y1) {
+ height = clip->y1 - y + 1;
+ }
-bool gui_window_drag_start(struct gui_window *g, gui_drag_type type,
- const struct rect *rect)
-{
- return true;
-}
+ g->caretx = x;
+ g->carety = y;
+ g->careth = height;
-void gui_drag_save_object(gui_save_type type, hlcache_handle *c,
- struct gui_window *g)
-{
+ nsgtk_redraw_caret(g);
+ gtk_widget_grab_focus(GTK_WIDGET(g->layout));
}
-void gui_drag_save_selection(struct gui_window *g, const char *selection)
-{
-
-}
-void gui_window_get_dimensions(struct gui_window *g, int *width, int *height,
+static void gui_window_get_dimensions(struct gui_window *g, int *width, int *height,
bool scaled)
{
GtkAllocation alloc;
@@ -1156,9 +1186,75 @@ void gui_window_get_dimensions(struct gui_window *g, int *width, int *height,
*height = alloc.height;
if (scaled) {
- *width /= g->bw->scale;
- *height /= g->bw->scale;
+ float scale = browser_window_get_scale(g->bw);
+ *width /= scale;
+ *height /= scale;
}
LOG(("width: %i", *width));
LOG(("height: %i", *height));
}
+
+static void gui_window_start_selection(struct gui_window *g)
+{
+ gtk_widget_grab_focus(GTK_WIDGET(g->layout));
+}
+
+static void
+gui_window_file_gadget_open(struct gui_window *g,
+ hlcache_handle *hl,
+ struct form_control *gadget)
+{
+ GtkWidget *dialog;
+
+ dialog = gtk_file_chooser_dialog_new("Select File",
+ nsgtk_scaffolding_window(g->scaffold),
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+ NULL);
+
+ LOG(("*** open dialog: %p", dialog));
+
+ int ret = gtk_dialog_run(GTK_DIALOG(dialog));
+ LOG(("*** return value: %d", ret));
+ if (ret == GTK_RESPONSE_ACCEPT) {
+ char *filename;
+
+ filename = gtk_file_chooser_get_filename(
+ GTK_FILE_CHOOSER(dialog));
+
+ browser_window_set_gadget_filename(g->bw, gadget, filename);
+
+ g_free(filename);
+ }
+
+ gtk_widget_destroy(dialog);
+}
+
+static struct gui_window_table window_table = {
+ .create = gui_window_create,
+ .destroy = gui_window_destroy,
+ .redraw = gui_window_redraw_window,
+ .update = gui_window_update_box,
+ .get_scroll = gui_window_get_scroll,
+ .set_scroll = gui_window_set_scroll,
+ .get_dimensions = gui_window_get_dimensions,
+ .update_extent = gui_window_update_extent,
+ .reformat = nsgtk_window_reformat,
+
+ .set_icon = gui_window_set_icon,
+ .set_status = gui_window_set_status,
+ .set_pointer = gui_window_set_pointer,
+ .place_caret = gui_window_place_caret,
+ .remove_caret = gui_window_remove_caret,
+ .file_gadget_open = gui_window_file_gadget_open,
+ .start_selection = gui_window_start_selection,
+
+ /* from scaffold */
+ .set_title = gui_window_set_title,
+ .set_url = gui_window_set_url,
+ .start_throbber = gui_window_start_throbber,
+ .stop_throbber = gui_window_stop_throbber,
+};
+
+struct gui_window_table *nsgtk_window_table = &window_table;
diff --git a/gtk/window.h b/gtk/window.h
index 2def42dd5..c604bf3f7 100644
--- a/gtk/window.h
+++ b/gtk/window.h
@@ -19,10 +19,9 @@
#ifndef NETSURF_GTK_WINDOW_H
#define NETSURF_GTK_WINDOW_H 1
-#include "desktop/gui.h"
-#include "desktop/browser.h"
#include "gtk/scaffolding.h"
+extern struct gui_window_table *nsgtk_window_table;
typedef enum nsgtk_window_signals {
NSGTK_WINDOW_SIGNAL_CLICK,
@@ -33,12 +32,10 @@ typedef enum nsgtk_window_signals {
extern struct gui_window *window_list;
extern int temp_open_background;
-
struct browser_window *nsgtk_get_browser_window(struct gui_window *g);
-nsgtk_scaffolding *nsgtk_get_scaffold(struct gui_window *g);
+struct nsgtk_scaffolding *nsgtk_get_scaffold(struct gui_window *g);
GdkPixbuf *nsgtk_get_icon(struct gui_window *gw);
void nsgtk_reflow_all_windows(void);
-void nsgtk_window_process_reformats(void);
float nsgtk_get_scale_for_gui(struct gui_window *g);
int nsgtk_gui_window_update_targets(struct gui_window *g);
void nsgtk_window_destroy_browser(struct gui_window *g);
@@ -48,5 +45,4 @@ struct gui_window *nsgtk_window_iterate(struct gui_window *g);
GtkWidget *nsgtk_window_get_tab(struct gui_window *g);
void nsgtk_window_set_tab(struct gui_window *g, GtkWidget *w);
-
#endif /* NETSURF_GTK_WINDOW_H */
diff --git a/image/Makefile b/image/Makefile
index becd944cd..9992c5443 100644
--- a/image/Makefile
+++ b/image/Makefile
@@ -6,7 +6,6 @@ S_IMAGE_NO :=
S_IMAGE_$(NETSURF_USE_BMP) += bmp.c ico.c
S_IMAGE_$(NETSURF_USE_GIF) += gif.c
S_IMAGE_$(NETSURF_USE_JPEG) += jpeg.c
-S_IMAGE_$(NETSURF_USE_MNG) += mng.c
S_IMAGE_$(NETSURF_USE_ROSPRITE) += nssprite.c
S_IMAGE_$(NETSURF_USE_PNG) += png.c
S_IMAGE_$(NETSURF_USE_NSSVG) += svg.c
diff --git a/image/gif.c b/image/gif.c
index 4bd45c7fe..5c1b3abe8 100644
--- a/image/gif.c
+++ b/image/gif.c
@@ -39,14 +39,15 @@
#include "content/hlcache.h"
#include "utils/nsoption.h"
#include "desktop/plotters.h"
-#include "image/image.h"
-#include "image/bitmap.h"
-#include "image/gif.h"
+#include "desktop/gui_factory.h"
#include "utils/log.h"
#include "utils/messages.h"
-#include "utils/schedule.h"
#include "utils/utils.h"
+#include "image/image.h"
+#include "image/bitmap.h"
+#include "image/gif.h"
+
typedef struct nsgif_content {
struct content base;
@@ -159,7 +160,7 @@ static void nsgif_animate(void *p)
delay = gif->gif->frames[gif->current_frame].frame_delay;
if (delay < nsoption_int(minimum_gif_delay))
delay = nsoption_int(minimum_gif_delay);
- schedule(delay, nsgif_animate, gif);
+ guit->browser->schedule(delay * 10, nsgif_animate, gif);
}
if ((!nsoption_bool(animate_images)) ||
@@ -292,7 +293,9 @@ static bool nsgif_convert(struct content *c)
/* Schedule the animation if we have one */
gif->current_frame = 0;
if (gif->gif->frame_count_partial > 1)
- schedule(gif->gif->frames[0].frame_delay, nsgif_animate, c);
+ guit->browser->schedule(gif->gif->frames[0].frame_delay * 10,
+ nsgif_animate,
+ c);
/* Exit as a success */
content_set_ready(c);
@@ -351,7 +354,7 @@ static void nsgif_destroy(struct content *c)
nsgif_content *gif = (nsgif_content *) c;
/* Free all the associated memory buffers */
- schedule_remove(nsgif_animate, c);
+ guit->browser->schedule(-1, nsgif_animate, c);
gif_finalise(gif->gif);
free(gif->gif);
}
diff --git a/image/image.c b/image/image.c
index becf221b9..81d53a3af 100644
--- a/image/image.c
+++ b/image/image.c
@@ -25,13 +25,13 @@
#include "utils/config.h"
#include "utils/log.h"
#include "desktop/plotters.h"
+#include "content/content.h"
#include "image/bitmap.h"
#include "image/bmp.h"
#include "image/gif.h"
#include "image/ico.h"
#include "image/jpeg.h"
-#include "image/mng.h"
#include "image/nssprite.h"
#include "image/png.h"
#include "image/rsvg.h"
@@ -73,18 +73,7 @@ nserror image_init(void)
return error;
#endif
-#ifdef WITH_MNG
- error = nsmng_init();
- if (error != NSERROR_OK)
- return error;
-
- error = nsjpng_init();
- if (error != NSERROR_OK)
- return error;
-#endif
-
#ifdef WITH_PNG
- /* Prefer libpng over libmng for pngs by registering later */
error = nspng_init();
if (error != NSERROR_OK)
return error;
diff --git a/image/image_cache.c b/image/image_cache.c
index c1369086f..051243944 100644
--- a/image/image_cache.c
+++ b/image/image_cache.c
@@ -22,7 +22,7 @@
#include <stdbool.h>
#include <string.h>
-#include "utils/schedule.h"
+#include "desktop/gui_factory.h"
#include "utils/log.h"
#include "content/content_protected.h"
@@ -290,9 +290,9 @@ static void image_cache__background_update(void *p)
image_cache__clean(icache);
- schedule((icache->params.bg_clean_time / 10),
- image_cache__background_update,
- icache);
+ guit->browser->schedule(icache->params.bg_clean_time,
+ image_cache__background_update,
+ icache);
}
/* exported interface documented in image_cache.h */
@@ -372,9 +372,9 @@ image_cache_init(const struct image_cache_parameters *image_cache_parameters)
image_cache->params = *image_cache_parameters;
- schedule((image_cache->params.bg_clean_time / 10),
- image_cache__background_update,
- image_cache);
+ guit->browser->schedule(image_cache->params.bg_clean_time,
+ image_cache__background_update,
+ image_cache);
LOG(("Image cache initilised with a limit of %d hysteresis of %d",
image_cache->params.limit, image_cache->params.hysteresis));
@@ -387,7 +387,7 @@ nserror image_cache_fini(void)
{
unsigned int op_count;
- schedule_remove(image_cache__background_update, image_cache);
+ guit->browser->schedule(-1, image_cache__background_update, image_cache);
LOG(("Size at finish %d (in %d)",
image_cache->total_bitmap_size,
diff --git a/image/image_cache.h b/image/image_cache.h
index 8a9fb896d..c0a3076b0 100644
--- a/image/image_cache.h
+++ b/image/image_cache.h
@@ -41,6 +41,8 @@
#include "desktop/plotters.h"
#include "image/bitmap.h"
+struct content_redraw_data;
+
typedef struct bitmap * (image_cache_convert_fn) (struct content *content);
struct image_cache_parameters {
diff --git a/image/mng.c b/image/mng.c
deleted file mode 100644
index 325d1d192..000000000
--- a/image/mng.c
+++ /dev/null
@@ -1,832 +0,0 @@
-/*
- * Copyright 2005 Richard Wilson <info@tinct.net>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/** \file
- * Content for image/mng, image/png, and image/jng (implementation).
- */
-
-#include <assert.h>
-#include <stdbool.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/time.h>
-#include <time.h>
-#include <libmng.h>
-#include "content/content_protected.h"
-#include "utils/nsoption.h"
-#include "desktop/plotters.h"
-#include "image/bitmap.h"
-#include "image/mng.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/schedule.h"
-#include "utils/utils.h"
-
-/* This implementation does not currently support dynamic MNGs or any
- * form of colour/gamma correction,
- */
-
-typedef struct nsmng_content
-{
- struct content base;
-
- bool opaque_test_pending;
- bool read_start;
- bool read_resume;
- int read_size;
- bool waiting;
- bool displayed;
- void *handle;
-
- struct bitmap *bitmap; /**< Created NetSurf bitmap */
-} nsmng_content;
-
-
-#ifndef MNG_INTERNAL_MEMMNGMT
-
-/**
- * Memory allocation callback for libmng.
- */
-
-static mng_ptr nsmng_alloc(mng_size_t n)
-{
- return calloc(1, n);
-}
-
-
-/**
- * Memory free callback for libmng.
- */
-
-static void nsmng_free(mng_ptr p, mng_size_t n)
-{
- free(p);
-}
-
-#endif
-
-/**
- * Broadcasts an error message and returns false
- *
- * \param c the content to broadcast for
- * \return Appropriate error
- */
-static nserror nsmng_broadcast_error(nsmng_content *c, mng_retcode code)
-{
- union content_msg_data msg_data;
- char error[100];
-
- assert(c != NULL);
-
- if (code == MNG_OUTOFMEMORY) {
- msg_data.error = messages_get("NoMemory");
- content_broadcast(&c->base, CONTENT_MSG_ERROR, msg_data);
- return NSERROR_NOMEM;
- }
-
- snprintf(error, sizeof error, messages_get("MNGError"), code);
- msg_data.error = error;
- content_broadcast(&c->base, CONTENT_MSG_ERROR, msg_data);
- return NSERROR_MNG_ERROR;
-}
-
-/* CALLBACKS REQUIRED FOR libmng READING */
-
-static mng_bool nsmng_openstream(mng_handle mng)
-{
- assert(mng != NULL);
- return MNG_TRUE;
-}
-
-static mng_bool nsmng_readdata(mng_handle mng, mng_ptr buffer, mng_uint32 size,
- mng_uint32 *bytesread)
-{
- nsmng_content *c;
- const char *data;
- unsigned long data_size;
-
- assert(mng != NULL);
- assert(buffer != NULL);
- assert(bytesread != NULL);
-
- /* Get our content back
- */
- c = (nsmng_content *) mng_get_userdata(mng);
- assert(c != NULL);
-
- /* Copy any data we have (maximum of 'size')
- */
- data = content__get_source_data(&c->base, &data_size);
-
- *bytesread = ((data_size - c->read_size) < size) ?
- (data_size - c->read_size) : size;
-
- if ((*bytesread) > 0) {
- memcpy(buffer, data + c->read_size, *bytesread);
- c->read_size += *bytesread;
- }
-
- /* Return success
- */
- return MNG_TRUE;
-}
-
-static mng_bool nsmng_closestream(mng_handle mng)
-{
- assert(mng != NULL);
- return MNG_TRUE;
-}
-
-static mng_bool nsmng_processheader(mng_handle mng, mng_uint32 width,
- mng_uint32 height)
-{
- nsmng_content *c;
- union content_msg_data msg_data;
- uint8_t *buffer;
-
- assert(mng != NULL);
-
- /* This function is called when the header has been read and we
- know the dimensions of the canvas.
- */
- c = (nsmng_content *) mng_get_userdata(mng);
- assert(c != NULL);
-
- c->bitmap = bitmap_create(width, height, BITMAP_NEW);
- if (c->bitmap == NULL) {
- msg_data.error = messages_get("NoMemory");
- content_broadcast(&c->base, CONTENT_MSG_ERROR, msg_data);
- LOG(("Insufficient memory to create canvas."));
- return MNG_FALSE;
- }
-
- /* Get the buffer to ensure that it is allocated and the calls in
- * nsmng_getcanvasline() succeed. */
- buffer = bitmap_get_buffer(c->bitmap);
- if (buffer == NULL) {
- msg_data.error = messages_get("NoMemory");
- content_broadcast(&c->base, CONTENT_MSG_ERROR, msg_data);
- LOG(("Insufficient memory to create canvas."));
- return MNG_FALSE;
- }
-
- /* Initialise the content size
- */
- c->base.width = width;
- c->base.height = height;
-
- /* Set the canvas style
- */
- if (mng_set_canvasstyle(mng, MNG_CANVAS_RGBA8) != MNG_NOERROR) {
- LOG(("Error setting canvas style."));
- }
-
- /* Return success
- */
- return MNG_TRUE;
-}
-
-
-/* END OF CALLBACKS REQUIRED FOR READING
-*/
-
-
-static bool nsmng_process_data(struct content *c, const char *data, unsigned int size)
-{
- nsmng_content *mng = (nsmng_content *) c;
- mng_retcode status;
-
- assert(c != NULL);
- assert(data != NULL);
-
- /* We only need to do any processing if we're starting/resuming reading.
- */
- if ((!mng->read_resume) && (!mng->read_start))
- return true;
-
- /* Try to start processing, or process some more data
- */
- if (mng->read_start) {
- status = mng_read(mng->handle);
- mng->read_start = false;
- } else {
- status = mng_read_resume(mng->handle);
- }
- mng->read_resume = (status == MNG_NEEDMOREDATA);
- if ((status != MNG_NOERROR) && (status != MNG_NEEDMOREDATA)) {
- LOG(("Failed to start/continue reading (%i).", status));
- return nsmng_broadcast_error(mng, status) == NSERROR_OK;
- }
-
- /* Continue onwards
- */
- return true;
-}
-
-/* START OF CALLBACKS REQUIRED FOR DISPLAYING
-*/
-
-
-static mng_ptr nsmng_getcanvasline(mng_handle mng, mng_uint32 line)
-{
- nsmng_content *c;
-
- assert(mng != NULL);
-
- /* Get our content back
- */
- c = (nsmng_content *) mng_get_userdata(mng);
- assert(c != NULL);
-
- /* Calculate the address
- */
- return bitmap_get_buffer(c->bitmap) +
- bitmap_get_rowstride(c->bitmap) * line;
-}
-
-static mng_bool nsmng_refresh(mng_handle mng, mng_uint32 x, mng_uint32 y,
- mng_uint32 w, mng_uint32 h)
-{
- union content_msg_data data;
- nsmng_content *c;
-
- assert(mng != NULL);
-
- /* Get our content back
- */
- c = (nsmng_content *) mng_get_userdata(mng);
- assert(c != NULL);
-
- /* Set the minimum redraw area
- */
- data.redraw.x = x;
- data.redraw.y = y;
- data.redraw.width = w;
- data.redraw.height = h;
-
- /* Set the redraw area to the whole canvas to ensure that if
- we can redraw something to trigger animation later then we do
- */
-/* data.redraw.x = 0;
- data.redraw.y = 0;
- data.redraw.width = c->width;
- data.redraw.height = c->height;
-*/
- /* Always redraw everything
- */
- data.redraw.full_redraw = true;
-
- /* Set the object characteristics
- */
- data.redraw.object = &c->base;
- data.redraw.object_x = 0;
- data.redraw.object_y = 0;
- data.redraw.object_width = c->base.width;
- data.redraw.object_height = c->base.height;
-
- /* Only attempt to force the redraw if we've been requested to
- * display the image in the first place (i.e. nsmng_redraw has
- * been called). This avoids the situation of forcibly redrawing
- * an image that shouldn't be shown (e.g. if the image is a fallback
- * for an object that can't be rendered)
- */
- if (c->displayed)
- content_broadcast(&c->base, CONTENT_MSG_REDRAW, data);
-
- return MNG_TRUE;
-}
-
-/**
- * Animates to the next frame
- */
-static void nsmng_animate(void *p)
-{
- nsmng_content *c;
-
- assert(p != NULL);
-
- c = (nsmng_content *) p;
-
- /* If we used the last animation we advance, if not we try again later
- */
- if (c->base.user_list->next == NULL) {
- c->waiting = true;
- } else {
- c->waiting = false;
- mng_display_resume(c->handle);
- c->opaque_test_pending = true;
- if (c->bitmap)
- bitmap_modified(c->bitmap);
- }
-}
-
-static mng_bool nsmng_settimer(mng_handle mng, mng_uint32 msecs)
-{
- nsmng_content *c;
-
- assert(mng != NULL);
-
- /* Get our content back
- */
- c = (nsmng_content *) mng_get_userdata(mng);
- assert(c != NULL);
-
- /* Perform the scheduling
- */
- schedule(msecs / 10, nsmng_animate, c);
- return MNG_TRUE;
-}
-
-/**
- * Get the wall-clock time in milliseconds since some fixed time.
- */
-
-static mng_uint32 nsmng_gettickcount(mng_handle mng)
-{
- static bool start = true;
- static time_t t0;
- struct timeval tv;
-#if defined(__SVR4) && defined(__sun) || defined(__NetBSD__) || \
- defined(__APPLE__)
- /* Solaris, NetBSD, and OS X don't have this structure, and ignore the
- * second parameter to gettimeofday()
- */
- int tz;
-#else
- struct timezone tz;
-#endif
- assert(mng != NULL);
-
- gettimeofday(&tv, &tz);
- if (start) {
- t0 = tv.tv_sec;
- start = false;
- }
-
- return (tv.tv_sec - t0) * 1000 + tv.tv_usec / 1000;
-}
-
-/* END OF CALLBACKS REQUIRED FOR DISPLAYING
-*/
-
-static mng_bool nsmng_errorproc(mng_handle mng, mng_int32 code,
- mng_int8 severity, mng_chunkid chunktype, mng_uint32 chunkseq,
- mng_int32 extra1, mng_int32 extra2, mng_pchar text)
-{
- nsmng_content *c;
- char chunk[5];
-
- assert(mng != NULL);
-
- c = (nsmng_content *) mng_get_userdata(mng);
- assert(c != NULL);
-
- chunk[0] = (char)((chunktype >> 24) & 0xFF);
- chunk[1] = (char)((chunktype >> 16) & 0xFF);
- chunk[2] = (char)((chunktype >> 8) & 0xFF);
- chunk[3] = (char)((chunktype ) & 0xFF);
- chunk[4] = '\0';
-
- LOG(("error playing '%s' chunk %s (%d):",
- content_get_url(&c->base), chunk, chunkseq));
- LOG(("code %d severity %d extra1 %d extra2 %d text:'%s'", code,
- severity, extra1, extra2, text));
-
- return (0);
-}
-
-static nserror nsmng_create_mng_data(nsmng_content *c)
-{
- mng_retcode code;
- union content_msg_data msg_data;
-
- assert(c != NULL);
-
- /* Initialise the library
- */
-#ifdef MNG_INTERNAL_MEMMNGMT
- c->handle = mng_initialize(c, MNG_NULL, MNG_NULL, MNG_NULL);
-#else
- c->handle = mng_initialize(c, nsmng_alloc, nsmng_free, MNG_NULL);
-#endif
- if (c->handle == MNG_NULL) {
- LOG(("Unable to initialise MNG library."));
- msg_data.error = messages_get("NoMemory");
- content_broadcast(&c->base, CONTENT_MSG_ERROR, msg_data);
- return NSERROR_NOMEM;
- }
-
- /* We need to decode in suspension mode
- */
- code = mng_set_suspensionmode(c->handle, MNG_TRUE);
- if (code) {
- LOG(("Unable to set suspension mode."));
- return nsmng_broadcast_error(c, code);
- }
-
- /* We need to register our callbacks
- */
- code = mng_setcb_openstream(c->handle, nsmng_openstream);
- if (code) {
- LOG(("Unable to set openstream callback."));
- return nsmng_broadcast_error(c, code);
- }
- code = mng_setcb_readdata(c->handle, nsmng_readdata);
- if (code) {
- LOG(("Unable to set readdata callback."));
- return nsmng_broadcast_error(c, code);
- }
- code = mng_setcb_closestream(c->handle, nsmng_closestream);
- if (code) {
- LOG(("Unable to set closestream callback."));
- return nsmng_broadcast_error(c, code);
- }
- code = mng_setcb_processheader(c->handle, nsmng_processheader);
- if (code) {
- LOG(("Unable to set processheader callback."));
- return nsmng_broadcast_error(c, code);
- }
-
- /* Register our callbacks for displaying
- */
- code = mng_setcb_getcanvasline(c->handle, nsmng_getcanvasline);
- if (code) {
- LOG(("Unable to set getcanvasline callback."));
- return nsmng_broadcast_error(c, code);
- }
- code = mng_setcb_refresh(c->handle, nsmng_refresh);
- if (code) {
- LOG(("Unable to set refresh callback."));
- return nsmng_broadcast_error(c, code);
- }
- code = mng_setcb_gettickcount(c->handle, nsmng_gettickcount);
- if (code) {
- LOG(("Unable to set gettickcount callback."));
- return nsmng_broadcast_error(c, code);
- }
- code = mng_setcb_settimer(c->handle, nsmng_settimer);
- if (code) {
- LOG(("Unable to set settimer callback."));
- return nsmng_broadcast_error(c, code);
- }
-
- /* register error handling function */
- code = mng_setcb_errorproc(c->handle, nsmng_errorproc);
- if (code) {
- LOG(("Unable to set errorproc"));
- return nsmng_broadcast_error(c, code);
- }
-
- /* Initialise the reading
- */
- c->read_start = true;
- c->read_resume = false;
- c->read_size = 0;
- c->waiting = false;
-
- c->displayed = false;
-
- return NSERROR_OK;
-}
-
-static nserror nsmng_create(const content_handler *handler,
- lwc_string *imime_type, const struct http_parameter *params,
- llcache_handle *llcache, const char *fallback_charset,
- bool quirks, struct content **c)
-{
- nsmng_content *mng;
- nserror error;
-
- mng = calloc(1, sizeof(nsmng_content));
- if (mng == NULL)
- return NSERROR_NOMEM;
-
- error = content__init(&mng->base, handler, imime_type, params,
- llcache, fallback_charset, quirks);
- if (error != NSERROR_OK) {
- free(mng);
- return error;
- }
-
- error = nsmng_create_mng_data(mng);
- if (error != NSERROR_OK) {
- free(mng);
- return error;
- }
-
- *c = (struct content *) mng;
-
- return NSERROR_OK;
-}
-
-
-
-static bool nsmng_convert(struct content *c)
-{
- nsmng_content *mng = (nsmng_content *) c;
- mng_retcode status;
- unsigned long size;
- char *title;
-
- assert(c != NULL);
-
- content__get_source_data(c, &size);
-
- /* by this point, the png should have been parsed
- * and the bitmap created, so ensure that's the case
- */
- if (mng->bitmap == NULL) {
- return nsmng_broadcast_error(mng, -1) == NSERROR_OK;
- }
-
-
- /* set title text */
- title = messages_get_buff("MNGTitle",
- nsurl_access_leaf(llcache_handle_get_url(c->llcache)),
- c->width, c->height);
- if (title != NULL) {
- content__set_title(c, title);
- free(title);
- }
-
- c->size += c->width * c->height * 4;
- content_set_ready(c);
- content_set_done(c);
- /* Done: update status bar */
- content_set_status(c, "");
-
- /* jmb: I'm really not sure that this should be here.
- * The *_convert functions are for converting a content into a
- * displayable format. They should not, however, do anything which
- * could cause the content to be displayed; the content may have
- * hidden visibility or be a fallback for an object; this
- * information is not available here (nor is there any need for it
- * to be).
- * The specific issue here is that mng_display calls the display
- * callbacks, which include nsmng_refresh. nsmng_refresh forces
- * a content to be redrawn regardless of whether it should be
- * displayed or not.
- */
- /* Start displaying
- */
- status = mng_display(mng->handle);
- if ((status != MNG_NOERROR) && (status != MNG_NEEDTIMERWAIT)) {
- LOG(("Unable to start display (%i)", status));
- return nsmng_broadcast_error(mng, status) == NSERROR_OK;
- }
- bitmap_modified(mng->bitmap);
-
- /* Optimise the plotting of MNG */
- mng->opaque_test_pending = false;
-
- return true;
-}
-
-static bool nsjpng_convert(struct content *c)
-{
- nsmng_content *mng = (nsmng_content *) c;
- mng_retcode status;
- unsigned long size;
- char *title;
- mng_handle handle;
-
- assert(c != NULL);
-
- content__get_source_data(c, &size);
-
- /* by this point, the png should have been parsed
- * and the bitmap created, so ensure that's the case
- */
- if (mng->bitmap == NULL) {
- return nsmng_broadcast_error(mng, -1) == NSERROR_OK;
- }
-
- /* set title text */
- title = messages_get_buff("PNGTitle",
- nsurl_access_leaf(llcache_handle_get_url(c->llcache)),
- c->width, c->height);
- if (title != NULL) {
- content__set_title(c, title);
- free(title);
- }
-
- c->size += c->width * c->height * 4;
- content_set_ready(c);
- content_set_done(c);
- /* Done: update status bar */
- content_set_status(c, "");
-
- /* jmb: I'm really not sure that this should be here.
- * The *_convert functions are for converting a content into a
- * displayable format. They should not, however, do anything which
- * could cause the content to be displayed; the content may have
- * hidden visibility or be a fallback for an object; this
- * information is not available here (nor is there any need for it
- * to be).
- * The specific issue here is that mng_display calls the display
- * callbacks, which include nsmng_refresh. nsmng_refresh forces
- * a content to be redrawn regardless of whether it should be
- * displayed or not.
- */
- /* Start displaying
- */
- status = mng_display(mng->handle);
- if ((status != MNG_NOERROR) && (status != MNG_NEEDTIMERWAIT)) {
- LOG(("Unable to start display (%i)", status));
- return nsmng_broadcast_error(mng, status) == NSERROR_OK;
- }
- bitmap_modified(mng->bitmap);
-
- /* Optimise the plotting of JNG/PNGs
- */
- mng->opaque_test_pending = true;
- bitmap_set_opaque(mng->bitmap, false);
-
- /* free associated memory */
-
- handle = mng->handle;
-
- mng_cleanup(&handle);
-
- mng->handle = NULL;
-
- return true;
-}
-
-static void nsmng_destroy(struct content *c)
-{
- nsmng_content *mng = (nsmng_content *) c;
-
- assert (c != NULL);
-
- /* Cleanup the MNG structure and release the canvas memory
- */
- schedule_remove(nsmng_animate, c);
-
- if (mng->handle != NULL) {
- mng_handle handle = mng->handle;
-
- mng_cleanup(&handle);
-
- mng->handle = NULL;
- }
-
- if (mng->bitmap) {
- bitmap_destroy(mng->bitmap);
- }
-}
-
-
-static bool nsmng_redraw(struct content *c, struct content_redraw_data *data,
- const struct rect *clip, const struct redraw_context *ctx)
-{
- nsmng_content *mng = (nsmng_content *) c;
- bool ret;
- bitmap_flags_t flags = BITMAPF_NONE;
-
- /* mark image as having been requested to display */
- mng->displayed = true;
-
- if ((mng->bitmap) &&
- (mng->opaque_test_pending)) {
- bitmap_set_opaque(mng->bitmap, bitmap_test_opaque(mng->bitmap));
- mng->opaque_test_pending = false;
- }
-
- if (data->repeat_x)
- flags |= BITMAPF_REPEAT_X;
- if (data->repeat_y)
- flags |= BITMAPF_REPEAT_Y;
-
- ret = ctx->plot->bitmap(data->x, data->y, data->width, data->height,
- mng->bitmap, data->background_colour, flags);
-
- /* Check if we need to restart the animation */
- if ((mng->waiting) &&
- (nsoption_bool(animate_images))) {
- nsmng_animate(c);
- }
-
- return ret;
-}
-
-
-static nserror nsmng_clone(const struct content *old, struct content **newc)
-{
- nsmng_content *mng;
- nserror error;
- const char *data;
- unsigned long size;
-
- mng = calloc(1, sizeof(nsmng_content));
- if (mng == NULL)
- return NSERROR_NOMEM;
-
- error = content__clone(old, &mng->base);
- if (error != NSERROR_OK) {
- content_destroy(&mng->base);
- return error;
- }
-
- /* Simply replay create/process/convert */
- error = nsmng_create_mng_data(mng);
- if (error != NSERROR_OK) {
- content_destroy(&mng->base);
- return error;
- }
-
- data = content__get_source_data(&mng->base, &size);
- if (size > 0) {
- if (nsmng_process_data(&mng->base, data, size) == false) {
- content_destroy(&mng->base);
- return NSERROR_CLONE_FAILED;
- }
- }
-
- if (old->status == CONTENT_STATUS_READY ||
- old->status == CONTENT_STATUS_DONE) {
- if (nsmng_convert(&mng->base) == false) {
- content_destroy(&mng->base);
- return NSERROR_CLONE_FAILED;
- }
- }
-
- *newc = (struct content *) mng;
-
- return NSERROR_OK;
-}
-
-static void *nsmng_get_internal(const struct content *c, void *context)
-{
- nsmng_content *mng = (nsmng_content *)c;
-
- return mng->bitmap;
-}
-
-static content_type nsmng_content_type(void)
-{
- return CONTENT_IMAGE;
-}
-
-/* register handler for mng types */
-static const content_handler nsmng_content_handler = {
- .create = nsmng_create,
- .process_data = nsmng_process_data,
- .data_complete = nsmng_convert,
- .destroy = nsmng_destroy,
- .redraw = nsmng_redraw,
- .clone = nsmng_clone,
- .get_internal = nsmng_get_internal,
- .type = nsmng_content_type,
- .no_share = false,
-};
-
-static const char *nsmng_types[] = {
- /* MNG types*/
- "image/mng",
- "image/x-mng",
- "video/mng",
- "video/x-mng",
-};
-
-CONTENT_FACTORY_REGISTER_TYPES(nsmng, nsmng_types, nsmng_content_handler);
-
-/* register handler for jng and png types */
-static const content_handler nsjpng_content_handler = {
- .create = nsmng_create,
- .process_data = nsmng_process_data,
- .data_complete = nsjpng_convert,
- .destroy = nsmng_destroy,
- .redraw = nsmng_redraw,
- .clone = nsmng_clone,
- .get_internal = nsmng_get_internal,
- .type = nsmng_content_type,
- .no_share = false,
-};
-
-
-static const char *nsjpng_types[] = {
- /* JNG types*/
- "image/jng",
- "image/x-jng",
- /* PNG types*/
- "image/png",
- "image/x-png"
-};
-
-CONTENT_FACTORY_REGISTER_TYPES(nsjpng, nsjpng_types, nsjpng_content_handler);
diff --git a/javascript/Makefile b/javascript/Makefile
index 693ed6541..04eed66b6 100644
--- a/javascript/Makefile
+++ b/javascript/Makefile
@@ -54,12 +54,12 @@ ifeq ($(WANT_JS_SOURCE),YES)
S_JSAPI :=
-S_JAVASCRIPT += content.c jsapi.c $(addprefix jsapi/,$(S_JSAPI))
+S_JAVASCRIPT += content.c jsapi.c fetcher.c $(addprefix jsapi/,$(S_JSAPI))
$(eval $(foreach V,$(filter JSAPI_BINDING_%,$(.VARIABLES)),$(call convert_jsapi_binding,$($(V)),$(OBJROOT)/$(patsubst JSAPI_BINDING_%,%,$(V)).c,$(OBJROOT)/$(patsubst JSAPI_BINDING_%,%,$(V)).h,$(patsubst JSAPI_BINDING_%,%,$(V))_jsapi)))
else
-S_JAVASCRIPT += none.c
+S_JAVASCRIPT += none.c fetcher.c
endif
S_JAVASCRIPT := $(addprefix javascript/,$(S_JAVASCRIPT)) $(S_JSAPI_BINDING) \ No newline at end of file
diff --git a/javascript/fetcher.c b/javascript/fetcher.c
new file mode 100644
index 000000000..690751cd3
--- /dev/null
+++ b/javascript/fetcher.c
@@ -0,0 +1,238 @@
+/*
+ * Copyright 2012 Vincent Sanders <vince@kyllikki.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * implementation for javascript scheme fetcher
+ *
+ * This fetcher implements http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#javascript-protocol
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <assert.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <inttypes.h>
+#include <string.h>
+#include <strings.h>
+#include <time.h>
+#include <stdio.h>
+#include <dirent.h>
+#include <limits.h>
+#include <stdarg.h>
+
+#include <libwapcaplet/libwapcaplet.h>
+
+#include "utils/config.h"
+#include "utils/errors.h"
+#include "utils/corestrings.h"
+#include "utils/nsoption.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/utils.h"
+#include "utils/ring.h"
+#include "desktop/gui_factory.h"
+
+#include "content/fetch.h"
+#include "content/fetchers.h"
+#include "javascript/fetcher.h"
+#include "content/urldb.h"
+
+/** Context for an resource fetch */
+struct fetch_javascript_context {
+ struct fetch_javascript_context *r_next, *r_prev;
+
+ struct fetch *fetchh; /**< Handle for this fetch */
+
+ bool aborted; /**< Flag indicating fetch has been aborted */
+ bool locked; /**< Flag indicating entry is already entered */
+
+ nsurl *url;
+};
+
+static struct fetch_javascript_context *ring = NULL;
+
+
+/** issue fetch callbacks with locking */
+static inline bool fetch_javascript_send_callback(const fetch_msg *msg,
+ struct fetch_javascript_context *ctx)
+{
+ ctx->locked = true;
+ fetch_send_callback(msg, ctx->fetchh);
+ ctx->locked = false;
+
+ return ctx->aborted;
+}
+
+
+/**
+ * called from poll to progress fetch.
+ *
+ * \todo This is currently completely unimplemented and just returns 204
+ */
+static bool fetch_javascript_handler(struct fetch_javascript_context *ctx)
+{
+ fetch_msg msg;
+ int code = 204;
+
+ /* content is going to return error code */
+ fetch_set_http_code(ctx->fetchh, code);
+
+ msg.type = FETCH_FINISHED;
+ fetch_javascript_send_callback(&msg, ctx);
+
+ return true;
+}
+
+
+
+/** callback to initialise the resource fetcher. */
+static bool fetch_javascript_initialise(lwc_string *scheme)
+{
+ return true;
+}
+
+/** callback to finalise the resource fetcher. */
+static void fetch_javascript_finalise(lwc_string *scheme)
+{
+}
+
+static bool fetch_javascript_can_fetch(const nsurl *url)
+{
+ return true;
+}
+
+/** callback to set up a resource fetch context. */
+static void *
+fetch_javascript_setup(struct fetch *fetchh,
+ nsurl *url,
+ bool only_2xx,
+ bool downgrade_tls,
+ const char *post_urlenc,
+ const struct fetch_multipart_data *post_multipart,
+ const char **headers)
+{
+ struct fetch_javascript_context *ctx;
+
+ ctx = calloc(1, sizeof(*ctx));
+ if (ctx == NULL)
+ return NULL;
+
+ ctx->url = nsurl_ref(url);
+
+ ctx->fetchh = fetchh;
+
+ RING_INSERT(ring, ctx);
+
+ return ctx;
+}
+
+/** callback to free a resource fetch */
+static void fetch_javascript_free(void *ctx)
+{
+ struct fetch_javascript_context *c = ctx;
+ if (c->url != NULL) {
+ nsurl_unref(c->url);
+ }
+ RING_REMOVE(ring, c);
+ free(ctx);
+}
+
+/** callback to start a resource fetch */
+static bool fetch_javascript_start(void *ctx)
+{
+ return true;
+}
+
+/** callback to abort a resource fetch */
+static void fetch_javascript_abort(void *ctx)
+{
+ struct fetch_javascript_context *c = ctx;
+
+ /* To avoid the poll loop having to deal with the fetch context
+ * disappearing from under it, we simply flag the abort here.
+ * The poll loop itself will perform the appropriate cleanup.
+ */
+ c->aborted = true;
+}
+
+
+/** callback to poll for additional resource fetch contents */
+static void fetch_javascript_poll(lwc_string *scheme)
+{
+ struct fetch_javascript_context *c, *next;
+
+ if (ring == NULL) return;
+
+ /* Iterate over ring, processing each pending fetch */
+ c = ring;
+ do {
+ /* Ignore fetches that have been flagged as locked.
+ * This allows safe re-entrant calls to this function.
+ * Re-entrancy can occur if, as a result of a callback,
+ * the interested party causes fetch_poll() to be called
+ * again.
+ */
+ if (c->locked == true) {
+ next = c->r_next;
+ continue;
+ }
+
+ /* Only process non-aborted fetches */
+ if (c->aborted == false) {
+ /* resource fetches can be processed in one go */
+ fetch_javascript_handler(c);
+ }
+
+ /* Compute next fetch item at the last possible moment
+ * as processing this item may have added to the ring
+ */
+ next = c->r_next;
+
+ fetch_remove_from_queues(c->fetchh);
+ fetch_free(c->fetchh);
+
+ /* Advance to next ring entry, exiting if we've reached
+ * the start of the ring or the ring has become empty
+ */
+ } while ( (c = next) != ring && ring != NULL);
+}
+
+/**
+ * Register javascript scheme fetcher with fetcher factory.
+ *
+ * \return NSERROR_OK on success or appropriate error code on faliure.
+*/
+nserror fetch_javascript_register(void)
+{
+ lwc_string *scheme = lwc_string_ref(corestring_lwc_javascript);
+ const struct fetcher_operation_table fetcher_ops = {
+ .initialise = fetch_javascript_initialise,
+ .acceptable = fetch_javascript_can_fetch,
+ .setup = fetch_javascript_setup,
+ .start = fetch_javascript_start,
+ .abort = fetch_javascript_abort,
+ .free = fetch_javascript_free,
+ .poll = fetch_javascript_poll,
+ .finalise = fetch_javascript_finalise
+ };
+
+ return fetcher_add(scheme, &fetcher_ops);
+}
diff --git a/javascript/fetcher.h b/javascript/fetcher.h
new file mode 100644
index 000000000..f39714089
--- /dev/null
+++ b/javascript/fetcher.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf.
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * javascript scheme handler
+ */
+
+#ifndef NETSURF_JAVASCRIPT_FETCHER_H
+#define NETSURF_JAVASCRIPT_FETCHER_H
+
+nserror fetch_javascript_register(void);
+
+#endif
diff --git a/javascript/jsapi/location.bnd b/javascript/jsapi/location.bnd
index af76836f5..f64f6330e 100644
--- a/javascript/jsapi/location.bnd
+++ b/javascript/jsapi/location.bnd
@@ -62,8 +62,7 @@ operation assign %{
browser_window_navigate(bw,
joined,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -84,7 +83,7 @@ operation replace %{
browser_window_navigate(bw,
joined,
NULL,
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_NONE,
NULL,
NULL,
NULL);
@@ -129,7 +128,7 @@ setter href %{
browser_window_navigate(bw,
joined,
NULL,
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_NONE,
NULL,
NULL,
NULL);
diff --git a/monkey/401login.c b/monkey/401login.c
index 605a21aa9..8b4d33d7d 100644
--- a/monkey/401login.c
+++ b/monkey/401login.c
@@ -16,12 +16,13 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "desktop/401login.h"
#include "utils/ring.h"
#include <stdlib.h>
#include <stdio.h>
+#include "monkey/401login.h"
+
typedef struct monkey401 {
struct monkey401 *r_next, *r_prev;
uint32_t num;
diff --git a/monkey/401login.h b/monkey/401login.h
new file mode 100644
index 000000000..e78355ea2
--- /dev/null
+++ b/monkey/401login.h
@@ -0,0 +1,9 @@
+
+#include <stdbool.h>
+
+#include "utils/nsurl.h"
+#include "utils/errors.h"
+
+
+void gui_401login_open(nsurl *url, const char *realm,
+ nserror (*cb)(bool proceed, void *pw), void *cbpw);
diff --git a/monkey/Makefile.defaults b/monkey/Makefile.defaults
index 659c1e336..d6a90a3dc 100644
--- a/monkey/Makefile.defaults
+++ b/monkey/Makefile.defaults
@@ -2,12 +2,12 @@
# Monkey-specific options
# ----------------------------------------------------------------------------
- # How did I get mixed up with this fucking monkey anyhow?
- NETSURF_MONKEY_RESOURCES := $(PREFIX)/share/netsurf/
- NETSURF_MONKEY_BIN := $(PREFIX)/bin/
- NETSURF_USE_RSVG := NO
- NETSURF_USE_NSSVG := NO
- NETSURF_USE_ROSPRITE := NO
- NETSURF_USE_HARU_PDF := NO
- NETSURF_USE_LIBICONV_PLUG := NO
- CFLAGS += -O2
+# How did I get mixed up with this fucking monkey anyhow?
+NETSURF_MONKEY_RESOURCES := $(PREFIX)/share/netsurf/
+NETSURF_MONKEY_BIN := $(PREFIX)/bin/
+NETSURF_USE_RSVG := NO
+NETSURF_USE_NSSVG := NO
+NETSURF_USE_ROSPRITE := NO
+NETSURF_USE_HARU_PDF := NO
+
+CFLAGS += -O2
diff --git a/monkey/Makefile.target b/monkey/Makefile.target
index 6c60ca1c5..d3c974782 100644
--- a/monkey/Makefile.target
+++ b/monkey/Makefile.target
@@ -33,25 +33,19 @@ $(eval $(call pkg_config_find_and_add_enabled,JS,mozilla-js,JavaScript))
# no pkg-config for this library
$(eval $(call feature_enabled,WEBP,-DWITH_WEBP,-lwebp -lvpx,WebP (libwebp)))
-WARNFLAGS += -Werror
+CWARNFLAGS += -Werror
-MONKEYCFLAGS := -std=c99 -Dmonkey -Dnsmonkey \
- -D_BSD_SOURCE \
- -D_XOPEN_SOURCE=600 \
- -D_POSIX_C_SOURCE=200112L \
- -D_NETBSD_SOURCE \
- -DMONKEY_RESPATH=\"$(NETSURF_MONKEY_RESOURCES)\" \
- $(WARNFLAGS) -g \
- $(shell $(PKG_CONFIG) --cflags glib-2.0) \
- $(shell $(PKG_CONFIG) --cflags libdom libcurl) \
- $(shell $(PKG_CONFIG) --cflags openssl) \
- $(shell xml2-config --cflags)
+CFLAGS += -std=c99 -Dmonkey -Dnsmonkey -g \
+ -D_BSD_SOURCE \
+ -D_XOPEN_SOURCE=600 \
+ -D_POSIX_C_SOURCE=200112L \
+ -D_NETBSD_SOURCE \
+ -DMONKEY_RESPATH=\"$(NETSURF_MONKEY_RESOURCES)\" \
+ $(shell $(PKG_CONFIG) --cflags glib-2.0) \
+ $(shell $(PKG_CONFIG) --cflags libdom libcurl) \
+ $(shell $(PKG_CONFIG) --cflags openssl)
-MONKEYLDFLAGS := -lm $(shell $(PKG_CONFIG) --cflags --libs glib-2.0 lcms)
-
-
-CFLAGS += $(MONKEYCFLAGS)
-LDFLAGS += $(MONKEYLDFLAGS)
+LDFLAGS += -lm $(shell $(PKG_CONFIG) --cflags --libs glib-2.0)
# ---------------------------------------------------------------------------
# Windows flag setup
@@ -68,7 +62,7 @@ endif
# S_MONKEY are sources purely for the MONKEY build
S_MONKEY := main.c utils.c filetype.c schedule.c \
bitmap.c plot.c browser.c download.c thumbnail.c \
- 401login.c cert.c font.c poll.c dispatch.c
+ 401login.c cert.c font.c poll.c dispatch.c fetch.c
S_MONKEY := $(addprefix monkey/,$(S_MONKEY))
diff --git a/monkey/browser.c b/monkey/browser.c
index 09ecf4b11..0e488c578 100644
--- a/monkey/browser.c
+++ b/monkey/browser.c
@@ -64,19 +64,13 @@ monkey_find_window_by_content(hlcache_handle *content)
return ret;
}
-void
-monkey_window_process_reformats(void)
+
+/**
+ * callback from core to reformat a window.
+ */
+static void monkey_window_reformat(struct gui_window *gw)
{
- RING_ITERATE_START(struct gui_window, gw_ring, c_ring) {
- if (c_ring == NULL)
- RING_ITERATE_STOP(gw_ring, c_ring);
- if (c_ring->bw->reformat_pending) {
- browser_window_reformat(c_ring->bw,
- false,
- c_ring->width,
- c_ring->height);
- }
- } RING_ITERATE_END(gw_ring, c_ring);
+ browser_window_reformat(gw->bw, false, gw->width, gw->height);
}
void
@@ -87,9 +81,10 @@ monkey_kill_browser_windows(void)
}
}
-struct gui_window *
-gui_create_browser_window(struct browser_window *bw,
- struct browser_window *clone, bool new_tab)
+static struct gui_window *
+gui_window_create(struct browser_window *bw,
+ struct gui_window *existing,
+ gui_window_create_flags flags)
{
struct gui_window *ret = calloc(sizeof(*ret), 1);
if (ret == NULL)
@@ -101,8 +96,9 @@ gui_create_browser_window(struct browser_window *bw,
ret->width = 800;
ret->height = 600;
- fprintf(stdout, "WINDOW NEW WIN %u FOR %p CLONE %p NEWTAB %s\n",
- ret->win_num, bw, clone, new_tab ? "TRUE" : "FALSE");
+ fprintf(stdout, "WINDOW NEW WIN %u FOR %p EXISTING %p NEWTAB %s CLONE %s\n",
+ ret->win_num, bw, existing, flags & GW_CREATE_TAB ? "TRUE" : "FALSE",
+ flags & GW_CREATE_CLONE ? "TRUE" : "FALSE");
fprintf(stdout, "WINDOW SIZE WIN %u WIDTH %d HEIGHT %d\n",
ret->win_num, ret->width, ret->height);
@@ -111,7 +107,7 @@ gui_create_browser_window(struct browser_window *bw,
return ret;
}
-void
+static void
gui_window_destroy(struct gui_window *g)
{
fprintf(stdout, "WINDOW DESTROY WIN %u\n", g->win_num);
@@ -119,19 +115,19 @@ gui_window_destroy(struct gui_window *g)
free(g);
}
-void
+static void
gui_window_set_title(struct gui_window *g, const char *title)
{
fprintf(stdout, "WINDOW TITLE WIN %u STR %s\n", g->win_num, title);
}
-void
+static void
gui_window_redraw_window(struct gui_window *g)
{
fprintf(stdout, "WINDOW REDRAW WIN %u\n", g->win_num);
}
-void
+static void
gui_window_get_dimensions(struct gui_window *g, int *width, int *height,
bool scaled)
{
@@ -141,31 +137,31 @@ gui_window_get_dimensions(struct gui_window *g, int *width, int *height,
*height = g->height;
}
-void
+static void
gui_window_new_content(struct gui_window *g)
{
fprintf(stdout, "WINDOW NEW_CONTENT WIN %u\n", g->win_num);
}
-void
+static void
gui_window_set_icon(struct gui_window *g, hlcache_handle *icon)
{
fprintf(stdout, "WINDOW NEW_ICON WIN %u\n", g->win_num);
}
-void
+static void
gui_window_start_throbber(struct gui_window *g)
{
fprintf(stdout, "WINDOW START_THROBBER WIN %u\n", g->win_num);
}
-void
+static void
gui_window_stop_throbber(struct gui_window *g)
{
fprintf(stdout, "WINDOW STOP_THROBBER WIN %u\n", g->win_num);
}
-void
+static void
gui_window_set_scroll(struct gui_window *g, int sx, int sy)
{
g->scrollx = sx;
@@ -173,7 +169,7 @@ gui_window_set_scroll(struct gui_window *g, int sx, int sy)
fprintf(stdout, "WINDOW SET_SCROLL WIN %u X %d Y %d\n", g->win_num, sx, sy);
}
-void
+static void
gui_window_update_box(struct gui_window *g, const struct rect *rect)
{
fprintf(stdout, "WINDOW UPDATE_BOX WIN %u X %d Y %d WIDTH %d HEIGHT %d\n",
@@ -182,7 +178,7 @@ gui_window_update_box(struct gui_window *g, const struct rect *rect)
}
-void
+static void
gui_window_update_extent(struct gui_window *g)
{
if (!g->bw->current_content)
@@ -194,13 +190,13 @@ gui_window_update_extent(struct gui_window *g)
content_get_height(g->bw->current_content));
}
-void
+static void
gui_window_set_status(struct gui_window *g, const char *text)
{
fprintf(stdout, "WINDOW SET_STATUS WIN %u STR %s\n", g->win_num, text);
}
-void
+static void
gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape)
{
const char *ptr_name = "UNKNOWN";
@@ -269,20 +265,13 @@ gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape)
fprintf(stdout, "WINDOW SET_POINTER WIN %u POINTER %s\n", g->win_num, ptr_name);
}
-void
+static void
gui_window_set_url(struct gui_window *g, const char *url)
{
fprintf(stdout, "WINDOW SET_URL WIN %u URL %s\n", g->win_num, url);
}
-void
-gui_drag_save_object(gui_save_type type, hlcache_handle *c,
- struct gui_window *g)
-{
- /* Ignore? */
-}
-
-bool
+static bool
gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
{
fprintf(stdout, "WINDOW GET_SCROLL WIN %u X %d Y %d\n",
@@ -292,7 +281,7 @@ gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
return true;
}
-bool
+static bool
gui_window_scroll_start(struct gui_window *g)
{
fprintf(stdout, "WINDOW SCROLL_START WIN %u\n", g->win_num);
@@ -300,12 +289,7 @@ gui_window_scroll_start(struct gui_window *g)
return true;
}
-void
-gui_window_set_search_ico(hlcache_handle *ico)
-{
-}
-
-void
+static void
gui_window_scroll_visible(struct gui_window *g, int x0, int y0,
int x1, int y1)
{
@@ -313,46 +297,7 @@ gui_window_scroll_visible(struct gui_window *g, int x0, int y0,
g->win_num, x0, y0, x1, y1);
}
-void
-gui_drag_save_selection(struct gui_window *g, const char *selection)
-{
-}
-
-void
-gui_start_selection(struct gui_window *g)
-{
-}
-
-void
-gui_clear_selection(struct gui_window *g)
-{
-}
-
-/**
- * Core asks front end for clipboard contents.
- *
- * \param buffer UTF-8 text, allocated by front end, ownership yeilded to core
- * \param length Byte length of UTF-8 text in buffer
- */
-void gui_get_clipboard(char **buffer, size_t *length)
-{
-}
-
-
-/**
- * Core tells front end to put given text in clipboard
- *
- * \param buffer UTF-8 text, owned by core
- * \param length Byte length of UTF-8 text in buffer
- * \param styles Array of styles given to text runs, owned by core, or NULL
- * \param n_styles Number of text run styles in array
- */
-void gui_set_clipboard(const char *buffer, size_t length,
- nsclipboard_styles styles[], int n_styles)
-{
-}
-
-void
+static void
gui_window_place_caret(struct gui_window *g, int x, int y, int height,
const struct rect *clip)
{
@@ -360,13 +305,13 @@ gui_window_place_caret(struct gui_window *g, int x, int y, int height,
g->win_num, x, y, height);
}
-void
+static void
gui_window_remove_caret(struct gui_window *g)
{
fprintf(stdout, "WINDOW REMOVE_CARET WIN %u\n", g->win_num);
}
-bool
+static bool
gui_window_drag_start(struct gui_window *g, gui_drag_type type,
const struct rect *rect)
{
@@ -374,15 +319,7 @@ gui_window_drag_start(struct gui_window *g, gui_drag_type type,
return false;
}
-void
-gui_create_form_select_menu(struct browser_window *bw,
- struct form_control *control)
-{
- fprintf(stdout, "WINDOW SELECT_MENU WIN %u\n",
- bw->window->win_num);
-}
-
-void
+static void
gui_window_save_link(struct gui_window *g, const char *url,
const char *title)
{
@@ -391,6 +328,7 @@ gui_window_save_link(struct gui_window *g, const char *url,
}
+
/**** Handlers ****/
static void
@@ -406,8 +344,7 @@ monkey_window_handle_new(int argc, char **argv)
error = nsurl_create(argv[2], &url);
}
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -466,8 +403,7 @@ monkey_window_handle_go(int argc, char **argv)
browser_window_navigate(gw->bw,
url,
ref_url,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -559,3 +495,32 @@ monkey_window_handle_command(int argc, char **argv)
}
}
+
+static struct gui_window_table window_table = {
+ .create = gui_window_create,
+ .destroy = gui_window_destroy,
+ .redraw = gui_window_redraw_window,
+ .update = gui_window_update_box,
+ .get_scroll = gui_window_get_scroll,
+ .set_scroll = gui_window_set_scroll,
+ .get_dimensions = gui_window_get_dimensions,
+ .update_extent = gui_window_update_extent,
+ .reformat = monkey_window_reformat,
+
+ .set_title = gui_window_set_title,
+ .set_url = gui_window_set_url,
+ .set_icon = gui_window_set_icon,
+ .set_status = gui_window_set_status,
+ .set_pointer = gui_window_set_pointer,
+ .place_caret = gui_window_place_caret,
+ .remove_caret = gui_window_remove_caret,
+ .drag_start = gui_window_drag_start,
+ .save_link = gui_window_save_link,
+ .scroll_visible = gui_window_scroll_visible,
+ .scroll_start = gui_window_scroll_start,
+ .new_content = gui_window_new_content,
+ .start_throbber = gui_window_start_throbber,
+ .stop_throbber = gui_window_stop_throbber,
+};
+
+struct gui_window_table *monkey_window_table = &window_table;
diff --git a/monkey/browser.h b/monkey/browser.h
index 3ccbe7a91..959c6a1e6 100644
--- a/monkey/browser.h
+++ b/monkey/browser.h
@@ -22,6 +22,9 @@
#include "desktop/browser.h"
#include "content/hlcache.h"
+extern struct gui_window_table *monkey_window_table;
+extern struct gui_download_table *monkey_download_table;
+
struct gui_window {
struct gui_window *r_next;
struct gui_window *r_prev;
@@ -42,4 +45,5 @@ void monkey_window_process_reformats(void);
void monkey_window_handle_command(int argc, char **argv);
void monkey_kill_browser_windows(void);
+
#endif /* NETSURF_MONKEY_BROWSER_H */
diff --git a/monkey/cert.c b/monkey/cert.c
index 0aa01f3a7..6f2172743 100644
--- a/monkey/cert.c
+++ b/monkey/cert.c
@@ -16,12 +16,15 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "desktop/gui.h"
-#include "utils/ring.h"
-
#include <stdlib.h>
#include <stdio.h>
+#include "utils/ring.h"
+#include "utils/nsurl.h"
+#include "desktop/gui.h"
+
+#include "monkey/cert.h"
+
typedef struct monkey_cert {
struct monkey_cert *r_next, *r_prev;
uint32_t num;
diff --git a/monkey/cert.h b/monkey/cert.h
new file mode 100644
index 000000000..2780f4f57
--- /dev/null
+++ b/monkey/cert.h
@@ -0,0 +1,4 @@
+void
+gui_cert_verify(nsurl *url, const struct ssl_cert_info *certs,
+ unsigned long num, nserror (*cb)(bool proceed, void *pw),
+ void *cbpw);
diff --git a/monkey/dispatch.c b/monkey/dispatch.c
index c1b3edce4..ba15fbd13 100644
--- a/monkey/dispatch.c
+++ b/monkey/dispatch.c
@@ -55,20 +55,34 @@ monkey_process_command(void)
char **argv = NULL;
char *p, *r = NULL;
handle_command_fn fn = NULL;
+ char **nargv;
if (fgets(buffer, PATH_MAX, stdin) == NULL) {
netsurf_quit = true;
+ return;
}
-
- buffer[strlen(buffer)-1] = '\0';
+
+ /* remove newline */
+ buffer[strlen(buffer) - 1] = '\0';
argv = malloc(sizeof *argv);
+ if (argv == NULL) {
+ return;
+ }
argc = 1;
*argv = buffer;
for (p = r = buffer; *p != '\0'; p++) {
if (*p == ' ') {
- argv = realloc(argv, sizeof(*argv) * (argc + 1));
+ nargv = realloc(argv, sizeof(*argv) * (argc + 1));
+ if (nargv == NULL) {
+ /* reallocation of argument vector failed, try using what is
+ * already processed.
+ */
+ break;
+ } else {
+ argv = nargv;
+ }
argv[argc++] = r = p + 1;
*p = '\0';
}
@@ -81,6 +95,9 @@ monkey_process_command(void)
}
} RING_ITERATE_END(handler_ring, handler);
- if (fn != NULL)
+ if (fn != NULL) {
fn(argc, argv);
+ }
+
+ free(argv);
}
diff --git a/monkey/download.c b/monkey/download.c
index d706dd6e0..721f77ddc 100644
--- a/monkey/download.c
+++ b/monkey/download.c
@@ -16,11 +16,13 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "desktop/browser.h"
-#include "monkey/browser.h"
+#include <stdio.h>
+
+#include "desktop/gui.h"
+#include "desktop/download.h"
#include "utils/ring.h"
-#include <stdio.h>
+#include "monkey/browser.h"
static uint32_t dwin_ctr = 0;
@@ -34,7 +36,7 @@ struct gui_download_window {
static struct gui_download_window *dw_ring = NULL;
-struct gui_download_window *
+static struct gui_download_window *
gui_download_window_create(download_context *ctx,
struct gui_window *parent)
{
@@ -52,7 +54,7 @@ gui_download_window_create(download_context *ctx,
return ret;
}
-nserror
+static nserror
gui_download_window_data(struct gui_download_window *dw,
const char *data, unsigned int size)
{
@@ -61,7 +63,7 @@ gui_download_window_data(struct gui_download_window *dw,
return NSERROR_OK;
}
-void
+static void
gui_download_window_error(struct gui_download_window *dw,
const char *error_msg)
{
@@ -69,7 +71,7 @@ gui_download_window_error(struct gui_download_window *dw,
dw->dwin_num, error_msg);
}
-void
+static void
gui_download_window_done(struct gui_download_window *dw)
{
fprintf(stdout, "DOWNLOAD_WINDOW DONE DWIN %u\n",
@@ -77,3 +79,12 @@ gui_download_window_done(struct gui_download_window *dw)
RING_REMOVE(dw_ring, dw);
free(dw);
}
+
+static struct gui_download_table download_table = {
+ .create = gui_download_window_create,
+ .data = gui_download_window_data,
+ .error = gui_download_window_error,
+ .done = gui_download_window_done,
+};
+
+struct gui_download_table *monkey_download_table = &download_table;
diff --git a/monkey/fetch.c b/monkey/fetch.c
new file mode 100644
index 000000000..88cb27dcf
--- /dev/null
+++ b/monkey/fetch.c
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdbool.h>
+#include <limits.h>
+
+#include "desktop/gui.h"
+#include "utils/file.h"
+#include "utils/nsurl.h"
+#include "utils/filepath.h"
+
+#include "monkey/filetype.h"
+#include "monkey/fetch.h"
+
+extern char **respaths;
+
+
+static nsurl *gui_get_resource_url(const char *path)
+{
+ char buf[PATH_MAX];
+ nsurl *url = NULL;
+
+ netsurf_path_to_nsurl(filepath_sfind(respaths, buf, path), &url);
+
+ return url;
+}
+
+static struct gui_fetch_table fetch_table = {
+ .filetype = monkey_fetch_filetype,
+
+ .get_resource_url = gui_get_resource_url,
+};
+
+struct gui_fetch_table *monkey_fetch_table = &fetch_table;
diff --git a/monkey/fetch.h b/monkey/fetch.h
new file mode 100644
index 000000000..59e8696d1
--- /dev/null
+++ b/monkey/fetch.h
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+struct gui_fetch_table *monkey_fetch_table;
diff --git a/monkey/filetype.c b/monkey/filetype.c
index f89f2358c..8c5037781 100644
--- a/monkey/filetype.c
+++ b/monkey/filetype.c
@@ -26,14 +26,15 @@
#include <sys/stat.h>
#include <unistd.h>
-#include "gtk/filetype.h"
#include "content/fetch.h"
#include "utils/log.h"
#include "utils/hashtable.h"
+#include "monkey/filetype.h"
+
static struct hash_table *mime_hash = NULL;
-void gtk_fetch_filetype_init(const char *mimefile)
+void monkey_fetch_filetype_init(const char *mimefile)
{
struct stat statbuf;
FILE *fh = NULL;
@@ -143,12 +144,21 @@ void gtk_fetch_filetype_init(const char *mimefile)
fclose(fh);
}
-void gtk_fetch_filetype_fin(void)
+void monkey_fetch_filetype_fin(void)
{
hash_destroy(mime_hash);
}
-const char *fetch_filetype(const char *unix_path)
+/**
+ * Determine the MIME type of a local file.
+ *
+ * @note used in file fetcher
+ *
+ * \param unix_path Unix style path to file on disk
+ * \return Pointer to static MIME type string (should not be freed) not NULL.
+ * invalidated on next call to fetch_filetype.
+ */
+const char *monkey_fetch_filetype(const char *unix_path)
{
struct stat statbuf;
char *ext;
@@ -157,9 +167,16 @@ const char *fetch_filetype(const char *unix_path)
const char *type;
int l;
- stat(unix_path, &statbuf);
- if (S_ISDIR(statbuf.st_mode))
+ if (stat(unix_path, &statbuf) != 0) {
+ /* error calling stat, the file has probably become
+ * inacessible, this routine cannot fail so just
+ * return the default mime type.
+ */
+ return "text/plain";
+ }
+ if (S_ISDIR(statbuf.st_mode)) {
return "application/x-netsurf-directory";
+ }
l = strlen(unix_path);
if ((3 < l) && (strcasecmp(unix_path + l - 4, ",f79") == 0)) {
@@ -175,8 +192,9 @@ const char *fetch_filetype(const char *unix_path)
while (*ptr != '.' && *ptr != '/')
ptr--;
- if (*ptr != '.')
+ if (*ptr != '.') {
return "text/plain";
+ }
ext = strdup(ptr + 1); /* skip the . */
@@ -195,11 +213,6 @@ const char *fetch_filetype(const char *unix_path)
return type != NULL ? type : "text/plain";
}
-char *fetch_mimetype(const char *unix_path)
-{
- return strdup(fetch_filetype(unix_path));
-}
-
#ifdef TEST_RIG
int main(int argc, char *argv[])
diff --git a/monkey/filetype.h b/monkey/filetype.h
index 8bf98db7c..6c16db01b 100644
--- a/monkey/filetype.h
+++ b/monkey/filetype.h
@@ -17,5 +17,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-void gtk_fetch_filetype_init(const char *mimefile);
-void gtk_fetch_filetype_fin(void);
+void monkey_fetch_filetype_init(const char *mimefile);
+void monkey_fetch_filetype_fin(void);
+const char *monkey_fetch_filetype(const char *unix_path);
diff --git a/monkey/main.c b/monkey/main.c
index 95432e3c7..08af69405 100644
--- a/monkey/main.c
+++ b/monkey/main.c
@@ -20,69 +20,57 @@
#include <stdio.h>
#include <stdlib.h>
-#include "monkey/filetype.h"
#include "utils/nsoption.h"
-#include "monkey/poll.h"
-#include "monkey/dispatch.h"
-#include "monkey/browser.h"
-
#include "content/urldb.h"
#include "content/fetchers/resource.h"
#include "desktop/gui.h"
#include "desktop/netsurf.h"
#include "utils/log.h"
#include "utils/filepath.h"
-#include "utils/url.h"
-static char **respaths; /** resource search path vector */
+#include "monkey/poll.h"
+#include "monkey/dispatch.h"
+#include "monkey/browser.h"
+#include "monkey/cert.h"
+#include "monkey/401login.h"
+#include "monkey/filetype.h"
+#include "monkey/fetch.h"
+#include "monkey/schedule.h"
+
+char **respaths; /** resource search path vector */
/* Stolen from gtk/gui.c */
static char **
nsmonkey_init_resource(const char *resource_path)
{
- const gchar * const *langv;
- char **pathv; /* resource path string vector */
- char **respath; /* resource paths vector */
+ const gchar * const *langv;
+ char **pathv; /* resource path string vector */
+ char **respath; /* resource paths vector */
- pathv = filepath_path_to_strvec(resource_path);
+ pathv = filepath_path_to_strvec(resource_path);
- langv = g_get_language_names();
+ langv = g_get_language_names();
- respath = filepath_generate(pathv, langv);
+ respath = filepath_generate(pathv, langv);
- filepath_free_strvec(pathv);
+ filepath_free_strvec(pathv);
- return respath;
-}
-
-void gui_quit(void)
-{
- urldb_save_cookies(nsoption_charp(cookie_jar));
- urldb_save(nsoption_charp(url_file));
- free(nsoption_charp(cookie_file));
- free(nsoption_charp(cookie_jar));
- gtk_fetch_filetype_fin();
+ return respath;
}
-nsurl *gui_get_resource_url(const char *path)
+static void monkey_quit(void)
{
- char buf[PATH_MAX];
- char *raw;
- nsurl *url = NULL;
-
- raw = path_to_url(filepath_sfind(respaths, buf, path));
- if (raw != NULL) {
- nsurl_create(raw, &url);
- free(raw);
- }
-
- return url;
+ urldb_save_cookies(nsoption_charp(cookie_jar));
+ urldb_save(nsoption_charp(url_file));
+ free(nsoption_charp(cookie_file));
+ free(nsoption_charp(cookie_jar));
+ monkey_fetch_filetype_fin();
}
-void
-gui_launch_url(const char *url)
+static nserror gui_launch_url(struct nsurl *url)
{
- fprintf(stdout, "GENERIC LAUNCH URL %s\n", url);
+ fprintf(stdout, "GENERIC LAUNCH URL %s\n", nsurl_access(url));
+ return NSERROR_OK;
}
static void quit_handler(int argc, char **argv)
@@ -113,6 +101,16 @@ static bool nslog_stream_configure(FILE *fptr)
return true;
}
+static struct gui_browser_table monkey_browser_table = {
+ .poll = monkey_poll,
+ .schedule = monkey_schedule,
+
+ .quit = monkey_quit,
+ .launch_url = gui_launch_url,
+ .cert_verify = gui_cert_verify,
+ .login = gui_401login_open,
+};
+
int
main(int argc, char **argv)
{
@@ -120,12 +118,23 @@ main(int argc, char **argv)
char *options;
char buf[PATH_MAX];
nserror ret;
+ struct netsurf_table monkey_table = {
+ .browser = &monkey_browser_table,
+ .window = monkey_window_table,
+ .download = monkey_download_table,
+ .fetch = monkey_fetch_table,
+ };
+
+ ret = netsurf_register(&monkey_table);
+ if (ret != NSERROR_OK) {
+ die("NetSurf operation table failed registration");
+ }
/* Unbuffer stdin/out/err */
setbuf(stdin, NULL);
setbuf(stdout, NULL);
setbuf(stderr, NULL);
-
+
/* Prep the search paths */
respaths = nsmonkey_init_resource("${HOME}/.netsurf/:${NETSURFRES}:"MONKEY_RESPATH":./monkey/res");
@@ -146,27 +155,27 @@ main(int argc, char **argv)
/* common initialisation */
messages = filepath_find(respaths, "Messages");
- ret = netsurf_init(messages);
+ ret = netsurf_init(messages, NULL);
free(messages);
if (ret != NSERROR_OK) {
die("NetSurf failed to initialise");
}
-
+
filepath_sfinddef(respaths, buf, "mime.types", "/etc/");
- gtk_fetch_filetype_init(buf);
-
+ monkey_fetch_filetype_init(buf);
+
urldb_load(nsoption_charp(url_file));
urldb_load_cookies(nsoption_charp(cookie_file));
-
+
monkey_prepare_input();
monkey_register_handler("QUIT", quit_handler);
monkey_register_handler("WINDOW", monkey_window_handle_command);
-
+
fprintf(stdout, "GENERIC STARTED\n");
netsurf_main_loop();
fprintf(stdout, "GENERIC CLOSING_DOWN\n");
monkey_kill_browser_windows();
-
+
netsurf_exit();
fprintf(stdout, "GENERIC FINISHED\n");
diff --git a/monkey/plot.c b/monkey/plot.c
index 76980ce5b..db4d6cd32 100644
--- a/monkey/plot.c
+++ b/monkey/plot.c
@@ -16,10 +16,10 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "desktop/plotters.h"
-
#include <stdio.h>
+#include "desktop/plotters.h"
+
static bool
monkey_plot_disc(int x, int y, int radius, const plot_style_t *style)
{
diff --git a/monkey/poll.c b/monkey/poll.c
index 024005b89..e65f2d3e2 100644
--- a/monkey/poll.c
+++ b/monkey/poll.c
@@ -22,7 +22,7 @@
#include "desktop/gui.h"
#include "monkey/schedule.h"
#include "monkey/browser.h"
-#include "content/fetchers/curl.h"
+#include "content/fetchers.h"
#include "monkey/dispatch.h"
#include "monkey/poll.h"
@@ -88,60 +88,45 @@ monkey_prepare_input(void)
}
void
-gui_poll(bool active)
+monkey_poll(bool active)
{
- CURLMcode code;
fd_set read_fd_set, write_fd_set, exc_fd_set;
int max_fd;
GPollFD *fd_list[1000];
unsigned int fd_count = 0;
bool block = true;
-
- schedule_run();
- if (browser_reformat_pending)
- block = false;
-
- if (active) {
- FD_ZERO(&read_fd_set);
- FD_ZERO(&write_fd_set);
- FD_ZERO(&exc_fd_set);
- code = curl_multi_fdset(fetch_curl_multi,
- &read_fd_set,
- &write_fd_set,
- &exc_fd_set,
- &max_fd);
- assert(code == CURLM_OK);
- LOG(("maxfd from curl is %d", max_fd));
- for (int i = 0; i <= max_fd; i++) {
- if (FD_ISSET(i, &read_fd_set)) {
- GPollFD *fd = malloc(sizeof *fd);
- fd->fd = i;
- fd->events = G_IO_IN | G_IO_HUP | G_IO_ERR;
- g_main_context_add_poll(0, fd, 0);
- fd_list[fd_count++] = fd;
- LOG(("Want to read %d", i));
- }
- if (FD_ISSET(i, &write_fd_set)) {
- GPollFD *fd = malloc(sizeof *fd);
- fd->fd = i;
- fd->events = G_IO_OUT | G_IO_ERR;
- g_main_context_add_poll(0, fd, 0);
- fd_list[fd_count++] = fd;
- LOG(("Want to write %d", i));
- }
- if (FD_ISSET(i, &exc_fd_set)) {
- GPollFD *fd = malloc(sizeof *fd);
- fd->fd = i;
- fd->events = G_IO_ERR;
- g_main_context_add_poll(0, fd, 0);
- fd_list[fd_count++] = fd;
- LOG(("Want to check %d", i));
- }
+ fetcher_fdset(&read_fd_set, &write_fd_set, &exc_fd_set, &max_fd);
+ for (int i = 0; i <= max_fd; i++) {
+ if (FD_ISSET(i, &read_fd_set)) {
+ GPollFD *fd = malloc(sizeof *fd);
+ fd->fd = i;
+ fd->events = G_IO_IN | G_IO_HUP | G_IO_ERR;
+ g_main_context_add_poll(0, fd, 0);
+ fd_list[fd_count++] = fd;
+ LOG(("Want to read %d", i));
+ }
+ if (FD_ISSET(i, &write_fd_set)) {
+ GPollFD *fd = malloc(sizeof *fd);
+ fd->fd = i;
+ fd->events = G_IO_OUT | G_IO_ERR;
+ g_main_context_add_poll(0, fd, 0);
+ fd_list[fd_count++] = fd;
+ LOG(("Want to write %d", i));
+ }
+ if (FD_ISSET(i, &exc_fd_set)) {
+ GPollFD *fd = malloc(sizeof *fd);
+ fd->fd = i;
+ fd->events = G_IO_ERR;
+ g_main_context_add_poll(0, fd, 0);
+ fd_list[fd_count++] = fd;
+ LOG(("Want to check %d", i));
}
}
-
- LOG(("Iterate %sactive %sblocking", active?"":"in", block?"":"non-"));
+
+ schedule_run();
+
+ LOG(("Iterate %sblocking", block?"":"non-"));
if (block) {
fprintf(stdout, "GENERIC POLL BLOCKING\n");
}
@@ -152,9 +137,5 @@ gui_poll(bool active)
free(fd_list[i]);
}
- schedule_run();
-
- if (browser_reformat_pending)
- monkey_window_process_reformats();
}
diff --git a/monkey/poll.h b/monkey/poll.h
index 1aebe6856..4195958c9 100644
--- a/monkey/poll.h
+++ b/monkey/poll.h
@@ -21,4 +21,6 @@
void monkey_prepare_input(void);
+void monkey_poll(bool active);
+
#endif /* NETSURF_MONKEY_POLL_H */
diff --git a/monkey/schedule.c b/monkey/schedule.c
index dd789331c..e8ec1c6fa 100644
--- a/monkey/schedule.c
+++ b/monkey/schedule.c
@@ -20,8 +20,9 @@
#include <stdlib.h>
#include <stdbool.h>
-#include "utils/schedule.h"
-#include "gtk/schedule.h"
+#include "utils/errors.h"
+
+#include "monkey/schedule.h"
#undef DEBUG_MONKEY_SCHEDULE
@@ -74,7 +75,7 @@ nsgtk_schedule_kill_callback(void *_target, void *_match)
}
}
-void
+static void
schedule_remove(void (*callback)(void *p), void *p)
{
_nsgtk_callback_t cb_match = {
@@ -90,20 +91,27 @@ schedule_remove(void (*callback)(void *p), void *p)
nsgtk_schedule_kill_callback, &cb_match);
}
-void
-schedule(int t, void (*callback)(void *p), void *p)
+nserror monkey_schedule(int t, void (*callback)(void *p), void *p)
{
- const int msec_timeout = t * 10;
- _nsgtk_callback_t *cb = malloc(sizeof(_nsgtk_callback_t));
+ _nsgtk_callback_t *cb;
+
/* Kill any pending schedule of this kind. */
schedule_remove(callback, p);
+ if (t < 0) {
+ return NSERROR_OK;
+ }
+
+ cb = malloc(sizeof(_nsgtk_callback_t));
cb->callback = callback;
cb->context = p;
cb->callback_killed = false;
/* Prepend is faster right now. */
- LOG(("queued a callback to %p(%p) for %d msecs time", callback, p, msec_timeout));
+ LOG(("queued a callback to %p(%p) for %d msecs time", callback, p, t));
queued_callbacks = g_list_prepend(queued_callbacks, cb);
- g_timeout_add(msec_timeout, nsgtk_schedule_generic_callback, cb);
+ g_timeout_add(t, nsgtk_schedule_generic_callback, cb);
+
+ return NSERROR_OK;
+
}
bool
diff --git a/monkey/schedule.h b/monkey/schedule.h
index c63215e88..44ef9bf3b 100644
--- a/monkey/schedule.h
+++ b/monkey/schedule.h
@@ -19,7 +19,8 @@
#ifndef NETSURF_GTK_CALLBACK_H
#define NETSURF_GTK_CALLBACK_H 1
-typedef void (*gtk_callback)(void *p);
+nserror monkey_schedule(int t, void (*callback)(void *p), void *p);
+
bool schedule_run(void);
#endif /* NETSURF_GTK_CALLBACK_H */
diff --git a/monkey/utils.c b/monkey/utils.c
index 3e09106f7..e1a702f2f 100644
--- a/monkey/utils.c
+++ b/monkey/utils.c
@@ -22,92 +22,6 @@
#include "utils/config.h"
#include "utils/utils.h"
-#include "utils/url.h"
-#include "utils/utf8.h"
-
-char *path_to_url(const char *path)
-{
- int urllen;
- char *url;
-
- if (path == NULL) {
- return NULL;
- }
-
- urllen = strlen(path) + FILE_SCHEME_PREFIX_LEN + 1;
-
- url = malloc(urllen);
- if (url == NULL) {
- return NULL;
- }
-
- if (*path == '/') {
- path++; /* file: paths are already absolute */
- }
-
- snprintf(url, urllen, "%s%s", FILE_SCHEME_PREFIX, path);
-
- return url;
-}
-
-char *url_to_path(const char *url)
-{
- char *path;
- char *respath;
- url_func_result res; /* result from url routines */
-
- res = url_path(url, &path);
- if (res != URL_FUNC_OK) {
- return NULL;
- }
-
- res = url_unescape(path, &respath);
- free(path);
- if (res != URL_FUNC_OK) {
- return NULL;
- }
-
- return respath;
-}
-
-/**
- * Return the filename part of a full path
- *
- * \param path full path and filename
- * \return filename (will be freed with free())
- */
-
-char *filename_from_path(char *path)
-{
- char *leafname;
-
- leafname = strrchr(path, '/');
- if (!leafname)
- leafname = path;
- else
- leafname += 1;
-
- return strdup(leafname);
-}
-
-/**
- * Add a path component/filename to an existing path
- *
- * \param path buffer containing path + free space
- * \param length length of buffer "path"
- * \param newpart string containing path component to add to path
- * \return true on success
- */
-
-bool path_add_part(char *path, int length, const char *newpart)
-{
- if(path[strlen(path) - 1] != '/')
- strncat(path, "/", length);
-
- strncat(path, newpart, length);
-
- return true;
-}
void warn_user(const char *warning, const char *detail)
{
@@ -119,21 +33,3 @@ void die(const char * const error)
fprintf(stderr, "DIE %s\n", error);
exit(EXIT_FAILURE);
}
-
-utf8_convert_ret
-utf8_to_local_encoding(const char *string, size_t len,
- char **result)
-{
- *result = strndup(string, len);
- return (*result == NULL) ? UTF8_CONVERT_NOMEM : UTF8_CONVERT_OK;
-}
-
-utf8_convert_ret
-utf8_from_local_encoding(const char *string, size_t len,
- char **result)
-{
- *result = strndup(string, len);
- return (*result == NULL) ? UTF8_CONVERT_NOMEM : UTF8_CONVERT_OK;
-}
-
-
diff --git a/render/Makefile b/render/Makefile
index 12f0314fd..148c2c39d 100644
--- a/render/Makefile
+++ b/render/Makefile
@@ -1,10 +1,9 @@
# Render sources
S_RENDER := box.c box_construct.c box_normalise.c box_textarea.c \
- font.c form.c imagemap.c layout.c list.c search.c table.c \
- textplain.c \
+ font.c form.c imagemap.c layout.c search.c table.c textplain.c \
html.c html_css.c html_css_fetcher.c html_script.c \
html_interaction.c html_redraw.c html_forms.c html_object.c
-S_RENDER := $(addprefix render/,$(S_RENDER)) \ No newline at end of file
+S_RENDER := $(addprefix render/,$(S_RENDER))
diff --git a/render/box.c b/render/box.c
index 295308b5a..fb8a66c4b 100644
--- a/render/box.c
+++ b/render/box.c
@@ -42,14 +42,6 @@
#include "utils/talloc.h"
#include "utils/utils.h"
-static bool box_contains_point(struct box *box, int x, int y, bool *physically);
-static bool box_nearer_text_box(struct box *box, int bx, int by,
- int x, int y, int dir, struct box **nearest, int *tx, int *ty,
- int *nr_xd, int *nr_yd);
-static bool box_nearest_text_box(struct box *box, int bx, int by,
- int fx, int fy, int x, int y, int dir, struct box **nearest,
- int *tx, int *ty, int *nr_xd, int *nr_yd);
-
#define box_is_float(box) (box->type == BOX_FLOAT_LEFT || \
box->type == BOX_FLOAT_RIGHT)
@@ -344,150 +336,11 @@ void box_bounds(struct box *box, struct rect *r)
/**
- * Find the boxes at a point.
- *
- * \param box box to search children of
- * \param x point to find, in global document coordinates
- * \param y point to find, in global document coordinates
- * \param box_x position of box, in global document coordinates, updated
- * to position of returned box, if any
- * \param box_y position of box, in global document coordinates, updated
- * to position of returned box, if any
- * \return box at given point, or 0 if none found
- *
- * To find all the boxes in the hierarchy at a certain point, use code like
- * this:
- * \code
- * struct box *box = top_of_document_to_search;
- * int box_x = 0, box_y = 0;
- *
- * while ((box = box_at_point(box, x, y, &box_x, &box_y))) {
- * // process box
- * }
- * \endcode
- */
-
-struct box *box_at_point(struct box *box, const int x, const int y,
- int *box_x, int *box_y)
-{
- int bx = *box_x, by = *box_y;
- struct box *child, *sibling;
- bool physically;
-
- assert(box);
-
- /* consider floats first, since they will often overlap other boxes */
- for (child = box->float_children; child; child = child->next_float) {
- if (box_contains_point(child, x - bx, y - by, &physically)) {
- *box_x = bx + child->x -
- scrollbar_get_offset(child->scroll_x);
- *box_y = by + child->y -
- scrollbar_get_offset(child->scroll_y);
-
- if (physically)
- return child;
- else
- return box_at_point(child, x, y, box_x, box_y);
- }
- }
-
-non_float_children:
- /* non-float children */
- for (child = box->children; child; child = child->next) {
- if (box_is_float(child))
- continue;
- if (box_contains_point(child, x - bx, y - by, &physically)) {
- *box_x = bx + child->x -
- scrollbar_get_offset(child->scroll_x);
- *box_y = by + child->y -
- scrollbar_get_offset(child->scroll_y);
-
- if (physically)
- return child;
- else
- return box_at_point(child, x, y, box_x, box_y);
- }
- }
-
- /* marker boxes */
- if (box->list_marker) {
- if (box_contains_point(box->list_marker, x - bx, y - by,
- &physically)) {
- *box_x = bx + box->list_marker->x;
- *box_y = by + box->list_marker->y;
- return box->list_marker;
- }
- }
-
- /* siblings and siblings of ancestors */
- while (box) {
- if (box_is_float(box)) {
- bx -= box->x - scrollbar_get_offset(box->scroll_x);
- by -= box->y - scrollbar_get_offset(box->scroll_y);
- for (sibling = box->next_float; sibling;
- sibling = sibling->next_float) {
- if (box_contains_point(sibling,
- x - bx, y - by, &physically)) {
- *box_x = bx + sibling->x -
- scrollbar_get_offset(
- sibling->scroll_x);
- *box_y = by + sibling->y -
- scrollbar_get_offset(
- sibling->scroll_y);
-
- if (physically)
- return sibling;
- else
- return box_at_point(sibling,
- x, y,
- box_x, box_y);
- }
- }
- /* ascend to float's parent */
- do {
- box = box->parent;
- } while (!box->float_children);
- /* process non-float children of float's parent */
- goto non_float_children;
-
- } else {
- bx -= box->x - scrollbar_get_offset(box->scroll_x);
- by -= box->y - scrollbar_get_offset(box->scroll_y);
- for (sibling = box->next; sibling;
- sibling = sibling->next) {
- if (box_is_float(sibling))
- continue;
- if (box_contains_point(sibling, x - bx, y - by,
- &physically)) {
- *box_x = bx + sibling->x -
- scrollbar_get_offset(
- sibling->scroll_x);
- *box_y = by + sibling->y -
- scrollbar_get_offset(
- sibling->scroll_y);
-
- if (physically)
- return sibling;
- else
- return box_at_point(sibling,
- x, y,
- box_x, box_y);
- }
- }
- box = box->parent;
- }
- }
-
- return 0;
-}
-
-
-/**
* Determine if a point lies within a box.
*
* \param box box to consider
- * \param x coordinate relative to box parent
- * \param y coordinate relative to box parent
+ * \param x coordinate relative to box
+ * \param y coordinate relative to box
* \param physically if function returning true, physically is set true if
* point is within the box's physical dimensions and false
* if the point is not within the box's physical dimensions
@@ -498,7 +351,7 @@ non_float_children:
* This is a helper function for box_at_point().
*/
-bool box_contains_point(struct box *box, int x, int y, bool *physically)
+static bool box_contains_point(struct box *box, int x, int y, bool *physically)
{
css_computed_clip_rect css_rect;
@@ -509,12 +362,12 @@ bool box_contains_point(struct box *box, int x, int y, bool *physically)
CSS_CLIP_RECT) {
/* We have an absolutly positioned box with a clip rect */
struct rect r = {
- .x0 = box->x - box->border[LEFT].width,
- .y0 = box->y - box->border[TOP].width,
- .x1 = box->x + box->padding[LEFT] + box->width +
+ .x0 = box->border[LEFT].width,
+ .y0 = box->border[TOP].width,
+ .x1 = box->padding[LEFT] + box->width +
box->border[RIGHT].width +
box->padding[RIGHT],
- .y1 = box->y + box->padding[TOP] + box->height +
+ .y1 = box->padding[TOP] + box->height +
box->border[BOTTOM].width +
box->padding[BOTTOM]
};
@@ -535,14 +388,14 @@ bool box_contains_point(struct box *box, int x, int y, bool *physically)
box->style));
}
if (css_rect.right_auto == false) {
- r.x1 = box->x - box->border[LEFT].width +
+ r.x1 = box->border[LEFT].width +
FIXTOINT(nscss_len2px(
css_rect.right,
css_rect.runit,
box->style));
}
if (css_rect.bottom_auto == false) {
- r.y1 = box->y - box->border[TOP].width +
+ r.y1 = box->border[TOP].width +
FIXTOINT(nscss_len2px(
css_rect.bottom,
css_rect.bunit,
@@ -558,25 +411,25 @@ bool box_contains_point(struct box *box, int x, int y, bool *physically)
/* Not inside clip area */
return false;
}
- if (box->x <= x + box->border[LEFT].width &&
- x < box->x + box->padding[LEFT] + box->width +
- box->border[RIGHT].width + box->padding[RIGHT] &&
- box->y <= y + box->border[TOP].width &&
- y < box->y + box->padding[TOP] + box->height +
- box->border[BOTTOM].width + box->padding[BOTTOM]) {
+ if (x >= -box->border[LEFT].width &&
+ x < box->padding[LEFT] + box->width +
+ box->padding[RIGHT] + box->border[RIGHT].width &&
+ y >= -box->border[TOP].width &&
+ y < box->padding[TOP] + box->height +
+ box->padding[BOTTOM] + box->border[BOTTOM].width) {
*physically = true;
return true;
}
- if (box->list_marker && box->list_marker->x <= x +
+ if (box->list_marker && box->list_marker->x - box->x <= x +
box->list_marker->border[LEFT].width &&
- x < box->list_marker->x +
+ x < box->list_marker->x - box->x +
box->list_marker->padding[LEFT] +
box->list_marker->width +
box->list_marker->border[RIGHT].width +
box->list_marker->padding[RIGHT] &&
- box->list_marker->y <= y +
+ box->list_marker->y - box->y <= y +
box->list_marker->border[TOP].width &&
- y < box->list_marker->y +
+ y < box->list_marker->y - box->y +
box->list_marker->padding[TOP] +
box->list_marker->height +
box->list_marker->border[BOTTOM].width +
@@ -584,12 +437,18 @@ bool box_contains_point(struct box *box, int x, int y, bool *physically)
*physically = true;
return true;
}
- if ((box->style && css_computed_overflow(box->style) ==
+ if ((box->style && css_computed_overflow_x(box->style) ==
+ CSS_OVERFLOW_VISIBLE) || !box->style) {
+ if (box->descendant_x0 <= x &&
+ x < box->descendant_x1) {
+ *physically = false;
+ return true;
+ }
+ }
+ if ((box->style && css_computed_overflow_y(box->style) ==
CSS_OVERFLOW_VISIBLE) || !box->style) {
- if (box->x + box->descendant_x0 <= x &&
- x < box->x + box->descendant_x1 &&
- box->y + box->descendant_y0 <= y &&
- y < box->y + box->descendant_y1) {
+ if (box->descendant_y0 <= y &&
+ y < box->descendant_y1) {
*physically = false;
return true;
}
@@ -598,6 +457,243 @@ bool box_contains_point(struct box *box, int x, int y, bool *physically)
}
+/** Direction to move in a box-tree walk */
+enum box_walk_dir {
+ BOX_WALK_CHILDREN,
+ BOX_WALK_PARENT,
+ BOX_WALK_NEXT_SIBLING,
+ BOX_WALK_FLOAT_CHILDREN,
+ BOX_WALK_NEXT_FLOAT_SIBLING,
+ BOX_WALK_FLOAT_CONTAINER
+};
+
+
+/**
+ * Move from box to next box in given direction, adjusting for box coord change
+ *
+ * \param b box to move from from
+ * \param dir direction to move in
+ * \param x box's global x-coord, updated to position of next box
+ * \param y box's global y-coord, updated to position of next box
+ *
+ * If no box can be found in given direction, NULL is returned.
+ */
+static inline struct box *box_move_xy(struct box *b, enum box_walk_dir dir,
+ int *x, int *y)
+{
+ switch (dir) {
+ case BOX_WALK_CHILDREN:
+ b = b->children;
+ if (b == NULL)
+ return NULL;
+ *x += b->x;
+ *y += b->y;
+ if (!box_is_float(b)) {
+ return b;
+ }
+ /* Fall through */
+
+ case BOX_WALK_NEXT_SIBLING:
+ do {
+ *x -= b->x;
+ *y -= b->y;
+ b = b->next;
+ if (b == NULL)
+ break;
+ *x += b->x;
+ *y += b->y;
+ } while (box_is_float(b));
+ return b;
+
+ case BOX_WALK_PARENT:
+ *x -= b->x;
+ *y -= b->y;
+ return b->parent;
+
+ case BOX_WALK_FLOAT_CHILDREN:
+ b = b->float_children;
+ if (b == NULL)
+ return NULL;
+ *x += b->x;
+ *y += b->y;
+ return b;
+
+ case BOX_WALK_NEXT_FLOAT_SIBLING:
+ *x -= b->x;
+ *y -= b->y;
+ b = b->next_float;
+ if (b == NULL)
+ return NULL;
+ *x += b->x;
+ *y += b->y;
+ return b;
+
+ case BOX_WALK_FLOAT_CONTAINER:
+ *x -= b->x;
+ *y -= b->y;
+ return b->float_container;
+
+ default:
+ assert(0 && "Bad box walk type.");
+ }
+}
+
+
+/**
+ * Itterator for walking to next box in interaction order
+ *
+ * \param b box to find next box from
+ * \param x box's global x-coord, updated to position of next box
+ * \param y box's global y-coord, updated to position of next box
+ * \param skip_children whether to skip box's children
+ *
+ * This walks to a boxes float children before its children. When walking
+ * children, floating boxes are skipped.
+ */
+static inline struct box *box_next_xy(struct box *b, int *x, int *y,
+ bool skip_children)
+{
+ struct box *n;
+ int tx, ty;
+
+ assert(b != NULL);
+
+ if (skip_children) {
+ /* Caller is not interested in any kind of children */
+ goto skip_children;
+ }
+
+ tx = *x; ty = *y;
+ n = box_move_xy(b, BOX_WALK_FLOAT_CHILDREN, &tx, &ty);
+ if (n) {
+ /* Next node is float child */
+ *x = tx;
+ *y = ty;
+ return n;
+ }
+done_float_children:
+
+ tx = *x; ty = *y;
+ n = box_move_xy(b, BOX_WALK_CHILDREN, &tx, &ty);
+ if (n) {
+ /* Next node is child */
+ *x = tx;
+ *y = ty;
+ return n;
+ }
+
+skip_children:
+ tx = *x; ty = *y;
+ n = box_move_xy(b, BOX_WALK_NEXT_FLOAT_SIBLING, &tx, &ty);
+ if (n) {
+ /* Go to next float sibling */
+ *x = tx;
+ *y = ty;
+ return n;
+ }
+
+ if (box_is_float(b)) {
+ /* Done floats, but the float container may have children,
+ * or siblings, or ansestors with siblings. Change to
+ * float container and move past handling its float children.
+ */
+ b = box_move_xy(b, BOX_WALK_FLOAT_CONTAINER, x, y);
+ goto done_float_children;
+ }
+
+ /* Go to next sibling, or nearest ancestor with next sibling. */
+ while (b) {
+ while (!b->next && b->parent) {
+ b = box_move_xy(b, BOX_WALK_PARENT, x, y);
+ if (box_is_float(b)) {
+ /* Go on to next float, if there is one */
+ goto skip_children;
+ }
+ }
+ if (!b->next) {
+ /* No more boxes */
+ return NULL;
+ }
+
+ tx = *x; ty = *y;
+ n = box_move_xy(b, BOX_WALK_NEXT_SIBLING, &tx, &ty);
+ if (n) {
+ /* Go to non-float (ancestor) sibling */
+ *x = tx;
+ *y = ty;
+ return n;
+
+ } else if (b->parent) {
+ b = box_move_xy(b, BOX_WALK_PARENT, x, y);
+ if (box_is_float(b)) {
+ /* Go on to next float, if there is one */
+ goto skip_children;
+ }
+
+ } else {
+ /* No more boxes */
+ return NULL;
+ }
+ }
+
+ assert(b != NULL);
+ return NULL;
+}
+
+
+
+/**
+ * Find the boxes at a point.
+ *
+ * \param box box to search children of
+ * \param x point to find, in global document coordinates
+ * \param y point to find, in global document coordinates
+ * \param box_x position of box, in global document coordinates, updated
+ * to position of returned box, if any
+ * \param box_y position of box, in global document coordinates, updated
+ * to position of returned box, if any
+ * \return box at given point, or 0 if none found
+ *
+ * To find all the boxes in the hierarchy at a certain point, use code like
+ * this:
+ * \code
+ * struct box *box = top_of_document_to_search;
+ * int box_x = 0, box_y = 0;
+ *
+ * while ((box = box_at_point(box, x, y, &box_x, &box_y))) {
+ * // process box
+ * }
+ * \endcode
+ */
+
+struct box *box_at_point(struct box *box, const int x, const int y,
+ int *box_x, int *box_y)
+{
+ bool skip_children;
+ bool physically;
+
+ assert(box);
+
+ skip_children = false;
+ while ((box = box_next_xy(box, box_x, box_y, skip_children))) {
+ if (box_contains_point(box, x - *box_x, y - *box_y,
+ &physically)) {
+ *box_x -= scrollbar_get_offset(box->scroll_x);
+ *box_y -= scrollbar_get_offset(box->scroll_y);
+
+ if (physically)
+ return box;
+
+ skip_children = false;
+ } else {
+ skip_children = true;
+ }
+ }
+
+ return NULL;
+}
+
+
/**
* Check whether box is nearer mouse coordinates than current nearest box
*
@@ -621,7 +717,7 @@ bool box_contains_point(struct box *box, int x, int y, bool *physically)
* \return true if mouse point is inside box
*/
-bool box_nearer_text_box(struct box *box, int bx, int by,
+static bool box_nearer_text_box(struct box *box, int bx, int by,
int x, int y, int dir, struct box **nearest, int *tx, int *ty,
int *nr_xd, int *nr_yd)
{
@@ -693,7 +789,7 @@ bool box_nearer_text_box(struct box *box, int bx, int by,
* \return true if mouse point is inside text_box
*/
-bool box_nearest_text_box(struct box *box, int bx, int by,
+static bool box_nearest_text_box(struct box *box, int bx, int by,
int fx, int fy, int x, int y, int dir, struct box **nearest,
int *tx, int *ty, int *nr_xd, int *nr_yd)
{
@@ -874,7 +970,7 @@ bool box_visible(struct box *box)
* Print a box tree to a file.
*/
-void box_dump(FILE *stream, struct box *box, unsigned int depth)
+void box_dump(FILE *stream, struct box *box, unsigned int depth, bool style)
{
unsigned int i;
struct box *c, *prev;
@@ -929,7 +1025,7 @@ void box_dump(FILE *stream, struct box *box, unsigned int depth)
}
if (box->gadget)
fprintf(stream, "(gadget) ");
- if (box->style)
+ if (style && box->style)
nscss_dump_computed_style(stream, box->style);
if (box->href)
fprintf(stream, " -> '%s'", nsurl_access(box->href));
@@ -945,6 +1041,8 @@ void box_dump(FILE *stream, struct box *box, unsigned int depth)
fprintf(stream, " float_children %p", box->float_children);
if (box->next_float)
fprintf(stream, " next_float %p", box->next_float);
+ if (box->float_container)
+ fprintf(stream, " float_container %p", box->float_container);
if (box->col) {
fprintf(stream, " (columns");
for (i = 0; i != box->columns; i++)
@@ -965,7 +1063,7 @@ void box_dump(FILE *stream, struct box *box, unsigned int depth)
for (i = 0; i != depth; i++)
fprintf(stream, " ");
fprintf(stream, "list_marker:\n");
- box_dump(stream, box->list_marker, depth + 1);
+ box_dump(stream, box->list_marker, depth + 1, style);
}
for (c = box->children; c && c->next; c = c->next)
@@ -982,7 +1080,7 @@ void box_dump(FILE *stream, struct box *box, unsigned int depth)
fprintf(stream, "warning: box->prev %p (should be "
"%p) (box on next line)\n",
c->prev, prev);
- box_dump(stream, c, depth + 1);
+ box_dump(stream, c, depth + 1, style);
}
}
diff --git a/render/box.h b/render/box.h
index 878ebc8d3..988b2872c 100644
--- a/render/box.h
+++ b/render/box.h
@@ -331,7 +331,7 @@ struct box *box_pick_text_box(struct html_content *html,
int x, int y, int dir, int *dx, int *dy);
struct box *box_find_by_id(struct box *box, lwc_string *id);
bool box_visible(struct box *box);
-void box_dump(FILE *stream, struct box *box, unsigned int depth);
+void box_dump(FILE *stream, struct box *box, unsigned int depth, bool style);
bool box_extract_link(const char *rel, nsurl *base, nsurl **result);
bool box_handle_scrollbars(struct content *c, struct box *box,
@@ -339,8 +339,6 @@ bool box_handle_scrollbars(struct content *c, struct box *box,
bool box_vscrollbar_present(const struct box *box);
bool box_hscrollbar_present(const struct box *box);
-nserror box_construct_init(void);
-void box_construct_fini(void);
nserror dom_to_box(struct dom_node *n, struct html_content *c,
box_construct_complete_cb cb);
diff --git a/render/box_construct.c b/render/box_construct.c
index a72f918f8..8eeb7bc33 100644
--- a/render/box_construct.c
+++ b/render/box_construct.c
@@ -31,25 +31,26 @@
#include <stdlib.h>
#include <string.h>
#include <strings.h>
+
#include "utils/config.h"
#include "content/content_protected.h"
#include "css/css.h"
#include "css/utils.h"
#include "css/select.h"
+#include "desktop/gui_factory.h"
#include "utils/nsoption.h"
-#include "render/box.h"
-#include "render/box_textarea.h"
-#include "render/form.h"
-#include "render/html_internal.h"
#include "utils/corestrings.h"
#include "utils/locale.h"
#include "utils/log.h"
#include "utils/messages.h"
-#include "utils/schedule.h"
#include "utils/talloc.h"
-#include "utils/url.h"
#include "utils/utils.h"
+#include "render/box.h"
+#include "render/box_textarea.h"
+#include "render/form.h"
+#include "render/html_internal.h"
+
/**
* Context for box tree construction
*/
@@ -183,9 +184,7 @@ nserror dom_to_box(dom_node *n, html_content *c, box_construct_complete_cb cb)
ctx->cb = cb;
ctx->bctx = c->bctx;
- schedule(0, (schedule_callback_fn) convert_xml_to_box, ctx);
-
- return NSERROR_OK;
+ return guit->browser->schedule(0, (void *)convert_xml_to_box, ctx);
}
/* mapping from CSS display to box type
@@ -210,134 +209,13 @@ static const box_type box_map[] = {
BOX_NONE /*CSS_DISPLAY_NONE*/
};
-/** Key for box userdata on DOM elements (== '__ns_box') */
-static dom_string *kstr_box_key;
-static dom_string *kstr_title;
-static dom_string *kstr_id;
-static dom_string *kstr_colspan;
-static dom_string *kstr_rowspan;
-static dom_string *kstr_style;
-static dom_string *kstr_href;
-static dom_string *kstr_name;
-static dom_string *kstr_target;
-static dom_string *kstr_alt;
-static dom_string *kstr_src;
-static dom_string *kstr_codebase;
-static dom_string *kstr_classid;
-static dom_string *kstr_data;
-static dom_string *kstr_rows;
-static dom_string *kstr_cols;
-static dom_string *kstr_border;
-static dom_string *kstr_frameborder;
-static dom_string *kstr_bordercolor;
-static dom_string *kstr_noresize;
-static dom_string *kstr_scrolling;
-static dom_string *kstr_marginwidth;
-static dom_string *kstr_marginheight;
-static dom_string *kstr_type;
-static dom_string *kstr_value;
-static dom_string *kstr_selected;
-
-nserror box_construct_init(void)
-{
- dom_exception err;
-
- err = dom_string_create_interned((const uint8_t *) "__ns_box",
- SLEN("__ns_box"), &kstr_box_key);
- if (err != DOM_NO_ERR || kstr_box_key == NULL)
- goto error;
-
-#define BOX_CONSTRUCT_STRING_INTERN(NAME) \
- err = dom_string_create_interned((const uint8_t *)#NAME, \
- sizeof(#NAME) - 1, \
- &kstr_##NAME ); \
- if ((err != DOM_NO_ERR) || (kstr_##NAME == NULL)) \
- goto error
-
- BOX_CONSTRUCT_STRING_INTERN(title);
- BOX_CONSTRUCT_STRING_INTERN(id);
- BOX_CONSTRUCT_STRING_INTERN(colspan);
- BOX_CONSTRUCT_STRING_INTERN(rowspan);
- BOX_CONSTRUCT_STRING_INTERN(style);
- BOX_CONSTRUCT_STRING_INTERN(href);
- BOX_CONSTRUCT_STRING_INTERN(name);
- BOX_CONSTRUCT_STRING_INTERN(target);
- BOX_CONSTRUCT_STRING_INTERN(alt);
- BOX_CONSTRUCT_STRING_INTERN(src);
- BOX_CONSTRUCT_STRING_INTERN(codebase);
- BOX_CONSTRUCT_STRING_INTERN(classid);
- BOX_CONSTRUCT_STRING_INTERN(data);
- BOX_CONSTRUCT_STRING_INTERN(rows);
- BOX_CONSTRUCT_STRING_INTERN(cols);
- BOX_CONSTRUCT_STRING_INTERN(border);
- BOX_CONSTRUCT_STRING_INTERN(frameborder);
- BOX_CONSTRUCT_STRING_INTERN(bordercolor);
- BOX_CONSTRUCT_STRING_INTERN(noresize);
- BOX_CONSTRUCT_STRING_INTERN(scrolling);
- BOX_CONSTRUCT_STRING_INTERN(marginwidth);
- BOX_CONSTRUCT_STRING_INTERN(marginheight);
- BOX_CONSTRUCT_STRING_INTERN(type);
- BOX_CONSTRUCT_STRING_INTERN(value);
- BOX_CONSTRUCT_STRING_INTERN(selected);
-
-#undef BOX_CONSTRUCT_STRING_INTERN
-
- return NSERROR_OK;
-
-error:
- return NSERROR_NOMEM;
-}
-
-void box_construct_fini(void)
-{
- if (kstr_box_key != NULL) {
- dom_string_unref(kstr_box_key);
- kstr_box_key = NULL;
- }
-
-#define BOX_CONSTRUCT_STRING_UNREF(NAME) \
- do { \
- if (kstr_##NAME != NULL) { \
- dom_string_unref(kstr_##NAME); \
- kstr_##NAME = NULL; \
- } \
- } while (0) \
-
- BOX_CONSTRUCT_STRING_UNREF(title);
- BOX_CONSTRUCT_STRING_UNREF(id);
- BOX_CONSTRUCT_STRING_UNREF(colspan);
- BOX_CONSTRUCT_STRING_UNREF(rowspan);
- BOX_CONSTRUCT_STRING_UNREF(style);
- BOX_CONSTRUCT_STRING_UNREF(href);
- BOX_CONSTRUCT_STRING_UNREF(name);
- BOX_CONSTRUCT_STRING_UNREF(target);
- BOX_CONSTRUCT_STRING_UNREF(alt);
- BOX_CONSTRUCT_STRING_UNREF(src);
- BOX_CONSTRUCT_STRING_UNREF(codebase);
- BOX_CONSTRUCT_STRING_UNREF(classid);
- BOX_CONSTRUCT_STRING_UNREF(data);
- BOX_CONSTRUCT_STRING_UNREF(rows);
- BOX_CONSTRUCT_STRING_UNREF(cols);
- BOX_CONSTRUCT_STRING_UNREF(border);
- BOX_CONSTRUCT_STRING_UNREF(frameborder);
- BOX_CONSTRUCT_STRING_UNREF(bordercolor);
- BOX_CONSTRUCT_STRING_UNREF(noresize);
- BOX_CONSTRUCT_STRING_UNREF(scrolling);
- BOX_CONSTRUCT_STRING_UNREF(marginwidth);
- BOX_CONSTRUCT_STRING_UNREF(marginheight);
- BOX_CONSTRUCT_STRING_UNREF(type);
- BOX_CONSTRUCT_STRING_UNREF(value);
- BOX_CONSTRUCT_STRING_UNREF(selected);
-
-#undef BOX_CONSTRUCT_DOM_STRING_UNREF
-}
-
static inline struct box *box_for_node(dom_node *n)
{
struct box *box = NULL;
dom_exception err;
- err = dom_node_get_user_data(n, kstr_box_key, (void *) &box);
+ err = dom_node_get_user_data(n, corestring_dom___ns_key_box_node_data,
+ (void *) &box);
if (err != DOM_NO_ERR)
return NULL;
@@ -567,7 +445,7 @@ void convert_xml_to_box(struct box_construct_ctx *ctx)
} while (++num_processed < max_processed_before_yield);
/* More work to do: schedule a continuation */
- schedule(0, (schedule_callback_fn) convert_xml_to_box, ctx);
+ guit->browser->schedule(0, (void *)convert_xml_to_box, ctx);
}
/**
@@ -629,11 +507,28 @@ static bool box_construct_marker(struct box *box, const char *title,
* BOX_BLOCK <-- list box
* ...
*/
- while (last != NULL) {
- if (last->list_marker != NULL)
- break;
-
- last = last->last;
+ while (last != NULL && last->list_marker == NULL) {
+ struct box *last_inner = last;
+
+ while (last_inner != NULL) {
+ if (last_inner->list_marker != NULL)
+ break;
+ if (last_inner->type ==
+ BOX_INLINE_CONTAINER ||
+ last_inner->type ==
+ BOX_FLOAT_LEFT ||
+ last_inner->type ==
+ BOX_FLOAT_RIGHT) {
+ last_inner = last_inner->last;
+ } else {
+ last_inner = NULL;
+ }
+ }
+ if (last_inner != NULL) {
+ last = last_inner;
+ } else {
+ last = last->prev;
+ }
}
if (last && last->list_marker) {
@@ -859,7 +754,7 @@ bool box_construct_element(struct box_construct_ctx *ctx,
return false;
/* Extract title attribute, if present */
- err = dom_element_get_attribute(ctx->n, kstr_title, &title0);
+ err = dom_element_get_attribute(ctx->n, corestring_dom_title, &title0);
if (err != DOM_NO_ERR)
return false;
@@ -880,7 +775,7 @@ bool box_construct_element(struct box_construct_ctx *ctx,
}
/* Extract id attribute, if present */
- err = dom_element_get_attribute(ctx->n, kstr_id, &s);
+ err = dom_element_get_attribute(ctx->n, corestring_dom_id, &s);
if (err != DOM_NO_ERR)
return false;
@@ -903,7 +798,7 @@ bool box_construct_element(struct box_construct_ctx *ctx,
ctx->root_box = box;
/* Deal with colspan/rowspan */
- err = dom_element_get_attribute(ctx->n, kstr_colspan, &s);
+ err = dom_element_get_attribute(ctx->n, corestring_dom_colspan, &s);
if (err != DOM_NO_ERR)
return false;
@@ -916,7 +811,7 @@ bool box_construct_element(struct box_construct_ctx *ctx,
dom_string_unref(s);
}
- err = dom_element_get_attribute(ctx->n, kstr_rowspan, &s);
+ err = dom_element_get_attribute(ctx->n, corestring_dom_rowspan, &s);
if (err != DOM_NO_ERR)
return false;
@@ -1000,7 +895,8 @@ bool box_construct_element(struct box_construct_ctx *ctx,
}
/* Attach DOM node to box */
- err = dom_node_set_user_data(ctx->n, kstr_box_key, box, NULL,
+ err = dom_node_set_user_data(ctx->n,
+ corestring_dom___ns_key_box_node_data, box, NULL,
(void *) &old_box);
if (err != DOM_NO_ERR)
return false;
@@ -1013,12 +909,13 @@ bool box_construct_element(struct box_construct_ctx *ctx,
box->type == BOX_BR ||
box->type == BOX_INLINE_BLOCK ||
css_computed_float(box->style) == CSS_FLOAT_LEFT ||
- css_computed_float(box->style) == CSS_FLOAT_RIGHT)) {
+ css_computed_float(box->style) == CSS_FLOAT_RIGHT) &&
+ props.node_is_root == false) {
/* Found an inline child of a block without a current container
* (i.e. this box is the first child of its parent, or was
* preceded by block-level siblings) */
assert(props.containing_block != NULL &&
- "Root box must not be inline or floated");
+ "Box must have containing block.");
props.inline_container = box_create(NULL, NULL, false, NULL,
NULL, NULL, NULL, ctx->bctx);
@@ -1073,9 +970,11 @@ bool box_construct_element(struct box_construct_ctx *ctx,
return false;
}
- if (css_computed_float(box->style) == CSS_FLOAT_LEFT ||
+ if (props.node_is_root == false &&
+ (css_computed_float(box->style) ==
+ CSS_FLOAT_LEFT ||
css_computed_float(box->style) ==
- CSS_FLOAT_RIGHT) {
+ CSS_FLOAT_RIGHT)) {
/* Float: insert a float between the parent and box. */
struct box *flt = box_create(NULL, NULL, false,
props.href, props.target, props.title,
@@ -1430,7 +1329,7 @@ css_select_results *box_get_style(html_content *c,
nscss_select_ctx ctx;
/* Firstly, construct inline stylesheet, if any */
- err = dom_element_get_attribute(n, kstr_style, &s);
+ err = dom_element_get_attribute(n, corestring_dom_style, &s);
if (err != DOM_NO_ERR)
return NULL;
@@ -1572,7 +1471,7 @@ bool box_a(BOX_SPECIAL_PARAMS)
dom_string *s;
dom_exception err;
- err = dom_element_get_attribute(n, kstr_href, &s);
+ err = dom_element_get_attribute(n, corestring_dom_href, &s);
if (err == DOM_NO_ERR && s != NULL) {
ok = box_extract_link(dom_string_data(s),
content->base_url, &url);
@@ -1587,7 +1486,7 @@ bool box_a(BOX_SPECIAL_PARAMS)
}
/* name and id share the same namespace */
- err = dom_element_get_attribute(n, kstr_name, &s);
+ err = dom_element_get_attribute(n, corestring_dom_name, &s);
if (err == DOM_NO_ERR && s != NULL) {
lwc_string *lwc_name;
@@ -1606,7 +1505,7 @@ bool box_a(BOX_SPECIAL_PARAMS)
}
/* target frame [16.3] */
- err = dom_element_get_attribute(n, kstr_target, &s);
+ err = dom_element_get_attribute(n, corestring_dom_target, &s);
if (err == DOM_NO_ERR && s != NULL) {
if (dom_string_caseless_lwc_isequal(s,
corestring_lwc__blank))
@@ -1660,7 +1559,7 @@ bool box_image(BOX_SPECIAL_PARAMS)
return true;
/* handle alt text */
- err = dom_element_get_attribute(n, kstr_alt, &s);
+ err = dom_element_get_attribute(n, corestring_dom_alt, &s);
if (err == DOM_NO_ERR && s != NULL) {
char *alt = squash_whitespace(dom_string_data(s));
dom_string_unref(s);
@@ -1684,7 +1583,7 @@ bool box_image(BOX_SPECIAL_PARAMS)
box->usemap++;
/* get image URL */
- err = dom_element_get_attribute(n, kstr_src, &s);
+ err = dom_element_get_attribute(n, corestring_dom_src, &s);
if (err != DOM_NO_ERR || s == NULL)
return true;
@@ -1787,7 +1686,7 @@ bool box_object(BOX_SPECIAL_PARAMS)
/* codebase, classid, and data are URLs
* (codebase is the base for the other two) */
- err = dom_element_get_attribute(n, kstr_codebase, &codebase);
+ err = dom_element_get_attribute(n, corestring_dom_codebase, &codebase);
if (err == DOM_NO_ERR && codebase != NULL) {
if (box_extract_link(dom_string_data(codebase),
content->base_url,
@@ -1800,7 +1699,7 @@ bool box_object(BOX_SPECIAL_PARAMS)
if (params->codebase == NULL)
params->codebase = nsurl_ref(content->base_url);
- err = dom_element_get_attribute(n, kstr_classid, &classid);
+ err = dom_element_get_attribute(n, corestring_dom_classid, &classid);
if (err == DOM_NO_ERR && classid != NULL) {
if (box_extract_link(dom_string_data(classid), params->codebase,
&params->classid) == false) {
@@ -1810,7 +1709,7 @@ bool box_object(BOX_SPECIAL_PARAMS)
dom_string_unref(classid);
}
- err = dom_element_get_attribute(n, kstr_data, &data);
+ err = dom_element_get_attribute(n, corestring_dom_data, &data);
if (err == DOM_NO_ERR && data != NULL) {
if (box_extract_link(dom_string_data(data), params->codebase,
&params->data) == false) {
@@ -2049,7 +1948,7 @@ bool box_create_frameset(struct content_html_frames *f, dom_node *n,
colour default_border_colour = 0x000000;
/* parse rows and columns */
- err = dom_element_get_attribute(n, kstr_rows, &s);
+ err = dom_element_get_attribute(n, corestring_dom_rows, &s);
if (err == DOM_NO_ERR && s != NULL) {
row_height = box_parse_multi_lengths(dom_string_data(s), &rows);
dom_string_unref(s);
@@ -2063,7 +1962,7 @@ bool box_create_frameset(struct content_html_frames *f, dom_node *n,
row_height->unit = FRAME_DIMENSION_PERCENT;
}
- err = dom_element_get_attribute(n, kstr_cols, &s);
+ err = dom_element_get_attribute(n, corestring_dom_cols, &s);
if (err == DOM_NO_ERR && s != NULL) {
col_width = box_parse_multi_lengths(dom_string_data(s), &cols);
dom_string_unref(s);
@@ -2082,7 +1981,7 @@ bool box_create_frameset(struct content_html_frames *f, dom_node *n,
}
/* common extension: border="0|1" to control all children */
- err = dom_element_get_attribute(n, kstr_border, &s);
+ err = dom_element_get_attribute(n, corestring_dom_border, &s);
if (err == DOM_NO_ERR && s != NULL) {
if ((dom_string_data(s)[0] == '0') &&
(dom_string_data(s)[1] == '\0'))
@@ -2091,7 +1990,7 @@ bool box_create_frameset(struct content_html_frames *f, dom_node *n,
}
/* common extension: frameborder="yes|no" to control all children */
- err = dom_element_get_attribute(n, kstr_frameborder, &s);
+ err = dom_element_get_attribute(n, corestring_dom_frameborder, &s);
if (err == DOM_NO_ERR && s != NULL) {
if (dom_string_caseless_lwc_isequal(s,
corestring_lwc_no) == 0)
@@ -2101,7 +2000,7 @@ bool box_create_frameset(struct content_html_frames *f, dom_node *n,
/* common extension: bordercolor="#RRGGBB|<named colour>" to control
*all children */
- err = dom_element_get_attribute(n, kstr_bordercolor, &s);
+ err = dom_element_get_attribute(n, corestring_dom_bordercolor, &s);
if (err == DOM_NO_ERR && s != NULL) {
css_color color;
@@ -2230,7 +2129,7 @@ bool box_create_frameset(struct content_html_frames *f, dom_node *n,
/* get frame URL (not required) */
url = NULL;
- err = dom_element_get_attribute(c, kstr_src, &s);
+ err = dom_element_get_attribute(c, corestring_dom_src, &s);
if (err == DOM_NO_ERR && s != NULL) {
box_extract_link(dom_string_data(s),
content->base_url, &url);
@@ -2247,17 +2146,17 @@ bool box_create_frameset(struct content_html_frames *f, dom_node *n,
}
/* fill in specified values */
- err = dom_element_get_attribute(c, kstr_name, &s);
+ err = dom_element_get_attribute(c, corestring_dom_name, &s);
if (err == DOM_NO_ERR && s != NULL) {
frame->name = talloc_strdup(content->bctx,
dom_string_data(s));
dom_string_unref(s);
}
- dom_element_has_attribute(c, kstr_noresize,
+ dom_element_has_attribute(c, corestring_dom_noresize,
&frame->no_resize);
- err = dom_element_get_attribute(c, kstr_frameborder,
+ err = dom_element_get_attribute(c, corestring_dom_frameborder,
&s);
if (err == DOM_NO_ERR && s != NULL) {
i = atoi(dom_string_data(s));
@@ -2265,7 +2164,7 @@ bool box_create_frameset(struct content_html_frames *f, dom_node *n,
dom_string_unref(s);
}
- err = dom_element_get_attribute(c, kstr_scrolling, &s);
+ err = dom_element_get_attribute(c, corestring_dom_scrolling, &s);
if (err == DOM_NO_ERR && s != NULL) {
if (dom_string_caseless_lwc_isequal(s,
corestring_lwc_yes))
@@ -2276,21 +2175,21 @@ bool box_create_frameset(struct content_html_frames *f, dom_node *n,
dom_string_unref(s);
}
- err = dom_element_get_attribute(c, kstr_marginwidth,
+ err = dom_element_get_attribute(c, corestring_dom_marginwidth,
&s);
if (err == DOM_NO_ERR && s != NULL) {
frame->margin_width = atoi(dom_string_data(s));
dom_string_unref(s);
}
- err = dom_element_get_attribute(c, kstr_marginheight,
+ err = dom_element_get_attribute(c, corestring_dom_marginheight,
&s);
if (err == DOM_NO_ERR && s != NULL) {
frame->margin_height = atoi(dom_string_data(s));
dom_string_unref(s);
}
- err = dom_element_get_attribute(c, kstr_bordercolor,
+ err = dom_element_get_attribute(c, corestring_dom_bordercolor,
&s);
if (err == DOM_NO_ERR && s != NULL) {
css_color color;
@@ -2360,7 +2259,7 @@ bool box_iframe(BOX_SPECIAL_PARAMS)
return true;
/* get frame URL */
- err = dom_element_get_attribute(n, kstr_src, &s);
+ err = dom_element_get_attribute(n, corestring_dom_src, &s);
if (err != DOM_NO_ERR || s == NULL)
return true;
if (box_extract_link(dom_string_data(s), content->base_url,
@@ -2400,20 +2299,20 @@ bool box_iframe(BOX_SPECIAL_PARAMS)
content->iframe = iframe;
/* fill in specified values */
- err = dom_element_get_attribute(n, kstr_name, &s);
+ err = dom_element_get_attribute(n, corestring_dom_name, &s);
if (err == DOM_NO_ERR && s != NULL) {
iframe->name = talloc_strdup(content->bctx, dom_string_data(s));
dom_string_unref(s);
}
- err = dom_element_get_attribute(n, kstr_frameborder, &s);
+ err = dom_element_get_attribute(n, corestring_dom_frameborder, &s);
if (err == DOM_NO_ERR && s != NULL) {
i = atoi(dom_string_data(s));
iframe->border = (i != 0);
dom_string_unref(s);
}
- err = dom_element_get_attribute(n, kstr_bordercolor, &s);
+ err = dom_element_get_attribute(n, corestring_dom_bordercolor, &s);
if (err == DOM_NO_ERR && s != NULL) {
css_color color;
@@ -2423,7 +2322,7 @@ bool box_iframe(BOX_SPECIAL_PARAMS)
dom_string_unref(s);
}
- err = dom_element_get_attribute(n, kstr_scrolling, &s);
+ err = dom_element_get_attribute(n, corestring_dom_scrolling, &s);
if (err == DOM_NO_ERR && s != NULL) {
if (dom_string_caseless_lwc_isequal(s,
corestring_lwc_yes))
@@ -2434,13 +2333,13 @@ bool box_iframe(BOX_SPECIAL_PARAMS)
dom_string_unref(s);
}
- err = dom_element_get_attribute(n, kstr_marginwidth, &s);
+ err = dom_element_get_attribute(n, corestring_dom_marginwidth, &s);
if (err == DOM_NO_ERR && s != NULL) {
iframe->margin_width = atoi(dom_string_data(s));
dom_string_unref(s);
}
- err = dom_element_get_attribute(n, kstr_marginheight, &s);
+ err = dom_element_get_attribute(n, corestring_dom_marginheight, &s);
if (err == DOM_NO_ERR && s != NULL) {
iframe->margin_height = atoi(dom_string_data(s));
dom_string_unref(s);
@@ -2501,13 +2400,14 @@ bool box_input(BOX_SPECIAL_PARAMS)
nsurl *url;
nserror error;
- dom_element_get_attribute(n, kstr_type, &type);
+ dom_element_get_attribute(n, corestring_dom_type, &type);
gadget = html_forms_get_control_for_node(content->forms, n);
if (gadget == NULL)
goto no_memory;
box->gadget = gadget;
gadget->box = box;
+ gadget->html = content;
if (type && dom_string_caseless_lwc_isequal(type,
corestring_lwc_password)) {
@@ -2586,7 +2486,7 @@ bool box_input(BOX_SPECIAL_PARAMS)
nsoption_bool(foreground_images) == true) {
dom_string *s;
- err = dom_element_get_attribute(n, kstr_src, &s);
+ err = dom_element_get_attribute(n, corestring_dom_src, &s);
if (err == DOM_NO_ERR && s != NULL) {
error = nsurl_join(content->base_url,
dom_string_data(s), &url);
@@ -2643,6 +2543,7 @@ bool box_button(BOX_SPECIAL_PARAMS)
if (!gadget)
return false;
+ gadget->html = content;
box->gadget = gadget;
gadget->box = box;
@@ -2671,6 +2572,7 @@ bool box_select(BOX_SPECIAL_PARAMS)
if (gadget == NULL)
return false;
+ gadget->html = content;
err = dom_node_get_first_child(n, &c);
if (err != DOM_NO_ERR)
return false;
@@ -2777,6 +2679,8 @@ bool box_select(BOX_SPECIAL_PARAMS)
gadget->data.select.current->initial_selected =
gadget->data.select.current->selected = true;
gadget->data.select.num_selected = 1;
+ dom_html_option_element_set_selected(
+ gadget->data.select.current->node, true);
}
if (gadget->data.select.num_selected == 0)
@@ -2832,7 +2736,7 @@ bool box_select_add_option(struct form_control *control, dom_node *n)
if (text == NULL)
goto no_memory;
- err = dom_element_get_attribute(n, kstr_value, &s);
+ err = dom_element_get_attribute(n, corestring_dom_value, &s);
if (err == DOM_NO_ERR && s != NULL) {
value = strdup(dom_string_data(s));
dom_string_unref(s);
@@ -2843,14 +2747,14 @@ bool box_select_add_option(struct form_control *control, dom_node *n)
if (value == NULL)
goto no_memory;
- dom_element_has_attribute(n, kstr_selected, &selected);
+ dom_element_has_attribute(n, corestring_dom_selected, &selected);
/* replace spaces/TABs with hard spaces to prevent line wrapping */
text_nowrap = cnv_space2nbsp(text);
if (text_nowrap == NULL)
goto no_memory;
- if (form_add_option(control, value, text_nowrap, selected) == false)
+ if (form_add_option(control, value, text_nowrap, selected, n) == false)
goto no_memory;
free(text);
@@ -2876,6 +2780,7 @@ bool box_textarea(BOX_SPECIAL_PARAMS)
if (box->gadget == NULL)
return false;
+ box->gadget->html = content;
box->gadget->box = box;
if (!box_input_text(content, box, n))
@@ -2919,7 +2824,7 @@ bool box_embed(BOX_SPECIAL_PARAMS)
params->params = NULL;
/* src is a URL */
- err = dom_element_get_attribute(n, kstr_src, &src);
+ err = dom_element_get_attribute(n, corestring_dom_src, &src);
if (err != DOM_NO_ERR || src == NULL)
return true;
if (box_extract_link(dom_string_data(src), content->base_url,
diff --git a/render/box_normalise.c b/render/box_normalise.c
index 5a4b6256a..0c91fa3fd 100644
--- a/render/box_normalise.c
+++ b/render/box_normalise.c
@@ -42,6 +42,8 @@
struct span_info {
/** Number of rows this cell spans */
unsigned int row_span;
+ /** Row group of cell */
+ struct box *rg;
/** The cell in this column spans all rows until the end of the table */
bool auto_row;
};
@@ -72,7 +74,7 @@ static bool box_normalise_table_row(struct box *row,
html_content *c);
static bool calculate_table_row(struct columns *col_info,
unsigned int col_span, unsigned int row_span,
- unsigned int *start_column);
+ unsigned int *start_column, struct box *cell);
static bool box_normalise_inline_container(struct box *cont, html_content *c);
/**
@@ -419,6 +421,7 @@ bool box_normalise_table_spans(struct box *table, struct span_info *spans,
struct box *table_row;
struct box *table_cell;
unsigned int rows_left = table->rows;
+ unsigned int group_rows_left;
unsigned int col;
nscss_select_ctx ctx;
@@ -427,20 +430,37 @@ bool box_normalise_table_spans(struct box *table, struct span_info *spans,
/* Scan table, filling in width and height of table cells with
* colspan = 0 and rowspan = 0. Also generate empty cells */
- for (table_row_group = table->children; table_row_group != NULL;
- table_row_group = table_row_group->next) {
- for (table_row = table_row_group->children; table_row != NULL;
- table_row = table_row->next){
- for (table_cell = table_row->children;
- table_cell != NULL;
- table_cell = table_cell->next) {
+ for (table_row_group = table->children;
+ table_row_group != NULL;
+ table_row_group = table_row_group->next) {
+
+ group_rows_left = table_row_group->rows;
+
+ for (table_row = table_row_group->children;
+ table_row != NULL;
+ table_row = table_row->next) {
+
+ for (table_cell = table_row->children;
+ table_cell != NULL;
+ table_cell = table_cell->next) {
+
/* colspan = 0 -> colspan = 1 */
- if (table_cell->columns == 0)
+ if (table_cell->columns == 0) {
table_cell->columns = 1;
+ }
+
+ /* if rowspan is 0 it is expanded to
+ * the number of rows left in the row
+ * group
+ */
+ if (table_cell->rows == 0) {
+ table_cell->rows = group_rows_left;
+ }
- /* rowspan = 0 -> rowspan = rows_left */
- if (table_cell->rows == 0)
- table_cell->rows = rows_left;
+ /* limit rowspans within group */
+ if (table_cell->rows > group_rows_left) {
+ table_cell->rows = group_rows_left;
+ }
/* Record span information */
for (col = table_cell->start_column;
@@ -540,6 +560,8 @@ bool box_normalise_table_spans(struct box *table, struct span_info *spans,
rows_left--;
}
+
+ group_rows_left--;
}
return true;
@@ -555,6 +577,7 @@ bool box_normalise_table_row_group(struct box *row_group,
struct box *row;
css_computed_style *style;
nscss_select_ctx ctx;
+ unsigned int group_row_count = 0;
assert(row_group != 0);
assert(row_group->type == BOX_TABLE_ROW_GROUP);
@@ -569,6 +592,7 @@ bool box_normalise_table_row_group(struct box *row_group,
switch (child->type) {
case BOX_TABLE_ROW:
/* ok */
+ group_row_count++;
if (box_normalise_table_row(child, col_info,
c) == false)
return false;
@@ -628,6 +652,7 @@ bool box_normalise_table_row_group(struct box *row_group,
row_group->last = row;
row->parent = row_group;
+ group_row_count++;
if (box_normalise_table_row(row, col_info,
c) == false)
return false;
@@ -676,10 +701,14 @@ bool box_normalise_table_row_group(struct box *row_group,
row->parent = row_group;
row_group->children = row_group->last = row;
+ group_row_count = 1;
+
/* Keep table's row count in sync */
col_info->num_rows++;
}
+ row_group->rows = group_row_count;
+
#ifdef BOX_NORMALISE_DEBUG
LOG(("row_group %p done", row_group));
#endif
@@ -790,7 +819,7 @@ bool box_normalise_table_row(struct box *row,
}
if (calculate_table_row(col_info, cell->columns, cell->rows,
- &cell->start_column) == false)
+ &cell->start_column, cell) == false)
return false;
}
@@ -827,21 +856,27 @@ bool box_normalise_table_row(struct box *row,
* \param col_span Number of columns that current cell spans
* \param row_span Number of rows that current cell spans
* \param start_column Pointer to location to receive column index
+ * \param cell Box for current table cell
* \return true on success, false on memory exhaustion
*/
bool calculate_table_row(struct columns *col_info,
unsigned int col_span, unsigned int row_span,
- unsigned int *start_column)
+ unsigned int *start_column, struct box *cell)
{
unsigned int cell_start_col = col_info->current_column;
unsigned int cell_end_col;
unsigned int i;
struct span_info *spans;
+ struct box *rg = cell->parent->parent; /* Cell's row group */
/* Skip columns with cells spanning from above */
- while (col_info->spans[cell_start_col].row_span != 0)
+ /* TODO: Need to ignore cells spanning from above that belong to
+ * different row group. We don't have that info here. */
+ while (col_info->spans[cell_start_col].row_span != 0 &&
+ col_info->spans[cell_start_col].rg == rg) {
cell_start_col++;
+ }
/* Update current column with calculated start */
col_info->current_column = cell_start_col;
@@ -876,6 +911,7 @@ bool calculate_table_row(struct columns *col_info,
for (i = cell_start_col; i < cell_end_col; i++) {
col_info->spans[i].row_span = (row_span == 0) ? 1 : row_span;
col_info->spans[i].auto_row = (row_span == 0);
+ col_info->spans[i].rg = rg;
}
/* Update current column with calculated end. */
diff --git a/render/box_textarea.c b/render/box_textarea.c
index 546a39e04..fe5a7bab1 100644
--- a/render/box_textarea.c
+++ b/render/box_textarea.c
@@ -107,8 +107,8 @@ bool box_textarea_keypress(html_content *html, struct box *box, uint32_t key)
static void box_textarea_callback(void *data, struct textarea_msg *msg)
{
struct form_textarea_data *d = data;
- struct html_content *html = d->html;
struct form_control *gadget = d->gadget;
+ struct html_content *html = d->gadget->html;
struct box *box = gadget->box;
switch (msg->type) {
@@ -119,7 +119,7 @@ static void box_textarea_callback(void *data, struct textarea_msg *msg)
union html_drag_owner drag_owner;
drag_owner.no_owner = true;
- html_set_drag_type(d->html, drag_type, drag_owner,
+ html_set_drag_type(html, drag_type, drag_owner,
NULL);
} else {
/* Textarea drag started */
@@ -146,7 +146,7 @@ static void box_textarea_callback(void *data, struct textarea_msg *msg)
break;
}
- html_set_drag_type(d->html, drag_type, drag_owner,
+ html_set_drag_type(html, drag_type, drag_owner,
&rect);
}
break;
@@ -171,7 +171,7 @@ static void box_textarea_callback(void *data, struct textarea_msg *msg)
union html_selection_owner sel_owner;
sel_owner.textarea = box;
- html_set_selection(d->html, HTML_SELECTION_TEXTAREA,
+ html_set_selection(html, HTML_SELECTION_TEXTAREA,
sel_owner,
msg->data.selection.read_only);
} else {
@@ -179,7 +179,7 @@ static void box_textarea_callback(void *data, struct textarea_msg *msg)
union html_selection_owner sel_owner;
sel_owner.none = true;
- html_set_selection(d->html, HTML_SELECTION_NONE,
+ html_set_selection(html, HTML_SELECTION_NONE,
sel_owner, true);
}
break;
@@ -191,12 +191,12 @@ static void box_textarea_callback(void *data, struct textarea_msg *msg)
if (msg->data.caret.type == TEXTAREA_CARET_HIDE) {
union html_focus_owner focus_owner;
focus_owner.textarea = box;
- html_set_focus(d->html, HTML_FOCUS_TEXTAREA,
+ html_set_focus(html, HTML_FOCUS_TEXTAREA,
focus_owner, true, 0, 0, 0, NULL);
} else {
union html_focus_owner focus_owner;
focus_owner.textarea = box;
- html_set_focus(d->html, HTML_FOCUS_TEXTAREA,
+ html_set_focus(html, HTML_FOCUS_TEXTAREA,
focus_owner, false,
msg->data.caret.pos.x,
msg->data.caret.pos.y,
@@ -204,6 +204,12 @@ static void box_textarea_callback(void *data, struct textarea_msg *msg)
msg->data.caret.pos.clip);
}
break;
+
+ case TEXTAREA_MSG_TEXT_MODIFIED:
+ form_gadget_update_value(gadget,
+ strndup(msg->data.modified.text,
+ msg->data.modified.len));
+ break;
}
}
@@ -237,7 +243,7 @@ bool box_textarea_create_textarea(html_content *html,
return false;
/* Get the textarea's initial content */
- err = dom_node_get_text_content(node, &dom_text);
+ err = dom_html_text_area_element_get_value(textarea, &dom_text);
if (err != DOM_NO_ERR)
return false;
@@ -271,7 +277,6 @@ bool box_textarea_create_textarea(html_content *html,
if (read_only)
ta_flags |= TEXTAREA_READONLY;
- gadget->data.text.data.html = html;
gadget->data.text.data.gadget = gadget;
font_plot_style_from_css(gadget->box->style, &fstyle);
diff --git a/render/form.c b/render/form.c
index ebe9b6f28..76a67ba5c 100644
--- a/render/form.c
+++ b/render/form.c
@@ -32,12 +32,11 @@
#include <stdio.h>
#include <string.h>
#include <dom/dom.h>
+
#include "content/fetch.h"
#include "content/hlcache.h"
#include "css/css.h"
#include "css/utils.h"
-#include "desktop/browser.h"
-#include "desktop/gui.h"
#include "desktop/mouse.h"
#include "desktop/knockout.h"
#include "desktop/plot_style.h"
@@ -50,6 +49,7 @@
#include "render/html.h"
#include "render/html_internal.h"
#include "render/layout.h"
+#include "utils/corestrings.h"
#include "utils/log.h"
#include "utils/messages.h"
#include "utils/talloc.h"
@@ -87,7 +87,7 @@ static plot_font_style_t plot_fstyle_entry = {
};
static char *form_acceptable_charset(struct form *form);
-static char *form_encode_item(const char *item, const char *charset,
+static char *form_encode_item(const char *item, uint32_t len, const char *charset,
const char *fallback);
static void form_select_menu_clicked(struct form_control *control,
int x, int y);
@@ -103,6 +103,7 @@ static void form_select_menu_scroll_callback(void *client_data,
* \param method method and enctype
* \param charset acceptable encodings for form submission, or NULL
* \param doc_charset encoding of containing document, or NULL
+ * \param html HTML content containing form
* \return a new structure, or NULL on memory exhaustion
*/
struct form *form_new(void *node, const char *action, const char *target,
@@ -153,6 +154,7 @@ struct form *form_new(void *node, const char *action, const char *target,
return form;
}
+
/**
* Free a form, and any controls it owns.
*
@@ -278,10 +280,11 @@ void form_free_control(struct form_control *control)
* \param value value of option, used directly (not copied)
* \param text text for option, used directly (not copied)
* \param selected this option is selected
+ * \param node the DOM node this option is associated with
* \return true on success, false on memory exhaustion
*/
bool form_add_option(struct form_control *control, char *value, char *text,
- bool selected)
+ bool selected, void *node)
{
struct form_option *option;
@@ -312,12 +315,14 @@ bool form_add_option(struct form_control *control, char *value, char *text,
control->data.select.num_items++;
+ option->node = node;
+
return true;
}
/**
- * Identify 'successful' controls.
+ * Identify 'successful' controls via the DOM.
*
* All text strings in the successful controls list will be in the charset most
* appropriate for submission. Therefore, no utf8_to_* processing should be
@@ -334,313 +339,507 @@ bool form_add_option(struct form_control *control, char *value, char *text,
*
* See HTML 4.01 section 17.13.2.
*/
-bool form_successful_controls(struct form *form,
- struct form_control *submit_button,
- struct fetch_multipart_data **successful_controls)
+bool form_successful_controls_dom(struct form *_form,
+ struct form_control *_submit_button,
+ struct fetch_multipart_data **successful_controls)
{
- struct form_control *control;
- struct form_option *option;
+ dom_html_form_element *form = _form->node;
+ dom_html_element *submit_button = (_submit_button != NULL) ? _submit_button->node : NULL;
+ dom_html_collection *form_elements = NULL;
+ dom_html_options_collection *options = NULL;
+ dom_node *form_element = NULL, *option_element = NULL;
+ dom_exception err;
+ dom_string *nodename = NULL, *inputname = NULL, *inputvalue = NULL, *inputtype = NULL;
struct fetch_multipart_data sentinel, *last_success, *success_new;
- char *value = NULL;
- bool had_submit = false;
- char *charset;
+ bool had_submit = false, element_disabled, checked;
+ char *charset, *rawfile_temp = NULL, *basename;
+ uint32_t index, element_count;
+ struct image_input_coords *coords;
last_success = &sentinel;
sentinel.next = NULL;
-
- charset = form_acceptable_charset(form);
- if (charset == NULL)
+
+ LOG(("XYZZY: Yay, let's look for a form"));
+
+ /** \todo Replace this call with something DOMish */
+ charset = form_acceptable_charset(_form);
+ if (charset == NULL) {
+ LOG(("failed to find charset"));
return false;
+ }
-#define ENCODE_ITEM(i) form_encode_item((i), charset, form->document_charset)
-
- for (control = form->controls; control; control = control->next) {
- /* ignore disabled controls */
- if (control->disabled)
+#define ENCODE_ITEM(i) (((i) == NULL) ? ( \
+ form_encode_item("", 0, charset, _form->document_charset) \
+ ):( \
+ form_encode_item(dom_string_data(i), dom_string_byte_length(i), \
+ charset, _form->document_charset) \
+ ))
+
+ err = dom_html_form_element_get_elements(form, &form_elements);
+
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get form elements"));
+ goto dom_no_memory;
+ }
+
+ LOG(("Reffed %p", form_elements));
+
+ err = dom_html_collection_get_length(form_elements, &element_count);
+
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get form element count"));
+ goto dom_no_memory;
+ }
+
+ for (index = 0; index < element_count; index++) {
+ if (form_element != NULL) {
+ LOG(("Unreffed %p", form_element));
+ dom_node_unref(form_element);
+ form_element = NULL;
+ }
+ if (nodename != NULL) {
+ dom_string_unref(nodename);
+ nodename = NULL;
+ }
+ if (inputname != NULL) {
+ dom_string_unref(inputname);
+ inputname = NULL;
+ }
+ if (inputvalue != NULL) {
+ dom_string_unref(inputvalue);
+ inputvalue = NULL;
+ }
+ if (inputtype != NULL) {
+ dom_string_unref(inputtype);
+ inputtype = NULL;
+ }
+ if (options != NULL) {
+ dom_html_options_collection_unref(options);
+ options = NULL;
+ }
+ err = dom_html_collection_item(form_elements,
+ index, &form_element);
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not retrieve form element %d", index));
+ goto dom_no_memory;
+ }
+ LOG(("Reffed %p", form_element));
+ /* Form elements are one of:
+ * HTMLInputElement
+ * HTMLTextAreaElement
+ * HTMLSelectElement
+ */
+ err = dom_node_get_node_name(form_element, &nodename);
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get node name"));
+ goto dom_no_memory;
+ }
+ LOG(("Found a node(%p): `%*s`", nodename,
+ dom_string_byte_length(nodename),
+ dom_string_data(nodename)));
+ if (dom_string_isequal(nodename, corestring_dom_TEXTAREA)) {
+ err = dom_html_text_area_element_get_disabled(
+ (dom_html_text_area_element *)form_element,
+ &element_disabled);
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get text area disabled property"));
+ goto dom_no_memory;
+ }
+ err = dom_html_text_area_element_get_name(
+ (dom_html_text_area_element *)form_element,
+ &inputname);
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get text area name property"));
+ goto dom_no_memory;
+ }
+ } else if (dom_string_isequal(nodename, corestring_dom_SELECT)) {
+ err = dom_html_select_element_get_disabled(
+ (dom_html_select_element *)form_element,
+ &element_disabled);
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get select disabled property"));
+ goto dom_no_memory;
+ }
+ err = dom_html_select_element_get_name(
+ (dom_html_select_element *)form_element,
+ &inputname);
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get select name property"));
+ goto dom_no_memory;
+ }
+ } else if (dom_string_isequal(nodename, corestring_dom_INPUT)) {
+ err = dom_html_input_element_get_disabled(
+ (dom_html_input_element *)form_element,
+ &element_disabled);
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get input disabled property"));
+ goto dom_no_memory;
+ }
+ err = dom_html_input_element_get_name(
+ (dom_html_input_element *)form_element,
+ &inputname);
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get input name property"));
+ goto dom_no_memory;
+ }
+ } else if (dom_string_isequal(nodename, corestring_dom_BUTTON)) {
+ /* It was a button, no fair */
continue;
-
- /* ignore controls with no name */
- if (!control->name)
+ } else {
+ /* Unknown element type came through! */
+ LOG(("Unknown element type: %*s",
+ dom_string_byte_length(nodename),
+ dom_string_data(nodename)));
+ goto dom_no_memory;
+ }
+ if (element_disabled)
continue;
-
- switch (control->type) {
- case GADGET_HIDDEN:
- if (control->value)
- value = ENCODE_ITEM(control->value);
- else
- value = ENCODE_ITEM("");
- if (!value) {
- LOG(("failed to duplicate value"
- "'%s' for control %s",
- control->value,
- control->name));
- goto no_memory;
- }
- break;
-
- case GADGET_RADIO:
- case GADGET_CHECKBOX:
- /* ignore checkboxes and radio buttons which
- * aren't selected */
- if (!control->selected)
- continue;
- if (control->value)
- value = ENCODE_ITEM(control->value);
- else
- value = ENCODE_ITEM("on");
- if (!value) {
- LOG(("failed to duplicate"
- "value '%s' for"
- "control %s",
- control->value,
- control->name));
- goto no_memory;
- }
- break;
-
- case GADGET_SELECT:
- /* select */
- for (option = control->data.select.items;
- option != NULL;
- option = option->next) {
- if (!option->selected)
- continue;
- success_new =
- malloc(sizeof(*success_new));
- if (!success_new) {
- LOG(("malloc failed"));
- goto no_memory;
- }
- success_new->file = false;
- success_new->name =
- ENCODE_ITEM(control->name);
- success_new->value =
- ENCODE_ITEM(option->value);
- success_new->next = NULL;
- last_success->next = success_new;
- last_success = success_new;
- if (!success_new->name ||
- !success_new->value) {
- LOG(("strdup failed"));
- goto no_memory;
- }
+ if (inputname == NULL)
+ continue;
+
+ if (dom_string_isequal(nodename, corestring_dom_TEXTAREA)) {
+ err = dom_html_text_area_element_get_value(
+ (dom_html_text_area_element *)form_element,
+ &inputvalue);
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get text area content"));
+ goto dom_no_memory;
+ }
+ } else if (dom_string_isequal(nodename, corestring_dom_SELECT)) {
+ uint32_t options_count, option_index;
+ err = dom_html_select_element_get_options(
+ (dom_html_select_element *)form_element,
+ &options);
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get select options collection"));
+ goto dom_no_memory;
+ }
+ err = dom_html_options_collection_get_length(
+ options, &options_count);
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get select options collection length"));
+ goto dom_no_memory;
+ }
+ for(option_index = 0; option_index < options_count;
+ ++option_index) {
+ bool selected;
+ if (option_element != NULL) {
+ dom_node_unref(option_element);
+ option_element = NULL;
}
-
- continue;
- break;
-
- case GADGET_TEXTBOX:
- case GADGET_PASSWORD:
- case GADGET_TEXTAREA:
- {
- char *v2;
- int ta_len = textarea_get_text(
- control->data.text.ta,
- NULL, 0);
-
- value = malloc(ta_len);
- if (!value) {
- LOG(("failed handling textarea"));
- goto no_memory;
+ if (inputvalue != NULL) {
+ dom_string_unref(inputvalue);
+ inputvalue = NULL;
}
- textarea_get_text(control->data.text.ta,
- value, ta_len);
-
- if (control->type == GADGET_TEXTAREA &&
- value[0] == '\0') {
- /* Textarea not submitted if empty */
- free(value);
- continue;
+ err = dom_html_options_collection_item(
+ options, option_index, &option_element);
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get options item %d", option_index));
+ goto dom_no_memory;
}
-
- v2 = ENCODE_ITEM(value);
- if (!v2) {
- LOG(("failed handling textarea"));
- free(value);
- goto no_memory;
+ err = dom_html_option_element_get_selected(
+ (dom_html_option_element *)option_element,
+ &selected);
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get option selected property"));
+ goto dom_no_memory;
}
-
- free(value);
- value = v2;
- }
- break;
-
- case GADGET_IMAGE: {
- /* image */
- size_t len;
- char *name;
-
- if (control != submit_button)
- /* only the activated submit button
- * is successful */
+ if (!selected)
continue;
-
- name = ENCODE_ITEM(control->name);
- if (name == NULL)
- goto no_memory;
-
- len = strlen(name) + 3;
-
- /* x */
- success_new = malloc(sizeof(*success_new));
- if (!success_new) {
- free(name);
- LOG(("malloc failed"));
- goto no_memory;
+ err = dom_html_option_element_get_value(
+ (dom_html_option_element *)option_element,
+ &inputvalue);
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get option value"));
+ goto dom_no_memory;
}
- success_new->file = false;
- success_new->name = malloc(len);
- success_new->value = malloc(20);
- if (!success_new->name ||
- !success_new->value) {
- free(success_new->name);
- free(success_new->value);
- free(success_new);
- free(name);
- LOG(("malloc failed"));
- goto no_memory;
+
+ success_new = calloc(1, sizeof(*success_new));
+ if (success_new == NULL) {
+ LOG(("Could not allocate data for option"));
+ goto dom_no_memory;
}
- sprintf(success_new->name, "%s.x", name);
- sprintf(success_new->value, "%i",
- control->data.image.mx);
- success_new->next = 0;
+
last_success->next = success_new;
last_success = success_new;
-
- /* y */
- success_new = malloc(sizeof(*success_new));
- if (!success_new) {
- free(name);
- LOG(("malloc failed"));
- goto no_memory;
+
+ success_new->name = ENCODE_ITEM(inputname);
+ if (success_new->name == NULL) {
+ LOG(("Could not encode name for option"));
+ goto dom_no_memory;
}
- success_new->file = false;
- success_new->name = malloc(len);
- success_new->value = malloc(20);
- if (!success_new->name ||
- !success_new->value) {
- free(success_new->name);
- free(success_new->value);
- free(success_new);
- free(name);
- LOG(("malloc failed"));
- goto no_memory;
+ success_new->value = ENCODE_ITEM(inputvalue);
+ if (success_new->value == NULL) {
+ LOG(("Could not encode value for option"));
+ goto dom_no_memory;
}
- sprintf(success_new->name, "%s.y", name);
- sprintf(success_new->value, "%i",
- control->data.image.my);
- success_new->next = 0;
- last_success->next = success_new;
- last_success = success_new;
-
- free(name);
-
- continue;
- break;
}
-
- case GADGET_SUBMIT:
- if (!submit_button && !had_submit)
- /* no submit button specified, so
- * use first declared in form */
+ continue;
+ } else if (dom_string_isequal(nodename, corestring_dom_INPUT)) {
+ /* Things to consider here */
+ /* Buttons -- only if the successful control */
+ /* radio and checkbox -- only if selected */
+ /* file -- also get the rawfile */
+ /* everything else -- just value */
+ err = dom_html_input_element_get_type(
+ (dom_html_input_element *) form_element,
+ &inputtype);
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get input element type"));
+ goto dom_no_memory;
+ }
+ if (dom_string_caseless_isequal(
+ inputtype, corestring_dom_submit)) {
+ LOG(("Examining submit button"));
+ if (submit_button == NULL && !had_submit)
+ /* no button used, and first submit
+ * node found, so use it
+ */
had_submit = true;
- else if (control != submit_button)
- /* only the activated submit button
- * is successful */
+ else if ((dom_node *)submit_button !=
+ (dom_node *)form_element)
continue;
- if (control->value)
- value = ENCODE_ITEM(control->value);
- else
- value = ENCODE_ITEM("");
- if (!value) {
- LOG(("failed to duplicate value"
- "'%s' for control %s",
- control->value,
- control->name));
- goto no_memory;
+ err = dom_html_input_element_get_value(
+ (dom_html_input_element *)form_element,
+ &inputvalue);
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get submit button value"));
+ goto dom_no_memory;
}
- break;
-
- case GADGET_RESET:
- /* ignore reset */
- continue;
- break;
-
- case GADGET_FILE:
- /* file */
- /* Handling of blank file entries is
- * implementation defined - we're perfectly
- * within our rights to treat it as an
- * unsuccessful control. Unfortunately, every
- * other browser submits the field with
- * a blank filename and no content. So,
- * that's what we have to do, too.
+ /* Drop through to report the successful button */
+ } else if (dom_string_caseless_isequal(
+ inputtype, corestring_dom_image)) {
+ /* We *ONLY* use an image input if it was the
+ * thing which activated us
*/
- success_new = malloc(sizeof(*success_new));
- if (!success_new) {
- LOG(("malloc failed"));
- goto no_memory;
+ LOG(("Examining image button"));
+ if ((dom_node *)submit_button !=
+ (dom_node *)form_element)
+ continue;
+
+ err = dom_node_get_user_data(
+ form_element,
+ corestring_dom___ns_key_image_coords_node_data,
+ &coords);
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get image XY data"));
+ goto dom_no_memory;
+ }
+ if (coords == NULL) {
+ LOG(("No XY data on the image input"));
+ goto dom_no_memory;
+ }
+
+ basename = ENCODE_ITEM(inputname);
+
+ success_new = calloc(1, sizeof(*success_new));
+ if (success_new == NULL) {
+ free(basename);
+ LOG(("Could not allocate data for image.x"));
+ goto dom_no_memory;
+ }
+
+ last_success->next = success_new;
+ last_success = success_new;
+
+ success_new->name = malloc(strlen(basename) + 3);
+ if (success_new->name == NULL) {
+ free(basename);
+ LOG(("Could not allocate name for image.x"));
+ goto dom_no_memory;
+ }
+ success_new->value = malloc(20);
+ if (success_new->value == NULL) {
+ free(basename);
+ LOG(("Could not allocate value for image.x"));
+ goto dom_no_memory;
+ }
+ sprintf(success_new->name, "%s.x", basename);
+ sprintf(success_new->value, "%d", coords->x);
+
+ success_new = calloc(1, sizeof(*success_new));
+ if (success_new == NULL) {
+ free(basename);
+ LOG(("Could not allocate data for image.y"));
+ goto dom_no_memory;
+ }
+
+ last_success->next = success_new;
+ last_success = success_new;
+
+ success_new->name = malloc(strlen(basename) + 3);
+ if (success_new->name == NULL) {
+ free(basename);
+ LOG(("Could not allocate name for image.y"));
+ goto dom_no_memory;
+ }
+ success_new->value = malloc(20);
+ if (success_new->value == NULL) {
+ free(basename);
+ LOG(("Could not allocate value for image.y"));
+ goto dom_no_memory;
+ }
+ sprintf(success_new->name, "%s.y", basename);
+ sprintf(success_new->value, "%d", coords->y);
+ free(basename);
+ continue;
+ } else if (dom_string_caseless_isequal(
+ inputtype, corestring_dom_radio) ||
+ dom_string_caseless_isequal(
+ inputtype, corestring_dom_checkbox)) {
+ LOG(("Examining radio or checkbox"));
+ err = dom_html_input_element_get_checked(
+ (dom_html_input_element *)form_element,
+ &checked);
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get input element checked"));
+ goto dom_no_memory;
}
- success_new->file = true;
- success_new->name = ENCODE_ITEM(control->name);
- success_new->value =
- ENCODE_ITEM(control->value ?
- control->value : "");
- success_new->next = 0;
- last_success->next = success_new;
- last_success = success_new;
- if (!success_new->name ||
- !success_new->value) {
- LOG(("strdup failed"));
- goto no_memory;
+ if (!checked)
+ continue;
+ err = dom_html_input_element_get_value(
+ (dom_html_input_element *)form_element,
+ &inputvalue);
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get input element value"));
+ goto dom_no_memory;
}
-
- continue;
- break;
-
- case GADGET_BUTTON:
- /* Ignore it */
+ if (inputvalue == NULL)
+ inputvalue = dom_string_ref(
+ corestring_dom_on);
+ /* Fall through to simple allocation */
+ } else if (dom_string_caseless_isequal(
+ inputtype, corestring_dom_file)) {
+ LOG(("Examining file input"));
+ err = dom_html_input_element_get_value(
+ (dom_html_input_element *)form_element,
+ &inputvalue);
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get file value"));
+ goto dom_no_memory;
+ }
+ err = dom_node_get_user_data(
+ form_element,
+ corestring_dom___ns_key_file_name_node_data,
+ &rawfile_temp);
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get file rawname"));
+ goto dom_no_memory;
+ }
+ rawfile_temp = strdup(rawfile_temp != NULL ?
+ rawfile_temp :
+ "");
+ if (rawfile_temp == NULL) {
+ LOG(("Could not copy file rawname"));
+ goto dom_no_memory;
+ }
+ /* Fall out to the allocation */
+ } else if (dom_string_caseless_isequal(
+ inputtype, corestring_dom_reset) ||
+ dom_string_caseless_isequal(
+ inputtype, corestring_dom_button)) {
+ /* Skip these */
+ LOG(("Skipping RESET and BUTTON"));
continue;
- break;
-
- default:
- assert(0);
- break;
+ } else {
+ /* Everything else is treated as text values */
+ LOG(("Retrieving generic input text"));
+ err = dom_html_input_element_get_value(
+ (dom_html_input_element *)form_element,
+ &inputvalue);
+ if (err != DOM_NO_ERR) {
+ LOG(("Could not get input value"));
+ goto dom_no_memory;
+ }
+ /* Fall out to the allocation */
+ }
}
-
- success_new = malloc(sizeof(*success_new));
- if (!success_new) {
- LOG(("malloc failed"));
- free(value);
- goto no_memory;
+
+ success_new = calloc(1, sizeof(*success_new));
+ if (success_new == NULL) {
+ LOG(("Could not allocate data for generic"));
+ goto dom_no_memory;
}
- success_new->file = false;
- success_new->name = ENCODE_ITEM(control->name);
- success_new->value = value;
- success_new->next = NULL;
+
last_success->next = success_new;
last_success = success_new;
- if (!success_new->name) {
- LOG(("failed to duplicate name '%s'",
- control->name));
- goto no_memory;
+
+ success_new->name = ENCODE_ITEM(inputname);
+ if (success_new->name == NULL) {
+ LOG(("Could not encode name for generic"));
+ goto dom_no_memory;
+ }
+ success_new->value = ENCODE_ITEM(inputvalue);
+ if (success_new->value == NULL) {
+ LOG(("Could not encode value for generic"));
+ goto dom_no_memory;
+ }
+ if (rawfile_temp != NULL) {
+ success_new->file = true;
+ success_new->rawfile = rawfile_temp;
+ rawfile_temp = NULL;
}
}
-
+
free(charset);
-
+ if (form_element != NULL) {
+ LOG(("Unreffed %p", form_element));
+ dom_node_unref(form_element);
+ }
+ if (form_elements != NULL) {
+ LOG(("Unreffed %p", form_elements));
+ dom_html_collection_unref(form_elements);
+ }
+ if (nodename != NULL)
+ dom_string_unref(nodename);
+ if (inputname != NULL)
+ dom_string_unref(inputname);
+ if (inputvalue != NULL)
+ dom_string_unref(inputvalue);
+ if (options != NULL)
+ dom_html_options_collection_unref(options);
+ if (option_element != NULL)
+ dom_node_unref(option_element);
+ if (inputtype != NULL)
+ dom_string_unref(inputtype);
+ if (rawfile_temp != NULL)
+ free(rawfile_temp);
*successful_controls = sentinel.next;
+
+ for (success_new = *successful_controls; success_new != NULL;
+ success_new = success_new->next) {
+ LOG(("%p -> %s=%s", success_new, success_new->name, success_new->value));
+ LOG(("%p -> file=%s rawfile=%s", success_new,
+ success_new->file ? "yes" : "no", success_new->rawfile));
+ }
return true;
-
-no_memory:
- warn_user("NoMemory", 0);
+
+dom_no_memory:
free(charset);
fetch_multipart_data_destroy(sentinel.next);
+
+ if (form_elements != NULL)
+ dom_html_collection_unref(form_elements);
+ if (form_element != NULL)
+ dom_node_unref(form_element);
+ if (nodename != NULL)
+ dom_string_unref(nodename);
+ if (inputname != NULL)
+ dom_string_unref(inputname);
+ if (inputvalue != NULL)
+ dom_string_unref(inputvalue);
+ if (options != NULL)
+ dom_html_options_collection_unref(options);
+ if (option_element != NULL)
+ dom_node_unref(option_element);
+ if (inputtype != NULL)
+ dom_string_unref(inputtype);
+ if (rawfile_temp != NULL)
+ free(rawfile_temp);
+
return false;
-
-#undef ENCODE_ITEM
}
-
+#undef ENCODE_ITEM
/**
* Encode controls using application/x-www-form-urlencoded.
@@ -658,7 +857,7 @@ static char *form_url_encode(struct form *form,
char *name, *value;
char *s, *s2;
unsigned int len, len1, len_init;
- url_func_result url_err;
+ nserror url_err;
if (query_string)
s = malloc(2);
@@ -679,21 +878,21 @@ static char *form_url_encode(struct form *form,
for (; control; control = control->next) {
url_err = url_escape(control->name, 0, true, NULL, &name);
- if (url_err == URL_FUNC_NOMEM) {
+ if (url_err == NSERROR_NOMEM) {
free(s);
return NULL;
}
- assert(url_err == URL_FUNC_OK);
+ assert(url_err == NSERROR_OK);
url_err = url_escape(control->value, 0, true, NULL, &value);
- if (url_err == URL_FUNC_NOMEM) {
+ if (url_err == NSERROR_NOMEM) {
free(name);
free(s);
return NULL;
}
- assert(url_err == URL_FUNC_OK);
+ assert(url_err == NSERROR_OK);
len1 = len + strlen(name) + strlen(value) + 2;
s2 = realloc(s, len1 + 1);
@@ -785,15 +984,16 @@ char *form_acceptable_charset(struct form *form)
* \todo Return charset used?
*
* \param item String to convert
+ * \param len Length of string to convert
* \param charset Destination charset
* \param fallback Fallback charset (may be NULL),
* used iff converting to charset fails
* \return Pointer to converted string (on heap, caller frees), or NULL
*/
-char *form_encode_item(const char *item, const char *charset,
+char *form_encode_item(const char *item, uint32_t len, const char *charset,
const char *fallback)
{
- utf8_convert_ret err;
+ nserror err;
char *ret = NULL;
char cset[256];
@@ -803,19 +1003,19 @@ char *form_encode_item(const char *item, const char *charset,
snprintf(cset, sizeof cset, "%s//TRANSLIT", charset);
err = utf8_to_enc(item, cset, 0, &ret);
- if (err == UTF8_CONVERT_BADENC) {
+ if (err == NSERROR_BAD_ENCODING) {
/* charset not understood, try without transliteration */
snprintf(cset, sizeof cset, "%s", charset);
- err = utf8_to_enc(item, cset, 0, &ret);
+ err = utf8_to_enc(item, cset, len, &ret);
- if (err == UTF8_CONVERT_BADENC) {
+ if (err == NSERROR_BAD_ENCODING) {
/* nope, try fallback charset (if any) */
if (fallback) {
snprintf(cset, sizeof cset,
"%s//TRANSLIT", fallback);
err = utf8_to_enc(item, cset, 0, &ret);
- if (err == UTF8_CONVERT_BADENC) {
+ if (err == NSERROR_BAD_ENCODING) {
/* and without transliteration */
snprintf(cset, sizeof cset,
"%s", fallback);
@@ -823,11 +1023,11 @@ char *form_encode_item(const char *item, const char *charset,
}
}
- if (err == UTF8_CONVERT_BADENC) {
+ if (err == NSERROR_BAD_ENCODING) {
/* that also failed, use 8859-1 */
err = utf8_to_enc(item, "ISO-8859-1//TRANSLIT",
0, &ret);
- if (err == UTF8_CONVERT_BADENC) {
+ if (err == NSERROR_BAD_ENCODING) {
/* and without transliteration */
err = utf8_to_enc(item, "ISO-8859-1",
0, &ret);
@@ -835,7 +1035,7 @@ char *form_encode_item(const char *item, const char *charset,
}
}
}
- if (err == UTF8_CONVERT_NOMEM) {
+ if (err == NSERROR_NOMEM) {
return NULL;
}
@@ -1134,18 +1334,26 @@ static void form__select_process_selection(html_content *html,
for (count = 0, o = control->data.select.items;
o != NULL;
count++, o = o->next) {
- if (!control->data.select.multiple)
+ if (!control->data.select.multiple && o->selected) {
o->selected = false;
+ dom_html_option_element_set_selected(o->node, false);
+ }
if (count == item) {
if (control->data.select.multiple) {
if (o->selected) {
o->selected = false;
+ dom_html_option_element_set_selected(
+ o->node, false);
control->data.select.num_selected--;
} else {
o->selected = true;
+ dom_html_option_element_set_selected(
+ o->node, true);
control->data.select.num_selected++;
}
} else {
+ dom_html_option_element_set_selected(
+ o->node, true);
o->selected = true;
}
}
@@ -1175,14 +1383,11 @@ static void form__select_process_selection(html_content *html,
}
-void form_select_process_selection(hlcache_handle *h,
- struct form_control *control, int item)
+void form_select_process_selection(struct form_control *control, int item)
{
- assert(h != NULL);
+ assert(control != NULL);
- form__select_process_selection(
- (html_content *)hlcache_handle_get_content(h),
- control, item);
+ form__select_process_selection(control->html, control, item);
}
/**
@@ -1410,12 +1615,10 @@ void form_select_menu_callback(void *client_data,
* \param radio form control of type GADGET_RADIO
*/
-void form_radio_set(html_content *html,
- struct form_control *radio)
+void form_radio_set(struct form_control *radio)
{
struct form_control *control;
- assert(html);
assert(radio);
if (!radio->form)
return;
@@ -1434,12 +1637,14 @@ void form_radio_set(html_content *html,
if (control->selected) {
control->selected = false;
- html__redraw_a_box(html, control->box);
+ dom_html_input_element_set_checked(control->node, false);
+ html__redraw_a_box(radio->html, control->box);
}
}
radio->selected = true;
- html__redraw_a_box(html, radio->box);
+ dom_html_input_element_set_checked(radio->node, true);
+ html__redraw_a_box(radio->html, radio->box);
}
@@ -1458,7 +1663,7 @@ void form_submit(nsurl *page_url, struct browser_window *target,
assert(form != NULL);
- if (form_successful_controls(form, submit_button, &success) == false) {
+ if (form_successful_controls_dom(form, submit_button, &success) == false) {
warn_user("NoMemory", 0);
return;
}
@@ -1494,8 +1699,7 @@ void form_submit(nsurl *page_url, struct browser_window *target,
browser_window_navigate(target,
action_query,
page_url,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -1515,8 +1719,7 @@ void form_submit(nsurl *page_url, struct browser_window *target,
browser_window_navigate(target,
action_url,
page_url,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
data,
NULL,
NULL);
@@ -1526,8 +1729,7 @@ void form_submit(nsurl *page_url, struct browser_window *target,
browser_window_navigate(target,
action_url,
page_url,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
success,
NULL);
@@ -1539,3 +1741,39 @@ void form_submit(nsurl *page_url, struct browser_window *target,
fetch_multipart_data_destroy(success);
free(data);
}
+
+void form_gadget_update_value(struct form_control *control, char *value)
+{
+ switch (control->type) {
+ case GADGET_HIDDEN:
+ case GADGET_TEXTBOX:
+ case GADGET_TEXTAREA:
+ case GADGET_PASSWORD:
+ case GADGET_FILE:
+ if (control->value != NULL) {
+ free(control->value);
+ }
+ control->value = value;
+ if (control->node != NULL) {
+ dom_exception err;
+ dom_string *str;
+ err = dom_string_create((uint8_t *)value,
+ strlen(value), &str);
+ if (err == DOM_NO_ERR) {
+ if (control->type == GADGET_TEXTAREA)
+ err = dom_html_text_area_element_set_value(
+ (dom_html_text_area_element *)(control->node),
+ str);
+ else
+ err = dom_html_input_element_set_value(
+ (dom_html_input_element *)(control->node),
+ str);
+ dom_string_unref(str);
+ }
+ }
+ break;
+ default:
+ /* Do nothing */
+ break;
+ }
+}
diff --git a/render/form.h b/render/form.h
index 9088ca293..7715b9ad3 100644
--- a/render/form.h
+++ b/render/form.h
@@ -35,6 +35,8 @@ struct form_option;
struct form_select_menu;
struct html_content;
struct dom_string;
+struct content;
+struct nsurl;
/** Form submit method. */
typedef enum {
@@ -76,13 +78,13 @@ typedef enum {
/** Data for textarea */
struct form_textarea_data {
- struct html_content *html;
struct form_control *gadget;
};
/** Form control. */
struct form_control {
void *node; /**< Corresponding DOM node */
+ struct html_content *html; /**< HTML content containing control */
form_control_type type; /**< Type of control */
@@ -126,6 +128,7 @@ struct form_control {
/** Option in a select. */
struct form_option {
+ void *node; /**< Corresponding DOM node */
bool selected;
bool initial_selected;
char *value;
@@ -133,6 +136,11 @@ struct form_option {
struct form_option* next;
};
+struct image_input_coords {
+ int x;
+ int y;
+};
+
/**
* Called by the select menu when it wants an area to be redrawn. The
* coordinates are menu origin relative.
@@ -154,10 +162,13 @@ struct form_control *form_new_control(void *node, form_control_type type);
void form_add_control(struct form *form, struct form_control *control);
void form_free_control(struct form_control *control);
bool form_add_option(struct form_control *control, char *value, char *text,
- bool selected);
+ bool selected, void *node);
bool form_successful_controls(struct form *form,
struct form_control *submit_button,
struct fetch_multipart_data **successful_controls);
+bool form_successful_controls_dom(struct form *form,
+ struct form_control *submit_button,
+ struct fetch_multipart_data **successful_controls);
bool form_open_select_menu(void *client_data,
struct form_control *control,
@@ -177,10 +188,11 @@ void form_select_mouse_drag_end(struct form_control *control,
browser_mouse_state mouse, int x, int y);
void form_select_get_dimensions(struct form_control *control,
int *width, int *height);
-void form_select_process_selection(hlcache_handle *h,
- struct form_control *control, int item);
-void form_submit(nsurl *page_url, struct browser_window *target,
+void form_select_process_selection(struct form_control *control, int item);
+void form_submit(struct nsurl *page_url, struct browser_window *target,
struct form *form, struct form_control *submit_button);
-void form_radio_set(struct html_content *html, struct form_control *radio);
+void form_radio_set(struct form_control *radio);
+
+void form_gadget_update_value(struct form_control *control, char *value);
#endif
diff --git a/render/html.c b/render/html.c
index 1e7350cf1..12c173f0d 100644
--- a/render/html.c
+++ b/render/html.c
@@ -29,14 +29,25 @@
#include <stdlib.h>
#include "utils/config.h"
+#include "utils/corestrings.h"
+#include "utils/http.h"
+#include "utils/libdom.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/talloc.h"
+#include "utils/utf8.h"
+#include "utils/utils.h"
+#include "utils/nsoption.h"
#include "content/content_protected.h"
#include "content/fetch.h"
#include "content/hlcache.h"
-#include "utils/nsoption.h"
#include "desktop/selection.h"
#include "desktop/scrollbar.h"
#include "desktop/textarea.h"
#include "image/bitmap.h"
+#include "javascript/js.h"
+#include "desktop/gui_factory.h"
+
#include "render/box.h"
#include "render/font.h"
#include "render/form.h"
@@ -44,17 +55,6 @@
#include "render/imagemap.h"
#include "render/layout.h"
#include "render/search.h"
-#include "javascript/js.h"
-#include "utils/corestrings.h"
-#include "utils/http.h"
-#include "utils/libdom.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/schedule.h"
-#include "utils/talloc.h"
-#include "utils/url.h"
-#include "utils/utf8.h"
-#include "utils/utils.h"
#define CHUNK 4096
@@ -100,7 +100,7 @@ static void html_box_convert_done(html_content *c, bool success)
#if ALWAYS_DUMP_BOX
- box_dump(stderr, c->layout->children, 0);
+ box_dump(stderr, c->layout->children, 0, true);
#endif
#if ALWAYS_DUMP_FRAMESET
if (c->frameset)
@@ -507,6 +507,37 @@ static nserror html_meta_refresh_process_element(html_content *c, dom_node *n)
return error;
}
+static bool html_process_img(html_content *c, dom_node *node)
+{
+ dom_string *src;
+ nsurl *url;
+ nserror err;
+ dom_exception exc;
+ bool success;
+
+ /* Do nothing if foreground images are disabled */
+ if (nsoption_bool(foreground_images) == false) {
+ return true;
+ }
+
+ exc = dom_element_get_attribute(node, corestring_dom_src, &src);
+ if (exc != DOM_NO_ERR || src == NULL) {
+ return true;
+ }
+
+ err = nsurl_join(c->base_url, dom_string_data(src), &url);
+ if (err != NSERROR_OK) {
+ dom_string_unref(src);
+ return false;
+ }
+ dom_string_unref(src);
+
+ /* Speculatively fetch the image */
+ success = html_fetch_object(c, url, NULL, CONTENT_IMAGE, 0, 0, false);
+ nsurl_unref(url);
+
+ return success;
+}
/**
* Complete conversion of an HTML document
@@ -558,6 +589,7 @@ void html_finish_conversion(html_content *c)
error = dom_to_box(html, c, html_box_convert_done);
if (error != NSERROR_OK) {
+ LOG(("box conversion failed"));
dom_node_unref(html);
html_object_free_objects(c);
content_broadcast_errorcode(&c->base, error);
@@ -608,6 +640,10 @@ dom_default_action_DOMNodeInserted_cb(struct dom_event *evt, void *pw)
name, corestring_lwc_title) &&
htmlc->title == NULL) {
htmlc->title = dom_node_ref(node);
+ } else if (dom_string_caseless_lwc_isequal(
+ name, corestring_lwc_img)) {
+ html_process_img(htmlc,
+ (dom_node *) node);
}
dom_string_unref(name);
@@ -694,6 +730,7 @@ html_create_html_data(html_content *c, const http_parameter *params)
dom_hubbub_error error;
c->parser = NULL;
+ c->parse_completed = false;
c->document = NULL;
c->quirks = DOM_DOCUMENT_QUIRKS_MODE_NONE;
c->encoding = NULL;
@@ -1033,16 +1070,35 @@ html_begin_conversion(html_content *htmlc)
dom_string *node_name = NULL;
dom_hubbub_error error;
- LOG(("Completing parse"));
- /* complete parsing */
- error = dom_hubbub_parser_completed(htmlc->parser);
- if (error != DOM_HUBBUB_OK) {
- LOG(("Parsing failed"));
+ /* The act of completing the parse can result in additional data
+ * being flushed through the parser. This may result in new style or
+ * script nodes, upon which the conversion depends. Thus, once we
+ * have completed the parse, we must check again to see if we can
+ * begin the conversion. If we can't, we must stop and wait for the
+ * new styles/scripts to be processed. Once they have been processed,
+ * we will be called again to begin the conversion for real. Thus,
+ * we must also ensure that we don't attempt to complete the parse
+ * multiple times, so store a flag to indicate that parsing is
+ * complete to avoid repeating the completion pointlessly.
+ */
+ if (htmlc->parse_completed == false) {
+ LOG(("Completing parse"));
+ /* complete parsing */
+ error = dom_hubbub_parser_completed(htmlc->parser);
+ if (error != DOM_HUBBUB_OK) {
+ LOG(("Parsing failed"));
+
+ content_broadcast_errorcode(&htmlc->base,
+ libdom_hubbub_error_to_nserror(error));
- content_broadcast_errorcode(&htmlc->base,
- libdom_hubbub_error_to_nserror(error));
+ return false;
+ }
+ htmlc->parse_completed = true;
+ }
- return false;
+ if (html_can_begin_conversion(htmlc) == false) {
+ /* We can't proceed (see commentary above) */
+ return true;
}
/* Give up processing if we've been aborted */
@@ -1685,6 +1741,85 @@ html_scroll_at_point(struct content *c, int x, int y, int scrx, int scry)
return false;
}
+/** Helper for file gadgets to store their filename unencoded on the
+ * dom node associated with the gadget.
+ *
+ * \todo Get rid of this crap eventually
+ */
+static void html__dom_user_data_handler(dom_node_operation operation,
+ dom_string *key, void *_data, struct dom_node *src,
+ struct dom_node *dst)
+{
+ char *oldfile;
+ char *data = (char *)_data;
+
+ if (!dom_string_isequal(corestring_dom___ns_key_file_name_node_data,
+ key) || data == NULL) {
+ return;
+ }
+
+ switch (operation) {
+ case DOM_NODE_CLONED:
+ if (dom_node_set_user_data(dst,
+ corestring_dom___ns_key_file_name_node_data,
+ strdup(data), html__dom_user_data_handler,
+ &oldfile) == DOM_NO_ERR) {
+ if (oldfile != NULL)
+ free(oldfile);
+ }
+ break;
+
+ case DOM_NODE_RENAMED:
+ case DOM_NODE_IMPORTED:
+ case DOM_NODE_ADOPTED:
+ break;
+
+ case DOM_NODE_DELETED:
+ free(data);
+ break;
+ default:
+ LOG(("User data operation not handled."));
+ assert(0);
+ }
+}
+
+static void html__set_file_gadget_filename(struct content *c,
+ struct form_control *gadget, const char *fn)
+{
+ nserror ret;
+ char *utf8_fn, *oldfile = NULL;
+ html_content *html = (html_content *)c;
+ struct box *file_box = gadget->box;
+
+ ret = guit->utf8->local_to_utf8(fn, 0, &utf8_fn);
+ if (ret != NSERROR_OK) {
+ assert(ret != NSERROR_BAD_ENCODING);
+ LOG(("utf8 to local encoding conversion failed"));
+ /* Load was for us - just no memory */
+ return;
+ }
+
+ form_gadget_update_value(gadget, utf8_fn);
+
+ /* corestring_dom___ns_key_file_name_node_data */
+ if (dom_node_set_user_data((dom_node *)file_box->gadget->node,
+ corestring_dom___ns_key_file_name_node_data,
+ strdup(fn), html__dom_user_data_handler,
+ &oldfile) == DOM_NO_ERR) {
+ if (oldfile != NULL)
+ free(oldfile);
+ }
+
+ /* Redraw box. */
+ html__redraw_a_box(html, file_box);
+}
+
+void html_set_file_gadget_filename(struct hlcache_handle *hl,
+ struct form_control *gadget, const char *fn)
+{
+ return html__set_file_gadget_filename(hlcache_handle_get_content(hl),
+ gadget, fn);
+}
/**
* Drop a file onto a content at a particular point, or determine if a file
@@ -1751,25 +1886,7 @@ static bool html_drop_file_at_point(struct content *c, int x, int y, char *file)
/* Handle the drop */
if (file_box) {
/* File dropped on file input */
- utf8_convert_ret ret;
- char *utf8_fn;
-
- ret = utf8_from_local_encoding(file, 0,
- &utf8_fn);
- if (ret != UTF8_CONVERT_OK) {
- /* A bad encoding should never happen */
- assert(ret != UTF8_CONVERT_BADENC);
- LOG(("utf8_from_local_encoding failed"));
- /* Load was for us - just no memory */
- return true;
- }
-
- /* Found: update form input */
- free(file_box->gadget->value);
- file_box->gadget->value = utf8_fn;
-
- /* Redraw box. */
- html__redraw_a_box(html, file_box);
+ html__set_file_gadget_filename(c, file_box->gadget, file);
} else {
/* File dropped on text input */
@@ -1778,7 +1895,7 @@ static bool html_drop_file_at_point(struct content *c, int x, int y, char *file)
FILE *fp = NULL;
char *buffer;
char *utf8_buff;
- utf8_convert_ret ret;
+ nserror ret;
unsigned int size;
int bx, by;
@@ -1819,11 +1936,11 @@ static bool html_drop_file_at_point(struct content *c, int x, int y, char *file)
/* TODO: Sniff for text? */
/* Convert to UTF-8 */
- ret = utf8_from_local_encoding(buffer, file_len, &utf8_buff);
- if (ret != UTF8_CONVERT_OK) {
+ ret = guit->utf8->local_to_utf8(buffer, file_len, &utf8_buff);
+ if (ret != NSERROR_OK) {
/* bad encoding shouldn't happen */
- assert(ret != UTF8_CONVERT_BADENC);
- LOG(("utf8_from_local_encoding failed"));
+ assert(ret != NSERROR_BAD_ENCODING);
+ LOG(("local to utf8 encoding failed"));
free(buffer);
warn_user("NoMemory", NULL);
return true;
@@ -1854,17 +1971,43 @@ static bool html_drop_file_at_point(struct content *c, int x, int y, char *file)
/**
* Dump debug info concerning the html_content
*
- * \param bw The browser window
- * \param bw The file to dump to
+ * \param bw The browser window
+ * \param f The file to dump to
*/
-static void html_debug_dump(struct content *c, FILE *f)
+static nserror
+html_debug_dump(struct content *c, FILE *f, enum content_debug op)
{
- html_content *html = (html_content *) c;
+ html_content *htmlc = (html_content *)c;
+ dom_node *html;
+ dom_exception exc; /* returned by libdom functions */
+ nserror ret;
- assert(html != NULL);
- assert(html->layout != NULL);
+ assert(htmlc != NULL);
+
+ if (op == CONTENT_DEBUG_RENDER) {
+ assert(htmlc->layout != NULL);
+ box_dump(f, htmlc->layout, 0, true);
+ ret = NSERROR_OK;
+ } else {
+ if (htmlc->document == NULL) {
+ LOG(("No document to dump"));
+ return NSERROR_DOM;
+ }
- box_dump(f, html->layout, 0);
+ exc = dom_document_get_document_element(htmlc->document, (void *) &html);
+ if ((exc != DOM_NO_ERR) || (html == NULL)) {
+ LOG(("Unable to obtain root node"));
+ return NSERROR_DOM;
+ }
+
+ ret = libdom_dump_structure(html, f, 0);
+
+ LOG(("DOM structure dump returning %d", ret));
+
+ dom_node_unref(html);
+ }
+
+ return ret;
}
@@ -2084,8 +2227,6 @@ static content_type html_content_type(void)
static void html_fini(void)
{
- box_construct_fini();
-
html_css_fini();
}
@@ -2125,10 +2266,6 @@ nserror html_init(void)
if (error != NSERROR_OK)
goto error;
- error = box_construct_init();
- if (error != NSERROR_OK)
- goto error;
-
for (i = 0; i < NOF_ELEMENTS(html_types); i++) {
error = content_factory_register_handler(html_types[i],
&html_content_handler);
diff --git a/render/html.h b/render/html.h
index 162541d72..a5ee5ffa5 100644
--- a/render/html.h
+++ b/render/html.h
@@ -51,6 +51,7 @@ struct scrollbar;
struct scrollbar_msg_data;
struct search_context;
struct selection;
+struct nsurl;
/**
* Container for stylesheets used by an HTML document
@@ -113,7 +114,7 @@ struct content_html_frames {
int margin_height; /** frame margin height */
char *name; /** frame name (for targetting) */
- nsurl *url; /** frame url */
+ struct nsurl *url; /** frame url */
bool no_resize; /** frame is not resizable */
frame_scrolling scrolling; /** scrolling characteristics */
@@ -131,7 +132,7 @@ struct content_html_iframe {
int margin_height; /** frame margin height */
char *name; /** frame name (for targetting) */
- nsurl *url; /** frame url */
+ struct nsurl *url; /** frame url */
frame_scrolling scrolling; /** scrolling characteristics */
bool border; /** frame has a border */
@@ -176,8 +177,10 @@ const char *html_get_encoding(struct hlcache_handle *h);
dom_hubbub_encoding_source html_get_encoding_source(struct hlcache_handle *h);
struct content_html_frames *html_get_frameset(struct hlcache_handle *h);
struct content_html_iframe *html_get_iframe(struct hlcache_handle *h);
-nsurl *html_get_base_url(struct hlcache_handle *h);
+struct nsurl *html_get_base_url(struct hlcache_handle *h);
const char *html_get_base_target(struct hlcache_handle *h);
+void html_set_file_gadget_filename(struct hlcache_handle *hl,
+ struct form_control *gadget, const char *fn);
/**
* Retrieve stylesheets used by HTML document
diff --git a/render/html_css.c b/render/html_css.c
index 88c67697d..b4c25bae2 100644
--- a/render/html_css.c
+++ b/render/html_css.c
@@ -28,12 +28,13 @@
#include <stdlib.h>
#include "content/hlcache.h"
+#include "desktop/gui_factory.h"
#include "utils/nsoption.h"
-#include "render/html_internal.h"
#include "utils/corestrings.h"
#include "utils/config.h"
#include "utils/log.h"
-#include "utils/schedule.h"
+
+#include "render/html_internal.h"
static nsurl *html_default_stylesheet_url;
static nsurl *html_adblock_stylesheet_url;
@@ -97,14 +98,6 @@ html_convert_css_callback(hlcache_handle *css,
assert(i != parent->stylesheet_count);
switch (event->type) {
- case CONTENT_MSG_LOADING:
- break;
-
- case CONTENT_MSG_READY:
- break;
-
- case CONTENT_MSG_REDIRECT:
- break;
case CONTENT_MSG_DONE:
LOG(("done stylesheet slot %d '%s'", i,
@@ -143,7 +136,7 @@ html_convert_css_callback(hlcache_handle *css,
return NSERROR_OK;
default:
- assert(0);
+ break;
}
if (html_can_begin_conversion(parent)) {
@@ -315,7 +308,7 @@ static void html_css_process_modified_styles(void *pw)
/* If we failed to process any sheet, schedule a retry */
if (all_done == false) {
- schedule(100, html_css_process_modified_styles, c);
+ guit->browser->schedule(1000, html_css_process_modified_styles, c);
}
}
@@ -340,7 +333,7 @@ bool html_css_update_style(html_content *c, dom_node *style)
s->modified = true;
- schedule(0, html_css_process_modified_styles, c);
+ guit->browser->schedule(0, html_css_process_modified_styles, c);
return true;
}
@@ -470,7 +463,7 @@ nserror html_css_free_stylesheets(html_content *html)
{
unsigned int i;
- schedule_remove(html_css_process_modified_styles, html);
+ guit->browser->schedule(-1, html_css_process_modified_styles, html);
for (i = 0; i != html->stylesheet_count; i++) {
if (html->stylesheets[i].sheet != NULL) {
diff --git a/render/html_css_fetcher.c b/render/html_css_fetcher.c
index 9bd3b21a6..3df1528af 100644
--- a/render/html_css_fetcher.c
+++ b/render/html_css_fetcher.c
@@ -28,6 +28,7 @@
#include "utils/config.h"
#include "content/fetch.h"
+#include "content/fetchers.h"
#include "render/html_internal.h"
#include "utils/log.h"
#include "utils/ring.h"
@@ -276,6 +277,16 @@ static void html_css_fetcher_poll(lwc_string *scheme)
void html_css_fetcher_register(void)
{
lwc_string *scheme;
+ const struct fetcher_operation_table html_css_fetcher_ops = {
+ .initialise = html_css_fetcher_initialise,
+ .acceptable = html_css_fetcher_can_fetch,
+ .setup = html_css_fetcher_setup,
+ .start = html_css_fetcher_start,
+ .abort = html_css_fetcher_abort,
+ .free = html_css_fetcher_free,
+ .poll = html_css_fetcher_poll,
+ .finalise = html_css_fetcher_finalise
+ };
if (lwc_intern_string("x-ns-css", SLEN("x-ns-css"),
&scheme) != lwc_error_ok) {
@@ -283,15 +294,7 @@ void html_css_fetcher_register(void)
"(couldn't intern \"x-ns-css\").");
}
- fetch_add_fetcher(scheme,
- html_css_fetcher_initialise,
- html_css_fetcher_can_fetch,
- html_css_fetcher_setup,
- html_css_fetcher_start,
- html_css_fetcher_abort,
- html_css_fetcher_free,
- html_css_fetcher_poll,
- html_css_fetcher_finalise);
+ fetcher_add(scheme, &html_css_fetcher_ops);
}
nserror html_css_fetcher_add_item(dom_string *data, nsurl *base_url,
diff --git a/render/html_interaction.c b/render/html_interaction.c
index 6f4d9bd51..e030e570d 100644
--- a/render/html_interaction.c
+++ b/render/html_interaction.c
@@ -29,7 +29,9 @@
#include <dom/dom.h>
#include "content/content.h"
+#include "content/hlcache.h"
#include "desktop/browser.h"
+#include "desktop/gui_factory.h"
#include "desktop/frames.h"
#include "desktop/mouse.h"
#include "utils/nsoption.h"
@@ -45,8 +47,10 @@
#include "render/imagemap.h"
#include "render/search.h"
#include "javascript/js.h"
+#include "utils/corestrings.h"
#include "utils/messages.h"
#include "utils/utils.h"
+#include "utils/log.h"
/**
@@ -228,6 +232,47 @@ void html_mouse_track(struct content *c, struct browser_window *bw,
html_mouse_action(c, bw, mouse, x, y);
}
+/** Helper for file gadgets to store their filename unencoded on the
+ * dom node associated with the gadget.
+ *
+ * \todo Get rid of this crap eventually
+ */
+static void html__image_coords_dom_user_data_handler(dom_node_operation operation,
+ dom_string *key, void *_data, struct dom_node *src,
+ struct dom_node *dst)
+{
+ struct image_input_coords *oldcoords, *coords = _data, *newcoords;
+
+ if (!dom_string_isequal(corestring_dom___ns_key_image_coords_node_data,
+ key) || coords == NULL) {
+ return;
+ }
+
+ switch (operation) {
+ case DOM_NODE_CLONED:
+ newcoords = calloc(1, sizeof(*newcoords));
+ *newcoords = *coords;
+ if (dom_node_set_user_data(dst,
+ corestring_dom___ns_key_image_coords_node_data,
+ newcoords, html__image_coords_dom_user_data_handler,
+ &oldcoords) == DOM_NO_ERR) {
+ free(oldcoords);
+ }
+ break;
+
+ case DOM_NODE_RENAMED:
+ case DOM_NODE_IMPORTED:
+ case DOM_NODE_ADOPTED:
+ break;
+
+ case DOM_NODE_DELETED:
+ free(coords);
+ break;
+ default:
+ LOG(("User data operation not handled."));
+ assert(0);
+ }
+}
/**
* Handle mouse clicks and movements in an HTML content window.
@@ -611,24 +656,40 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
c);
pointer = BROWSER_POINTER_DEFAULT;
} else if (mouse & BROWSER_MOUSE_CLICK_1)
- gui_create_form_select_menu(bw, gadget);
+ guit->browser->create_form_select_menu(bw, gadget);
break;
case GADGET_CHECKBOX:
status = messages_get("FormCheckbox");
if (mouse & BROWSER_MOUSE_CLICK_1) {
gadget->selected = !gadget->selected;
+ dom_html_input_element_set_checked(
+ (dom_html_input_element *)(gadget->node),
+ gadget->selected);
html__redraw_a_box(html, gadget_box);
}
break;
case GADGET_RADIO:
status = messages_get("FormRadio");
if (mouse & BROWSER_MOUSE_CLICK_1)
- form_radio_set(html, gadget);
+ form_radio_set(gadget);
break;
case GADGET_IMAGE:
if (mouse & BROWSER_MOUSE_CLICK_1) {
- gadget->data.image.mx = x - gadget_box_x;
- gadget->data.image.my = y - gadget_box_y;
+ struct image_input_coords *coords, *oldcoords;
+ /** \todo Find a way to not ignore errors */
+ coords = calloc(1, sizeof(*coords));
+ if (coords == NULL) {
+ return;
+ }
+ coords->x = x - gadget_box_x;
+ coords->y = y - gadget_box_y;
+ if (dom_node_set_user_data(
+ gadget->node,
+ corestring_dom___ns_key_image_coords_node_data,
+ coords, html__image_coords_dom_user_data_handler,
+ &oldcoords) != DOM_NO_ERR)
+ return;
+ free(oldcoords);
}
/* drop through */
case GADGET_SUBMIT:
@@ -682,6 +743,10 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
break;
case GADGET_FILE:
status = messages_get("FormFile");
+ if (mouse & BROWSER_MOUSE_CLICK_1) {
+ msg_data.gadget_click.gadget = gadget;
+ content_broadcast(c, CONTENT_MSG_GADGETCLICK, msg_data);
+ }
break;
case GADGET_BUTTON:
/* This gadget cannot be activated */
@@ -758,8 +823,7 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
browser_window_navigate(bw,
url,
content_get_url(c),
- BROWSER_WINDOW_DOWNLOAD |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_DOWNLOAD,
NULL,
NULL,
NULL);
@@ -938,8 +1002,7 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
browser_window_navigate(browser_window_find_target(bw, target, mouse),
url,
content_get_url(c),
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -1009,13 +1072,11 @@ bool html_keypress(struct content *c, uint32_t key)
* Handle search.
*
* \param c content of type HTML
- * \param gui_callbacks vtable for updating front end
- * \param gui_data front end private data
+ * \param context front end private data
* \param flags search flags
* \param string search string
*/
-void html_search(struct content *c,
- struct gui_search_callbacks *gui_callbacks, void *gui_data,
+void html_search(struct content *c, void *context,
search_flags_t flags, const char *string)
{
html_content *html = (html_content *)c;
@@ -1040,8 +1101,7 @@ void html_search(struct content *c,
html->search = NULL;
}
- html->search = search_create_context(c, CONTENT_HTML,
- gui_callbacks, gui_data);
+ html->search = search_create_context(c, CONTENT_HTML, context);
if (html->search == NULL)
return;
@@ -1072,8 +1132,9 @@ void html_search_clear(struct content *c)
free(html->search_string);
html->search_string = NULL;
- if (html->search != NULL)
+ if (html->search != NULL) {
search_destroy_context(html->search);
+ }
html->search = NULL;
}
@@ -1200,6 +1261,7 @@ void html_set_focus(html_content *html, html_focus_type focus_type,
union content_msg_data msg_data;
int x_off = 0;
int y_off = 0;
+ struct rect cr;
bool textarea_lost_focus = html->focus_type == HTML_FOCUS_TEXTAREA &&
focus_type != HTML_FOCUS_TEXTAREA;
@@ -1230,7 +1292,6 @@ void html_set_focus(html_content *html, html_focus_type focus_type,
} else if (focus_type != HTML_FOCUS_SELF && hide_caret) {
msg_data.caret.type = CONTENT_CARET_HIDE;
} else {
- struct rect cr;
if (clip != NULL) {
cr = *clip;
cr.x0 += x_off;
diff --git a/render/html_internal.h b/render/html_internal.h
index 43fce9bfd..05a085e22 100644
--- a/render/html_internal.h
+++ b/render/html_internal.h
@@ -71,6 +71,7 @@ typedef struct html_content {
struct content base;
dom_hubbub_parser *parser; /**< Parser object handle */
+ bool parse_completed; /**< Whether the parse has been completed */
/** Document tree */
dom_document *document;
@@ -253,8 +254,7 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
bool html_keypress(struct content *c, uint32_t key);
void html_overflow_scroll_callback(void *client_data,
struct scrollbar_msg_data *scrollbar_data);
-void html_search(struct content *c,
- struct gui_search_callbacks *gui_callbacks, void *gui_data,
+void html_search(struct content *c, void *context,
search_flags_t flags, const char *string);
void html_search_clear(struct content *c);
diff --git a/render/html_object.c b/render/html_object.c
index f4975e9ba..6499f249a 100644
--- a/render/html_object.c
+++ b/render/html_object.c
@@ -31,12 +31,13 @@
#include "css/utils.h"
#include "utils/nsoption.h"
#include "desktop/scrollbar.h"
-#include "render/box.h"
-#include "render/html_internal.h"
+#include "desktop/gui_factory.h"
#include "utils/corestrings.h"
#include "utils/config.h"
#include "utils/log.h"
-#include "utils/schedule.h"
+
+#include "render/box.h"
+#include "render/html_internal.h"
/* break reference loop */
static void html_object_refresh(void *p);
@@ -123,6 +124,9 @@ html_object_callback(hlcache_handle *object,
assert(c->base.status != CONTENT_STATUS_ERROR);
box = o->box;
+ if (box == NULL && event->type != CONTENT_MSG_ERROR) {
+ return NSERROR_OK;
+ }
switch (event->type) {
case CONTENT_MSG_LOADING:
@@ -181,11 +185,13 @@ html_object_callback(hlcache_handle *object,
o->content = NULL;
- c->base.active--;
- LOG(("%d fetches active", c->base.active));
+ if (box != NULL) {
+ c->base.active--;
+ LOG(("%d fetches active", c->base.active));
- content_add_error(&c->base, "?", 0);
- html_object_failed(box, c, o->background);
+ content_add_error(&c->base, "?", 0);
+ html_object_failed(box, c, o->background);
+ }
break;
case CONTENT_MSG_STATUS:
@@ -203,10 +209,6 @@ html_object_callback(hlcache_handle *object,
}
break;
- case CONTENT_MSG_REFORMAT:
- case CONTENT_MSG_REDIRECT:
- break;
-
case CONTENT_MSG_REDRAW:
if (c->base.status != CONTENT_STATUS_LOADING) {
union content_msg_data data = event->data;
@@ -334,7 +336,7 @@ html_object_callback(hlcache_handle *object,
case CONTENT_MSG_REFRESH:
if (content_get_type(object) == CONTENT_HTML) {
/* only for HTML objects */
- schedule(event->data.delay * 100,
+ guit->browser->schedule(event->data.delay * 1000,
html_object_refresh, o);
}
@@ -372,6 +374,7 @@ html_object_callback(hlcache_handle *object,
case CONTENT_MSG_SAVELINK:
case CONTENT_MSG_POINTER:
+ case CONTENT_MSG_GADGETCLICK:
/* These messages are for browser window layer.
* we're not interested, so pass them on. */
content_broadcast(&c->base, event->type, event->data);
@@ -440,7 +443,7 @@ html_object_callback(hlcache_handle *object,
break;
default:
- assert(0);
+ break;
}
if (c->base.status == CONTENT_STATUS_READY && c->base.active == 0 &&
@@ -464,7 +467,7 @@ html_object_callback(hlcache_handle *object,
* then reformat the page to display newly fetched objects */
else if (nsoption_bool(incremental_reflow) &&
event->type == CONTENT_MSG_DONE &&
- !(box->flags & REPLACE_DIM) &&
+ box != NULL && !(box->flags & REPLACE_DIM) &&
(c->base.status == CONTENT_STATUS_READY ||
c->base.status == CONTENT_STATUS_DONE) &&
(wallclock() > c->base.reformat_time)) {
@@ -491,6 +494,7 @@ static bool html_replace_object(struct content_html_object *object, nsurl *url)
nserror error;
assert(object != NULL);
+ assert(object->box != NULL);
c = (html_content *) object->parent;
@@ -531,7 +535,7 @@ static bool html_replace_object(struct content_html_object *object, nsurl *url)
}
/**
- * schedule() callback for object refresh
+ * schedule callback for object refresh
*/
static void html_object_refresh(void *p)
@@ -562,7 +566,7 @@ nserror html_object_open_objects(html_content *html, struct browser_window *bw)
for (object = html->object_list; object != NULL; object = next) {
next = object->next;
- if (object->content == NULL)
+ if (object->content == NULL || object->box == NULL)
continue;
if (content_get_type(object->content) == CONTENT_NONE)
@@ -621,14 +625,15 @@ nserror html_object_close_objects(html_content *html)
for (object = html->object_list; object != NULL; object = next) {
next = object->next;
- if (object->content == NULL)
+ if (object->content == NULL || object->box == NULL)
continue;
if (content_get_type(object->content) == CONTENT_NONE)
continue;
- if (content_get_type(object->content) == CONTENT_HTML)
- schedule_remove(html_object_refresh, object);
+ if (content_get_type(object->content) == CONTENT_HTML) {
+ guit->browser->schedule(-1, html_object_refresh, object);
+ }
content_close(object->content);
}
@@ -643,9 +648,9 @@ nserror html_object_free_objects(html_content *html)
if (victim->content != NULL) {
LOG(("object %p", victim->content));
- if (content_get_type(victim->content) == CONTENT_HTML)
- schedule_remove(html_object_refresh, victim);
-
+ if (content_get_type(victim->content) == CONTENT_HTML) {
+ guit->browser->schedule(-1, html_object_refresh, victim);
+ }
hlcache_handle_release(victim->content);
}
@@ -701,8 +706,10 @@ bool html_fetch_object(html_content *c, nsurl *url, struct box *box,
c->object_list = object;
c->num_objects++;
- c->base.active++;
- LOG(("%d fetches active", c->base.active));
+ if (box != NULL) {
+ c->base.active++;
+ LOG(("%d fetches active", c->base.active));
+ }
return true;
}
diff --git a/render/html_redraw.c b/render/html_redraw.c
index 13cffe6ed..92b70fec7 100644
--- a/render/html_redraw.c
+++ b/render/html_redraw.c
@@ -1905,10 +1905,17 @@ bool html_redraw_box(const html_content *html, struct box *box,
struct box *bg_box = NULL;
bool has_x_scroll, has_y_scroll;
css_computed_clip_rect css_rect;
+ enum css_overflow_e overflow_x = CSS_OVERFLOW_VISIBLE;
+ enum css_overflow_e overflow_y = CSS_OVERFLOW_VISIBLE;
if (html_redraw_printing && (box->flags & PRINTED))
return true;
+ if (box->style != NULL) {
+ overflow_x = css_computed_overflow_x(box->style);
+ overflow_y = css_computed_overflow_y(box->style);
+ }
+
/* avoid trivial FP maths */
if (scale == 1.0) {
x = x_parent + box->x;
@@ -1946,49 +1953,66 @@ bool html_redraw_box(const html_content *html, struct box *box,
}
/* calculate rectangle covering this box and descendants */
- if (box->style && css_computed_overflow(box->style) !=
- CSS_OVERFLOW_VISIBLE) {
+ if (box->style && overflow_x != CSS_OVERFLOW_VISIBLE &&
+ box->parent != NULL) {
/* box contents clipped to box size */
r.x0 = x - border_left;
- r.y0 = y - border_top;
r.x1 = x + padding_width + border_right;
- r.y1 = y + padding_height + border_bottom;
} else {
/* box contents can hang out of the box; use descendant box */
if (scale == 1.0) {
r.x0 = x + box->descendant_x0;
- r.y0 = y + box->descendant_y0;
r.x1 = x + box->descendant_x1 + 1;
- r.y1 = y + box->descendant_y1 + 1;
} else {
r.x0 = x + box->descendant_x0 * scale;
- r.y0 = y + box->descendant_y0 * scale;
r.x1 = x + box->descendant_x1 * scale + 1;
- r.y1 = y + box->descendant_y1 * scale + 1;
}
if (!box->parent) {
/* root element */
int margin_left, margin_right;
- int margin_top, margin_bottom;
if (scale == 1.0) {
margin_left = box->margin[LEFT];
- margin_top = box->margin[TOP];
margin_right = box->margin[RIGHT];
- margin_bottom = box->margin[BOTTOM];
} else {
margin_left = box->margin[LEFT] * scale;
- margin_top = box->margin[TOP] * scale;
margin_right = box->margin[RIGHT] * scale;
- margin_bottom = box->margin[BOTTOM] * scale;
}
r.x0 = x - border_left - margin_left < r.x0 ?
x - border_left - margin_left : r.x0;
- r.y0 = y - border_top - margin_top < r.y0 ?
- y - border_top - margin_top : r.y0;
r.x1 = x + padding_width + border_right +
margin_right > r.x1 ?
x + padding_width + border_right +
margin_right : r.x1;
+ }
+ }
+
+ /* calculate rectangle covering this box and descendants */
+ if (box->style && overflow_y != CSS_OVERFLOW_VISIBLE &&
+ box->parent != NULL) {
+ /* box contents clipped to box size */
+ r.y0 = y - border_top;
+ r.y1 = y + padding_height + border_bottom;
+ } else {
+ /* box contents can hang out of the box; use descendant box */
+ if (scale == 1.0) {
+ r.y0 = y + box->descendant_y0;
+ r.y1 = y + box->descendant_y1 + 1;
+ } else {
+ r.y0 = y + box->descendant_y0 * scale;
+ r.y1 = y + box->descendant_y1 * scale + 1;
+ }
+ if (!box->parent) {
+ /* root element */
+ int margin_top, margin_bottom;
+ if (scale == 1.0) {
+ margin_top = box->margin[TOP];
+ margin_bottom = box->margin[BOTTOM];
+ } else {
+ margin_top = box->margin[TOP] * scale;
+ margin_bottom = box->margin[BOTTOM] * scale;
+ }
+ r.y0 = y - border_top - margin_top < r.y0 ?
+ y - border_top - margin_top : r.y0;
r.y1 = y + padding_height + border_bottom +
margin_bottom > r.y1 ?
y + padding_height + border_bottom +
@@ -2307,22 +2331,50 @@ bool html_redraw_box(const html_content *html, struct box *box,
}
/* clip to the padding edge for objects, or boxes with overflow hidden
- * or scroll */
- if ((box->style && css_computed_overflow(box->style) !=
- CSS_OVERFLOW_VISIBLE) || box->object ||
- box->flags & IFRAME) {
- r.x0 = x;
- r.y0 = y;
- r.x1 = x + padding_width;
- r.y1 = y + padding_height;
- if (r.x0 < clip->x0) r.x0 = clip->x0;
- if (r.y0 < clip->y0) r.y0 = clip->y0;
- if (clip->x1 < r.x1) r.x1 = clip->x1;
- if (clip->y1 < r.y1) r.y1 = clip->y1;
- if (r.x1 <= r.x0 || r.y1 <= r.y0)
- return ((!plot->group_end) || (plot->group_end()));
- if (box->type == BOX_BLOCK || box->type == BOX_INLINE_BLOCK ||
- box->type == BOX_TABLE_CELL || box->object) {
+ * or scroll, unless it's the root element */
+ if (box->parent != NULL) {
+ bool need_clip = false;
+ if (box->object || box->flags & IFRAME ||
+ (overflow_x != CSS_OVERFLOW_VISIBLE &&
+ overflow_y != CSS_OVERFLOW_VISIBLE)) {
+ r.x0 = x;
+ r.y0 = y;
+ r.x1 = x + padding_width;
+ r.y1 = y + padding_height;
+ if (r.x0 < clip->x0) r.x0 = clip->x0;
+ if (r.y0 < clip->y0) r.y0 = clip->y0;
+ if (clip->x1 < r.x1) r.x1 = clip->x1;
+ if (clip->y1 < r.y1) r.y1 = clip->y1;
+ if (r.x1 <= r.x0 || r.y1 <= r.y0)
+ return (!plot->group_end || plot->group_end());
+ need_clip = true;
+
+ } else if (overflow_x != CSS_OVERFLOW_VISIBLE) {
+ r.x0 = x;
+ r.y0 = clip->y0;
+ r.x1 = x + padding_width;
+ r.y1 = clip->y1;
+ if (r.x0 < clip->x0) r.x0 = clip->x0;
+ if (clip->x1 < r.x1) r.x1 = clip->x1;
+ if (r.x1 <= r.x0)
+ return (!plot->group_end || plot->group_end());
+ need_clip = true;
+
+ } else if (overflow_y != CSS_OVERFLOW_VISIBLE) {
+ r.x0 = clip->x0;
+ r.y0 = y;
+ r.x1 = clip->x1;
+ r.y1 = y + padding_height;
+ if (r.y0 < clip->y0) r.y0 = clip->y0;
+ if (clip->y1 < r.y1) r.y1 = clip->y1;
+ if (r.y1 <= r.y0)
+ return (!plot->group_end || plot->group_end());
+ need_clip = true;
+ }
+
+ if (need_clip && (box->type == BOX_BLOCK ||
+ box->type == BOX_INLINE_BLOCK ||
+ box->type == BOX_TABLE_CELL || box->object)) {
if (!plot->clip(&r))
return false;
}
@@ -2440,12 +2492,12 @@ bool html_redraw_box(const html_content *html, struct box *box,
/* scrollbars */
if (((box->style && box->type != BOX_BR &&
box->type != BOX_TABLE && box->type != BOX_INLINE &&
- (css_computed_overflow(box->style) ==
- CSS_OVERFLOW_SCROLL ||
- css_computed_overflow(box->style) ==
- CSS_OVERFLOW_AUTO)) || (box->object &&
- content_get_type(box->object) == CONTENT_HTML)) &&
- box->parent != NULL) {
+ (overflow_x == CSS_OVERFLOW_SCROLL ||
+ overflow_x == CSS_OVERFLOW_AUTO ||
+ overflow_y == CSS_OVERFLOW_SCROLL ||
+ overflow_y == CSS_OVERFLOW_AUTO)) ||
+ (box->object && content_get_type(box->object) ==
+ CONTENT_HTML)) && box->parent != NULL) {
has_x_scroll = box_hscrollbar_present(box);
has_y_scroll = box_vscrollbar_present(box);
diff --git a/render/html_script.c b/render/html_script.c
index 4aa8aff11..4a82bcd70 100644
--- a/render/html_script.c
+++ b/render/html_script.c
@@ -172,8 +172,6 @@ convert_script_async_cb(hlcache_handle *script,
parent->base.active--;
LOG(("%d fetches active", parent->base.active));
-
-
break;
case CONTENT_MSG_ERROR:
@@ -188,11 +186,8 @@ convert_script_async_cb(hlcache_handle *script,
break;
- case CONTENT_MSG_STATUS:
- break;
-
default:
- assert(0);
+ break;
}
return NSERROR_OK;
@@ -219,11 +214,6 @@ convert_script_defer_cb(hlcache_handle *script,
assert(i != parent->scripts_count);
switch (event->type) {
- case CONTENT_MSG_LOADING:
- break;
-
- case CONTENT_MSG_READY:
- break;
case CONTENT_MSG_DONE:
LOG(("script %d done '%s'", i,
@@ -245,11 +235,8 @@ convert_script_defer_cb(hlcache_handle *script,
break;
- case CONTENT_MSG_STATUS:
- break;
-
default:
- assert(0);
+ break;
}
/* if there are no active fetches remaining begin post parse
@@ -333,19 +320,8 @@ convert_script_sync_cb(hlcache_handle *script,
break;
- case CONTENT_MSG_LOADING:
- case CONTENT_MSG_READY:
- case CONTENT_MSG_STATUS:
- case CONTENT_MSG_REDIRECT:
- /* messages content handler will legitamately recive
- * but does not need to handle
- */
- break;
-
default:
- /* all other messages are unexpected and fatal */
- LOG(("Unhandled message type %d", event->type));
- assert(0);
+ break;
}
/* if there are no active fetches remaining begin post parse
diff --git a/render/imagemap.c b/render/imagemap.c
index 433ae68be..707c6bc31 100644
--- a/render/imagemap.c
+++ b/render/imagemap.c
@@ -76,18 +76,44 @@ struct imagemap {
struct imagemap *next; /**< next entry in this hash chain */
};
-static bool imagemap_add(html_content *c, dom_string *key,
- struct mapentry *list);
-static bool imagemap_create(html_content *c);
-static bool imagemap_extract_map(dom_node *node, html_content *c,
- struct mapentry **entry);
-static bool imagemap_addtolist(dom_node *n, nsurl *base_url,
- struct mapentry **entry, dom_string *tagtype);
-static void imagemap_freelist(struct mapentry *list);
-static unsigned int imagemap_hash(const char *key);
-static int imagemap_point_in_poly(int num, float *xpt, float *ypt,
- unsigned long x, unsigned long y, unsigned long click_x,
- unsigned long click_y);
+/**
+ * Create hashtable of imagemaps
+ *
+ * \param c The containing content
+ * \return true on success, false otherwise
+ */
+static bool imagemap_create(html_content *c)
+{
+ assert(c != NULL);
+
+ if (c->imagemaps == NULL) {
+ c->imagemaps = calloc(HASH_SIZE, sizeof(struct imagemap *));
+ if (c->imagemaps == NULL) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+/**
+ * Hash function.
+ *
+ * \param key The key to hash.
+ * \return The hashed value.
+ */
+static unsigned int imagemap_hash(const char *key)
+{
+ unsigned int z = 0;
+
+ if (key == 0) return 0;
+
+ for (; *key != 0; key++) {
+ z += *key & 0x1f;
+ }
+
+ return (z % (HASH_SIZE - 1)) + 1;
+}
/**
* Add an imagemap to the hashtable, creating it if it doesn't exist
@@ -97,7 +123,8 @@ static int imagemap_point_in_poly(int num, float *xpt, float *ypt,
* \param list List of map regions
* \return true on succes, false otherwise
*/
-bool imagemap_add(html_content *c, dom_string *key, struct mapentry *list)
+static bool
+imagemap_add(html_content *c, dom_string *key, struct mapentry *list)
{
struct imagemap *map;
unsigned int slot;
@@ -112,7 +139,7 @@ bool imagemap_add(html_content *c, dom_string *key, struct mapentry *list)
map = calloc(1, sizeof(*map));
if (map == NULL)
return false;
-
+
/* \todo Stop relying on NULL termination of dom_string */
map->key = strdup(dom_string_data(key));
if (map->key == NULL) {
@@ -131,23 +158,34 @@ bool imagemap_add(html_content *c, dom_string *key, struct mapentry *list)
}
/**
- * Create hashtable of imagemaps
+ * Free list of imagemap entries
*
- * \param c The containing content
- * \return true on success, false otherwise
+ * \param list Pointer to head of list
*/
-bool imagemap_create(html_content *c)
+static void imagemap_freelist(struct mapentry *list)
{
- assert(c != NULL);
+ struct mapentry *entry, *prev;
- if (c->imagemaps == NULL) {
- c->imagemaps = calloc(HASH_SIZE, sizeof(struct imagemap *));
- if (c->imagemaps == NULL) {
- return false;
+ assert(list != NULL);
+
+ entry = list;
+
+ while (entry != NULL) {
+ prev = entry;
+
+ nsurl_unref(entry->url);
+
+ if (entry->target)
+ free(entry->target);
+
+ if (entry->type == IMAGEMAP_POLY) {
+ free(entry->bounds.poly.xcoords);
+ free(entry->bounds.poly.ycoords);
}
- }
- return true;
+ entry = entry->next;
+ free(prev);
+ }
}
/**
@@ -245,166 +283,6 @@ void imagemap_dump(html_content *c)
}
/**
- * Extract all imagemaps from a document tree
- *
- * \param c The content
- * \param map_str A dom_string which is "map"
- * \return false on memory exhaustion, true otherwise
- */
-nserror
-imagemap_extract(html_content *c)
-{
- dom_nodelist *nlist;
- dom_exception exc;
- unsigned long mapnr;
- uint32_t maybe_maps;
- nserror ret = NSERROR_OK;
-
- exc = dom_document_get_elements_by_tag_name(c->document,
- corestring_dom_map,
- &nlist);
- if (exc != DOM_NO_ERR) {
- return NSERROR_DOM;
- }
-
- exc = dom_nodelist_get_length(nlist, &maybe_maps);
- if (exc != DOM_NO_ERR) {
- ret = NSERROR_DOM;
- goto out_nlist;
- }
-
- for (mapnr = 0; mapnr < maybe_maps; ++mapnr) {
- dom_node *node;
- dom_string *name;
- exc = dom_nodelist_item(nlist, mapnr, &node);
- if (exc != DOM_NO_ERR) {
- ret = NSERROR_DOM;
- goto out_nlist;
- }
-
- exc = dom_element_get_attribute(node, corestring_dom_id,
- &name);
- if (exc != DOM_NO_ERR) {
- dom_node_unref(node);
- ret = NSERROR_DOM;
- goto out_nlist;
- }
-
- if (name == NULL) {
- exc = dom_element_get_attribute(node,
- corestring_dom_name,
- &name);
- if (exc != DOM_NO_ERR) {
- dom_node_unref(node);
- ret = NSERROR_DOM;
- goto out_nlist;
- }
- }
-
- if (name != NULL) {
- struct mapentry *entry = NULL;
- if (imagemap_extract_map(node, c, &entry) == false) {
- dom_string_unref(name);
- dom_node_unref(node);
- ret = NSERROR_NOMEM; /** @todo check this */
- goto out_nlist;
- }
-
- /* imagemap_extract_map may not extract anything,
- * so entry can still be NULL here. This isn't an
- * error as it just means that we've encountered
- * an incorrectly defined <map>...</map> block
- */
- if ((entry != NULL) &&
- (imagemap_add(c, name, entry) == false)) {
- dom_string_unref(name);
- dom_node_unref(node);
- ret = NSERROR_NOMEM; /** @todo check this */
- goto out_nlist;
- }
- }
-
- dom_string_unref(name);
- dom_node_unref(node);
- }
-
-
-out_nlist:
-
- dom_nodelist_unref(nlist);
-
- return ret;
-}
-
-/**
- * Extract an imagemap from html source
- *
- * \param node XML node containing map
- * \param c Content containing document
- * \param entry List of map entries
- * \param tname The sub-tags to consider on this pass
- * \return false on memory exhaustion, true otherwise
- */
-static bool
-imagemap_extract_map_entries(dom_node *node, html_content *c,
- struct mapentry **entry, dom_string *tname)
-{
- dom_nodelist *nlist;
- dom_exception exc;
- unsigned long ent;
- uint32_t tag_count;
-
- exc = dom_element_get_elements_by_tag_name(node, tname, &nlist);
- if (exc != DOM_NO_ERR) {
- return false;
- }
-
- exc = dom_nodelist_get_length(nlist, &tag_count);
- if (exc != DOM_NO_ERR) {
- dom_nodelist_unref(nlist);
- return false;
- }
-
- for (ent = 0; ent < tag_count; ++ent) {
- dom_node *subnode;
-
- exc = dom_nodelist_item(nlist, ent, &subnode);
- if (exc != DOM_NO_ERR) {
- dom_nodelist_unref(nlist);
- return false;
- }
- if (imagemap_addtolist(subnode, c->base_url,
- entry, tname) == false) {
- dom_node_unref(subnode);
- dom_nodelist_unref(nlist);
- return false;
- }
- dom_node_unref(subnode);
- }
-
- dom_nodelist_unref(nlist);
-
- return true;
-}
-
-/**
- * Extract an imagemap from html source
- *
- * \param node XML node containing map
- * \param c Content containing document
- * \param entry List of map entries
- * \return false on memory exhaustion, true otherwise
- */
-bool imagemap_extract_map(dom_node *node, html_content *c,
- struct mapentry **entry)
-{
- if (imagemap_extract_map_entries(node, c, entry,
- corestring_dom_area) == false)
- return false;
- return imagemap_extract_map_entries(node, c, entry,
- corestring_dom_a);
-}
-/**
* Adds an imagemap entry to the list
*
* \param n The xmlNode representing the entry to add
@@ -412,7 +290,7 @@ bool imagemap_extract_map(dom_node *node, html_content *c,
* \param entry Pointer to list of entries
* \return false on memory exhaustion, true otherwise
*/
-bool
+static bool
imagemap_addtolist(dom_node *n, nsurl *base_url,
struct mapentry **entry, dom_string *tagtype)
{
@@ -421,50 +299,50 @@ imagemap_addtolist(dom_node *n, nsurl *base_url,
dom_string *coords = NULL;
struct mapentry *new_map, *temp;
bool ret = true;
-
+
if (dom_string_caseless_isequal(tagtype, corestring_dom_area)) {
bool nohref = false;
- exc = dom_element_has_attribute(n,
+ exc = dom_element_has_attribute(n,
corestring_dom_nohref, &nohref);
if ((exc != DOM_NO_ERR) || nohref)
/* Skip <area nohref="anything" /> */
goto ok_out;
}
-
+
exc = dom_element_get_attribute(n, corestring_dom_href, &href);
if (exc != DOM_NO_ERR || href == NULL) {
/* No href="" attribute, skip this element */
goto ok_out;
}
-
+
exc = dom_element_get_attribute(n, corestring_dom_target, &target);
if (exc != DOM_NO_ERR) {
goto ok_out;
}
-
+
exc = dom_element_get_attribute(n, corestring_dom_shape, &shape);
if (exc != DOM_NO_ERR) {
goto ok_out;
}
-
+
/* If there's no shape, we default to rectangles */
if (shape == NULL)
shape = dom_string_ref(corestring_dom_rect);
-
+
if (!dom_string_caseless_lwc_isequal(shape, corestring_lwc_default)) {
/* If not 'default' and there's no 'coords' give up */
- exc = dom_element_get_attribute(n, corestring_dom_coords,
+ exc = dom_element_get_attribute(n, corestring_dom_coords,
&coords);
if (exc != DOM_NO_ERR || coords == NULL) {
goto ok_out;
}
}
-
+
new_map = calloc(1, sizeof(*new_map));
if (new_map == NULL) {
goto bad_out;
}
-
+
if (dom_string_caseless_lwc_isequal(shape, corestring_lwc_rect) ||
dom_string_caseless_lwc_isequal(shape, corestring_lwc_rectangle))
new_map->type = IMAGEMAP_RECT;
@@ -477,16 +355,16 @@ imagemap_addtolist(dom_node *n, nsurl *base_url,
new_map->type = IMAGEMAP_DEFAULT;
else
goto bad_out;
-
- if (box_extract_link(dom_string_data(href),
+
+ if (box_extract_link(dom_string_data(href),
base_url, &new_map->url) == false)
goto bad_out;
-
+
if (new_map->url == NULL) {
/* non-fatal error -> ignore this */
goto ok_free_map_out;
}
-
+
if (target != NULL) {
/* Copy target into the map */
new_map->target = malloc(dom_string_byte_length(target) + 1);
@@ -496,7 +374,7 @@ imagemap_addtolist(dom_node *n, nsurl *base_url,
/* \todo Do this better */
strcpy(new_map->target, dom_string_data(target));
}
-
+
if (new_map->type != IMAGEMAP_DEFAULT) {
int x, y;
float *xcoords, *ycoords;
@@ -524,7 +402,7 @@ imagemap_addtolist(dom_node *n, nsurl *base_url,
}
num++;
- val = strtok('\0', ",");
+ val = strtok(NULL, ",");
}
break;
case IMAGEMAP_CIRCLE:
@@ -543,7 +421,7 @@ imagemap_addtolist(dom_node *n, nsurl *base_url,
}
num++;
- val = strtok('\0', ",");
+ val = strtok(NULL, ",");
}
break;
case IMAGEMAP_POLY:
@@ -553,7 +431,7 @@ imagemap_addtolist(dom_node *n, nsurl *base_url,
while (val != NULL) {
x = atoi(val);
- val = strtok('\0', ",");
+ val = strtok(NULL, ",");
if (val == NULL)
break;
@@ -577,7 +455,7 @@ imagemap_addtolist(dom_node *n, nsurl *base_url,
new_map->bounds.poly.ycoords[num - 1] = y;
num++;
- val = strtok('\0', ",");
+ val = strtok(NULL, ",");
}
new_map->bounds.poly.num = num - 1;
@@ -587,22 +465,21 @@ imagemap_addtolist(dom_node *n, nsurl *base_url,
break;
}
}
-
+
new_map->next = NULL;
- if (entry && *entry) {
+ if (*entry) {
/* add to END of list */
for (temp = (*entry); temp->next != NULL; temp = temp->next)
;
temp->next = new_map;
- }
- else {
+ } else {
(*entry) = new_map;
}
-
+
/* All good, linked in, let's clean up */
goto ok_out;
-
+
bad_out:
ret = false;
ok_free_map_out:
@@ -629,39 +506,207 @@ ok_out:
dom_string_unref(shape);
if (coords != NULL)
dom_string_unref(coords);
-
+
return ret;
}
/**
- * Free list of imagemap entries
+ * Extract an imagemap from html source
*
- * \param list Pointer to head of list
+ * \param node XML node containing map
+ * \param c Content containing document
+ * \param entry List of map entries
+ * \param tname The sub-tags to consider on this pass
+ * \return false on memory exhaustion, true otherwise
*/
-void imagemap_freelist(struct mapentry *list)
+static bool
+imagemap_extract_map_entries(dom_node *node, html_content *c,
+ struct mapentry **entry, dom_string *tname)
{
- struct mapentry *entry, *prev;
+ dom_nodelist *nlist;
+ dom_exception exc;
+ unsigned long ent;
+ uint32_t tag_count;
- assert(list != NULL);
+ exc = dom_element_get_elements_by_tag_name(node, tname, &nlist);
+ if (exc != DOM_NO_ERR) {
+ return false;
+ }
- entry = list;
+ exc = dom_nodelist_get_length(nlist, &tag_count);
+ if (exc != DOM_NO_ERR) {
+ dom_nodelist_unref(nlist);
+ return false;
+ }
- while (entry != NULL) {
- prev = entry;
+ for (ent = 0; ent < tag_count; ++ent) {
+ dom_node *subnode;
- nsurl_unref(entry->url);
+ exc = dom_nodelist_item(nlist, ent, &subnode);
+ if (exc != DOM_NO_ERR) {
+ dom_nodelist_unref(nlist);
+ return false;
+ }
+ if (imagemap_addtolist(subnode, c->base_url,
+ entry, tname) == false) {
+ dom_node_unref(subnode);
+ dom_nodelist_unref(nlist);
+ return false;
+ }
+ dom_node_unref(subnode);
+ }
- if (entry->target)
- free(entry->target);
+ dom_nodelist_unref(nlist);
- if (entry->type == IMAGEMAP_POLY) {
- free(entry->bounds.poly.xcoords);
- free(entry->bounds.poly.ycoords);
+ return true;
+}
+
+/**
+ * Extract an imagemap from html source
+ *
+ * \param node XML node containing map
+ * \param c Content containing document
+ * \param entry List of map entries
+ * \return false on memory exhaustion, true otherwise
+ */
+static bool imagemap_extract_map(dom_node *node, html_content *c,
+ struct mapentry **entry)
+{
+ if (imagemap_extract_map_entries(node, c, entry,
+ corestring_dom_area) == false)
+ return false;
+ return imagemap_extract_map_entries(node, c, entry,
+ corestring_dom_a);
+}
+
+/**
+ * Extract all imagemaps from a document tree
+ *
+ * \param c The content
+ * \param map_str A dom_string which is "map"
+ * \return false on memory exhaustion, true otherwise
+ */
+nserror
+imagemap_extract(html_content *c)
+{
+ dom_nodelist *nlist;
+ dom_exception exc;
+ unsigned long mapnr;
+ uint32_t maybe_maps;
+ nserror ret = NSERROR_OK;
+
+ exc = dom_document_get_elements_by_tag_name(c->document,
+ corestring_dom_map,
+ &nlist);
+ if (exc != DOM_NO_ERR) {
+ return NSERROR_DOM;
+ }
+
+ exc = dom_nodelist_get_length(nlist, &maybe_maps);
+ if (exc != DOM_NO_ERR) {
+ ret = NSERROR_DOM;
+ goto out_nlist;
+ }
+
+ for (mapnr = 0; mapnr < maybe_maps; ++mapnr) {
+ dom_node *node;
+ dom_string *name;
+ exc = dom_nodelist_item(nlist, mapnr, &node);
+ if (exc != DOM_NO_ERR) {
+ ret = NSERROR_DOM;
+ goto out_nlist;
}
- entry = entry->next;
- free(prev);
+ exc = dom_element_get_attribute(node, corestring_dom_id,
+ &name);
+ if (exc != DOM_NO_ERR) {
+ dom_node_unref(node);
+ ret = NSERROR_DOM;
+ goto out_nlist;
+ }
+
+ if (name == NULL) {
+ exc = dom_element_get_attribute(node,
+ corestring_dom_name,
+ &name);
+ if (exc != DOM_NO_ERR) {
+ dom_node_unref(node);
+ ret = NSERROR_DOM;
+ goto out_nlist;
+ }
+ }
+
+ if (name != NULL) {
+ struct mapentry *entry = NULL;
+ if (imagemap_extract_map(node, c, &entry) == false) {
+ if (entry != NULL) {
+ imagemap_freelist(entry);
+ }
+
+ dom_string_unref(name);
+ dom_node_unref(node);
+ ret = NSERROR_NOMEM; /** @todo check this */
+ goto out_nlist;
+ }
+
+ /* imagemap_extract_map may not extract anything,
+ * so entry can still be NULL here. This isn't an
+ * error as it just means that we've encountered
+ * an incorrectly defined <map>...</map> block
+ */
+ if ((entry != NULL) &&
+ (imagemap_add(c, name, entry) == false)) {
+ imagemap_freelist(entry);
+
+ dom_string_unref(name);
+ dom_node_unref(node);
+ ret = NSERROR_NOMEM; /** @todo check this */
+ goto out_nlist;
+ }
+ }
+
+ dom_string_unref(name);
+ dom_node_unref(node);
}
+
+out_nlist:
+
+ dom_nodelist_unref(nlist);
+
+ return ret;
+}
+
+/**
+ * Test if a point lies within an arbitrary polygon
+ * Modified from comp.graphics.algorithms FAQ 2.03
+ *
+ * \param num Number of vertices
+ * \param xpt Array of x coordinates
+ * \param ypt Array of y coordinates
+ * \param x Left hand edge of containing box
+ * \param y Top edge of containing box
+ * \param click_x X coordinate of click
+ * \param click_y Y coordinate of click
+ * \return 1 if point is in polygon, 0 if outside. 0 or 1 if on boundary
+ */
+static int
+imagemap_point_in_poly(int num, float *xpt, float *ypt, unsigned long x,
+ unsigned long y, unsigned long click_x, unsigned long click_y)
+{
+ int i, j, c = 0;
+
+ assert(xpt != NULL);
+ assert(ypt != NULL);
+
+ for (i = 0, j = num - 1; i < num; j = i++) {
+ if ((((ypt[i] + y <= click_y) && (click_y < ypt[j] + y)) ||
+ ((ypt[j] + y <= click_y) && (click_y < ypt[i] + y))) &&
+ (click_x < (xpt[j] - xpt[i]) *
+ (click_y - (ypt[i] + y)) / (ypt[j] - ypt[i]) + xpt[i] + x))
+ c = !c;
+ }
+
+ return c;
}
/**
@@ -751,55 +796,3 @@ nsurl *imagemap_get(struct html_content *c, const char *key,
return NULL;
}
-
-/**
- * Hash function
- *
- * \param key The key to hash
- * \return The hashed value
- */
-unsigned int imagemap_hash(const char *key)
-{
- unsigned int z = 0;
-
- if (key == 0) return 0;
-
- for (; *key != 0; key++) {
- z += *key & 0x1f;
- }
-
- return (z % (HASH_SIZE - 1)) + 1;
-}
-
-/**
- * Test if a point lies within an arbitrary polygon
- * Modified from comp.graphics.algorithms FAQ 2.03
- *
- * \param num Number of vertices
- * \param xpt Array of x coordinates
- * \param ypt Array of y coordinates
- * \param x Left hand edge of containing box
- * \param y Top edge of containing box
- * \param click_x X coordinate of click
- * \param click_y Y coordinate of click
- * \return 1 if point is in polygon, 0 if outside. 0 or 1 if on boundary
- */
-int imagemap_point_in_poly(int num, float *xpt, float *ypt, unsigned long x,
- unsigned long y, unsigned long click_x,
- unsigned long click_y)
-{
- int i, j, c = 0;
-
- assert(xpt != NULL);
- assert(ypt != NULL);
-
- for (i = 0, j = num - 1; i < num; j = i++) {
- if ((((ypt[i] + y <= click_y) && (click_y < ypt[j] + y)) ||
- ((ypt[j] + y <= click_y) && (click_y < ypt[i] + y))) &&
- (click_x < (xpt[j] - xpt[i]) *
- (click_y - (ypt[i] + y)) / (ypt[j] - ypt[i]) + xpt[i] + x))
- c = !c;
- }
-
- return c;
-}
diff --git a/render/layout.c b/render/layout.c
index 9bd1156ab..ab2dd6cc1 100644
--- a/render/layout.c
+++ b/render/layout.c
@@ -75,7 +75,8 @@ static struct box* layout_next_margin_block(struct box *box, struct box *block,
int viewport_height, int *max_pos_margin, int *max_neg_margin);
static bool layout_block_object(struct box *block);
static void layout_get_object_dimensions(struct box *box,
- int *width, int *height, int min_width, int max_width);
+ int *width, int *height, int min_width, int max_width,
+ int min_height, int max_height);
static void layout_block_find_dimensions(int available_width,
int viewport_height, int lm, int rm,
struct box *box);
@@ -88,7 +89,8 @@ static void layout_float_find_dimensions(int available_width,
static void layout_find_dimensions(int available_width, int viewport_height,
struct box *box, const css_computed_style *style,
int *width, int *height, int *max_width, int *min_width,
- int margin[4], int padding[4], struct box_border border[4]);
+ int *max_height, int *min_height, int margin[4], int padding[4],
+ struct box_border border[4]);
static void layout_tweak_form_dimensions(struct box *box, bool percentage,
int available_width, bool setwidth, int *dimension);
static int layout_clear(struct box *fl, enum css_clear_e clear);
@@ -229,7 +231,8 @@ bool layout_block_context(struct box *block, int viewport_height,
if (!layout_block_object(block))
return false;
layout_get_object_dimensions(block, &temp_width,
- &block->height, INT_MIN, INT_MAX);
+ &block->height, INT_MIN, INT_MAX,
+ INT_MIN, INT_MAX);
return true;
} else if (block->flags & REPLACE_DIM) {
return true;
@@ -278,6 +281,9 @@ bool layout_block_context(struct box *block, int viewport_height,
* then the while loop will visit each box marked with *, setting box
* to each in the order shown. */
while (box) {
+ enum css_overflow_e overflow_x = CSS_OVERFLOW_VISIBLE;
+ enum css_overflow_e overflow_y = CSS_OVERFLOW_VISIBLE;
+
assert(box->type == BOX_BLOCK || box->type == BOX_TABLE ||
box->type == BOX_INLINE_CONTAINER);
@@ -318,6 +324,12 @@ bool layout_block_context(struct box *block, int viewport_height,
y = layout_clear(block->float_children,
css_computed_clear(box->style));
+ /* Find box's overflow properties */
+ if (box->style) {
+ overflow_x = css_computed_overflow_x(box->style);
+ overflow_y = css_computed_overflow_y(box->style);
+ }
+
/* Blocks establishing a block formatting context get minimum
* left and right margins to avoid any floats. */
lm = rm = 0;
@@ -326,8 +338,8 @@ bool layout_block_context(struct box *block, int viewport_height,
if (!box->object && !(box->flags & IFRAME) &&
!(box->flags & REPLACE_DIM) &&
box->style &&
- css_computed_overflow(box->style) !=
- CSS_OVERFLOW_VISIBLE) {
+ (overflow_x != CSS_OVERFLOW_VISIBLE ||
+ overflow_y != CSS_OVERFLOW_VISIBLE)) {
/* box establishes new block formatting context
* so available width may be diminished due to
* floats. */
@@ -434,8 +446,8 @@ bool layout_block_context(struct box *block, int viewport_height,
/* Unless the box has an overflow style of visible, the box
* establishes a new block context. */
if (box->type == BOX_BLOCK && box->style &&
- css_computed_overflow(box->style) !=
- CSS_OVERFLOW_VISIBLE) {
+ (overflow_x != CSS_OVERFLOW_VISIBLE ||
+ overflow_y != CSS_OVERFLOW_VISIBLE)) {
layout_block_context(box, viewport_height, content);
@@ -815,7 +827,7 @@ void layout_minmax_block(struct box *block,
}
if (max < min) {
- box_dump(stderr, block, 0);
+ box_dump(stderr, block, 0, true);
assert(0);
}
@@ -903,8 +915,8 @@ struct box* layout_next_margin_block(struct box *box, struct box *block,
viewport_height, box,
box->style,
NULL, NULL, NULL, NULL,
- box->margin, box->padding,
- box->border);
+ NULL, NULL, box->margin,
+ box->padding, box->border);
/* Apply top margin */
if (*max_pos_margin < box->margin[TOP])
@@ -919,7 +931,7 @@ struct box* layout_next_margin_block(struct box *box, struct box *block,
box->border[TOP].width ||
box->padding[TOP] ||
(box->style &&
- css_computed_overflow(box->style) !=
+ css_computed_overflow_y(box->style) !=
CSS_OVERFLOW_VISIBLE) ||
(box->type == BOX_INLINE_CONTAINER &&
box != box->parent->children)) {
@@ -932,7 +944,7 @@ struct box* layout_next_margin_block(struct box *box, struct box *block,
/* Find next box */
if (box->type == BOX_BLOCK && !box->object && box->children &&
box->style &&
- css_computed_overflow(box->style) ==
+ css_computed_overflow_y(box->style) ==
CSS_OVERFLOW_VISIBLE) {
/* Down into children. */
box = box->children;
@@ -977,8 +989,8 @@ struct box* layout_next_margin_block(struct box *box, struct box *block,
viewport_height, box,
box->style,
NULL, NULL, NULL, NULL,
- box->margin, box->padding,
- box->border);
+ NULL, NULL, box->margin,
+ box->padding, box->border);
}
}
}
@@ -1029,12 +1041,14 @@ bool layout_block_object(struct box *block)
* \param height Height value in px or AUTO. If AUTO, updated to value in px.
* \param min_width Box's min width, as given by layout_find_dimensions.
* \param max_width Box's max width, as given by layout_find_dimensions.
+ * \param min_height Box's min height, as given by layout_find_dimensions.
+ * \param max_height Box's max height, as given by layout_find_dimensions.
*
* See CSS 2.1 sections 10.3 and 10.6.
*/
void layout_get_object_dimensions(struct box *box, int *width, int *height,
- int min_width, int max_width)
+ int min_width, int max_width, int min_height, int max_height)
{
assert(box->object != NULL);
assert(width != NULL && height != NULL);
@@ -1050,6 +1064,7 @@ void layout_get_object_dimensions(struct box *box, int *width, int *height,
*width = intrinsic_width;
*height = intrinsic_height;
+ /* Deal with min/max-width first */
if (min_width > 0 && min_width > *width) {
*width = min_width;
scaled = true;
@@ -1060,10 +1075,28 @@ void layout_get_object_dimensions(struct box *box, int *width, int *height,
}
if (scaled && (intrinsic_width != 0)) {
+ /* Update height */
*height = (*width * intrinsic_height) /
intrinsic_width;
}
+ scaled = false;
+ /* Deal with min/max-height */
+ if (min_height > 0 && min_height > *height) {
+ *height = min_height;
+ scaled = true;
+ }
+ if (max_height >= 0 && max_height < *height) {
+ *height = max_height;
+ scaled = true;
+ }
+
+ if (scaled && (intrinsic_height != 0)) {
+ /* Update width */
+ *width = (*height * intrinsic_width) /
+ intrinsic_height;
+ }
+
} else if (*width == AUTO) {
/* Have given height; width is calculated from the given height
* and ratio of intrinsic dimensions */
@@ -1116,7 +1149,7 @@ void layout_block_find_dimensions(int available_width, int viewport_height,
int lm, int rm, struct box *box)
{
int width, max_width, min_width;
- int height;
+ int height, max_height, min_height;
int *margin = box->margin;
int *padding = box->padding;
struct box_border *border = box->border;
@@ -1124,13 +1157,13 @@ void layout_block_find_dimensions(int available_width, int viewport_height,
layout_find_dimensions(available_width, viewport_height, box, style,
&width, &height, &max_width, &min_width,
- margin, padding, border);
+ &max_height, &min_height, margin, padding, border);
if (box->object && !(box->flags & REPLACE_DIM) &&
content_get_type(box->object) != CONTENT_HTML) {
/* block-level replaced element, see 10.3.4 and 10.6.2 */
layout_get_object_dimensions(box, &width, &height,
- min_width, max_width);
+ min_width, max_width, min_height, max_height);
}
box->width = layout_solve_width(box, available_width, width, lm, rm,
@@ -1262,32 +1295,42 @@ bool layout_apply_minmax_height(struct box *box, struct box *container)
void layout_block_add_scrollbar(struct box *box, int which)
{
- enum css_overflow_e overflow;
+ enum css_overflow_e overflow_x, overflow_y;
assert(box->type == BOX_BLOCK && (which == RIGHT || which == BOTTOM));
if (box->style == NULL)
return;
- overflow = css_computed_overflow(box->style);
+ overflow_x = css_computed_overflow_x(box->style);
+ overflow_y = css_computed_overflow_y(box->style);
+
+ if (which == BOTTOM &&
+ (overflow_x == CSS_OVERFLOW_SCROLL ||
+ overflow_x == CSS_OVERFLOW_AUTO ||
+ (box->object &&
+ content_get_type(box->object) == CONTENT_HTML))) {
+ /* make space for scrollbar, unless height is AUTO */
+ if (box->height != AUTO &&
+ (overflow_x == CSS_OVERFLOW_SCROLL ||
+ box_hscrollbar_present(box))) {
+ box->padding[BOTTOM] += SCROLLBAR_WIDTH;
+ }
- if (overflow == CSS_OVERFLOW_SCROLL || overflow == CSS_OVERFLOW_AUTO ||
- (box->object && content_get_type(box->object) ==
- CONTENT_HTML)) {
- /* make space for scrollbars, unless height/width are AUTO */
+ } else if (which == RIGHT &&
+ (overflow_y == CSS_OVERFLOW_SCROLL ||
+ overflow_y == CSS_OVERFLOW_AUTO ||
+ (box->object &&
+ content_get_type(box->object) == CONTENT_HTML))) {
+ /* make space for scrollbars, unless width is AUTO */
enum css_height_e htype;
css_fixed height = 0;
css_unit hunit = CSS_UNIT_PX;
htype = css_computed_height(box->style, &height, &hunit);
- if (which == BOTTOM && box->height != AUTO &&
- (overflow == CSS_OVERFLOW_SCROLL ||
- box_hscrollbar_present(box))) {
- box->padding[BOTTOM] += SCROLLBAR_WIDTH;
- }
if (which == RIGHT && box->width != AUTO &&
htype == CSS_HEIGHT_SET &&
- (overflow == CSS_OVERFLOW_SCROLL ||
+ (overflow_y == CSS_OVERFLOW_SCROLL ||
box_vscrollbar_present(box))) {
box->width -= SCROLLBAR_WIDTH;
box->padding[RIGHT] += SCROLLBAR_WIDTH;
@@ -1430,17 +1473,24 @@ int layout_solve_width(struct box *box, int available_width, int width,
void layout_float_find_dimensions(int available_width,
const css_computed_style *style, struct box *box)
{
- int width, height, max_width, min_width;
+ int width, height, max_width, min_width, max_height, min_height;
int *margin = box->margin;
int *padding = box->padding;
struct box_border *border = box->border;
- int scrollbar_width =
- (css_computed_overflow(style) == CSS_OVERFLOW_SCROLL ||
- css_computed_overflow(style) == CSS_OVERFLOW_AUTO) ?
+ enum css_overflow_e overflow_x = css_computed_overflow_x(style);
+ enum css_overflow_e overflow_y = css_computed_overflow_y(style);
+ int scrollbar_width_x =
+ (overflow_x == CSS_OVERFLOW_SCROLL ||
+ overflow_x == CSS_OVERFLOW_AUTO) ?
+ SCROLLBAR_WIDTH : 0;
+ int scrollbar_width_y =
+ (overflow_y == CSS_OVERFLOW_SCROLL ||
+ overflow_y == CSS_OVERFLOW_AUTO) ?
SCROLLBAR_WIDTH : 0;
layout_find_dimensions(available_width, -1, box, style, &width, &height,
- &max_width, &min_width, margin, padding, border);
+ &max_width, &min_width, &max_height, &min_height,
+ margin, padding, border);
if (margin[LEFT] == AUTO)
margin[LEFT] = 0;
@@ -1448,8 +1498,8 @@ void layout_float_find_dimensions(int available_width,
margin[RIGHT] = 0;
if (box->gadget == NULL) {
- padding[RIGHT] += scrollbar_width;
- padding[BOTTOM] += scrollbar_width;
+ padding[RIGHT] += scrollbar_width_y;
+ padding[BOTTOM] += scrollbar_width_x;
}
if (box->object && !(box->flags & REPLACE_DIM) &&
@@ -1457,7 +1507,7 @@ void layout_float_find_dimensions(int available_width,
/* Floating replaced element, with intrinsic width or height.
* See 10.3.6 and 10.6.2 */
layout_get_object_dimensions(box, &width, &height,
- min_width, max_width);
+ min_width, max_width, min_height, max_height);
} else if (box->gadget && (box->gadget->type == GADGET_TEXTBOX ||
box->gadget->type == GADGET_PASSWORD ||
box->gadget->type == GADGET_FILE ||
@@ -1530,7 +1580,7 @@ void layout_float_find_dimensions(int available_width,
} else {
if (max_width >= 0 && width > max_width) width = max_width;
if (min_width > 0 && width < min_width) width = min_width;
- width -= scrollbar_width;
+ width -= scrollbar_width_y;
}
box->width = width;
@@ -1555,6 +1605,8 @@ void layout_float_find_dimensions(int available_width,
* \param height updated to height, may be NULL
* \param max_width updated to max-width, may be NULL
* \param min_width updated to min-width, may be NULL
+ * \param max_height updated to max-height, may be NULL
+ * \param min_height updated to min-height, may be NULL
* \param margin[4] filled with margins, may be NULL
* \param padding[4] filled with paddings, may be NULL
* \param border[4] filled with border widths, may be NULL
@@ -1563,7 +1615,8 @@ void layout_float_find_dimensions(int available_width,
void layout_find_dimensions(int available_width, int viewport_height,
struct box *box, const css_computed_style *style,
int *width, int *height, int *max_width, int *min_width,
- int margin[4], int padding[4], struct box_border border[4])
+ int *max_height, int *min_height, int margin[4], int padding[4],
+ struct box_border border[4])
{
struct box *containing_block = NULL;
unsigned int i;
@@ -1750,6 +1803,48 @@ void layout_find_dimensions(int available_width, int viewport_height,
}
}
+ if (max_height) {
+ enum css_max_height_e type;
+ css_fixed value = 0;
+ css_unit unit = CSS_UNIT_PX;
+
+ type = css_computed_max_height(style, &value, &unit);
+
+ if (type == CSS_MAX_HEIGHT_SET) {
+ if (unit == CSS_UNIT_PCT) {
+ /* TODO: handle percentage */
+ *max_height = -1;
+ } else {
+ *max_height = FIXTOINT(nscss_len2px(value, unit,
+ style));
+ }
+ } else {
+ /* Inadmissible */
+ *max_height = -1;
+ }
+ }
+
+ if (min_height) {
+ enum css_min_height_e type;
+ css_fixed value = 0;
+ css_unit unit = CSS_UNIT_PX;
+
+ type = css_computed_min_height(style, &value, &unit);
+
+ if (type == CSS_MIN_HEIGHT_SET) {
+ if (unit == CSS_UNIT_PCT) {
+ /* TODO: handle percentage */
+ *min_height = 0;
+ } else {
+ *min_height = FIXTOINT(nscss_len2px(value, unit,
+ style));
+ }
+ } else {
+ /* Inadmissible */
+ *min_height = 0;
+ }
+ }
+
for (i = 0; i != 4; i++) {
if (margin) {
enum css_margin_e type = CSS_MARGIN_AUTO;
@@ -2297,7 +2392,7 @@ bool layout_line(struct box *first, int *width, int *y,
#endif
for (x = 0, b = first; x <= x1 - x0 && b != 0; b = b->next) {
- int min_width, max_width;
+ int min_width, max_width, min_height, max_height;
assert(b->type == BOX_INLINE || b->type == BOX_INLINE_BLOCK ||
b->type == BOX_FLOAT_LEFT ||
@@ -2347,7 +2442,8 @@ bool layout_line(struct box *first, int *width, int *y,
if (b->type == BOX_INLINE) {
/* calculate borders, margins, and padding */
layout_find_dimensions(*width, -1, b, b->style, 0, 0,
- 0, 0, b->margin, b->padding, b->border);
+ 0, 0, 0, 0, b->margin, b->padding,
+ b->border);
for (i = 0; i != 4; i++)
if (b->margin[i] == AUTO)
b->margin[i] = 0;
@@ -2454,11 +2550,12 @@ bool layout_line(struct box *first, int *width, int *y,
layout_find_dimensions(*width, -1, b, b->style,
&b->width, &b->height, &max_width, &min_width,
- NULL, NULL, NULL);
+ &max_height, &min_height, NULL, NULL, NULL);
if (b->object && !(b->flags & REPLACE_DIM)) {
layout_get_object_dimensions(b, &b->width, &b->height,
- min_width, max_width);
+ min_width, max_width,
+ min_height, max_height);
} else if (b->flags & IFRAME) {
/* TODO: should we look at the content dimensions? */
if (b->width == AUTO)
@@ -2697,7 +2794,7 @@ bool layout_line(struct box *first, int *width, int *y,
LOG(("float %p already placed", b));
#endif
- box_dump(stderr, cont, 0);
+ box_dump(stderr, cont, 0, true);
assert(0);
}
b->next_float = cont->float_children;
@@ -3185,6 +3282,7 @@ struct box *layout_minmax_line(struct box *first,
int temp_height = height;
layout_get_object_dimensions(b,
&width, &temp_height,
+ INT_MIN, INT_MAX,
INT_MIN, INT_MAX);
}
@@ -3412,23 +3510,33 @@ bool layout_table(struct box *table, int available_width,
/* find margins, paddings, and borders for table and cells */
layout_find_dimensions(available_width, -1, table, style, 0, 0, 0, 0,
- table->margin, table->padding, table->border);
+ 0, 0, table->margin, table->padding, table->border);
for (row_group = table->children; row_group;
row_group = row_group->next) {
for (row = row_group->children; row; row = row->next) {
for (c = row->children; c; c = c->next) {
+ enum css_overflow_e overflow_x;
+ enum css_overflow_e overflow_y;
+
assert(c->style);
table_used_border_for_cell(c);
layout_find_dimensions(available_width, -1,
- c, c->style, 0, 0, 0, 0, 0,
- c->padding, c->border);
- if (css_computed_overflow(c->style) ==
- CSS_OVERFLOW_SCROLL ||
- css_computed_overflow(c->style) ==
+ c, c->style, 0, 0, 0, 0, 0, 0,
+ 0, c->padding, c->border);
+
+ overflow_x = css_computed_overflow_x(c->style);
+ overflow_y = css_computed_overflow_y(c->style);
+
+ if (overflow_x == CSS_OVERFLOW_SCROLL ||
+ overflow_x ==
CSS_OVERFLOW_AUTO) {
- c->padding[RIGHT] += SCROLLBAR_WIDTH;
c->padding[BOTTOM] += SCROLLBAR_WIDTH;
}
+ if (overflow_y == CSS_OVERFLOW_SCROLL ||
+ overflow_y ==
+ CSS_OVERFLOW_AUTO) {
+ c->padding[RIGHT] += SCROLLBAR_WIDTH;
+ }
}
}
}
@@ -4031,7 +4139,7 @@ void layout_minmax_table(struct box *table,
for (i = 0; i != table->columns; i++) {
if (col[i].max < col[i].min) {
- box_dump(stderr, table, 0);
+ box_dump(stderr, table, 0, true);
assert(0);
}
table_min += col[i].min;
@@ -4518,7 +4626,7 @@ bool layout_absolute(struct box *box, struct box *containing_block,
box->float_container = containing_block;
layout_find_dimensions(available_width, -1, box, box->style,
&width, &height, &max_width, &min_width,
- margin, padding, border);
+ 0, 0, margin, padding, border);
box->float_container = NULL;
/* 10.3.7 */
@@ -4951,7 +5059,7 @@ static void layout_get_box_bbox(struct box *box, int *desc_x0, int *desc_y0,
/* To stop the top of text getting clipped when css line-height is
* reduced, we increase the top of the descendant bbox. */
if (box->type == BOX_BLOCK && box->style != NULL &&
- css_computed_overflow(box->style) ==
+ css_computed_overflow_y(box->style) ==
CSS_OVERFLOW_VISIBLE &&
box->object == NULL) {
css_fixed font_size = 0;
@@ -4960,7 +5068,7 @@ static void layout_get_box_bbox(struct box *box, int *desc_x0, int *desc_y0,
css_computed_font_size(box->style, &font_size, &font_unit);
text_height = nscss_len2px(font_size, font_unit, box->style);
-
+ text_height = FIXTOINT(text_height * 3 / 4);
*desc_y0 = (*desc_y0 < -text_height) ? *desc_y0 : -text_height;
}
}
@@ -4987,9 +5095,19 @@ static void layout_update_descendant_bbox(struct box *box, struct box *child,
bool html_object = (child->object &&
content_get_type(child->object) == CONTENT_HTML);
+ enum css_overflow_e overflow_x = CSS_OVERFLOW_VISIBLE;
+ enum css_overflow_e overflow_y = CSS_OVERFLOW_VISIBLE;
+
+ if (child->style != NULL) {
+ overflow_x = css_computed_overflow_x(child->style);
+ overflow_y = css_computed_overflow_y(child->style);
+ }
+
if (child->style == NULL ||
- (child->style && css_computed_overflow(child->style) ==
- CSS_OVERFLOW_VISIBLE && html_object == false)) {
+ (child->style &&
+ overflow_x == CSS_OVERFLOW_VISIBLE &&
+ overflow_y == CSS_OVERFLOW_VISIBLE &&
+ html_object == false)) {
/* get child's descendant bbox relative to box */
child_desc_x0 = child_x + child->descendant_x0;
child_desc_y0 = child_y + child->descendant_y0;
@@ -5086,7 +5204,9 @@ void layout_calculate_descendant_bboxes(struct box *box)
layout_calculate_descendant_bboxes(child);
- if (box->style && css_computed_overflow(box->style) ==
+ if (box->style && css_computed_overflow_x(box->style) ==
+ CSS_OVERFLOW_HIDDEN &&
+ css_computed_overflow_y(box->style) ==
CSS_OVERFLOW_HIDDEN)
continue;
diff --git a/render/list.c b/render/list.c
deleted file mode 100644
index 8e58f6258..000000000
--- a/render/list.c
+++ /dev/null
@@ -1,483 +0,0 @@
-/*
- * Copyright 2005 Richard Wilson <info@tinct.net>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/** \file
- * HTML lists (implementation).
- */
-#include <assert.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <strings.h>
-#include "css/css.h"
-#include "render/list.h"
-#include "utils/log.h"
-
-
-struct list_counter {
- char *name; /** Counter name */
- struct list_counter_state *first; /** First counter state */
- struct list_counter_state *state; /** Current counter state */
- struct list_counter *next; /** Next counter */
-};
-
-struct list_counter_state {
- int count; /** Current count */
- struct list_counter_state *parent; /** Parent counter, or NULL */
- struct list_counter_state *next; /** Next counter, or NULL */
-};
-
-static struct list_counter *list_counter_pool = NULL;
-static char list_counter_workspace[16];
-
-static const char *list_counter_roman[] = { "I", "IV", "V", "IX",
- "X", "XL", "L", "XC",
- "C", "CD", "D", "CM",
- "M"};
-static const int list_counter_decimal[] = { 1, 4, 5, 9,
- 10, 40, 50, 90,
- 100, 400, 500, 900,
- 1000};
-#define ROMAN_DECIMAL_CONVERSIONS (sizeof(list_counter_decimal) \
- / sizeof(list_counter_decimal[0]))
-
-
-static struct list_counter *render_list_find_counter(const char *name);
-static char *render_list_encode_counter(struct list_counter_state *state,
- enum css_list_style_type_e style);
-static char *render_list_encode_roman(int value);
-
-/*
-static void render_list_counter_output(char *name);
-*/
-
-/**
- * Finds a counter from the current pool, or adds a new one.
- *
- * \param name the name of the counter to find
- * \return the counter, or NULL if it couldn't be found/created.
- */
-static struct list_counter *render_list_find_counter(const char *name) {
- struct list_counter *counter;
-
- assert(name);
- /* find a current counter */
- for (counter = list_counter_pool; counter; counter = counter->next)
- if (!strcasecmp(name, counter->name))
- return counter;
-
- /* create a new counter */
- counter = calloc(1, sizeof(struct list_counter));
- if (!counter) {
- LOG(("No memory for calloc()"));
- return NULL;
- }
- counter->name = malloc(strlen(name) + 1);
- if (!counter->name) {
- LOG(("No memory for malloc()"));
- free(counter);
- return NULL;
- }
- strcpy(counter->name, name);
- counter->next = list_counter_pool;
- list_counter_pool = counter;
- return counter;
-}
-
-
-/**
- * Removes all counters from the current pool.
- */
-void render_list_destroy_counters(void) {
- struct list_counter *counter = list_counter_pool;
- struct list_counter *next_counter;
- struct list_counter_state *state;
- struct list_counter_state *next_state;
-
- while (counter) {
- next_counter = counter->next;
- free(counter->name);
- state = counter->first;
- free(counter);
- counter = next_counter;
- while (state) {
- next_state = state->next;
- free(state);
- state = next_state;
- }
- }
- list_counter_pool = NULL;
-}
-
-
-/**
- * Resets a counter in accordance with counter-reset (CSS 2.1/12.4).
- *
- * \param name the name of the counter to reset
- * \param value the value to reset the counter to
- * \return true on success, false on failure.
- */
-bool render_list_counter_reset(const char *name, int value) {
- struct list_counter *counter;
- struct list_counter_state *state;
- struct list_counter_state *link;
-
- assert(name);
- counter = render_list_find_counter(name);
- if (!counter)
- return false;
- state = calloc(1, sizeof(struct list_counter_state));
- if (!state) {
- LOG(("No memory for calloc()"));
- return false;
- }
- state->count = value;
- state->parent = counter->state;
- counter->state = state;
- if (!counter->first) {
- counter->first = state;
- } else {
- for (link = counter->first; link->next; link = link->next);
- link->next = state;
- }
-/* render_list_counter_output(name);
-*/ return true;
-}
-
-
-/**
- * Increments a counter in accordance with counter-increment (CSS 2.1/12.4).
- *
- * \param name the name of the counter to reset
- * \param value the value to increment the counter by
- * \return true on success, false on failure.
- */
-bool render_list_counter_increment(const char *name, int value) {
- struct list_counter *counter;
-
- assert(name);
- counter = render_list_find_counter(name);
- if (!counter)
- return false;
- /* if no counter-reset used, it is assumed the counter has been reset
- * to 0 by the root element. */
- if (!counter->state) {
- if (counter->first) {
- counter->state = counter->first;
- counter->state->count = 0;
- } else {
- render_list_counter_reset(name, 0);
- }
- }
- if (counter->state)
- counter->state->count += value;
-/* render_list_counter_output(name);
-*/ return counter->state != NULL;
-}
-
-
-/**
- * Ends the scope of a counter.
- *
- * \param name the name of the counter to end the scope for
- * \return true on success, false on failure.
- */
-bool render_list_counter_end_scope(const char *name) {
- struct list_counter *counter;
-
- assert(name);
- counter = render_list_find_counter(name);
- if ((!counter) || (!counter->state))
- return false;
- counter->state = counter->state->parent;
-/* render_list_counter_output(name);
-*/ return true;
-}
-
-
-/**
- * Returns a textual representation of a counter for counter() or counters()
- * (CSS 2.1/12.2).
- *
- * \param css_counter the counter to convert
- * \return a textual representation of the counter, or NULL on failure
- */
-char *render_list_counter(const css_computed_content_item *css_counter) {
- struct list_counter *counter;
- struct list_counter_state *state;
- char *compound = NULL;
- char *merge, *extend;
- lwc_string *name = NULL, *sep = NULL;
- uint8_t style;
-
- assert(css_counter);
-
- if (css_counter->type == CSS_COMPUTED_CONTENT_COUNTER) {
- name = css_counter->data.counter.name;
- style = css_counter->data.counter.style;
- } else {
- assert(css_counter->type == CSS_COMPUTED_CONTENT_COUNTERS);
-
- name = css_counter->data.counters.name;
- sep = css_counter->data.counters.sep;
- style = css_counter->data.counters.style;
- }
-
- counter = render_list_find_counter(lwc_string_data(name));
- if (!counter) {
- LOG(("Failed to find/create counter for conversion"));
- return NULL;
- }
-
- /* handle counter() first */
- if (sep == NULL)
- return render_list_encode_counter(counter->state, style);
-
- /* loop through all states for counters() */
- for (state = counter->first; state; state = state->next) {
- merge = render_list_encode_counter(state, style);
- if (!merge) {
- free(compound);
- return NULL;
- }
- if (!compound) {
- compound = merge;
- } else {
- extend = realloc(compound, strlen(compound) +
- strlen(merge) + 1);
- if (!extend) {
- LOG(("No memory for realloc()"));
- free(compound);
- free(merge);
- return NULL;
- }
- compound = extend;
- strcat(compound, merge);
- }
- if (state->next) {
- merge = realloc(compound, strlen(compound) +
- lwc_string_length(sep) + 1);
- if (!merge) {
- LOG(("No memory for realloc()"));
- free(compound);
- return NULL;
- }
- compound = merge;
- strcat(compound, lwc_string_data(sep));
- }
- }
- return compound;
-}
-
-
-/**
- * Returns a textual representation of a counter state in a specified style.
- *
- * \param state the counter state to represent
- * \param style the counter style to use
- * \return a textual representation of the counter state, or NULL on failure
- */
-static char *render_list_encode_counter(struct list_counter_state *state,
- enum css_list_style_type_e style) {
- char *result = NULL;
- int i;
-
- /* no counter state means that the counter is currently out of scope */
- if (!state) {
- result = malloc(1);
- if (!result)
- return NULL;
- result[0] = '\0';
- return result;
- }
-
- /* perform the relevant encoding to upper case where applicable */
- switch (style) {
- case CSS_LIST_STYLE_TYPE_LOWER_ALPHA:
- case CSS_LIST_STYLE_TYPE_UPPER_ALPHA:
- if (state->count <= 0)
- result = calloc(1, 1);
- else
- result = malloc(2);
- if (!result)
- return NULL;
- if (state->count > 0) {
- result[0] = 'A' + (state->count - 1) % 26;
- result[1] = '\0';
- }
- break;
- case CSS_LIST_STYLE_TYPE_DISC:
- case CSS_LIST_STYLE_TYPE_CIRCLE:
- case CSS_LIST_STYLE_TYPE_SQUARE:
- result = malloc(2);
- if (!result)
- return NULL;
- result[0] = '?';
- result[1] = '\0';
- break;
- case CSS_LIST_STYLE_TYPE_LOWER_ROMAN:
- case CSS_LIST_STYLE_TYPE_UPPER_ROMAN:
- result = render_list_encode_roman(state->count);
- if (!result)
- return NULL;
- break;
- case CSS_LIST_STYLE_TYPE_DECIMAL:
- snprintf(list_counter_workspace,
- sizeof list_counter_workspace,
- "%i", state->count);
- result = malloc(strlen(list_counter_workspace) + 1);
- if (!result)
- return NULL;
- strcpy(result, list_counter_workspace);
- break;
- case CSS_LIST_STYLE_TYPE_NONE:
- result = malloc(1);
- if (!result)
- return NULL;
- result[0] = '\0';
- break;
- default:
- break;
- }
-
- /* perform case conversion */
- if ((style == CSS_LIST_STYLE_TYPE_LOWER_ALPHA) ||
- (style == CSS_LIST_STYLE_TYPE_LOWER_ROMAN))
- for (i = 0; result[i]; i++)
- result[i] = tolower(result[i]);
-
- return result;
-}
-
-
-/**
- * Encodes a value in roman numerals.
- * For values that cannot be represented (ie <=0) an empty string is returned.
- *
- * \param value the value to represent
- * \return a string containing the representation, or NULL on failure
- */
-static char *render_list_encode_roman(int value) {
- int i, overflow, p = 0;
- char temp[10];
- char *result;
-
- /* zero and below is returned as an empty string and not erred as
- * if it is counters() will fail to complete other scopes. */
- if (value <= 0) {
- result = malloc(1);
- if (!result)
- return NULL;
- result[0] = '\0';
- return result;
- }
-
- /* we only calculate 1->999 and then add a M for each thousand */
- overflow = value / 1000;
- value = value % 1000;
-
- /* work backwards through the array */
- for (i = ROMAN_DECIMAL_CONVERSIONS - 1; i >= 0; i--) {
- while (value >= list_counter_decimal[0]) {
- if (value - list_counter_decimal[i] <
- list_counter_decimal[0] - 1)
- break;
- value -= list_counter_decimal[i];
- temp[p++] = list_counter_roman[i][0];
- if (i & 0x1)
- temp[p++] = list_counter_roman[i][1];
- }
- }
- temp[p] = '\0';
-
- /* create a copy for the caller including thousands */
- result = malloc(p + overflow + 1);
- if (!result)
- return NULL;
- for (i = 0; i < overflow; i++)
- result[i] = 'M';
- strcpy(&result[overflow], temp);
- return result;
-}
-
-
-
-
-
-
-
-
-void render_list_test(void) {
- /* example given in CSS2.1/12.4.1 */
-/* render_list_counter_reset("item", 0);
- render_list_counter_increment("item", 1);
- render_list_counter_increment("item", 1);
- render_list_counter_reset("item", 0);
- render_list_counter_increment("item", 1);
- render_list_counter_increment("item", 1);
- render_list_counter_increment("item", 1);
- render_list_counter_reset("item", 0);
- render_list_counter_increment("item", 1);
- render_list_counter_end_scope("item");
- render_list_counter_reset("item", 0);
- render_list_counter_increment("item", 1);
- render_list_counter_end_scope("item");
- render_list_counter_increment("item", 1);
- render_list_counter_end_scope("item");
- render_list_counter_increment("item", 1);
- render_list_counter_increment("item", 1);
- render_list_counter_end_scope("item");
- render_list_counter_reset("item", 0);
- render_list_counter_increment("item", 1);
- render_list_counter_increment("item", 1);
- render_list_counter_end_scope("item");
-*/
-}
-/*
-static void render_list_counter_output(char *name) {
- struct list_counter *counter;
- char *result;
- struct css_counter css_counter;
-
- assert(name);
- counter = render_list_find_counter(name);
- if (!counter) {
- fprintf(stderr, "Unable to create counter '%s'\n", name);
- return;
- }
-
- css_counter.name = name;
- css_counter.style = CSS_LIST_STYLE_TYPE_LOWER_ALPHA;
- css_counter.separator = NULL;
- result = render_list_counter(&css_counter);
- if (!result) {
- fprintf(stderr, "Failed to output counter('%s')\n", name);
- } else {
- fprintf(stderr, "counter('%s') is '%s'\n", name, result);
- free(result);
- }
- css_counter.separator = ".";
- result = render_list_counter(&css_counter);
- if (!result) {
- fprintf(stderr, "Failed to output counters('%s', '.')\n", name);
- } else {
- fprintf(stderr, "counters('%s', '.') is '%s'\n", name, result);
- free(result);
- }
-}
-*/
diff --git a/render/search.c b/render/search.c
index 895cff0a1..00261a36a 100644
--- a/render/search.c
+++ b/render/search.c
@@ -21,28 +21,25 @@
/** \file
* Free text search (core)
*/
-#include "utils/config.h"
#include <ctype.h>
#include <string.h>
-
#include <dom/dom.h>
+#include "utils/config.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/utils.h"
#include "content/content.h"
#include "content/hlcache.h"
-#include "desktop/gui.h"
#include "desktop/selection.h"
+#include "desktop/gui_factory.h"
+
#include "render/box.h"
#include "render/html.h"
#include "render/html_internal.h"
#include "render/search.h"
#include "render/textplain.h"
-#include "utils/config.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/url.h"
-#include "utils/utils.h"
-
#ifndef NOF_ELEMENTS
#define NOF_ELEMENTS(array) (sizeof(array)/sizeof(*(array)))
@@ -63,7 +60,6 @@ struct list_entry {
};
struct search_context {
- struct gui_search_callbacks *gui;
void *gui_p;
struct content *c;
struct list_entry *found;
@@ -77,8 +73,7 @@ struct search_context {
/* Exported function documented in search.h */
struct search_context * search_create_context(struct content *c,
- content_type type, struct gui_search_callbacks *callbacks,
- void *gui_data)
+ content_type type, void *gui_data)
{
struct search_context *context;
struct list_entry *search_head;
@@ -115,7 +110,6 @@ struct search_context * search_create_context(struct content *c,
context->newsearch = true;
context->c = c;
context->is_html = (type == CONTENT_HTML) ? true : false;
- context->gui = callbacks;
context->gui_p = gui_data;
return context;
@@ -469,8 +463,7 @@ static void search_text(const char *string, int string_len,
context->string[string_len] = '\0';
}
- if ((context->gui != NULL) && (context->gui->hourglass != NULL))
- context->gui->hourglass(true, context->gui_p);
+ guit->search->hourglass(true, context->gui_p);
if (context->is_html == true) {
res = find_occurrences_html(string, string_len,
@@ -482,14 +475,10 @@ static void search_text(const char *string, int string_len,
if (!res) {
free_matches(context);
- if ((context->gui != NULL) &&
- (context->gui->hourglass != NULL))
- context->gui->hourglass(false, context->gui_p);
+ guit->search->hourglass(false, context->gui_p);
return;
}
- if ((context->gui != NULL) &&
- (context->gui->hourglass != NULL))
- context->gui->hourglass(false, context->gui_p);
+ guit->search->hourglass(false, context->gui_p);
context->prev_case_sens = case_sensitive;
@@ -508,20 +497,14 @@ static void search_text(const char *string, int string_len,
}
}
- if (context->gui == NULL)
- return;
- if (context->gui->status != NULL)
- context->gui->status((context->current != NULL),
- context->gui_p);
+ guit->search->status((context->current != NULL), context->gui_p);
search_show_all(showall, context);
- if (context->gui->back_state != NULL)
- context->gui->back_state((context->current != NULL) &&
+ guit->search->back_state((context->current != NULL) &&
(context->current->prev != NULL),
context->gui_p);
- if (context->gui->forward_state != NULL)
- context->gui->forward_state((context->current != NULL) &&
+ guit->search->forward_state((context->current != NULL) &&
(context->current->next != NULL),
context->gui_p);
@@ -558,13 +541,12 @@ void search_step(struct search_context *context, search_flags_t flags,
int string_len;
int i = 0;
- if ((context == NULL) || (context->gui == NULL)) {
+ if (context == NULL) {
warn_user("SearchError", 0);
return;
}
- if (context->gui->add_recent != NULL)
- context->gui->add_recent(string, context->gui_p);
+ guit->search->add_recent(string, context->gui_p);
string_len = strlen(string);
for (i = 0; i < string_len; i++)
@@ -573,12 +555,10 @@ void search_step(struct search_context *context, search_flags_t flags,
if (i >= string_len) {
union content_msg_data msg_data;
free_matches(context);
- if (context->gui->status != NULL)
- context->gui->status(true, context->gui_p);
- if (context->gui->back_state != NULL)
- context->gui->back_state(false, context->gui_p);
- if (context->gui->forward_state != NULL)
- context->gui->forward_state(false, context->gui_p);
+
+ guit->search->status(true, context->gui_p);
+ guit->search->back_state(false, context->gui_p);
+ guit->search->forward_state(false, context->gui_p);
msg_data.scroll.area = false;
msg_data.scroll.x0 = 0;
@@ -654,11 +634,14 @@ void search_destroy_context(struct search_context *context)
{
assert(context != NULL);
- if ((context->string != NULL) && (context->gui != NULL) &&
- (context->gui->add_recent != NULL)) {
- context->gui->add_recent(context->string, context->gui_p);
+ if (context->string != NULL) {
+ guit->search->add_recent(context->string, context->gui_p);
free(context->string);
}
+
+ guit->search->forward_state(true, context->gui_p);
+ guit->search->back_state(true, context->gui_p);
+
free_matches(context);
free(context);
}
diff --git a/render/search.h b/render/search.h
index 43c93b3ab..a8354e77e 100644
--- a/render/search.h
+++ b/render/search.h
@@ -36,8 +36,7 @@ struct search_context;
* \return true for success
*/
struct search_context * search_create_context(struct content *c,
- content_type type, struct gui_search_callbacks *callbacks,
- void *gui_data);
+ content_type type, void *context);
/**
* Ends the search process, invalidating all state
diff --git a/render/table.c b/render/table.c
index 5eba544b5..22b5afd37 100644
--- a/render/table.c
+++ b/render/table.c
@@ -337,7 +337,7 @@ void table_used_left_border_for_cell(struct box *cell)
if (cell->prev == NULL) {
struct box *row;
- /* Spanned from a previous row */
+ /* Spanned from a previous row in current row group */
for (row = cell->parent; row != NULL; row = row->prev) {
for (prev = row->children; prev != NULL;
prev = prev->next) {
@@ -954,12 +954,12 @@ bool table_cell_top_process_row(struct box *cell, struct box *row,
while (processed == false) {
for (c = row->children; c != NULL; c = c->next) {
/* Ignore cells to the left */
- if (c->start_column + c->columns <
+ if (c->start_column + c->columns - 1 <
cell->start_column)
continue;
/* Ignore cells to the right */
- if (c->start_column >= cell->start_column +
- cell->columns)
+ if (c->start_column > cell->start_column +
+ cell->columns - 1)
continue;
/* Flag that we've processed a cell */
diff --git a/render/textplain.c b/render/textplain.c
index 892e03e57..86c87330d 100644
--- a/render/textplain.c
+++ b/render/textplain.c
@@ -29,13 +29,13 @@
#include <math.h>
#include <parserutils/input/inputstream.h>
+#include <parserutils/charset/utf8.h>
#include "content/content_protected.h"
#include "content/hlcache.h"
#include "css/css.h"
#include "css/utils.h"
#include "desktop/browser.h"
-#include "desktop/gui.h"
#include "utils/nsoption.h"
#include "desktop/plotters.h"
#include "desktop/search.h"
@@ -46,6 +46,7 @@
#include "render/textplain.h"
#include "render/html.h"
#include "render/search.h"
+#include "utils/corestrings.h"
#include "utils/http.h"
#include "utils/log.h"
#include "utils/messages.h"
@@ -112,8 +113,7 @@ static void textplain_mouse_track(struct content *c, struct browser_window *bw,
static void textplain_mouse_action(struct content *c, struct browser_window *bw,
browser_mouse_state mouse, int x, int y);
static bool textplain_keypress(struct content *c, uint32_t key);
-static void textplain_search(struct content *c,
- struct gui_search_callbacks *gui_callbacks, void *gui_data,
+static void textplain_search(struct content *c, void *gui_data,
search_flags_t flags, const char *string);
static void textplain_search_clear(struct content *c);
static void textplain_reformat(struct content *c, int width, int height);
@@ -159,7 +159,6 @@ static const content_handler textplain_content_handler = {
.no_share = true,
};
-static lwc_string *textplain_charset;
static lwc_string *textplain_default_charset;
/**
@@ -170,16 +169,9 @@ nserror textplain_init(void)
lwc_error lerror;
nserror error;
- lerror = lwc_intern_string("charset", SLEN("charset"),
- &textplain_charset);
- if (lerror != lwc_error_ok) {
- return NSERROR_NOMEM;
- }
-
lerror = lwc_intern_string("Windows-1252", SLEN("Windows-1252"),
&textplain_default_charset);
if (lerror != lwc_error_ok) {
- lwc_string_unref(textplain_charset);
return NSERROR_NOMEM;
}
@@ -187,7 +179,6 @@ nserror textplain_init(void)
&textplain_content_handler);
if (error != NSERROR_OK) {
lwc_string_unref(textplain_default_charset);
- lwc_string_unref(textplain_charset);
}
return error;
@@ -202,11 +193,6 @@ void textplain_fini(void)
lwc_string_unref(textplain_default_charset);
textplain_default_charset = NULL;
}
-
- if (textplain_charset != NULL) {
- lwc_string_unref(textplain_charset);
- textplain_charset = NULL;
- }
}
/**
@@ -233,7 +219,7 @@ nserror textplain_create(const content_handler *handler,
return error;
}
- error = http_parameter_list_find_item(params, textplain_charset,
+ error = http_parameter_list_find_item(params, corestring_lwc_charset,
&encoding);
if (error != NSERROR_OK) {
encoding = lwc_string_ref(textplain_default_charset);
@@ -480,6 +466,8 @@ void textplain_reformat(struct content *c, int width, int height)
int character_width;
size_t line_start;
+ LOG(("content %p w:%d h:%d",c, width, height));
+
/* compute available columns (assuming monospaced font) - use 8
* characters for better accuracy */
if (!nsfont.font_width(&textplain_style, "ABCDEFGH", 8, &character_width))
@@ -500,12 +488,27 @@ void textplain_reformat(struct content *c, int width, int height)
line[line_count++].start = line_start = 0;
space = 0;
- for (i = 0, col = 0; i != utf8_data_size; i++) {
- bool term = (utf8_data[i] == '\n' || utf8_data[i] == '\r');
- size_t next_col = col + 1;
+ i = 0;
+ col = 0;
+ while (i < utf8_data_size) {
+ size_t csize; /* number of bytes in character */
+ uint32_t chr;
+ bool term;
+ size_t next_col;
+ parserutils_error perror;
+
+ perror = parserutils_charset_utf8_to_ucs4((const uint8_t *)utf8_data + i, utf8_data_size - i, &chr, &csize);
+ if (perror != PARSERUTILS_OK) {
+ chr = 0xfffd;
+ }
+
+ term = (chr == '\n' || chr == '\r');
- if (utf8_data[i] == '\t')
+ next_col = col + 1;
+
+ if (chr == '\t') {
next_col = (next_col + TAB_WIDTH - 1) & ~(TAB_WIDTH - 1);
+ }
if (term || next_col >= columns) {
if (line_count % 1024 == 0) {
@@ -530,7 +533,6 @@ void textplain_reformat(struct content *c, int width, int height)
/* break at last space in line */
i = space;
line[line_count-1].length = (i + 1) - line_start;
-
} else
line[line_count-1].length = i - line_start;
}
@@ -539,9 +541,10 @@ void textplain_reformat(struct content *c, int width, int height)
space = 0;
} else {
col++;
- if (utf8_data[i] == ' ')
+ if (chr == ' ')
space = i;
}
+ i += csize;
}
line[line_count-1].length = i - line[line_count-1].start;
line[line_count].start = utf8_data_size;
@@ -774,8 +777,7 @@ bool textplain_keypress(struct content *c, uint32_t key)
* \param flags search flags
* \param string search string
*/
-void textplain_search(struct content *c,
- struct gui_search_callbacks *gui_callbacks, void *gui_data,
+void textplain_search(struct content *c, void *gui_data,
search_flags_t flags, const char *string)
{
textplain_content *text = (textplain_content *) c;
@@ -801,7 +803,7 @@ void textplain_search(struct content *c,
}
text->search = search_create_context(c, CONTENT_TEXTPLAIN,
- gui_callbacks, gui_data);
+ gui_data);
if (text->search == NULL)
return;
diff --git a/resources/FatMessages b/resources/FatMessages
index 2d74f3d6d..9eb742676 100644
--- a/resources/FatMessages
+++ b/resources/FatMessages
@@ -1760,11 +1760,11 @@ de.gtk.gtkNavigate:_Navigation
fr.gtk.gtkNavigate:_Navigate
it.gtk.gtkNavigate:_Visualizza
nl.gtk.gtkNavigate:_Navigate
-en.gtk.gtkTabs:_Tabs
-de.gtk.gtkTabs:_Tabs
-fr.gtk.gtkTabs:_Tabs
-it.gtk.gtkTabs:_Schede
-nl.gtk.gtkTabs:_Tabs
+en.gtk.gtkTools:_Tools
+de.gtk.gtkTools:_Tools
+fr.gtk.gtkTools:_Tools
+it.gtk.gtkTools:_Tools
+nl.gtk.gtkTools:_Tools
en.gtk.gtkHelp:_Help
de.gtk.gtkHelp:_Hilfe
fr.gtk.gtkHelp:_Help
@@ -2003,16 +2003,16 @@ de.gtk.gtkFullScreenAccel:F11
fr.gtk.gtkFullScreenAccel:F11
it.gtk.gtkFullScreenAccel:F11
nl.gtk.gtkFullScreenAccel:F11
-en.gtk.gtkViewSource:View S_ource
-de.gtk.gtkViewSource: Q_uelltext Anzeigen
-fr.gtk.gtkViewSource:Voir la S_ource
-it.gtk.gtkViewSource:Mostra s_orgente
-nl.gtk.gtkViewSource:View S_ource
-en.gtk.gtkViewSourceAccel:F8
-de.gtk.gtkViewSourceAccel:F8
-fr.gtk.gtkViewSourceAccel:F8
-it.gtk.gtkViewSourceAccel:F8
-nl.gtk.gtkViewSourceAccel:F8
+en.gtk.gtkPageSource:Page S_ource
+de.gtk.gtkPageSource: Q_uelltext Anzeigen
+fr.gtk.gtkPageSource:Voir la S_ource
+it.gtk.gtkPageSource:Mostra s_orgente
+nl.gtk.gtkPageSource:Page S_ource
+en.gtk.gtkPageSourceAccel:<ctrl>U
+de.gtk.gtkPageSourceAccel:<ctrl>U
+fr.gtk.gtkPageSourceAccel:<ctrl>U
+it.gtk.gtkPageSourceAccel:<ctrl>U
+nl.gtk.gtkPageSourceAccel:<ctrl>U
en.gtk.gtkImages:_Images
de.gtk.gtkImages:B_ilder
fr.gtk.gtkImages:_Images
@@ -2033,6 +2033,11 @@ de.gtk.gtkToolbars:_Werkzeugleisten
fr.gtk.gtkToolbars:_Barre d'outils
it.gtk.gtkToolbars:_Barre strumenti
nl.gtk.gtkToolbars:_Toolbars
+en.gtk.gtkTabs:_Tabs
+de.gtk.gtkTabs:_Tabs
+fr.gtk.gtkTabs:_Tabs
+it.gtk.gtkTabs:_Schede
+nl.gtk.gtkTabs:_Tabs
en.gtk.gtkMenuBar:_Menu Bar
de.gtk.gtkMenuBar:_Menüleiste
fr.gtk.gtkMenuBar:_Barre de menu
@@ -2048,11 +2053,11 @@ de.gtk.gtkStatusBar:_Statusleiste
fr.gtk.gtkStatusBar:_Bar de statut
it.gtk.gtkStatusBar:Barra di s_tato
nl.gtk.gtkStatusBar:_Status Bar
-en.gtk.gtkDownloads:_Downloads
-de.gtk.gtkDownloads:_Downloads
-fr.gtk.gtkDownloads:_Téléchargements
-it.gtk.gtkDownloads:_Trasferimenti
-nl.gtk.gtkDownloads:_Downloads
+en.gtk.gtkDownloads:_Downloads...
+de.gtk.gtkDownloads:_Downloads...
+fr.gtk.gtkDownloads:_Téléchargements...
+it.gtk.gtkDownloads:_Trasferimenti...
+nl.gtk.gtkDownloads:_Downloads...
en.gtk.gtkDownloadsAccel:<ctrl>d
de.gtk.gtkDownloadsAccel:<ctrl>d
fr.gtk.gtkDownloadsAccel:<ctrl>d
@@ -2063,26 +2068,26 @@ de.gtk.gtkSaveWindowSize:Fenstergröße _speichern
fr.gtk.gtkSaveWindowSize:E_nregistrer la taille de la fenêtre
it.gtk.gtkSaveWindowSize:S_alva dimensione finestra
nl.gtk.gtkSaveWindowSize:S_ave Window Size
-en.gtk.gtkDebugging:De_bugging
-de.gtk.gtkDebugging:De_bugging
-fr.gtk.gtkDebugging:D_ébogage
-it.gtk.gtkDebugging:De_bugging
-nl.gtk.gtkDebugging:De_bugging
+en.gtk.gtkDeveloper:De_veloper
+de.gtk.gtkDeveloper:De_veloper
+fr.gtk.gtkDeveloper:D_ébogage
+it.gtk.gtkDeveloper:De_veloper
+nl.gtk.gtkDeveloper:De_veloper
en.gtk.gtkToggleDebugging:T_oggle debug rendering
de.gtk.gtkToggleDebugging:T_oggle debug rendering
fr.gtk.gtkToggleDebugging:Activer le débogage
it.gtk.gtkToggleDebugging:In_verti debug del rendering
nl.gtk.gtkToggleDebugging:T_oggle debug rendering
-en.gtk.gtkSaveBoxTree:_Save box tree
-de.gtk.gtkSaveBoxTree:_Save box tree
-fr.gtk.gtkSaveBoxTree:_Save box tree
-it.gtk.gtkSaveBoxTree:_Salva albero Box
-nl.gtk.gtkSaveBoxTree:_Save box tree
-en.gtk.gtkSaveDomTree:Save DOM tree
-de.gtk.gtkSaveDomTree:Save DOM tree
-fr.gtk.gtkSaveDomTree:Save DOM tree
-it.gtk.gtkSaveDomTree:Salva albero DOM
-nl.gtk.gtkSaveDomTree:Save DOM tree
+en.gtk.gtkDebugBoxTree:Debug _box tree
+de.gtk.gtkDebugBoxTree:Debug _box tree
+fr.gtk.gtkDebugBoxTree:Debug _box tree
+it.gtk.gtkDebugBoxTree:Debug _box tree
+nl.gtk.gtkDebugBoxTree:Debug _box tree
+en.gtk.gtkDebugDomTree:Debug _DOM tree
+de.gtk.gtkDebugDomTree:Debug _DOM tree
+fr.gtk.gtkDebugDomTree:Debug _DOM tree
+it.gtk.gtkDebugDomTree:Debug albero _DOM
+nl.gtk.gtkDebugDomTree:Debug _DOM tree
en.gtk.gtkBack:_Back
de.gtk.gtkBack:_Zurück
@@ -2222,26 +2227,38 @@ fr.gtk.gtkAbout:_A propos...
it.gtk.gtkAbout:_Informazioni
nl.gtk.gtkAbout:_About
+
en.gtk.gtkCustomize:Customise…
de.gtk.gtkCustomize:Customise..
fr.gtk.gtkCustomize:Customise…
it.gtk.gtkCustomize:Personalizza...
nl.gtk.gtkCustomize:Customise…
-en.gtk.gtkOpentab:Open Link in _New Tab
-de.gtk.gtkOpentab:Link in _neuem Tab öffnen
-fr.gtk.gtkOpentab:Open Link in _New Tab
-it.gtk.gtkOpentab:Apri in una _nuova scheda
-nl.gtk.gtkOpentab:Open Link in _New Tab
-en.gtk.gtkOpenwin:Open Link in New Window
-de.gtk.gtkOpenwin:Link in neuem Fenster öffnen
-fr.gtk.gtkOpenwin:Open Link in New Window
-it.gtk.gtkOpenwin:Apri in una nuova finestra
-nl.gtk.gtkOpenwin:Open Link in New Window
-en.gtk.gtkSavelink:Save Link
-de.gtk.gtkSavelink:Link speichern..
-fr.gtk.gtkSavelink:Save Link
-it.gtk.gtkSavelink:Salva Link
-nl.gtk.gtkSavelink:Save Link
+en.gtk.gtkOpentab:Open Link in New _Tab
+de.gtk.gtkOpentab:Link in neuem _Tab öffnen
+fr.gtk.gtkOpentab:Ouvrir dans un nouvel _Onglet
+it.gtk.gtkOpentab:Apri in una nuova _scheda
+nl.gtk.gtkOpentab:Open Link in New _Tab
+en.gtk.gtkOpenwin:Open Link in New _Window
+de.gtk.gtkOpenwin:Link in neuem _Fenster öffnen
+fr.gtk.gtkOpenwin:Ouvrir dans une nouvelle _Fenêtre
+it.gtk.gtkOpenwin:Apri in una nuova _finestra
+nl.gtk.gtkOpenwin:Open Link in New _Window
+en.gtk.gtkSavelink:Save Lin_k
+de.gtk.gtkSavelink:Lin_k speichern..
+fr.gtk.gtkSavelink:Save Lin_k
+it.gtk.gtkSavelink:Salva Lin_k
+nl.gtk.gtkSavelink:Save Lin_k
+en.gtk.gtkBookmarklink:Bookmark _Link
+de.gtk.gtkBookmarklink:Bookmark _Link
+fr.gtk.gtkBookmarklink:Bookmark _Link
+it.gtk.gtkBookmarklink:Bookmark _Link
+nl.gtk.gtkBookmarklink:Bookmark _Link
+en.gtk.gtkCopylink:Copy link loc_ation
+de.gtk.gtkCopylink:Copy link loc_ation
+fr.gtk.gtkCopylink:Copy link loc_ation
+it.gtk.gtkCopylink:Copy link loc_ation
+nl.gtk.gtkCopylink:Copy link loc_ation
+
en.gtk.gtkToolBarTitle:Toolbar custom button store
de.gtk.gtkToolBarTitle:Benutzerdefinierter Ort für Toolbar-Icons
@@ -2305,10 +2322,11 @@ en.gtk.preferencesTabsAlways:Always show tab bar
en.gtk.preferencesTabsSwitch:Switch to newly opened tabs immediately
en.gtk.preferencesTabsNewly:Newly opened tabs are blank
en.gtk.preferencesTabsPosition:Position:
-en.gtk.preferencesSource:<b>Source</b>
-en.gtk.preferencesSourceOpen:Open source view in new:
-en.gtk.preferencesSourceWindow:window
-en.gtk.preferencesSourceTab:tab
+en.gtk.preferencesTools:<b>Tools</b>
+en.gtk.preferencesDeveloperView:Open developer views in a
+en.gtk.preferencesDeveloperViewWindow:Window
+en.gtk.preferencesDeveloperViewTab:Tab
+en.gtk.preferencesDeveloperViewEditor:Editor
en.gtk.preferencesURLbar:<b>URLbar</b>
en.gtk.preferencesURLbarDisplay:Display recently visited URLs as you type
en.gtk.preferencesToolbar:<b>Toolbar</b>
@@ -2611,7 +2629,12 @@ de.all.Form_Many:(Viele)
fr.all.Form_Many:(Plusieurs)
it.all.Form_Many:(Molti)
nl.all.Form_Many:(Veel)
-en.all.Form_Drop:Drop file here
+en.gtk.Form_Drop:Click to select file
+en.ro.Form_Drop:Drop file here
+en.ami.Form_Drop:Click or drop file here
+en.beos.Form_Drop:Drop file here
+en.fb.Form_Drop:Click to select file
+en.osx.Form_Drop:Click to select file
de.all.Form_Drop:Datei hier hinziehen
fr.all.Form_Drop:Déposer les fichiers ici
it.all.Form_Drop:Inserisci un file qui
@@ -2911,6 +2934,11 @@ de.all.NoMemory:Zu wenig Speicher. Bitte mehr Speicher zur Verfügung stellen un
fr.all.NoMemory:NetSurf a besoin de plus de mémoire. Veuillez libérer de la mémoire et réessayer.
it.all.NoMemory:Memoria insufficiente per l'esecuzione di NetSurf. Per favore liberane un pò e riprova nuovamente.
nl.all.NoMemory:NetSurf krijgt gebrek aan geheugen. Maak wat geheugen vrij en probeer het dan nog eens.
+en.ro.LongURL:The URL for this page is too long for NetSurf to display.
+de.ro.LongURL:The URL for this page is too long for NetSurf to display.
+fr.ro.LongURL:The URL for this page is too long for NetSurf to display.
+it.ro.LongURL:The URL for this page is too long for NetSurf to display.
+nl.ro.LongURL:The URL for this page is too long for NetSurf to display.
en.ro.FontBadInst:An error occurred when initialising fonts due to the presence of obsolete copies of the ROM fonts on disc. NetSurf will exit and launch a program which will attempt to fix this.
de.ro.FontBadInst:Font-Initialisierung fehlerhaft. Obsolete Kopien von ROM Fonts auf dem lokalem Speichermedium. Fehlerbehebung startet.
fr.ro.FontBadInst:Une erreur s'est produite lors de l'initialisation des fontes à cause de la présence de copies obsolètes de fontes ROM sur disque. NetSurf va sortir et lancer un programme qui va tenter de réparer cela.
@@ -4810,28 +4838,58 @@ nl.ro.HelpCacheConfig3:\Tamount of memory to be used for caching content.
en.ro.HelpCacheConfig4:\Sreduce the amount of memory.
de.ro.HelpCacheConfig4:Klicken mit AUSWAHL verringert die Größe des Cachespeichers.
fr.ro.HelpCacheConfig4:\Sréduire la quantité de mémoire.
-it.ro.HelpCacheConfig4:\Sriduce la quantità di memoria.
+it.ro.HelpCacheConfig4:\Sriduce la quantità di memoria.
nl.ro.HelpCacheConfig4:\Sreduce the amount of memory.
en.ro.HelpCacheConfig5:\Sincrease the amount of memory.
de.ro.HelpCacheConfig5:Klicken mit AUSWAHL vergrößert die Größe des Cachespeichers.
fr.ro.HelpCacheConfig5:\Saugmenter la quantité de mémoire.
-it.ro.HelpCacheConfig5:\Saumenta la quantità di memoria.
+it.ro.HelpCacheConfig5:\Saumenta la quantità di memoria.
nl.ro.HelpCacheConfig5:\Sincrease the amount of memory.
-en.ro.HelpCacheConfig7:\Sreset the Cache options back to their default values.
-de.ro.HelpCacheConfig7:Stellt die Standardeinstellungen wieder her.
-fr.ro.HelpCacheConfig7:\Srevenir aux valeurs par défaut des options du Cache.
-it.ro.HelpCacheConfig7:\Sreset the Cache options back to their default values.
-nl.ro.HelpCacheConfig7:\Sreset the Cache options back to their default values.
-en.ro.HelpCacheConfig8:\Sclose this \w without saving changes.|M\Areturn the cache options to the last saved configuration.
-de.ro.HelpCacheConfig8:Klicken mit AUSWAHL schließt das Fenster ohne die Änderungen zu speichern.|MKlicken mit SPEZIAL stellt die zuletzt abgespeicherten Einstellungen wieder her.
-fr.ro.HelpCacheConfig8:\Sfermer cette fenêtre sans sauver les changements.|M\Arevenir aux options de Cache précédemment sauvegardées.
-it.ro.HelpCacheConfig8:\Sclose this \w without saving changes.|M\Areturn the cache options to the last saved configuration.
-nl.ro.HelpCacheConfig8:\Sclose this \w without saving changes.|M\Areturn the cache options to the last saved configuration.
-en.ro.HelpCacheConfig9:\Ssave these settings and close the \w.|M\Asave these settings without closing the \w.
-de.ro.HelpCacheConfig9:Klicken mit AUSWAHL speichert die Einstellungen und schließt das Fenster.|MKlicken mit SPEZIAL speichert die Einstellungen ohne das Fenster zu schließen.
-fr.ro.HelpCacheConfig9:\Ssauver ces réglages et fermer la fenêtre.|M\Asauver ces réglages sans fermer la fenêtre.
-it.ro.HelpCacheConfig9:\Ssave these settings and close the \w.|M\Asave these settings without closing the \w.
-nl.ro.HelpCacheConfig9:\Ssave these settings and close the \w.|M\Asave these settings without closing the \w.
+en.ro.HelpCacheConfig10:\Tamount of disc space to be used for caching content between sessions.
+de.ro.HelpCacheConfig10:\Tamount of disc space to be used for caching content between sessions.
+fr.ro.HelpCacheConfig10:\Tamount of disc space to be used for caching content between sessions.
+it.ro.HelpCacheConfig10:\Tamount of disc space to be used for caching content between sessions.
+nl.ro.HelpCacheConfig10:\Tamount of disc space to be used for caching content between sessions.
+en.ro.HelpCacheConfig11:\Sreduce the amount of memory.
+de.ro.HelpCacheConfig11:Klicken mit AUSWAHL verringert die Größe des Cachespeichers.
+fr.ro.HelpCacheConfig11:\Sréduire la quantité de mémoire.
+it.ro.HelpCacheConfig11:\Sriduce la quantità di memoria.
+nl.ro.HelpCacheConfig11:\Sreduce the amount of memory.
+en.ro.HelpCacheConfig12:\Sincrease the amount of memory.
+de.ro.HelpCacheConfig12:Klicken mit AUSWAHL vergrößert die Größe des Cachespeichers.
+fr.ro.HelpCacheConfig12:\Saugmenter la quantité de mémoire.
+it.ro.HelpCacheConfig12:\Saumenta la quantità di memoria.
+nl.ro.HelpCacheConfig12:\Sincrease the amount of memory.
+en.ro.HelpCacheConfig15:\Tmaximum number of days that content will be retained in the disc cache.
+de.ro.HelpCacheConfig15:\Tmaximum number of days that content will be retained in the disc cache.
+fr.ro.HelpCacheConfig15:\Tmaximum number of days that content will be retained in the disc cache.
+it.ro.HelpCacheConfig15:\Tmaximum number of days that content will be retained in the disc cache.
+nl.ro.HelpCacheConfig15:\Tmaximum number of days that content will be retained in the disc cache.
+en.ro.HelpCacheConfig16:\Sreduce the number of days.
+de.ro.HelpCacheConfig16:\Sreduce the number of days.
+fr.ro.HelpCacheConfig16:\Sreduce the number of days.
+it.ro.HelpCacheConfig16:\Sreduce the number of days.
+nl.ro.HelpCacheConfig16:\Sreduce the number of days.
+en.ro.HelpCacheConfig17:\Sincrease the number of days.
+de.ro.HelpCacheConfig17:\Sincrease the number of days.
+fr.ro.HelpCacheConfig17:\Sincrease the number of days.
+it.ro.HelpCacheConfig17:\Sincrease the number of days.
+nl.ro.HelpCacheConfig17:\Sincrease the number of days.
+en.ro.HelpCacheConfig19:\Sreset the Cache options back to their default values.
+de.ro.HelpCacheConfig19:Stellt die Standardeinstellungen wieder her.
+fr.ro.HelpCacheConfig19:\Srevenir aux valeurs par défaut des options du Cache.
+it.ro.HelpCacheConfig19:\Sreset the Cache options back to their default values.
+nl.ro.HelpCacheConfig19:\Sreset the Cache options back to their default values.
+en.ro.HelpCacheConfig20:\Sclose this \w without saving changes.|M\Areturn the cache options to the last saved configuration.
+de.ro.HelpCacheConfig20:Klicken mit AUSWAHL schließt das Fenster ohne die Änderungen zu speichern.|MKlicken mit SPEZIAL stellt die zuletzt abgespeicherten Einstellungen wieder her.
+fr.ro.HelpCacheConfig20:\Sfermer cette fenêtre sans sauver les changements.|M\Arevenir aux options de Cache précédemment sauvegardées.
+it.ro.HelpCacheConfig20:\Sclose this \w without saving changes.|M\Areturn the cache options to the last saved configuration.
+nl.ro.HelpCacheConfig20:\Sclose this \w without saving changes.|M\Areturn the cache options to the last saved configuration.
+en.ro.HelpCacheConfig21:\Ssave these settings and close the \w.|M\Asave these settings without closing the \w.
+de.ro.HelpCacheConfig21:Klicken mit AUSWAHL speichert die Einstellungen und schließt das Fenster.|MKlicken mit SPEZIAL speichert die Einstellungen ohne das Fenster zu schließen.
+fr.ro.HelpCacheConfig21:\Ssauver ces réglages et fermer la fenêtre.|M\Asauver ces réglages sans fermer la fenêtre.
+it.ro.HelpCacheConfig21:\Ssave these settings and close the \w.|M\Asave these settings without closing the \w.
+nl.ro.HelpCacheConfig21:\Ssave these settings and close the \w.|M\Asave these settings without closing the \w.
en.ro.HelpConnectConfig:\Tconnection configuration \w
de.ro.HelpConnectConfig:Das ist das Fenster zur Einstellung der Parameter für die Netzanbindung.
@@ -5671,11 +5729,11 @@ de.all.ScaleQuality:Skalieren hoher Qualität
fr.all.ScaleQuality:Higher quality scaling
it.all.ScaleQuality:Massima qualità di visualizzazione
nl.all.ScaleQuality:Higher quality scaling
-en.ami.DitherQuality:Dither quality (<= 8-bit modes only)
-de.ami.DitherQuality:Dither quality (<= 8-bit modes only)
-fr.ami.DitherQuality:Dither quality (<= 8-bit modes only)
-it.ami.DitherQuality:Qualità dither (<= solo modi a 8-bit)
-nl.ami.DitherQuality:Dither quality (<= 8-bit modes only)
+en.ami.DitherQuality:Dither quality
+de.ami.DitherQuality:Dither quality
+fr.ami.DitherQuality:Dither quality
+it.ami.DitherQuality:Qualità dither
+nl.ami.DitherQuality:Dither quality
en.ami.Low:Low
de.ami.Low:Low
fr.ami.Low:Low
diff --git a/riscos/401login.c b/riscos/401login.c
index 6740f54e5..76e28adee 100644
--- a/riscos/401login.c
+++ b/riscos/401login.c
@@ -22,20 +22,20 @@
#include <stdbool.h>
#include <string.h>
#include <oslib/wimp.h>
-#include "utils/config.h"
+
#include "content/content.h"
#include "content/hlcache.h"
#include "content/urldb.h"
#include "desktop/browser.h"
-#include "desktop/401login.h"
#include "desktop/gui.h"
-#include "riscos/dialog.h"
-#include "riscos/wimp_event.h"
#include "utils/log.h"
#include "utils/messages.h"
-#include "utils/url.h"
#include "utils/utils.h"
+#include "riscos/gui.h"
+#include "riscos/dialog.h"
+#include "riscos/wimp_event.h"
+
#define ICON_401LOGIN_LOGIN 0
#define ICON_401LOGIN_CANCEL 1
#define ICON_401LOGIN_HOST 2
diff --git a/riscos/Makefile.defaults b/riscos/Makefile.defaults
index f48024f5a..f719ee3de 100644
--- a/riscos/Makefile.defaults
+++ b/riscos/Makefile.defaults
@@ -2,30 +2,32 @@
# RISC OS-specific options
# ----------------------------------------------------------------------------
- # Enable NetSurf's use of libsvgtiny for displaying SVGs
- # Valid options: YES, NO
- NETSURF_USE_NSSVG := YES
+# Enable NetSurf's use of libsvgtiny for displaying SVGs
+# Valid options: YES, NO
+NETSURF_USE_NSSVG := YES
- # Enable NetSurf's support for displaying RISC OS Draw files
- # Valid options: YES, NO
- NETSURF_USE_DRAW := YES
+# Enable NetSurf's support for displaying RISC OS Draw files
+# Valid options: YES, NO
+NETSURF_USE_DRAW := YES
- # Enable NetSurf's support for displaying RISC OS Sprites
- # Valid options: YES, NO
- NETSURF_USE_SPRITE := YES
+# Enable NetSurf's support for displaying RISC OS Sprites
+# Valid options: YES, NO
+NETSURF_USE_SPRITE := YES
- # Enable NetSurf's use of AWRender for displaying ArtWorks files
- # Valid options: YES, NO
- NETSURF_USE_ARTWORKS := YES
+# Enable NetSurf's use of AWRender for displaying ArtWorks files
+# Valid options: YES, NO
+NETSURF_USE_ARTWORKS := YES
- # Enable NetSurf's support for the Acorn plugin protocol
- # Valid options: YES, NO
- NETSURF_USE_PLUGINS := NO
+# Enable NetSurf's support for the Acorn plugin protocol
+# Valid options: YES, NO
+NETSURF_USE_PLUGINS := NO
- # Enable NetSurf's use of pencil for Drawfile export
- # Valid options: YES, NO
- NETSURF_USE_DRAW_EXPORT := YES
+# Enable NetSurf's use of pencil for Drawfile export
+# Valid options: YES, NO
+NETSURF_USE_DRAW_EXPORT := YES
- # Optimisation levels
- CFLAGS += -O2
+# Enable building the source object cache filesystem based backing store.
+NETSURF_FS_BACKING_STORE := YES
+# Optimisation levels
+CFLAGS += -O2
diff --git a/riscos/Makefile.target b/riscos/Makefile.target
index 3d64e24f9..46ca34116 100644
--- a/riscos/Makefile.target
+++ b/riscos/Makefile.target
@@ -42,10 +42,10 @@ TPD_RISCOS = $(foreach TPL,$(notdir $(TPL_RISCOS)), \
RESOURCES = $(TPD_RISCOS) split-messages
-CFLAGS += $(WARNFLAGS) -Driscos -std=c99 -D_BSD_SOURCE -D_POSIX_C_SOURCE \
+CFLAGS += -Driscos -std=c99 -D_BSD_SOURCE -D_POSIX_C_SOURCE \
-mpoke-function-name -fno-strict-aliasing
-CFLAGS += -I$(GCCSDK_INSTALL_ENV)/include -I$(GCCSDK_INSTALL_ENV)/include/libmng
+CFLAGS += -I$(GCCSDK_INSTALL_ENV)/include
ifeq ($(HOST),riscos)
CFLAGS += -I<OSLib$$Dir> -mthrowback
endif
diff --git a/riscos/buffer.c b/riscos/buffer.c
index 56c245882..a8cb7fdf5 100644
--- a/riscos/buffer.c
+++ b/riscos/buffer.c
@@ -19,19 +19,22 @@
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
-#include "swis.h"
-#include "oslib/colourtrans.h"
-#include "oslib/os.h"
-#include "oslib/osspriteop.h"
-#include "oslib/wimp.h"
-#include "oslib/wimpreadsysinfo.h"
+#include <swis.h>
+#include <oslib/colourtrans.h>
+#include <oslib/os.h>
+#include <oslib/osspriteop.h>
+#include <oslib/wimp.h>
+#include <oslib/wimpreadsysinfo.h>
+
+#include "utils/nsoption.h"
+#include "utils/log.h"
+
#include "riscos/buffer.h"
#include "riscos/gui.h"
-#include "utils/nsoption.h"
#include "riscos/tinct.h"
#include "riscos/wimp.h"
#include "riscos/wimputils.h"
-#include "utils/log.h"
+
#define BUFFER_EXCLUSIVE_USER_REDRAW "Only support pure user redraw (faster)"
//#define BUFFER_EMULATE_32BPP "Redirect to a 32bpp sprite and plot with Tinct"
@@ -246,7 +249,7 @@ void ro_gui_buffer_open(wimp_draw *redraw)
*/
if ((error = xos_set_ecf_origin(-ro_plot_origin_x,
-ro_plot_origin_y)) != NULL) {
- LOG(("Invalid ECF origin"));
+ LOG(("Invalid ECF origin: '%s'", error->errmess));
}
}
diff --git a/riscos/configure.c b/riscos/configure.c
index 0f5ee322b..68aa3c0c6 100644
--- a/riscos/configure.c
+++ b/riscos/configure.c
@@ -25,18 +25,21 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
-#include "oslib/os.h"
-#include "oslib/osbyte.h"
-#include "oslib/territory.h"
-#include "oslib/wimp.h"
+#include <oslib/os.h>
+#include <oslib/osbyte.h>
+#include <oslib/territory.h>
+#include <oslib/wimp.h>
+
+#include "utils/log.h"
+#include "utils/utils.h"
+#include "utils/messages.h"
+
+#include "riscos/gui.h"
#include "riscos/dialog.h"
#include "riscos/configure.h"
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
#include "riscos/configure/configure.h"
-#include "utils/log.h"
-#include "utils/utils.h"
-#include "utils/messages.h"
#define CONFIGURE_ICON_PADDING_H 32
#define CONFIGURE_ICON_PADDING_V 32
@@ -177,9 +180,8 @@ void ro_gui_configure_open_window(wimp_open *open)
int screen_width, screen_height;
int height, width;
int icons_per_line, icon_lines;
- int max_icons_per_line, max_height;
+ int max_height;
os_box extent = { 0, 0, 0, 0 };
- int x, y, l;
struct configure_tool *tool;
if (!ro_gui_configure_translate()) {
@@ -195,6 +197,7 @@ void ro_gui_configure_open_window(wimp_open *open)
/* move our icons */
if (icons_per_line != configure_icons_per_line) {
+ int x, y, l;
configure_icons_per_line = icons_per_line;
x = CONFIGURE_ICON_PADDING_H / 2;
y = -configure_icon_height + (CONFIGURE_ICON_PADDING_V / 2);
@@ -238,6 +241,7 @@ void ro_gui_configure_open_window(wimp_open *open)
/* set the extent */
if ((configure_height != height) || (configure_width != width)) {
+ int max_icons_per_line;
ro_gui_screen_size(&screen_width, &screen_height);
max_icons_per_line = screen_width / configure_icon_width;
if (max_icons_per_line > configure_icons)
diff --git a/riscos/configure/con_cache.c b/riscos/configure/con_cache.c
index 6e402fe81..adaaa82b7 100644
--- a/riscos/configure/con_cache.c
+++ b/riscos/configure/con_cache.c
@@ -17,25 +17,33 @@
*/
#include <stdbool.h>
-#include "oslib/hourglass.h"
+#include <oslib/hourglass.h>
+
#include "utils/nsoption.h"
-#include "riscos/dialog.h"
+#include "utils/filename.h"
+#include "utils/messages.h"
+#include "utils/utils.h"
+
#include "riscos/gui.h"
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
#include "riscos/configure.h"
#include "riscos/configure/configure.h"
-#include "utils/filename.h"
-#include "utils/messages.h"
-#include "utils/utils.h"
+#include "riscos/dialog.h"
#define CACHE_MEMORY_SIZE 3
#define CACHE_MEMORY_DEC 4
#define CACHE_MEMORY_INC 5
-#define CACHE_DEFAULT_BUTTON 7
-#define CACHE_CANCEL_BUTTON 8
-#define CACHE_OK_BUTTON 9
+#define CACHE_DISC_SIZE 10
+#define CACHE_DISC_DEC 11
+#define CACHE_DISC_INC 12
+#define CACHE_DISC_EXPIRE 15
+#define CACHE_DISC_EXPIRE_DEC 16
+#define CACHE_DISC_EXPIRE_INC 17
+#define CACHE_DEFAULT_BUTTON 19
+#define CACHE_CANCEL_BUTTON 20
+#define CACHE_OK_BUTTON 21
static bool ro_gui_options_cache_click(wimp_pointer *pointer);
static bool ro_gui_options_cache_ok(wimp_w w);
@@ -45,10 +53,19 @@ bool ro_gui_options_cache_initialise(wimp_w w)
/* set the current values */
ro_gui_set_icon_decimal(w, CACHE_MEMORY_SIZE,
(nsoption_int(memory_cache_size) * 10) >> 20, 1);
+ ro_gui_set_icon_decimal(w, CACHE_DISC_SIZE,
+ (int) ((nsoption_uint(disc_cache_size)) >> 20), 0);
+ ro_gui_set_icon_decimal(w, CACHE_DISC_EXPIRE,
+ (nsoption_int(disc_cache_age)), 0);
/* initialise all functions for a newly created window */
ro_gui_wimp_event_register_numeric_field(w, CACHE_MEMORY_SIZE,
CACHE_MEMORY_INC, CACHE_MEMORY_DEC, 0, 640, 1, 1);
+ ro_gui_wimp_event_register_numeric_field(w, CACHE_DISC_SIZE,
+ CACHE_DISC_INC, CACHE_DISC_DEC, 0, 4095, 1, 0);
+ ro_gui_wimp_event_register_numeric_field(w, CACHE_DISC_EXPIRE,
+ CACHE_DISC_EXPIRE_INC, CACHE_DISC_EXPIRE_DEC, 1, 3650,
+ 1, 0);
ro_gui_wimp_event_register_mouse_click(w, ro_gui_options_cache_click);
ro_gui_wimp_event_register_cancel(w, CACHE_CANCEL_BUTTON);
ro_gui_wimp_event_register_ok(w, CACHE_OK_BUTTON,
@@ -65,7 +82,11 @@ bool ro_gui_options_cache_click(wimp_pointer *pointer)
case CACHE_DEFAULT_BUTTON:
/* set the default values */
ro_gui_set_icon_decimal(pointer->w, CACHE_MEMORY_SIZE,
- 20, 1);
+ 120, 1);
+ ro_gui_set_icon_decimal(pointer->w, CACHE_DISC_SIZE,
+ 1024, 0);
+ ro_gui_set_icon_decimal(pointer->w, CACHE_DISC_EXPIRE,
+ 28, 0);
return true;
}
return false;
@@ -76,6 +97,11 @@ bool ro_gui_options_cache_ok(wimp_w w)
nsoption_set_int(memory_cache_size,
(((ro_gui_get_icon_decimal(w,
CACHE_MEMORY_SIZE, 1) + 1) << 20) - 1) / 10);
+ nsoption_set_uint(disc_cache_size,
+ (uint) (ro_gui_get_icon_decimal(w,
+ CACHE_DISC_SIZE, 0) << 20));
+ nsoption_set_int(disc_cache_age,
+ ro_gui_get_icon_decimal(w, CACHE_DISC_EXPIRE, 0));
ro_gui_save_options();
return true;
diff --git a/riscos/configure/con_content.c b/riscos/configure/con_content.c
index d4f3e46bb..a1d27375f 100644
--- a/riscos/configure/con_content.c
+++ b/riscos/configure/con_content.c
@@ -17,16 +17,17 @@
*/
#include <stdbool.h>
+
#include "utils/nsoption.h"
-#include "riscos/dialog.h"
+#include "utils/messages.h"
+#include "utils/utils.h"
+
#include "riscos/gui.h"
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
#include "riscos/configure.h"
#include "riscos/configure/configure.h"
-#include "utils/messages.h"
-#include "utils/utils.h"
-
+#include "riscos/dialog.h"
#define CONTENT_BLOCK_ADVERTISEMENTS 2
#define CONTENT_BLOCK_POPUPS 3
diff --git a/riscos/configure/con_fonts.c b/riscos/configure/con_fonts.c
index 626115523..1fe427c24 100644
--- a/riscos/configure/con_fonts.c
+++ b/riscos/configure/con_fonts.c
@@ -17,18 +17,21 @@
*/
#include <stdbool.h>
-#include "css/css.h"
+
#include "utils/nsoption.h"
+#include "utils/messages.h"
+#include "utils/utils.h"
#include "desktop/plot_style.h"
-#include "riscos/dialog.h"
+#include "css/css.h"
+
#include "riscos/gui.h"
+#include "riscos/font.h"
#include "riscos/menus.h"
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
#include "riscos/configure.h"
#include "riscos/configure/configure.h"
-#include "utils/messages.h"
-#include "utils/utils.h"
+#include "riscos/dialog.h"
#define FONT_SANS_FIELD 3
diff --git a/riscos/configure/con_home.c b/riscos/configure/con_home.c
index 6f7d01043..4dec6ad61 100644
--- a/riscos/configure/con_home.c
+++ b/riscos/configure/con_home.c
@@ -17,8 +17,11 @@
*/
#include <stdbool.h>
+
+#include "utils/messages.h"
+#include "utils/utils.h"
#include "utils/nsoption.h"
-#include "riscos/dialog.h"
+
#include "riscos/gui.h"
#include "riscos/menus.h"
#include "riscos/url_suggest.h"
@@ -26,8 +29,7 @@
#include "riscos/wimp_event.h"
#include "riscos/configure.h"
#include "riscos/configure/configure.h"
-#include "utils/messages.h"
-#include "utils/utils.h"
+#include "riscos/dialog.h"
#define HOME_URL_FIELD 3
#define HOME_URL_GRIGHT 4
diff --git a/riscos/configure/con_image.c b/riscos/configure/con_image.c
index 4982423a3..ee4281856 100644
--- a/riscos/configure/con_image.c
+++ b/riscos/configure/con_image.c
@@ -17,18 +17,21 @@
*/
#include <stdbool.h>
-#include "swis.h"
-#include "oslib/osspriteop.h"
-#include "oslib/wimp.h"
+#include <swis.h>
+#include <oslib/osspriteop.h>
+#include <oslib/wimp.h>
+
#include "utils/nsoption.h"
+#include "utils/log.h"
+#include "utils/utils.h"
+
+#include "riscos/gui.h"
#include "riscos/configure/configure.h"
#include "riscos/dialog.h"
#include "riscos/menus.h"
#include "riscos/tinct.h"
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
-#include "utils/log.h"
-#include "utils/utils.h"
#define IMAGE_FOREGROUND_FIELD 3
@@ -62,11 +65,11 @@ unsigned int tinct_options[] = {tinct_USE_OS_SPRITE_OP, 0, tinct_DITHER,
bool ro_gui_options_image_initialise(wimp_w w)
{
- char pathname[256];
int i;
/* load the sprite file */
if (example_users == 0) {
+ char pathname[256];
snprintf(pathname, 256, "%s.Resources.Image", NETSURF_DIR);
pathname[255] = '\0';
example_images = ro_gui_load_sprite_file(pathname);
@@ -138,7 +141,6 @@ bool ro_gui_options_image_update(wimp_w w, wimp_i i, wimp_menu *m,
void ro_gui_options_image_redraw(wimp_draw *redraw)
{
osbool more;
- int origin_x, origin_y;
os_error *error;
wimp_icon_state icon_state;
osspriteop_header *bg = NULL, *fg = NULL;
@@ -168,6 +170,7 @@ void ro_gui_options_image_redraw(wimp_draw *redraw)
/* perform the redraw */
more = wimp_redraw_window(redraw);
while (more) {
+ int origin_x, origin_y;
origin_x = redraw->box.x0 - redraw->xscroll +
icon_state.icon.extent.x0 + 2;
origin_y = redraw->box.y1 - redraw->yscroll +
diff --git a/riscos/configure/con_inter.c b/riscos/configure/con_inter.c
index 2af5e3aa5..7ab912c54 100644
--- a/riscos/configure/con_inter.c
+++ b/riscos/configure/con_inter.c
@@ -17,14 +17,15 @@
*/
#include <stdbool.h>
-#include "riscos/dialog.h"
-#include "riscos/gui.h"
+
#include "utils/nsoption.h"
+
+#include "riscos/gui.h"
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
#include "riscos/configure.h"
#include "riscos/configure/configure.h"
-
+#include "riscos/dialog.h"
#define INTERFACE_STRIP_EXTNS_OPTION 2
#define INTERFACE_CONFIRM_OVWR_OPTION 3
diff --git a/riscos/configure/con_language.c b/riscos/configure/con_language.c
index 7e483b5af..ace7a6fdf 100644
--- a/riscos/configure/con_language.c
+++ b/riscos/configure/con_language.c
@@ -18,17 +18,19 @@
*/
#include <stdbool.h>
+
#include "utils/nsoption.h"
-#include "riscos/dialog.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/utils.h"
+
#include "riscos/gui.h"
#include "riscos/menus.h"
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
#include "riscos/configure.h"
#include "riscos/configure/configure.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/utils.h"
+#include "riscos/dialog.h"
#define LANGUAGE_INTERFACE_FIELD 3
diff --git a/riscos/configure/con_secure.c b/riscos/configure/con_secure.c
index 75e2bc705..2e3c31484 100644
--- a/riscos/configure/con_secure.c
+++ b/riscos/configure/con_secure.c
@@ -17,16 +17,17 @@
*/
#include <stdbool.h>
+
#include "utils/nsoption.h"
-#include "riscos/dialog.h"
+#include "utils/messages.h"
+#include "utils/utils.h"
+
#include "riscos/gui.h"
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
#include "riscos/configure.h"
#include "riscos/configure/configure.h"
-#include "utils/messages.h"
-#include "utils/utils.h"
-
+#include "riscos/dialog.h"
#define SECURITY_REFERRER 2
#define SECURITY_DURATION_FIELD 6
diff --git a/riscos/configure/con_theme.c b/riscos/configure/con_theme.c
index c4d605c88..13ba3165c 100644
--- a/riscos/configure/con_theme.c
+++ b/riscos/configure/con_theme.c
@@ -172,10 +172,9 @@ bool ro_gui_options_theme_initialise(wimp_w w)
void ro_gui_options_theme_finalise(wimp_w w)
{
- os_error *error;
-
ro_gui_options_theme_free();
if (theme_pane) {
+ os_error *error;
ro_gui_wimp_event_finalise(theme_pane);
error = xwimp_delete_window(theme_pane);
if (error) {
@@ -249,7 +248,6 @@ void ro_gui_options_theme_load(void)
wimp_icon_create new_icon;
wimp_window_state state;
int parent_width, nested_y, min_extent, base_extent;
- int item_height;
int *radio_icons, *radio_set;
int theme_count;
@@ -315,7 +313,7 @@ void ro_gui_options_theme_load(void)
(wimp_COLOUR_VERY_LIGHT_GREY << wimp_ICON_BG_COLOUR_SHIFT);
while (link) {
/* update the toolbar */
- item_height = 44 + 44 + 16;
+ int item_height = 44 + 44 + 16;
if (link->next) item_height += 16;
ro_toolbar_process(link->toolbar, parent_width, false);
extent.y0 = nested_y -
diff --git a/riscos/content-handlers/artworks.h b/riscos/content-handlers/artworks.h
index 20f6168b7..67832cc54 100644
--- a/riscos/content-handlers/artworks.h
+++ b/riscos/content-handlers/artworks.h
@@ -32,7 +32,10 @@ nserror artworks_init(void);
#else
-#define artworks_init() NSERROR_OK
+static inline nserror artworks_init(void)
+{
+ return NSERROR_OK;
+}
#endif
diff --git a/riscos/content-handlers/draw.h b/riscos/content-handlers/draw.h
index 76fcbc8dc..9f5baf6dc 100644
--- a/riscos/content-handlers/draw.h
+++ b/riscos/content-handlers/draw.h
@@ -32,7 +32,10 @@ nserror draw_init(void);
#else
-#define draw_init() NSERROR_OK
+static inline nserror draw_init(void)
+{
+ return NSERROR_OK;
+}
#endif /* WITH_DRAW */
diff --git a/riscos/content-handlers/sprite.h b/riscos/content-handlers/sprite.h
index 2219e0679..ab6d312a5 100644
--- a/riscos/content-handlers/sprite.h
+++ b/riscos/content-handlers/sprite.h
@@ -32,7 +32,10 @@ nserror sprite_init(void);
#else
-#define sprite_init() NSERROR_OK
+static inline nserror sprite_init(void)
+{
+ return NSERROR_OK;
+}
#endif
diff --git a/riscos/cookies.c b/riscos/cookies.c
index 0a1529737..b5e97f778 100644
--- a/riscos/cookies.c
+++ b/riscos/cookies.c
@@ -43,7 +43,6 @@
#include "riscos/wimp_event.h"
#include "utils/messages.h"
#include "utils/log.h"
-#include "utils/url.h"
#include "utils/utils.h"
static void ro_gui_cookies_toolbar_update_buttons(void);
diff --git a/riscos/dialog.c b/riscos/dialog.c
index 147dce9f8..fd854b857 100644
--- a/riscos/dialog.c
+++ b/riscos/dialog.c
@@ -5,6 +5,7 @@
* Copyright 2005 Richard Wilson <info@tinct.net>
* Copyright 2004 Andrew Timmins <atimmins@blueyonder.co.uk>
* Copyright 2005 Adrian Lees <adrianl@users.sourceforge.net>
+ * Copyright 2014 Stephen Fryatt <stevef@netsurf-browser.org>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -21,19 +22,28 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include "utils/config.h"
+
#include <assert.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
-#include "oslib/colourtrans.h"
-#include "oslib/osfile.h"
-#include "oslib/osgbpb.h"
-#include "oslib/osspriteop.h"
-#include "oslib/wimp.h"
-#include "rufl.h"
-#include "utils/config.h"
+#include <oslib/colourtrans.h>
+#include <oslib/osfile.h>
+#include <oslib/osgbpb.h>
+#include <oslib/osspriteop.h>
+#include <oslib/wimp.h>
+
+#include "utils/nsoption.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/nsurl.h"
+#include "utils/url.h"
+#include "utils/utils.h"
#include "desktop/netsurf.h"
+#include "desktop/browser.h"
#include "render/font.h"
+
#include "riscos/configure.h"
#include "riscos/cookies.h"
#include "riscos/dialog.h"
@@ -41,7 +51,6 @@
#include "riscos/gui.h"
#include "riscos/hotlist.h"
#include "riscos/menus.h"
-#include "utils/nsoption.h"
#include "riscos/save.h"
#include "riscos/sslcert.h"
#include "riscos/toolbar.h"
@@ -50,10 +59,6 @@
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
#include "riscos/wimputils.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/url.h"
-#include "utils/utils.h"
#define ICON_ZOOM_VALUE 1
#define ICON_ZOOM_DEC 2
@@ -85,6 +90,7 @@ static struct {
} persistent_dialog[MAX_PERSISTENT];
+static bool ro_gui_dialog_open_url_init(void);
static bool ro_gui_dialog_openurl_apply(wimp_w w);
static bool ro_gui_dialog_open_url_menu_prepare(wimp_w w, wimp_i i,
wimp_menu *menu, wimp_pointer *pointer);
@@ -161,15 +167,7 @@ void ro_gui_dialog_init(void)
ro_gui_wimp_event_set_help_prefix(dialog_url_complete, "HelpAutoURL");
/* open URL */
- dialog_openurl = ro_gui_dialog_create("open_url");
- ro_gui_wimp_event_register_menu_gright(dialog_openurl, ICON_OPENURL_URL,
- ICON_OPENURL_MENU, ro_gui_url_suggest_menu);
- ro_gui_wimp_event_register_cancel(dialog_openurl, ICON_OPENURL_CANCEL);
- ro_gui_wimp_event_register_ok(dialog_openurl, ICON_OPENURL_OPEN,
- ro_gui_dialog_openurl_apply);
- ro_gui_wimp_event_register_menu_prepare(dialog_openurl,
- ro_gui_dialog_open_url_menu_prepare);
- ro_gui_wimp_event_set_help_prefix(dialog_openurl, "HelpOpenURL");
+ ro_gui_dialog_open_url_init();
/* scale view */
dialog_zoom = ro_gui_dialog_create("zoom");
@@ -413,8 +411,6 @@ bool ro_gui_dialog_open_top(wimp_w w, struct toolbar *toolbar,
os_error *error;
int screen_width, screen_height;
wimp_window_state state;
- int dimension;
- int scroll_width;
bool open;
state.w = w;
@@ -428,6 +424,8 @@ bool ro_gui_dialog_open_top(wimp_w w, struct toolbar *toolbar,
* open in the centre of the screen. */
open = state.flags & wimp_WINDOW_OPEN;
if (!open) {
+ int dimension;
+ int scroll_width;
/* cancel any editing */
if (ro_toolbar_get_editing(toolbar))
ro_toolbar_toggle_edit(toolbar);
@@ -702,6 +700,70 @@ void ro_gui_dialog_update_zoom(struct gui_window *g) {
}
+/**
+ * Create the Open URL dialogue, allocating storage for the URL field icon
+ * as we go.
+ *
+ * \return true on success; false on failure (although errors with
+ * the templates or memory allocation will exit via die()).
+ */
+
+static bool ro_gui_dialog_open_url_init(void)
+{
+ wimp_window *definition;
+ char *buffer;
+ os_error *error;
+
+ definition = ro_gui_dialog_load_template("open_url");
+
+ /* _load_template() should die on any error, so we trust its data. */
+
+ assert(definition != NULL);
+
+ /* Create the dialogue, with modifications. */
+
+ if ((definition->icons[ICON_OPENURL_URL].flags & wimp_ICON_INDIRECTED)
+ == 0) {
+ LOG(("open_url URL icon not indirected"));
+ xwimp_close_template();
+ die("Template");
+ }
+
+ buffer = malloc(RO_GUI_MAX_URL_SIZE);
+ if (buffer == NULL) {
+ xwimp_close_template();
+ die("NoMemory");
+ }
+
+ definition->icons[ICON_OPENURL_URL].data.indirected_text.text = buffer;
+ definition->icons[ICON_OPENURL_URL].data.indirected_text.size =
+ RO_GUI_MAX_URL_SIZE;
+ definition->sprite_area = gui_sprites;
+
+ error = xwimp_create_window(definition, &dialog_openurl);
+ if (error != NULL) {
+ LOG(("xwimp_create_window: 0x%x: %s",
+ error->errnum, error->errmess));
+ xwimp_close_template();
+ die(error->errmess);
+ }
+
+ free(definition);
+
+ ro_gui_wimp_event_register_menu_gright(dialog_openurl, ICON_OPENURL_URL,
+ ICON_OPENURL_MENU, ro_gui_url_suggest_menu);
+ ro_gui_wimp_event_register_cancel(dialog_openurl, ICON_OPENURL_CANCEL);
+ ro_gui_wimp_event_register_ok(dialog_openurl, ICON_OPENURL_OPEN,
+ ro_gui_dialog_openurl_apply);
+ ro_gui_wimp_event_register_menu_prepare(dialog_openurl,
+ ro_gui_dialog_open_url_menu_prepare);
+ ro_gui_wimp_event_set_help_prefix(dialog_openurl, "HelpOpenURL");
+
+ return true;
+}
+
+
+
bool ro_gui_dialog_openurl_apply(wimp_w w) {
const char *urltxt;
char *url2;
@@ -717,8 +779,7 @@ bool ro_gui_dialog_openurl_apply(wimp_w w) {
error = nsurl_create(url2, &url);
free(url2);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
diff --git a/riscos/dialog.h b/riscos/dialog.h
index 5758ad366..463048436 100644
--- a/riscos/dialog.h
+++ b/riscos/dialog.h
@@ -19,11 +19,8 @@
#ifndef _NETSURF_RISCOS_DIALOG_H_
#define _NETSURF_RISCOS_DIALOG_H_
-#include <stdbool.h>
-#include <stdlib.h>
-#include "oslib/wimp.h"
-#include "riscos/toolbar.h"
-#include "riscos/gui.h"
+struct toolbar;
+struct gui_window;
void ro_gui_dialog_init(void);
wimp_w ro_gui_dialog_create(const char *template_name);
diff --git a/riscos/distribution/!Boot/Resources/!Cache/!Boot,feb b/riscos/distribution/!Boot/Resources/!Cache/!Boot,feb
new file mode 100644
index 000000000..f126ba27a
--- /dev/null
+++ b/riscos/distribution/!Boot/Resources/!Cache/!Boot,feb
@@ -0,0 +1,3 @@
+Set Cache$FromBoot True
+If "<Cache$Dir>" = "" Then Run <Obey$Dir>.!Run
+Unset Cache$FromBoot \ No newline at end of file
diff --git a/riscos/distribution/!Boot/Resources/!Cache/!Help,feb b/riscos/distribution/!Boot/Resources/!Cache/!Help,feb
new file mode 100644
index 000000000..35eeeb31b
--- /dev/null
+++ b/riscos/distribution/!Boot/Resources/!Cache/!Help,feb
@@ -0,0 +1,2 @@
+If "<CacheAppRes$Path>" = "" Then Run <Cache$AppDir>.Resources.ResFind CacheApp
+Filer_Run CacheAppRes:Help \ No newline at end of file
diff --git a/riscos/distribution/!Boot/Resources/!Cache/!Run,feb b/riscos/distribution/!Boot/Resources/!Cache/!Run,feb
new file mode 100644
index 000000000..a920e39ab
--- /dev/null
+++ b/riscos/distribution/!Boot/Resources/!Cache/!Run,feb
@@ -0,0 +1,10 @@
+Set Cache$AppDir <Obey$Dir>
+IconSprites <Cache$AppDir>.!Sprites
+
+Run <Cache$AppDir>.Resources.ResFind CacheApp
+Set Cache$Meta CacheAppRes:!Meta
+
+RMEnsure SysLog 0.17 IfThere <SysLog$Dir>.!Run Then Run <SysLog$Dir>.!Run
+RMEnsure SysLog 0.17 Set Cache$SysLogMissing "True"
+
+Run <Cache$AppDir>.!RunImage \ No newline at end of file
diff --git a/riscos/distribution/!Boot/Resources/!Cache/!RunImage,ffb b/riscos/distribution/!Boot/Resources/!Cache/!RunImage,ffb
new file mode 100644
index 000000000..61752af99
--- /dev/null
+++ b/riscos/distribution/!Boot/Resources/!Cache/!RunImage,ffb
Binary files differ
diff --git a/riscos/distribution/!Boot/Resources/!Cache/!Sprites,ff9 b/riscos/distribution/!Boot/Resources/!Cache/!Sprites,ff9
new file mode 100644
index 000000000..b71a51cf3
--- /dev/null
+++ b/riscos/distribution/!Boot/Resources/!Cache/!Sprites,ff9
Binary files differ
diff --git a/riscos/distribution/!Boot/Resources/!Cache/!Sprites22,ff9 b/riscos/distribution/!Boot/Resources/!Cache/!Sprites22,ff9
new file mode 100644
index 000000000..e43f88c89
--- /dev/null
+++ b/riscos/distribution/!Boot/Resources/!Cache/!Sprites22,ff9
Binary files differ
diff --git a/riscos/distribution/!Boot/Resources/!Cache/Caches/Blank b/riscos/distribution/!Boot/Resources/!Cache/Caches/Blank
new file mode 100644
index 000000000..898dc5872
--- /dev/null
+++ b/riscos/distribution/!Boot/Resources/!Cache/Caches/Blank
@@ -0,0 +1 @@
+This is here just to stop the directory structure getting lost when unzipping. \ No newline at end of file
diff --git a/riscos/distribution/!Boot/Resources/!Cache/Resources/MultiError,ffb b/riscos/distribution/!Boot/Resources/!Cache/Resources/MultiError,ffb
new file mode 100644
index 000000000..ec348b0e9
--- /dev/null
+++ b/riscos/distribution/!Boot/Resources/!Cache/Resources/MultiError,ffb
Binary files differ
diff --git a/riscos/distribution/!Boot/Resources/!Cache/Resources/ResFind,ffb b/riscos/distribution/!Boot/Resources/!Cache/Resources/ResFind,ffb
new file mode 100644
index 000000000..7766cc928
--- /dev/null
+++ b/riscos/distribution/!Boot/Resources/!Cache/Resources/ResFind,ffb
Binary files differ
diff --git a/riscos/distribution/!Boot/Resources/!Cache/Resources/UK/!Meta b/riscos/distribution/!Boot/Resources/!Cache/Resources/UK/!Meta
new file mode 100644
index 000000000..2de40bd7c
--- /dev/null
+++ b/riscos/distribution/!Boot/Resources/!Cache/Resources/UK/!Meta
@@ -0,0 +1,9 @@
+# Meta file for Cache
+Help:<CacheAppRes$Dir>.Help
+Version:1.13
+Web:http://www.snowstone.org.uk/riscos/
+Title:Cache
+Publisher:Adam Richardson
+Description:Cache provides a central location for semi-permanent data on your system.
+Email:riscos@snowstone.org.uk
+
diff --git a/riscos/distribution/!Boot/Resources/!Cache/Resources/UK/Help b/riscos/distribution/!Boot/Resources/!Cache/Resources/UK/Help
new file mode 100644
index 000000000..aad9bf0b1
--- /dev/null
+++ b/riscos/distribution/!Boot/Resources/!Cache/Resources/UK/Help
@@ -0,0 +1,60 @@
+Cache
+-----
+
+Cache provides a shared location for cached data. This location can be
+used by application authors to store semi-permanent data. Cache can be
+placed anywhere on your computer where it will be "seen" by the Filer
+during start up. (For instance, the "Resources" directory inside !Boot.)
+
+Once "seen" it will set up a cache location, which can be shown by
+double-clicking on !Cache.
+
+
+Application Authors
+----------- -------
+
+Use Cache in a similar way to using Scrap. You *must not* assume that
+Cache is present on the user's system however, as Cache is not an
+official part of the system (like Scrap).
+
+To use Cache you should:
+ * Check for the presence of "<Cache$Dir>" before proceeding
+ * Read from and write data to "<Cache$Dir>.APPNAME" where APPNAME has
+ been allocated to you by the allocations service. See:
+ http://www.riscosopen.com/content/allocate
+ * If the APPNAME directory does not exist, you should create it.
+
+This version of Cache is published by Adam Richardson who can be
+contacted at riscos@snowstone.org.uk.
+
+The website for Cache is: http://www.snowstone.org.uk/riscos/
+
+
+Credits
+-------
+
+Cache is (c) Adam Richardson, 2007.
+Thanks to Rob Kendrick for the initial idea and input.
+
+
+License
+-------
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/riscos/distribution/!Boot/Resources/!Cache/Resources/UK/Messages b/riscos/distribution/!Boot/Resources/!Cache/Resources/UK/Messages
new file mode 100644
index 000000000..366122292
--- /dev/null
+++ b/riscos/distribution/!Boot/Resources/!Cache/Resources/UK/Messages
@@ -0,0 +1,8 @@
+# Messages for Cache
+
+multiuser:Multi-user system present.
+singleuser:No multi-user system present.
+location:Cache directory set to:
+opendir:Opening cache location...
+fatalerror:Cache has suffered a fatal error and has quit.
+
diff --git a/riscos/distribution/!Boot/Resources/!Cache/Resources/UK/Templates,fec b/riscos/distribution/!Boot/Resources/!Cache/Resources/UK/Templates,fec
new file mode 100644
index 000000000..22f910ad9
--- /dev/null
+++ b/riscos/distribution/!Boot/Resources/!Cache/Resources/UK/Templates,fec
Binary files differ
diff --git a/riscos/download.c b/riscos/download.c
index ebd981dca..a03ff474b 100644
--- a/riscos/download.c
+++ b/riscos/download.c
@@ -33,6 +33,8 @@
#include <sys/time.h>
#include <time.h>
#include <curl/curl.h>
+#include <libwapcaplet/libwapcaplet.h>
+
#include "oslib/mimemap.h"
#include "oslib/osargs.h"
#include "oslib/osfile.h"
@@ -41,21 +43,27 @@
#include "oslib/osgbpb.h"
#include "oslib/wimp.h"
#include "oslib/wimpspriteop.h"
+
#include "desktop/gui.h"
#include "desktop/netsurf.h"
-#include "riscos/dialog.h"
+#include "desktop/download.h"
#include "utils/nsoption.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/nsurl.h"
+#include "utils/utf8.h"
+#include "utils/utils.h"
+#include "utils/corestrings.h"
+
+#include "riscos/gui.h"
+#include "riscos/dialog.h"
#include "riscos/mouse.h"
#include "riscos/save.h"
#include "riscos/query.h"
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/schedule.h"
-#include "utils/url.h"
-#include "utils/utf8.h"
-#include "utils/utils.h"
+#include "riscos/ucstables.h"
+#include "riscos/filetype.h"
#define ICON_DOWNLOAD_ICON 0
#define ICON_DOWNLOAD_URL 1
@@ -206,6 +214,60 @@ const char *ro_gui_download_temp_name(struct gui_download_window *dw)
return temp_name;
}
+/**
+ * Try and find the correct RISC OS filetype from a download context.
+ */
+static nserror download_ro_filetype(download_context *ctx, bits *ftype_out)
+{
+ nsurl *url = download_context_get_url(ctx);
+ bits ftype = 0;
+ lwc_string *scheme;
+
+ /* If the file is local try and read its filetype */
+ scheme = nsurl_get_component(url, NSURL_SCHEME);
+ if (scheme != NULL) {
+ bool filescheme;
+ if (lwc_string_isequal(scheme,
+ corestring_lwc_file,
+ &filescheme) != lwc_error_ok) {
+ filescheme = false;
+ }
+
+ if (filescheme) {
+ lwc_string *path = nsurl_get_component(url, NSURL_PATH);
+ if (path != NULL && lwc_string_length(path) != 0) {
+ char *raw_path;
+ raw_path = curl_unescape(lwc_string_data(path),
+ lwc_string_length(path));
+ if (raw_path != NULL) {
+ ftype = ro_filetype_from_unix_path(raw_path);
+ curl_free(raw_path);
+ }
+ }
+ }
+ }
+
+ /* If we still don't have a filetype (i.e. failed reading local
+ * one or fetching a remote object), then use the MIME type.
+ */
+ if (ftype == 0) {
+ /* convert MIME type to RISC OS file type */
+ os_error *error;
+ const char *mime_type;
+
+ mime_type = download_context_get_mime_type(ctx);
+ error = xmimemaptranslate_mime_type_to_filetype(mime_type, &ftype);
+ if (error) {
+ LOG(("xmimemaptranslate_mime_type_to_filetype: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("MiscError", error->errmess);
+ ftype = 0xffd;
+ }
+ }
+
+ *ftype_out = ftype;
+ return NSERROR_OK;
+}
/**
* Create and open a download progress window.
@@ -215,20 +277,17 @@ const char *ro_gui_download_temp_name(struct gui_download_window *dw)
* reported
*/
-struct gui_download_window *gui_download_window_create(download_context *ctx,
- struct gui_window *gui)
+static struct gui_download_window *
+gui_download_window_create(download_context *ctx, struct gui_window *gui)
{
- const char *url = download_context_get_url(ctx);
- const char *mime_type = download_context_get_mime_type(ctx);
+ nsurl *url = download_context_get_url(ctx);
const char *temp_name;
- char *scheme = NULL;
char *filename = NULL;
struct gui_download_window *dw;
bool space_warning = false;
os_error *error;
- url_func_result res;
char *local_path;
- utf8_convert_ret err;
+ nserror err;
size_t i, last_dot;
dw = malloc(sizeof *dw);
@@ -244,8 +303,13 @@ struct gui_download_window *gui_download_window_create(download_context *ctx,
dw->query = QUERY_INVALID;
dw->received = 0;
dw->total_size = download_context_get_total_length(ctx);
- strncpy(dw->url, url, sizeof dw->url);
+
+ /** @todo change this to take a reference to the nsurl and use
+ * that value directly rather than using a fixed buffer.
+ */
+ strncpy(dw->url, nsurl_access(url), sizeof dw->url);
dw->url[sizeof dw->url - 1] = 0;
+
dw->status[0] = 0;
gettimeofday(&dw->start_time, 0);
dw->last_time = dw->start_time;
@@ -254,55 +318,12 @@ struct gui_download_window *gui_download_window_create(download_context *ctx,
dw->average_rate = 0;
dw->average_points = 0;
- /* Get scheme from URL */
- res = url_scheme(url, &scheme);
- if (res == URL_FUNC_NOMEM) {
- warn_user("NoMemory", 0);
+ /* get filetype */
+ err = download_ro_filetype(ctx, &dw->file_type);
+ if (err != NSERROR_OK) {
+ warn_user(messages_get_errorcode(err), 0);
free(dw);
return 0;
- } else if (res == URL_FUNC_OK) {
- /* If we have a scheme and it's "file", then
- * attempt to use the local filetype directly */
- if (strcasecmp(scheme, "file") == 0) {
- char *path = NULL;
- res = url_path(url, &path);
- if (res == URL_FUNC_NOMEM) {
- warn_user("NoMemory", 0);
- free(scheme);
- free(dw);
- return 0;
- } else if (res == URL_FUNC_OK) {
- char *raw_path = curl_unescape(path,
- strlen(path));
- if (raw_path == NULL) {
- warn_user("NoMemory", 0);
- free(path);
- free(scheme);
- free(dw);
- return 0;
- }
- dw->file_type =
- ro_filetype_from_unix_path(raw_path);
- curl_free(raw_path);
- free(path);
- }
- }
-
- free(scheme);
- }
-
- /* If we still don't have a filetype (i.e. failed reading local
- * one or fetching a remote object), then use the MIME type */
- if (dw->file_type == 0) {
- /* convert MIME type to RISC OS file type */
- error = xmimemaptranslate_mime_type_to_filetype(mime_type,
- &(dw->file_type));
- if (error) {
- LOG(("xmimemaptranslate_mime_type_to_filetype: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("MiscError", error->errmess);
- dw->file_type = 0xffd;
- }
}
/* open temporary output file */
@@ -375,10 +396,12 @@ struct gui_download_window *gui_download_window_create(download_context *ctx,
snprintf(dw->path, RO_DOWNLOAD_MAX_PATH_LEN, "%s",
filename);
+ free(filename);
+
err = utf8_to_local_encoding(dw->path, 0, &local_path);
- if (err != UTF8_CONVERT_OK) {
+ if (err != NSERROR_OK) {
/* badenc should never happen */
- assert(err != UTF8_CONVERT_BADENC);
+ assert(err !=NSERROR_BAD_ENCODING);
LOG(("utf8_to_local_encoding failed"));
warn_user("NoMemory", 0);
free(dw);
@@ -435,6 +458,57 @@ struct gui_download_window *gui_download_window_create(download_context *ctx,
return dw;
}
+/**
+ * Handle failed downloads.
+ *
+ * \param dw download window
+ * \param error_msg error message
+ */
+
+static void gui_download_window_error(struct gui_download_window *dw,
+ const char *error_msg)
+{
+ os_error *error;
+
+ if (dw->ctx != NULL)
+ download_context_destroy(dw->ctx);
+ dw->ctx = NULL;
+ dw->error = true;
+
+ riscos_schedule(-1, ro_gui_download_update_status_wrapper, dw);
+
+ /* place error message in status icon in red */
+ strncpy(dw->status, error_msg, sizeof dw->status);
+ error = xwimp_set_icon_state(dw->window,
+ ICON_DOWNLOAD_STATUS,
+ wimp_COLOUR_RED << wimp_ICON_FG_COLOUR_SHIFT,
+ wimp_ICON_FG_COLOUR);
+ if (error) {
+ LOG(("xwimp_set_icon_state: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
+ }
+
+ /* grey out pathname icon */
+ error = xwimp_set_icon_state(dw->window, ICON_DOWNLOAD_PATH,
+ wimp_ICON_SHADED, 0);
+ if (error) {
+ LOG(("xwimp_set_icon_state: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
+ }
+
+ /* grey out file icon */
+ error = xwimp_set_icon_state(dw->window, ICON_DOWNLOAD_ICON,
+ wimp_ICON_SHADED, wimp_ICON_SHADED);
+ if (error) {
+ LOG(("xwimp_set_icon_state: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
+ }
+
+ ro_gui_download_window_hide_caret(dw);
+}
/**
* Handle received download data.
@@ -445,7 +519,7 @@ struct gui_download_window *gui_download_window_create(download_context *ctx,
* \return NSERROR_OK on success, appropriate error otherwise
*/
-nserror gui_download_window_data(struct gui_download_window *dw,
+static nserror gui_download_window_data(struct gui_download_window *dw,
const char *data, unsigned int size)
{
while (true) {
@@ -526,7 +600,6 @@ nserror gui_download_window_data(struct gui_download_window *dw,
void ro_gui_download_update_status(struct gui_download_window *dw)
{
- char *received;
char *total_size;
char *speed;
char time[20] = "?";
@@ -537,7 +610,7 @@ void ro_gui_download_update_status(struct gui_download_window *dw)
os_error *error;
int width;
char *local_status;
- utf8_convert_ret err;
+ nserror err;
gettimeofday(&t, 0);
dt = (t.tv_sec + 0.000001 * t.tv_usec) - (dw->last_time.tv_sec +
@@ -548,6 +621,7 @@ void ro_gui_download_update_status(struct gui_download_window *dw)
total_size = human_friendly_bytesize(max(dw->received, dw->total_size));
if (dw->ctx) {
+ char *received;
rate = (dw->received - dw->last_received) / dt;
received = human_friendly_bytesize(dw->received);
/* A simple 'modified moving average' download rate calculation
@@ -571,9 +645,9 @@ void ro_gui_download_update_status(struct gui_download_window *dw)
/* convert to local encoding */
err = utf8_to_local_encoding(
messages_get("Download"), 0, &local_status);
- if (err != UTF8_CONVERT_OK) {
+ if (err != NSERROR_OK) {
/* badenc should never happen */
- assert(err != UTF8_CONVERT_BADENC);
+ assert(err != NSERROR_BAD_ENCODING);
/* hide nomem error */
snprintf(dw->status, sizeof dw->status,
messages_get("Download"),
@@ -594,9 +668,9 @@ void ro_gui_download_update_status(struct gui_download_window *dw)
err = utf8_to_local_encoding(
messages_get("DownloadU"), 0, &local_status);
- if (err != UTF8_CONVERT_OK) {
+ if (err != NSERROR_OK) {
/* badenc should never happen */
- assert(err != UTF8_CONVERT_BADENC);
+ assert(err != NSERROR_BAD_ENCODING);
/* hide nomem error */
snprintf(dw->status, sizeof dw->status,
messages_get("DownloadU"),
@@ -622,9 +696,9 @@ void ro_gui_download_update_status(struct gui_download_window *dw)
err = utf8_to_local_encoding(messages_get("Downloaded"), 0,
&local_status);
- if (err != UTF8_CONVERT_OK) {
+ if (err != NSERROR_OK) {
/* badenc should never happen */
- assert(err != UTF8_CONVERT_BADENC);
+ assert(err != NSERROR_BAD_ENCODING);
/* hide nomem error */
snprintf(dw->status, sizeof dw->status,
messages_get("Downloaded"),
@@ -661,15 +735,16 @@ void ro_gui_download_update_status(struct gui_download_window *dw)
warn_user("WimpError", error->errmess);
}
- if (dw->ctx)
- schedule(100, ro_gui_download_update_status_wrapper, dw);
- else
- schedule_remove(ro_gui_download_update_status_wrapper, dw);
+ if (dw->ctx) {
+ riscos_schedule(1000, ro_gui_download_update_status_wrapper, dw);
+ } else {
+ riscos_schedule(-1, ro_gui_download_update_status_wrapper, dw);
+ }
}
/**
- * Wrapper for ro_gui_download_update_status(), suitable for schedule().
+ * Wrapper for ro_gui_download_update_status(), suitable for riscos_schedule().
*/
void ro_gui_download_update_status_wrapper(void *p)
@@ -707,57 +782,6 @@ void ro_gui_download_window_hide_caret(struct gui_download_window *dw)
}
-/**
- * Handle failed downloads.
- *
- * \param dw download window
- * \param error_msg error message
- */
-
-void gui_download_window_error(struct gui_download_window *dw,
- const char *error_msg)
-{
- os_error *error;
-
- if (dw->ctx != NULL)
- download_context_destroy(dw->ctx);
- dw->ctx = NULL;
- dw->error = true;
-
- schedule_remove(ro_gui_download_update_status_wrapper, dw);
-
- /* place error message in status icon in red */
- strncpy(dw->status, error_msg, sizeof dw->status);
- error = xwimp_set_icon_state(dw->window,
- ICON_DOWNLOAD_STATUS,
- wimp_COLOUR_RED << wimp_ICON_FG_COLOUR_SHIFT,
- wimp_ICON_FG_COLOUR);
- if (error) {
- LOG(("xwimp_set_icon_state: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("WimpError", error->errmess);
- }
-
- /* grey out pathname icon */
- error = xwimp_set_icon_state(dw->window, ICON_DOWNLOAD_PATH,
- wimp_ICON_SHADED, 0);
- if (error) {
- LOG(("xwimp_set_icon_state: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("WimpError", error->errmess);
- }
-
- /* grey out file icon */
- error = xwimp_set_icon_state(dw->window, ICON_DOWNLOAD_ICON,
- wimp_ICON_SHADED, wimp_ICON_SHADED);
- if (error) {
- LOG(("xwimp_set_icon_state: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("WimpError", error->errmess);
- }
-
- ro_gui_download_window_hide_caret(dw);
-}
/**
@@ -766,7 +790,7 @@ void gui_download_window_error(struct gui_download_window *dw,
* \param dw download window
*/
-void gui_download_window_done(struct gui_download_window *dw)
+static void gui_download_window_done(struct gui_download_window *dw)
{
os_error *error;
@@ -792,10 +816,11 @@ void gui_download_window_done(struct gui_download_window *dw)
warn_user("SaveError", error->errmess);
}
- if (dw->send_dataload)
+ if (dw->send_dataload) {
ro_gui_download_send_dataload(dw);
+ }
- schedule(200, ro_gui_download_window_destroy_wrapper, dw);
+ riscos_schedule(2000, ro_gui_download_window_destroy_wrapper, dw);
}
}
@@ -810,9 +835,6 @@ void gui_download_window_done(struct gui_download_window *dw)
bool ro_gui_download_click(wimp_pointer *pointer)
{
struct gui_download_window *dw;
- char command[256] = "Filer_OpenDir ";
- char *dot;
- os_error *error;
dw = (struct gui_download_window *)ro_gui_wimp_event_get_user_data(pointer->w);
if ((pointer->buttons & (wimp_DRAG_SELECT | wimp_DRAG_ADJUST)) &&
@@ -836,10 +858,14 @@ bool ro_gui_download_click(wimp_pointer *pointer)
ro_gui_drag_icon(x, y, sprite);
} else if (pointer->i == ICON_DOWNLOAD_DESTINATION) {
+ char command[256] = "Filer_OpenDir ";
+ char *dot;
+
strncpy(command + 14, dw->path, 242);
command[255] = 0;
dot = strrchr(command, '.');
if (dot) {
+ os_error *error;
*dot = 0;
error = xos_cli(command);
if (error) {
@@ -886,7 +912,7 @@ bool ro_gui_download_keypress(wimp_key *key)
!nsoption_bool(confirm_overwrite)) && !dw->ctx)
{
/* finished already */
- schedule(200, ro_gui_download_window_destroy_wrapper, dw);
+ riscos_schedule(2000, ro_gui_download_window_destroy_wrapper, dw);
}
return true;
}
@@ -982,7 +1008,7 @@ void ro_gui_download_datasave_ack(wimp_message *message)
ro_gui_download_send_dataload(dw);
- schedule(200, ro_gui_download_window_destroy_wrapper, dw);
+ riscos_schedule(2000, ro_gui_download_window_destroy_wrapper, dw);
}
}
@@ -1414,7 +1440,7 @@ void ro_gui_download_send_dataload(struct gui_download_window *dw)
warn_user("WimpError", error->errmess);
}
- schedule(200, ro_gui_download_window_destroy_wrapper, dw);
+ riscos_schedule(2000, ro_gui_download_window_destroy_wrapper, dw);
}
@@ -1477,8 +1503,8 @@ bool ro_gui_download_window_destroy(struct gui_download_window *dw, bool quit)
return false;
}
- schedule_remove(ro_gui_download_update_status_wrapper, dw);
- schedule_remove(ro_gui_download_window_destroy_wrapper, dw);
+ riscos_schedule(-1, ro_gui_download_update_status_wrapper, dw);
+ riscos_schedule(-1, ro_gui_download_window_destroy_wrapper, dw);
/* remove from list */
if (dw->prev)
@@ -1531,7 +1557,7 @@ bool ro_gui_download_window_destroy(struct gui_download_window *dw, bool quit)
/**
- * Wrapper for ro_gui_download_window_destroy(), suitable for schedule().
+ * Wrapper for ro_gui_download_window_destroy(), suitable for riscos_schedule().
*/
void ro_gui_download_window_destroy_wrapper(void *p)
@@ -1610,7 +1636,7 @@ void ro_gui_download_overwrite_confirmed(query_id id, enum query_response res, v
ro_gui_download_send_dataload(dw);
- schedule(200, ro_gui_download_window_destroy_wrapper, dw);
+ riscos_schedule(2000, ro_gui_download_window_destroy_wrapper, dw);
}
}
@@ -1631,3 +1657,12 @@ bool ro_gui_download_prequit(void)
}
return true;
}
+
+static struct gui_download_table download_table = {
+ .create = gui_download_window_create,
+ .data = gui_download_window_data,
+ .error = gui_download_window_error,
+ .done = gui_download_window_done,
+};
+
+struct gui_download_table *riscos_download_table = &download_table;
diff --git a/riscos/filetype.c b/riscos/filetype.c
index 86aafa85a..0a546d833 100644
--- a/riscos/filetype.c
+++ b/riscos/filetype.c
@@ -24,7 +24,7 @@
#include "content/content.h"
#include "content/fetch.h"
#include "content/hlcache.h"
-#include "riscos/gui.h"
+#include "riscos/filetype.h"
#include "utils/config.h"
#include "utils/log.h"
#include "utils/utils.h"
@@ -60,19 +60,13 @@ static char type_buf[BUF_SIZE];
static int cmp_type(const void *x, const void *y);
-/**
- * Determine the MIME type of a local file.
- *
- * \param unix_path Unix style path to file on disk
- * \return Pointer to MIME type string (should not be freed) - invalidated
- * on next call to fetch_filetype.
- */
+/* exported interface documented in riscos/filetype.h */
const char *fetch_filetype(const char *unix_path)
{
struct type_entry *t;
unsigned int len = strlen(unix_path) + 100;
char *path = calloc(len, 1);
- char *r, *slash;
+ char *r;
os_error *error;
bits file_type, temp;
int objtype;
@@ -110,7 +104,7 @@ const char *fetch_filetype(const char *unix_path)
/* If filetype is text or data, and the file has an extension, try to
* map the extension to a filetype via the MimeMap file. */
if (file_type == osfile_TYPE_TEXT || file_type == osfile_TYPE_DATA) {
- slash = strrchr(path, '/');
+ char *slash = strrchr(path, '/');
if (slash) {
error = xmimemaptranslate_extension_to_filetype(
slash+1, &temp);
@@ -154,12 +148,7 @@ const char *fetch_filetype(const char *unix_path)
}
-/**
- * Find a MIME type for a local file
- *
- * \param ro_path RISC OS style path to file on disk
- * \return MIME type string (on heap, caller should free), or NULL
- */
+/* exported interface documented in riscos/filetype.h */
char *fetch_mimetype(const char *ro_path)
{
os_error *e;
@@ -246,12 +235,7 @@ int cmp_type(const void *x, const void *y)
return *p < q->file_type ? -1 : (*p == q->file_type ? 0 : +1);
}
-/**
- * Determine the RISC OS filetype for a content.
- *
- * \param content The content to examine.
- * \return The RISC OS filetype corresponding to the content
- */
+/* exported interface documented in riscos/filetype.h */
int ro_content_filetype(hlcache_handle *c)
{
lwc_string *mime_type;
@@ -270,25 +254,21 @@ int ro_content_filetype(hlcache_handle *c)
return file_type;
}
-/**
- * Determine the native RISC OS filetype to export a content as
- *
- * \param c The content to examine
- * \return Native RISC OS filetype for export
- */
+
+/* exported interface documented in riscos/filetype.h */
int ro_content_native_type(hlcache_handle *c)
{
switch (ro_content_filetype(c)) {
- case 0xc85: /* jpeg */
- case 0xf78: /* jng */
- case 0xf83: /* mng */
- case 0x695: /* gif */
- case 0x69c: /* bmp */
- case 0x132: /* ico */
- case 0xb60: /* png */
+ case FILETYPE_JPEG: /* jpeg */
+ case FILETYPE_JNG: /* jng */
+ case FILETYPE_MNG: /* mng */
+ case FILETYPE_GIF: /* gif */
+ case FILETYPE_BMP: /* bmp */
+ case FILETYPE_ICO: /* ico */
+ case FILETYPE_PNG: /* png */
case 0xff9: /* sprite */
return osfile_TYPE_SPRITE;
- case 0xaad: /* svg */
+ case FILETYPE_SVG: /* svg */
case 0xaff: /* draw */
return osfile_TYPE_DRAW;
default:
@@ -298,12 +278,8 @@ int ro_content_native_type(hlcache_handle *c)
return osfile_TYPE_DATA;
}
-/**
- * Determine the RISC OS filetype for a MIME type
- *
- * \param mime_type MIME type to consider
- * \return Corresponding RISC OS filetype
- */
+
+/* exported interface documented in riscos/filetype.h */
int ro_content_filetype_from_mime_type(lwc_string *mime_type)
{
int file_type, index;
@@ -329,15 +305,11 @@ int ro_content_filetype_from_mime_type(lwc_string *mime_type)
return file_type;
}
-/**
- * Determine the RISC OS filetype from a content type.
- *
- * \param type The content type to examine.
- * \return The RISC OS filetype corresponding to the content, or 0 for unknown
- */
+
+/* exported interface documented in riscos/filetype.h */
int ro_content_filetype_from_type(content_type type) {
switch (type) {
- case CONTENT_HTML: return 0xfaf;
+ case CONTENT_HTML: return FILETYPE_HTML;
case CONTENT_TEXTPLAIN: return 0xfff;
case CONTENT_CSS: return 0xf79;
default: break;
@@ -345,12 +317,8 @@ int ro_content_filetype_from_type(content_type type) {
return 0;
}
-/**
- * Determine the type of a local file.
- *
- * \param unix_path Unix style path to file on disk
- * \return File type
- */
+
+/* exported interface documented in riscos/filetype.h */
bits ro_filetype_from_unix_path(const char *unix_path)
{
unsigned int len = strlen(unix_path) + 100;
diff --git a/riscos/filetype.h b/riscos/filetype.h
new file mode 100644
index 000000000..20dfb6cbc
--- /dev/null
+++ b/riscos/filetype.h
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file riscos/filetype.h
+ * RISC OS filetpe interface.
+ */
+
+#ifndef _NETSURF_RISCOS_FILETYPE_H_
+#define _NETSURF_RISCOS_FILETYPE_H_
+
+#include "content/content_type.h"
+
+#ifndef FILETYPE_ACORN_URI
+#define FILETYPE_ACORN_URI 0xf91
+#endif
+#ifndef FILETYPE_ANT_URL
+#define FILETYPE_ANT_URL 0xb28
+#endif
+#ifndef FILETYPE_IEURL
+#define FILETYPE_IEURL 0x1ba
+#endif
+#ifndef FILETYPE_HTML
+#define FILETYPE_HTML 0xfaf
+#endif
+#ifndef FILETYPE_JNG
+#define FILETYPE_JNG 0xf78
+#endif
+#ifndef FILETYPE_CSS
+#define FILETYPE_CSS 0xf79
+#endif
+#ifndef FILETYPE_MNG
+#define FILETYPE_MNG 0xf83
+#endif
+#ifndef FILETYPE_GIF
+#define FILETYPE_GIF 0x695
+#endif
+#ifndef FILETYPE_BMP
+#define FILETYPE_BMP 0x69c
+#endif
+#ifndef FILETYPE_ICO
+#define FILETYPE_ICO 0x132
+#endif
+#ifndef FILETYPE_PNG
+#define FILETYPE_PNG 0xb60
+#endif
+#ifndef FILETYPE_JPEG
+#define FILETYPE_JPEG 0xc85
+#endif
+#ifndef FILETYPE_ARTWORKS
+#define FILETYPE_ARTWORKS 0xd94
+#endif
+#ifndef FILETYPE_SVG
+#define FILETYPE_SVG 0xaad
+#endif
+
+/**
+ * Determine the MIME type of a local file.
+ *
+ * \param unix_path Unix style path to file on disk
+ * \return Pointer to MIME type string (should not be freed) - invalidated
+ * on next call to fetch_filetype.
+ */
+const char *fetch_filetype(const char *unix_path);
+
+/**
+ * Find a MIME type for a local file
+ *
+ * \param ro_path RISC OS style path to file on disk
+ * \return MIME type string (on heap, caller should free), or NULL
+ */
+char *fetch_mimetype(const char *ro_path);
+
+/**
+ * Determine the RISC OS filetype for a content.
+ *
+ * \param content The content to examine.
+ * \return The RISC OS filetype corresponding to the content
+ */
+int ro_content_filetype(struct hlcache_handle *c);
+
+/**
+ * Determine the native RISC OS filetype to export a content as
+ *
+ * \param c The content to examine
+ * \return Native RISC OS filetype for export
+ */
+int ro_content_native_type(struct hlcache_handle *c);
+
+/**
+ * Determine the RISC OS filetype for a MIME type
+ *
+ * \param mime_type MIME type to consider
+ * \return Corresponding RISC OS filetype
+ */
+int ro_content_filetype_from_mime_type(lwc_string *mime_type);
+
+/**
+ * Determine the RISC OS filetype from a content type.
+ *
+ * \param type The content type to examine.
+ * \return The RISC OS filetype corresponding to the content, or 0 for unknown
+ */
+int ro_content_filetype_from_type(content_type type);
+
+/**
+ * Determine the type of a local file.
+ *
+ * \param unix_path Unix style path to file on disk
+ * \return File type
+ */
+bits ro_filetype_from_unix_path(const char *unix_path);
+
+#endif
diff --git a/riscos/font.c b/riscos/font.c
index ddbe8536d..7e6c80fe5 100644
--- a/riscos/font.c
+++ b/riscos/font.c
@@ -17,25 +17,29 @@
*/
/** \file
- * Font handling (RISC OS implementation).
+ * RISC OS implementation of Font handling.
*
- * The RUfl is used handle and render fonts.
+ * The RUfl is used to handle and render fonts.
*/
+#include "utils/config.h"
+
#include <assert.h>
#include <string.h>
-#include "oslib/wimp.h"
-#include "oslib/wimpreadsysinfo.h"
-#include "rufl.h"
+#include <oslib/wimp.h>
+#include <oslib/wimpreadsysinfo.h>
+
#include "css/css.h"
#include "css/utils.h"
#include "render/font.h"
-#include "riscos/gui.h"
#include "utils/nsoption.h"
#include "utils/log.h"
#include "utils/messages.h"
#include "utils/utils.h"
+#include "riscos/gui.h"
+#include "riscos/font.h"
+
static void nsfont_check_option(char **option, const char *family,
const char *fallback);
static int nsfont_list_cmp(const void *keyval, const void *datum);
diff --git a/riscos/font.h b/riscos/font.h
new file mode 100644
index 000000000..4a1fe4c6b
--- /dev/null
+++ b/riscos/font.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file riscos/font.h
+ * RISC OS font interface.
+ */
+
+#ifndef _NETSURF_RISCOS_FONT_H_
+#define _NETSURF_RISCOS_FONT_H_
+
+#include <rufl.h>
+
+/** desktop font, size and style being used */
+extern char ro_gui_desktop_font_family[];
+extern int ro_gui_desktop_font_size;
+extern rufl_style ro_gui_desktop_font_style;
+
+void nsfont_init(void);
+bool nsfont_exists(const char *font_family);
+const char *nsfont_fallback_font(void);
+bool nsfont_paint(const plot_font_style_t *fstyle, const char *string,
+ size_t length, int x, int y);
+void nsfont_read_style(const plot_font_style_t *fstyle,
+ const char **font_family, unsigned int *font_size,
+ rufl_style *font_style);
+void ro_gui_wimp_get_desktop_font(void);
+
+#endif
diff --git a/riscos/global_history.c b/riscos/global_history.c
index 840271f93..9d1810503 100644
--- a/riscos/global_history.c
+++ b/riscos/global_history.c
@@ -32,6 +32,7 @@
#include "content/urldb.h"
#include "desktop/global_history.h"
#include "desktop/tree.h"
+#include "desktop/gui.h"
#include "riscos/dialog.h"
#include "riscos/global_history.h"
#include "riscos/gui.h"
@@ -44,7 +45,6 @@
#include "riscos/wimp_event.h"
#include "utils/messages.h"
#include "utils/log.h"
-#include "utils/url.h"
#include "utils/utils.h"
static void ro_gui_global_history_toolbar_update_buttons(void);
diff --git a/riscos/gui.c b/riscos/gui.c
index bb1a318de..2e337e5a2 100644
--- a/riscos/gui.c
+++ b/riscos/gui.c
@@ -21,127 +21,69 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <stdbool.h>
+#include <string.h>
#include <assert.h>
#include <errno.h>
-#include <fpu_control.h>
#include <signal.h>
-#include <stdbool.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <features.h>
#include <unixlib/local.h>
-#include <curl/curl.h>
-#include "oslib/font.h"
-#include "oslib/help.h"
-#include "oslib/hourglass.h"
-#include "oslib/inetsuite.h"
-#include "oslib/os.h"
-#include "oslib/osbyte.h"
-#include "oslib/osfile.h"
-#include "oslib/osfscontrol.h"
-#include "oslib/osgbpb.h"
-#include "oslib/osmodule.h"
-#include "oslib/osspriteop.h"
-#include "oslib/pdriver.h"
-#include "oslib/plugin.h"
-#include "oslib/wimp.h"
-#include "oslib/wimpspriteop.h"
-#include "oslib/uri.h"
-#include "rufl.h"
-#include "utils/config.h"
-#include "content/content.h"
-#include "content/hlcache.h"
-#include "content/urldb.h"
-#include "content/fetchers/resource.h"
-#include "desktop/gui.h"
-#include "desktop/netsurf.h"
+#include <fpu_control.h>
+#include <oslib/help.h>
+#include <oslib/uri.h>
+#include <oslib/inetsuite.h>
+#include <oslib/pdriver.h>
+#include <oslib/osfile.h>
+#include <oslib/hourglass.h>
+#include <oslib/osgbpb.h>
+#include <oslib/osbyte.h>
+#include <oslib/osmodule.h>
+#include <oslib/osfscontrol.h>
+
+#include "utils/utils.h"
#include "utils/nsoption.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/file.h"
+#include "utils/filename.h"
+#include "utils/url.h"
+#include "utils/corestrings.h"
+#include "desktop/gui.h"
#include "desktop/save_complete.h"
#include "desktop/treeview.h"
-#include "render/font.h"
-#include "riscos/content-handlers/artworks.h"
-#include "riscos/bitmap.h"
-#include "riscos/buffer.h"
-#include "riscos/cookies.h"
-#include "riscos/dialog.h"
-#include "riscos/content-handlers/draw.h"
-#include "riscos/global_history.h"
+#include "desktop/netsurf.h"
+#include "desktop/browser.h"
+#include "content/urldb.h"
+#include "content/hlcache.h"
+#include "content/backing_store.h"
+
#include "riscos/gui.h"
-#include "riscos/gui/url_bar.h"
-#include "riscos/help.h"
+#include "riscos/wimputils.h"
#include "riscos/hotlist.h"
-#include "riscos/iconbar.h"
-#include "riscos/menus.h"
-#include "riscos/message.h"
-#include "riscos/mouse.h"
+#include "riscos/buffer.h"
+#include "riscos/textselection.h"
#include "riscos/print.h"
-#include "riscos/query.h"
#include "riscos/save.h"
+#include "riscos/dialog.h"
+#include "riscos/wimp.h"
+#include "riscos/message.h"
+#include "riscos/help.h"
+#include "riscos/query.h"
+#include "riscos/window.h"
+#include "riscos/iconbar.h"
#include "riscos/sslcert.h"
-#include "riscos/content-handlers/sprite.h"
-#include "riscos/textselection.h"
-#include "riscos/theme.h"
-#include "riscos/toolbar.h"
-#include "riscos/treeview.h"
+#include "riscos/global_history.h"
+#include "riscos/cookies.h"
+#include "riscos/wimp_event.h"
#include "riscos/uri.h"
#include "riscos/url_protocol.h"
-#include "riscos/url_complete.h"
-#include "riscos/wimp.h"
-#include "riscos/wimp_event.h"
-#include "riscos/wimputils.h"
-#include "riscos/window.h"
-#include "utils/filename.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/url.h"
-#include "utils/utils.h"
-
-
-
-#ifndef FILETYPE_ACORN_URI
-#define FILETYPE_ACORN_URI 0xf91
-#endif
-#ifndef FILETYPE_ANT_URL
-#define FILETYPE_ANT_URL 0xb28
-#endif
-#ifndef FILETYPE_IEURL
-#define FILETYPE_IEURL 0x1ba
-#endif
-#ifndef FILETYPE_HTML
-#define FILETYPE_HTML 0xfaf
-#endif
-#ifndef FILETYPE_JNG
-#define FILETYPE_JNG 0xf78
-#endif
-#ifndef FILETYPE_CSS
-#define FILETYPE_CSS 0xf79
-#endif
-#ifndef FILETYPE_MNG
-#define FILETYPE_MNG 0xf83
-#endif
-#ifndef FILETYPE_GIF
-#define FILETYPE_GIF 0x695
-#endif
-#ifndef FILETYPE_BMP
-#define FILETYPE_BMP 0x69c
-#endif
-#ifndef FILETYPE_ICO
-#define FILETYPE_ICO 0x132
-#endif
-#ifndef FILETYPE_PNG
-#define FILETYPE_PNG 0xb60
-#endif
-#ifndef FILETYPE_JPEG
-#define FILETYPE_JPEG 0xc85
-#endif
-#ifndef FILETYPE_ARTWORKS
-#define FILETYPE_ARTWORKS 0xd94
-#endif
-#ifndef FILETYPE_SVG
-#define FILETYPE_SVG 0xaad
-#endif
+#include "riscos/mouse.h"
+#include "riscos/ucstables.h"
+#include "riscos/filetype.h"
+#include "riscos/font.h"
+#include "riscos/toolbar.h"
+#include "riscos/content-handlers/artworks.h"
+#include "riscos/content-handlers/draw.h"
+#include "riscos/content-handlers/sprite.h"
extern bool ro_plot_patterned_lines;
@@ -163,11 +105,15 @@ static const char *task_name = "NetSurf";
#define CHOICES_PREFIX "<Choices$Write>.WWW.NetSurf."
ro_gui_drag_type gui_current_drag_type;
-wimp_t task_handle; /**< RISC OS wimp task handle. */
-static clock_t gui_last_poll; /**< Time of last wimp_poll. */
-osspriteop_area *gui_sprites; /**< Sprite area containing pointer and hotlist sprites */
+wimp_t task_handle; /**< RISC OS wimp task handle. */
+static clock_t gui_last_poll; /**< Time of last wimp_poll. */
+osspriteop_area *gui_sprites; /**< Sprite area containing pointer and hotlist sprites */
+
+#define DIR_SEP ('.')
-/** Accepted wimp user messages. */
+/**
+ * Accepted wimp user messages.
+ */
static ns_wimp_message_list task_messages = {
message_HELP_REQUEST,
{
@@ -221,38 +167,26 @@ static ns_wimp_message_list task_messages = {
}
};
+
static struct
{
- int width; /* in OS units */
- int height;
+ int width; /* in OS units */
+ int height;
} screen_info;
-static void ro_gui_create_dirs(void);
-static void ro_gui_create_dir(char *path);
-static void ro_gui_choose_language(void);
-static void ro_gui_signal(int sig);
-static void ro_gui_cleanup(void);
-static void ro_gui_handle_event(wimp_event_no event, wimp_block *block);
-static void ro_gui_close_window_request(wimp_close *close);
-static void ro_gui_check_resolvers(void);
-static void ro_gui_keypress(wimp_key *key);
-static void ro_gui_user_message(wimp_event_no event, wimp_message *message);
-static void ro_msg_dataload(wimp_message *block);
-static char *ro_gui_uri_file_parse(const char *file_name, char **uri_title);
-static bool ro_gui_uri_file_parse_line(FILE *fp, char *b);
-static char *ro_gui_url_file_parse(const char *file_name);
-static char *ro_gui_ieurl_file_parse(const char *file_name);
-static void ro_msg_terminate_filename(wimp_full_message_data_xfer *message);
-static void ro_msg_datasave(wimp_message *message);
-static void ro_msg_datasave_ack(wimp_message *message);
-static void ro_msg_dataopen(wimp_message *message);
-static void ro_gui_get_screen_properties(void);
-static void ro_msg_prequit(wimp_message *message);
-static void ro_msg_save_desktop(wimp_message *message);
-static void ro_msg_window_info(wimp_message *message);
-static void ro_gui_view_source_bounce(wimp_message *message);
-
-nsurl *gui_get_resource_url(const char *path)
+
+/**
+ * Callback to translate resource to full url for RISC OS.
+ *
+ * Transforms a resource: path into a full URL. The returned URL is
+ * used as the target for a redirect. The caller takes ownership of
+ * the returned nsurl including unrefing it when finished with it.
+ *
+ * \param path The path of the resource to locate.
+ * \return A string containing the full URL of the target object or
+ * NULL if no suitable resource can be found.
+ */
+static nsurl *gui_get_resource_url(const char *path)
{
static const char base_url[] = "file:///NetSurf:/Resources/";
size_t path_len, length;
@@ -313,14 +247,21 @@ nsurl *gui_get_resource_url(const char *path)
return url;
}
+
/**
- * set option from wimp
+ * Set colour option from wimp.
+ *
+ * \param opts The netsurf options.
+ * \param wimp wimp colour value
+ * \param option the netsurf option enum.
+ * \param def_colour The default colour value to use.
+ * \return NSERROR_OK on success or error code.
*/
static nserror
set_colour_from_wimp(struct nsoption_s *opts,
- wimp_colour wimp,
- enum nsoption_e option,
- colour def_colour)
+ wimp_colour wimp,
+ enum nsoption_e option,
+ colour def_colour)
{
os_error *error;
os_PALETTE(20) palette;
@@ -339,17 +280,16 @@ set_colour_from_wimp(struct nsoption_s *opts,
return NSERROR_OK;
}
+
/**
* Set option defaults for riscos frontend
*
* @param defaults The option table to update.
* @return error status.
*
- * @TODO -- The wimp_COLOUR_... values here map the colour definitions
- * to parts of the RISC OS desktop palette. In places this
- * is fairly arbitrary, and could probably do with
- * re-checking.
- *
+ * @todo The wimp_COLOUR_... values here map the colour definitions to
+ * parts of the RISC OS desktop palette. In places this is fairly
+ * arbitrary, and could probably do with re-checking.
*/
static nserror set_defaults(struct nsoption_s *defaults)
{
@@ -398,11 +338,755 @@ static nserror set_defaults(struct nsoption_s *defaults)
return NSERROR_OK;
}
+
+
+
+/**
+ * Create intermediate directories for Choices and User Data files
+ */
+static void ro_gui_create_dirs(void)
+{
+ char buf[256];
+ char *path;
+
+ /* Choices */
+ path = getenv("NetSurf$ChoicesSave");
+ if (!path)
+ die("Failed to find NetSurf Choices save path");
+
+ snprintf(buf, sizeof(buf), "%s", path);
+ netsurf_mkdir_all(buf);
+
+ /* URL */
+ snprintf(buf, sizeof(buf), "%s", nsoption_charp(url_save));
+ netsurf_mkdir_all(buf);
+
+ /* Hotlist */
+ snprintf(buf, sizeof(buf), "%s", nsoption_charp(hotlist_save));
+ netsurf_mkdir_all(buf);
+
+ /* Recent */
+ snprintf(buf, sizeof(buf), "%s", nsoption_charp(recent_save));
+ netsurf_mkdir_all(buf);
+
+ /* Theme */
+ snprintf(buf, sizeof(buf), "%s", nsoption_charp(theme_save));
+ netsurf_mkdir_all(buf);
+ /* and the final directory part (as theme_save is a directory) */
+ xosfile_create_dir(buf, 0);
+}
+
+
+/**
+ * Ensures the gui exits cleanly.
+ */
+static void ro_gui_cleanup(void)
+{
+ ro_gui_buffer_close();
+ xhourglass_off();
+ /* Uninstall NetSurf-specific fonts */
+ xos_cli("FontRemove NetSurf:Resources.Fonts.");
+}
+
+
+/**
+ * Handles a signal
+ */
+static void ro_gui_signal(int sig)
+{
+ static const os_error error = { 1, "NetSurf has detected a serious "
+ "error and must exit. Please submit a bug report, "
+ "attaching the browser log file." };
+ os_colour old_sand, old_glass;
+
+ ro_gui_cleanup();
+
+ xhourglass_on();
+ xhourglass_colours(0x0000ffff, 0x000000ff, &old_sand, &old_glass);
+ nsoption_dump(stderr, NULL);
+ /*rufl_dump_state();*/
+
+#ifndef __ELF__
+ /* save WimpSlot and DA to files if NetSurf$CoreDump exists */
+ int used;
+ xos_read_var_val_size("NetSurf$CoreDump", 0, 0, &used, 0, 0);
+ if (used) {
+ int curr_slot;
+ xwimp_slot_size(-1, -1, &curr_slot, 0, 0);
+ LOG(("saving WimpSlot, size 0x%x", curr_slot));
+ xosfile_save("$.NetSurf_Slot", 0x8000, 0,
+ (byte *) 0x8000,
+ (byte *) 0x8000 + curr_slot);
+
+ if (__dynamic_num != -1) {
+ int size;
+ byte *base_address;
+ xosdynamicarea_read(__dynamic_num, &size,
+ &base_address, 0, 0, 0, 0, 0);
+ LOG(("saving DA %i, base %p, size 0x%x",
+ __dynamic_num,
+ base_address, size));
+ xosfile_save("$.NetSurf_DA",
+ (bits) base_address, 0,
+ base_address,
+ base_address + size);
+ }
+ }
+#else
+ /* Save WimpSlot and UnixLib managed DAs when UnixEnv$coredump
+ * defines a coredump directory. */
+ _kernel_oserror *err = __unixlib_write_coredump (NULL);
+ if (err != NULL)
+ LOG(("Coredump failed: %s", err->errmess));
+#endif
+
+ xhourglass_colours(old_sand, old_glass, 0, 0);
+ xhourglass_off();
+
+ __write_backtrace(sig);
+
+ xwimp_report_error_by_category(&error,
+ wimp_ERROR_BOX_GIVEN_CATEGORY |
+ wimp_ERROR_BOX_CATEGORY_ERROR <<
+ wimp_ERROR_BOX_CATEGORY_SHIFT,
+ "NetSurf", "!netsurf",
+ (osspriteop_area *) 1, "Quit", 0);
+ xos_cli("Filer_Run <Wimp$ScrapDir>.WWW.NetSurf.Log");
+
+ _Exit(sig);
+}
+
+
+/**
+ * Read a "line" from an Acorn URI file.
+ *
+ * \param fp file pointer to read from
+ * \param b buffer for line, size 400 bytes
+ * \return true on success, false on EOF
+ */
+static bool ro_gui_uri_file_parse_line(FILE *fp, char *b)
+{
+ int c;
+ unsigned int i = 0;
+
+ c = getc(fp);
+ if (c == EOF)
+ return false;
+
+ /* skip comment lines */
+ while (c == '#') {
+ do { c = getc(fp); } while (c != EOF && 32 <= c);
+ if (c == EOF)
+ return false;
+ do { c = getc(fp); } while (c != EOF && c < 32);
+ if (c == EOF)
+ return false;
+ }
+
+ /* read "line" */
+ do {
+ if (i == 399)
+ return false;
+ b[i++] = c;
+ c = getc(fp);
+ } while (c != EOF && 32 <= c);
+
+ /* skip line ending control characters */
+ while (c != EOF && c < 32)
+ c = getc(fp);
+
+ if (c != EOF)
+ ungetc(c, fp);
+
+ b[i] = 0;
+ return true;
+}
+
+
+/**
+ * Parse an Acorn URI file.
+ *
+ * \param file_name file to read
+ * \param uri_title pointer to receive title data, or NULL for no data
+ * \return URL from file, or 0 on error and error reported
+ */
+static char *ro_gui_uri_file_parse(const char *file_name, char **uri_title)
+{
+ /* See the "Acorn URI Handler Functional Specification" for the
+ * definition of the URI file format. */
+ char line[400];
+ char *url = NULL;
+ FILE *fp;
+
+ *uri_title = NULL;
+ fp = fopen(file_name, "rb");
+ if (!fp) {
+ LOG(("fopen(\"%s\", \"rb\"): %i: %s",
+ file_name, errno, strerror(errno)));
+ warn_user("LoadError", strerror(errno));
+ return 0;
+ }
+
+ /* "URI" */
+ if (!ro_gui_uri_file_parse_line(fp, line) || strcmp(line, "URI") != 0)
+ goto uri_syntax_error;
+
+ /* version */
+ if (!ro_gui_uri_file_parse_line(fp, line) ||
+ strspn(line, "0123456789") != strlen(line))
+ goto uri_syntax_error;
+
+ /* URI */
+ if (!ro_gui_uri_file_parse_line(fp, line))
+ goto uri_syntax_error;
+
+ url = strdup(line);
+ if (!url) {
+ warn_user("NoMemory", 0);
+ fclose(fp);
+ return 0;
+ }
+
+ /* title */
+ if (!ro_gui_uri_file_parse_line(fp, line))
+ goto uri_free;
+ if (uri_title && line[0] && ((line[0] != '*') || line[1])) {
+ *uri_title = strdup(line);
+ if (!*uri_title) /* non-fatal */
+ warn_user("NoMemory", 0);
+ }
+ fclose(fp);
+
+ return url;
+
+uri_free:
+ free(url);
+
+uri_syntax_error:
+ fclose(fp);
+ warn_user("URIError", 0);
+ return 0;
+}
+
+
+/**
+ * Parse an ANT URL file.
+ *
+ * \param file_name file to read
+ * \return URL from file, or 0 on error and error reported
+ */
+static char *ro_gui_url_file_parse(const char *file_name)
+{
+ char line[400];
+ char *url;
+ FILE *fp;
+
+ fp = fopen(file_name, "r");
+ if (!fp) {
+ LOG(("fopen(\"%s\", \"r\"): %i: %s",
+ file_name, errno, strerror(errno)));
+ warn_user("LoadError", strerror(errno));
+ return 0;
+ }
+
+ if (!fgets(line, sizeof line, fp)) {
+ if (ferror(fp)) {
+ LOG(("fgets: %i: %s",
+ errno, strerror(errno)));
+ warn_user("LoadError", strerror(errno));
+ } else
+ warn_user("LoadError", messages_get("EmptyError"));
+ fclose(fp);
+ return 0;
+ }
+
+ fclose(fp);
+
+ if (line[strlen(line) - 1] == '\n')
+ line[strlen(line) - 1] = '\0';
+
+ url = strdup(line);
+ if (!url) {
+ warn_user("NoMemory", 0);
+ return 0;
+ }
+
+ return url;
+}
+
+
+/**
+ * Parse an IEURL file.
+ *
+ * \param file_name file to read
+ * \return URL from file, or 0 on error and error reported
+ */
+static char *ro_gui_ieurl_file_parse(const char *file_name)
+{
+ char line[400];
+ char *url = 0;
+ FILE *fp;
+
+ fp = fopen(file_name, "r");
+ if (!fp) {
+ LOG(("fopen(\"%s\", \"r\"): %i: %s",
+ file_name, errno, strerror(errno)));
+ warn_user("LoadError", strerror(errno));
+ return 0;
+ }
+
+ while (fgets(line, sizeof line, fp)) {
+ if (strncmp(line, "URL=", 4) == 0) {
+ if (line[strlen(line) - 1] == '\n')
+ line[strlen(line) - 1] = '\0';
+ url = strdup(line + 4);
+ if (!url) {
+ fclose(fp);
+ warn_user("NoMemory", 0);
+ return 0;
+ }
+ break;
+ }
+ }
+ if (ferror(fp)) {
+ LOG(("fgets: %i: %s",
+ errno, strerror(errno)));
+ warn_user("LoadError", strerror(errno));
+ fclose(fp);
+ return 0;
+ }
+
+ fclose(fp);
+
+ if (!url)
+ warn_user("URIError", 0);
+
+ return url;
+}
+
+
+/**
+ * Handle Message_DataOpen (double-click on file in the Filer).
+ *
+ * \param message The wimp message to open.
+ */
+static void ro_msg_dataopen(wimp_message *message)
+{
+ int file_type = message->data.data_xfer.file_type;
+ char *url = 0;
+ os_error *oserror;
+ nsurl *urlns;
+ nserror error;
+ size_t len;
+
+ switch (file_type) {
+ case 0xb28: /* ANT URL file */
+ url = ro_gui_url_file_parse(message->data.data_xfer.file_name);
+ error = nsurl_create(url, &urlns);
+ free(url);
+ break;
+
+ case 0xfaf: /* HTML file */
+ error = netsurf_path_to_nsurl(message->data.data_xfer.file_name,
+ &urlns);
+ break;
+
+ case 0x1ba: /* IEURL file */
+ url = ro_gui_ieurl_file_parse(message->
+ data.data_xfer.file_name);
+ error = nsurl_create(url, &urlns);
+ free(url);
+ break;
+
+ case 0x2000: /* application */
+ len = strlen(message->data.data_xfer.file_name);
+ if (len < 9 || strcmp(".!NetSurf",
+ message->data.data_xfer.file_name + len - 9))
+ return;
+
+ if (nsoption_charp(homepage_url) &&
+ nsoption_charp(homepage_url)[0]) {
+ error = nsurl_create(nsoption_charp(homepage_url),
+ &urlns);
+ } else {
+ error = nsurl_create(NETSURF_HOMEPAGE, &urlns);
+ }
+ break;
+
+ default:
+ return;
+ }
+
+ /* send DataLoadAck */
+ message->action = message_DATA_LOAD_ACK;
+ message->your_ref = message->my_ref;
+ oserror = xwimp_send_message(wimp_USER_MESSAGE, message, message->sender);
+ if (oserror) {
+ LOG(("xwimp_send_message: 0x%x: %s",
+ oserror->errnum, oserror->errmess));
+ warn_user("WimpError", oserror->errmess);
+ return;
+ }
+
+ if (error != NSERROR_OK) {
+ warn_user(messages_get_errorcode(error), 0);
+ return;
+ }
+
+ /* create a new window with the file */
+ error = browser_window_create(BW_CREATE_HISTORY,
+ urlns,
+ NULL,
+ NULL,
+ NULL);
+ nsurl_unref(urlns);
+ if (error != NSERROR_OK) {
+ warn_user(messages_get_errorcode(error), 0);
+ }
+}
+
+
+/**
+ * Handle Message_DataLoad (file dragged in).
+ */
+static void ro_msg_dataload(wimp_message *message)
+{
+ int file_type = message->data.data_xfer.file_type;
+ char *urltxt = NULL;
+ char *title = NULL;
+ struct gui_window *g;
+ os_error *oserror;
+ nsurl *url;
+ nserror error;
+
+ g = ro_gui_window_lookup(message->data.data_xfer.w);
+ if (g) {
+ if (ro_gui_window_dataload(g, message))
+ return;
+ }
+ else {
+ g = ro_gui_toolbar_lookup(message->data.data_xfer.w);
+ if (g && ro_gui_toolbar_dataload(g, message))
+ return;
+ }
+
+ switch (file_type) {
+ case FILETYPE_ACORN_URI:
+ urltxt = ro_gui_uri_file_parse(message->data.data_xfer.file_name,
+ &title);
+ error = nsurl_create(urltxt, &url);
+ free(urltxt);
+ break;
+
+ case FILETYPE_ANT_URL:
+ urltxt = ro_gui_url_file_parse(message->data.data_xfer.file_name);
+ error = nsurl_create(urltxt, &url);
+ free(urltxt);
+ break;
+
+ case FILETYPE_IEURL:
+ urltxt = ro_gui_ieurl_file_parse(message->data.data_xfer.file_name);
+ error = nsurl_create(urltxt, &url);
+ free(urltxt);
+ break;
+
+ case FILETYPE_HTML:
+ case FILETYPE_JNG:
+ case FILETYPE_CSS:
+ case FILETYPE_MNG:
+ case FILETYPE_GIF:
+ case FILETYPE_BMP:
+ case FILETYPE_ICO:
+ case osfile_TYPE_DRAW:
+ case FILETYPE_PNG:
+ case FILETYPE_JPEG:
+ case osfile_TYPE_SPRITE:
+ case osfile_TYPE_TEXT:
+ case FILETYPE_ARTWORKS:
+ case FILETYPE_SVG:
+ /* display the actual file */
+ error = netsurf_path_to_nsurl(message->data.data_xfer.file_name, &url);
+ break;
+
+ default:
+ return;
+ }
+
+ /* report error to user */
+ if (error != NSERROR_OK) {
+ warn_user(messages_get_errorcode(error), 0);
+ return;
+ }
+
+
+ if (g) {
+ error = browser_window_navigate(g->bw,
+ url,
+ NULL,
+ BW_NAVIGATE_HISTORY,
+ NULL,
+ NULL,
+ NULL);
+ } else {
+ error = browser_window_create(BW_CREATE_HISTORY,
+ url,
+ NULL,
+ NULL,
+ NULL);
+ }
+ nsurl_unref(url);
+ if (error != NSERROR_OK) {
+ warn_user(messages_get_errorcode(error), 0);
+ }
+
+
+ /* send DataLoadAck */
+ message->action = message_DATA_LOAD_ACK;
+ message->your_ref = message->my_ref;
+ oserror = xwimp_send_message(wimp_USER_MESSAGE, message,
+ message->sender);
+ if (oserror) {
+ LOG(("xwimp_send_message: 0x%x: %s",
+ oserror->errnum, oserror->errmess));
+ warn_user("WimpError", oserror->errmess);
+ return;
+ }
+
+}
+
+
+/**
+ * Ensure that the filename in a data transfer message is NULL terminated
+ * (some applications, especially BASIC programs use CR)
+ *
+ * \param message message to be corrected
+ */
+static void ro_msg_terminate_filename(wimp_full_message_data_xfer *message)
+{
+ const char *ep = (char*)message + message->size;
+ char *p = message->file_name;
+
+ if ((size_t)message->size >= sizeof(*message))
+ ep = (char*)message + sizeof(*message) - 1;
+
+ while (p < ep && *p >= ' ') p++;
+ *p = '\0';
+}
+
+
+/**
+ * Handle Message_DataSave
+ */
+static void ro_msg_datasave(wimp_message *message)
+{
+ wimp_full_message_data_xfer *dataxfer = (wimp_full_message_data_xfer*)message;
+
+ /* remove ghost caret if drag-and-drop protocol was used */
+// ro_gui_selection_drag_reset();
+
+ ro_msg_terminate_filename(dataxfer);
+
+ if (ro_gui_selection_prepare_paste_datasave(dataxfer))
+ return;
+
+ switch (dataxfer->file_type) {
+ case FILETYPE_ACORN_URI:
+ case FILETYPE_ANT_URL:
+ case FILETYPE_IEURL:
+ case FILETYPE_HTML:
+ case FILETYPE_JNG:
+ case FILETYPE_CSS:
+ case FILETYPE_MNG:
+ case FILETYPE_GIF:
+ case FILETYPE_BMP:
+ case FILETYPE_ICO:
+ case osfile_TYPE_DRAW:
+ case FILETYPE_PNG:
+ case FILETYPE_JPEG:
+ case osfile_TYPE_SPRITE:
+ case osfile_TYPE_TEXT:
+ case FILETYPE_ARTWORKS:
+ case FILETYPE_SVG: {
+ os_error *error;
+
+ dataxfer->your_ref = dataxfer->my_ref;
+ dataxfer->size = offsetof(wimp_full_message_data_xfer, file_name) + 16;
+ dataxfer->action = message_DATA_SAVE_ACK;
+ dataxfer->est_size = -1;
+ memcpy(dataxfer->file_name, "<Wimp$Scrap>", 13);
+
+ error = xwimp_send_message(wimp_USER_MESSAGE, (wimp_message*)dataxfer, message->sender);
+ if (error) {
+ LOG(("xwimp_send_message: 0x%x: %s", error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
+ }
+ }
+ break;
+ }
+}
+
+
+/**
+ * Handle Message_DataSaveAck.
+ */
+static void ro_msg_datasave_ack(wimp_message *message)
+{
+ ro_msg_terminate_filename((wimp_full_message_data_xfer*)message);
+
+ if (ro_print_ack(message))
+ return;
+
+ switch (gui_current_drag_type) {
+ case GUI_DRAG_DOWNLOAD_SAVE:
+ ro_gui_download_datasave_ack(message);
+ break;
+
+ case GUI_DRAG_SAVE:
+ ro_gui_save_datasave_ack(message);
+ gui_current_drag_type = GUI_DRAG_NONE;
+ break;
+
+ default:
+ break;
+ }
+
+ gui_current_drag_type = GUI_DRAG_NONE;
+}
+
+
+/**
+ * Handle PreQuit message
+ *
+ * \param message PreQuit message from Wimp
+ */
+static void ro_msg_prequit(wimp_message *message)
+{
+ if (!ro_gui_prequit()) {
+ os_error *error;
+
+ /* we're objecting to the close down */
+ message->your_ref = message->my_ref;
+ error = xwimp_send_message(wimp_USER_MESSAGE_ACKNOWLEDGE,
+ message, message->sender);
+ if (error) {
+ LOG(("xwimp_send_message: 0x%x:%s", error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
+ }
+ }
+}
+
+
+/**
+ * Handle SaveDesktop message.
+ *
+ * \param message SaveDesktop message from Wimp.
+ */
+static void ro_msg_save_desktop(wimp_message *message)
+{
+ os_error *error;
+
+ error = xosgbpb_writew(message->data.save_desktopw.file,
+ (const byte*)"Run ", 4, NULL);
+ if (!error) {
+ error = xosgbpb_writew(message->data.save_desktopw.file,
+ (const byte*)NETSURF_DIR, strlen(NETSURF_DIR), NULL);
+ if (!error)
+ error = xos_bputw('\n', message->data.save_desktopw.file);
+ }
+
+ if (error) {
+ LOG(("xosgbpb_writew/xos_bputw: 0x%x:%s", error->errnum, error->errmess));
+ warn_user("SaveError", error->errmess);
+
+ /* we must cancel the save by acknowledging the message */
+ message->your_ref = message->my_ref;
+ error = xwimp_send_message(wimp_USER_MESSAGE_ACKNOWLEDGE,
+ message, message->sender);
+ if (error) {
+ LOG(("xwimp_send_message: 0x%x:%s", error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
+ }
+ }
+}
+
+
/**
- * Initialise the gui (RISC OS specific part).
+ * Handle WindowInfo message (part of the iconising protocol)
+ *
+ * \param message WindowInfo message from the Iconiser
*/
+static void ro_msg_window_info(wimp_message *message)
+{
+ wimp_full_message_window_info *wi;
+ struct gui_window *g;
-static void gui_init(int argc, char** argv)
+ /* allow the user to turn off thumbnail icons */
+ if (!nsoption_bool(thumbnail_iconise))
+ return;
+
+ wi = (wimp_full_message_window_info*)message;
+ g = ro_gui_window_lookup(wi->w);
+
+ /* ic_<task name> will suffice for our other windows */
+ if (g) {
+ ro_gui_window_iconise(g, wi);
+ ro_gui_dialog_close_persistent(wi->w);
+ }
+}
+
+
+/**
+ * Get screen properties following a mode change.
+ */
+static void ro_gui_get_screen_properties(void)
+{
+ static const ns_os_vdu_var_list vars = {
+ os_MODEVAR_XWIND_LIMIT,
+ {
+ os_MODEVAR_YWIND_LIMIT,
+ os_MODEVAR_XEIG_FACTOR,
+ os_MODEVAR_YEIG_FACTOR,
+ os_VDUVAR_END_LIST
+ }
+ };
+ os_error *error;
+ int vals[4];
+
+ error = xos_read_vdu_variables(PTR_OS_VDU_VAR_LIST(&vars), vals);
+ if (error) {
+ LOG(("xos_read_vdu_variables: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("MiscError", error->errmess);
+ return;
+ }
+ screen_info.width = (vals[0] + 1) << vals[2];
+ screen_info.height = (vals[1] + 1) << vals[3];
+}
+
+
+/**
+ * Warn the user if Inet$Resolvers is not set.
+ */
+static void ro_gui_check_resolvers(void)
+{
+ char *resolvers;
+ resolvers = getenv("Inet$Resolvers");
+ if (resolvers && resolvers[0]) {
+ LOG(("Inet$Resolvers '%s'", resolvers));
+ } else {
+ LOG(("Inet$Resolvers not set or empty"));
+ warn_user("Resolvers", 0);
+ }
+}
+
+
+/**
+ * Initialise the RISC OS specific GUI.
+ *
+ * \param argc The number of command line arguments.
+ * \param argv The string vector of command line arguments.
+ */
+static nserror gui_init(int argc, char** argv)
{
struct {
void (*sigabrt)(int);
@@ -417,7 +1101,9 @@ static void gui_init(int argc, char** argv)
int length;
char *nsdir_temp;
byte *base;
- nserror err;
+ nsurl *url;
+ nserror ret;
+ bool open_window;
/* re-enable all FPU exceptions/traps except inexact operations,
* which we're not interested in, and underflow which is incorrectly
@@ -540,27 +1226,35 @@ static void gui_init(int argc, char** argv)
die(error->errmess);
}
- err = treeview_init(12);
- if (err != NSERROR_OK) {
+ ret = treeview_init(12);
+ if (ret != NSERROR_OK) {
die("Failed to initialise treeview");
}
/* Initialise themes before dialogs */
ro_gui_theme_initialise();
+
/* Initialise dialog windows (must be after UI sprites are loaded) */
ro_gui_dialog_init();
+
/* Initialise download window */
ro_gui_download_init();
+
/* Initialise menus */
ro_gui_menu_init();
+
/* Initialise query windows */
ro_gui_query_init();
+
/* Initialise the history subsystem */
ro_gui_history_init();
+
/* Initialise toolbars */
ro_toolbar_init();
+
/* Initialise url bar module */
ro_gui_url_bar_init();
+
/* Initialise browser windows */
ro_gui_window_initialise();
@@ -572,89 +1266,84 @@ static void gui_init(int argc, char** argv)
/* Finally, check Inet$Resolvers for sanity */
ro_gui_check_resolvers();
-}
-/**
- * Create intermediate directories for Choices and User Data files
- */
-void ro_gui_create_dirs(void)
-{
- char buf[256];
- char *path;
-
- /* Choices */
- path = getenv("NetSurf$ChoicesSave");
- if (!path)
- die("Failed to find NetSurf Choices save path");
-
- snprintf(buf, sizeof(buf), "%s", path);
- ro_gui_create_dir(buf);
-
- /* URL */
- snprintf(buf, sizeof(buf), "%s", nsoption_charp(url_save));
- ro_gui_create_dir(buf);
+ /* certificate verification window */
+ ro_gui_cert_postinitialise();
- /* Hotlist */
- snprintf(buf, sizeof(buf), "%s", nsoption_charp(hotlist_save));
- ro_gui_create_dir(buf);
+ /* hotlist window */
+ ro_gui_hotlist_postinitialise();
- /* Recent */
- snprintf(buf, sizeof(buf), "%s", nsoption_charp(recent_save));
- ro_gui_create_dir(buf);
+ /* global history window */
+ ro_gui_global_history_postinitialise();
- /* Theme */
- snprintf(buf, sizeof(buf), "%s", nsoption_charp(theme_save));
- ro_gui_create_dir(buf);
- /* and the final directory part (as theme_save is a directory) */
- xosfile_create_dir(buf, 0);
-}
+ /* cookies window */
+ ro_gui_cookies_postinitialise();
+ open_window = nsoption_bool(open_browser_at_startup);
-/**
- * Create directory structure for a path
- *
- * Given a path of x.y.z directories x and x.y will be created
- *
- * \param path the directory path to create
- */
-void ro_gui_create_dir(char *path)
-{
- char *cur = path;
- while ((cur = strchr(cur, '.'))) {
- *cur = '\0';
- xosfile_create_dir(path, 0);
- *cur++ = '.';
+ /* parse command-line arguments */
+ if (argc == 2) {
+ LOG(("parameters: '%s'", argv[1]));
+ /* this is needed for launching URI files */
+ if (strcasecmp(argv[1], "-nowin") == 0) {
+ return NSERROR_OK;
+ }
+ ret = nsurl_create(NETSURF_HOMEPAGE, &url);
}
-}
-
+ else if (argc == 3) {
+ LOG(("parameters: '%s' '%s'", argv[1], argv[2]));
+ open_window = true;
-/**
- * Choose the language to use.
- */
+ /* HTML files */
+ if (strcasecmp(argv[1], "-html") == 0) {
+ ret = netsurf_path_to_nsurl(argv[2], &url);
+ }
+ /* URL files */
+ else if (strcasecmp(argv[1], "-urlf") == 0) {
+ char *urlf = ro_gui_url_file_parse(argv[2]);
+ if (!urlf) {
+ LOG(("allocation failed"));
+ die("Insufficient memory for URL");
+ }
+ ret = nsurl_create(urlf, &url);
+ free(urlf);
+ }
+ /* ANT URL Load */
+ else if (strcasecmp(argv[1], "-url") == 0) {
+ ret = nsurl_create(argv[2], &url);
+ }
+ /* Unknown => exit here. */
+ else {
+ LOG(("Unknown parameters: '%s' '%s'",
+ argv[1], argv[2]));
+ return NSERROR_BAD_PARAMETER;
+ }
+ }
+ /* get user's homepage (if configured) */
+ else if (nsoption_charp(homepage_url) &&
+ nsoption_charp(homepage_url)[0]) {
+ ret = nsurl_create(nsoption_charp(homepage_url), &url);
+ }
+ /* default homepage */
+ else {
+ ret = nsurl_create(NETSURF_HOMEPAGE, &url);
+ }
-void ro_gui_choose_language(void)
-{
- char path[40];
+ /* check for url creation error */
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
- /* if option_language exists and is valid, use that */
- if (nsoption_charp(language)) {
- if (2 < strlen(nsoption_charp(language)))
- nsoption_charp(language)[2] = 0;
- sprintf(path, "NetSurf:Resources.%s", nsoption_charp(language));
- if (is_dir(path)) {
- nsoption_setnull_charp(accept_language,
- strdup(nsoption_charp(language)));
- return;
- }
- nsoption_set_charp(language, NULL);
+ if (open_window) {
+ ret = browser_window_create(BW_CREATE_HISTORY,
+ url,
+ NULL,
+ NULL,
+ NULL);
}
+ nsurl_unref(url);
- nsoption_set_charp(language, strdup(ro_gui_default_language()));
- if (nsoption_charp(language) == NULL)
- die("Out of memory");
- nsoption_set_charp(accept_language, strdup(nsoption_charp(language)));
- if (nsoption_charp(accept_language) == NULL)
- die("Out of memory");
+ return ret;
}
@@ -664,7 +1353,6 @@ void ro_gui_choose_language(void)
* RISC OS has no standard way of determining which language the user prefers.
* We have to guess from the 'Country' setting.
*/
-
const char *ro_gui_default_language(void)
{
char path[40];
@@ -704,222 +1392,173 @@ const char *ro_gui_default_language(void)
/**
- * Warn the user if Inet$Resolvers is not set.
- */
-
-void ro_gui_check_resolvers(void)
-{
- char *resolvers;
- resolvers = getenv("Inet$Resolvers");
- if (resolvers && resolvers[0]) {
- LOG(("Inet$Resolvers '%s'", resolvers));
- } else {
- LOG(("Inet$Resolvers not set or empty"));
- warn_user("Resolvers", 0);
- }
-}
-
-
-/**
- * Last-minute gui init, after all other modules have initialised.
+ * Create a nsurl from a RISC OS pathname.
+ *
+ * Perform the necessary operations on a path to generate a nsurl.
+ *
+ * @param[in] path The RISC OS pathname to convert.
+ * @param[out] url pointer to recive the nsurl, The returned url must be
+ * unreferenced by the caller.
+ * @return NSERROR_OK and the url is placed in \a url or error code on faliure.
*/
-
-static void gui_init2(int argc, char** argv)
+static nserror ro_path_to_nsurl(const char *path, struct nsurl **url_out)
{
- char *url = 0;
- bool open_window = nsoption_bool(open_browser_at_startup);
-
- /* Complete initialisation of the treeview modules. */
-
- /* certificate verification window */
- ro_gui_cert_postinitialise();
+ int spare;
+ char *canonical_path; /* canonicalised RISC OS path */
+ char *unix_path; /* unix path */
+ char *escurl;
+ os_error *error;
+ nserror ret;
+ int urllen;
+ char *url; /* resulting url */
- /* hotlist window */
- ro_gui_hotlist_postinitialise();
+ /* calculate the canonical risc os path */
+ error = xosfscontrol_canonicalise_path(path, 0, 0, 0, 0, &spare);
+ if (error) {
+ LOG(("xosfscontrol_canonicalise_path failed: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("PathToURL", error->errmess);
+ return NSERROR_NOT_FOUND;
+ }
- /* global history window */
- ro_gui_global_history_postinitialise();
+ canonical_path = malloc(1 - spare);
+ if (canonical_path == NULL) {
+ free(canonical_path);
+ return NSERROR_NOMEM;
+ }
- /* cookies window */
- ro_gui_cookies_postinitialise();
+ error = xosfscontrol_canonicalise_path(path, canonical_path, 0, 0, 1 - spare, 0);
+ if (error) {
+ LOG(("xosfscontrol_canonicalise_path failed: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("PathToURL", error->errmess);
+ free(canonical_path);
+ return NSERROR_NOT_FOUND;
+ }
+ /* create a unix path from teh cananocal risc os one */
+ unix_path = __unixify(canonical_path, __RISCOSIFY_NO_REVERSE_SUFFIX, NULL, 0, 0);
- /* parse command-line arguments */
- if (argc == 2) {
- LOG(("parameters: '%s'", argv[1]));
- /* this is needed for launching URI files */
- if (strcasecmp(argv[1], "-nowin") == 0)
- open_window = false;
+ if (unix_path == NULL) {
+ LOG(("__unixify failed: %s", canonical_path));
+ free(canonical_path);
+ return NSERROR_BAD_PARAMETER;
}
- else if (argc == 3) {
- LOG(("parameters: '%s' '%s'", argv[1], argv[2]));
- open_window = true;
+ free(canonical_path);
- /* HTML files */
- if (strcasecmp(argv[1], "-html") == 0) {
- url = path_to_url(argv[2]);
- if (!url) {
- LOG(("malloc failed"));
- die("Insufficient memory for URL");
- }
- }
- /* URL files */
- else if (strcasecmp(argv[1], "-urlf") == 0) {
- url = ro_gui_url_file_parse(argv[2]);
- if (!url) {
- LOG(("malloc failed"));
- die("Insufficient memory for URL");
- }
- }
- /* ANT URL Load */
- else if (strcasecmp(argv[1], "-url") == 0) {
- url = strdup(argv[2]);
- if (!url) {
- LOG(("malloc failed"));
- die("Insufficient memory for URL");
- }
- }
- /* Unknown => exit here. */
- else {
- LOG(("Unknown parameters: '%s' '%s'",
- argv[1], argv[2]));
- return;
- }
- }
- /* get user's homepage (if configured) */
- else if (nsoption_charp(homepage_url) && nsoption_charp(homepage_url)[0]) {
- url = calloc(strlen(nsoption_charp(homepage_url)) + 5, sizeof(char));
- if (!url) {
- LOG(("malloc failed"));
- die("Insufficient memory for URL");
- }
- sprintf(url, "%s", nsoption_charp(homepage_url));
- }
- /* default homepage */
- else {
- url = strdup(NETSURF_HOMEPAGE);
- if (!url) {
- LOG(("malloc failed"));
- die("Insufficient memory for URL");
- }
+ /* convert the unix path into a url */
+ urllen = strlen(unix_path) + FILE_SCHEME_PREFIX_LEN + 1;
+ url = malloc(urllen);
+ if (url == NULL) {
+ LOG(("Unable to allocate url"));
+ free(unix_path);
+ return NSERROR_NOMEM;
}
- if (open_window) {
- nsurl *urlns;
- nserror errorns;
-
- errorns = nsurl_create(url, &urlns);
- if (errorns == NSERROR_OK) {
- errorns = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
- urlns,
- NULL,
- NULL,
- NULL);
- nsurl_unref(urlns);
- }
- if (errorns != NSERROR_OK) {
- warn_user(messages_get_errorcode(errorns), 0);
- }
+ if (*unix_path == '/') {
+ snprintf(url, urllen, "%s%s", FILE_SCHEME_PREFIX, unix_path + 1);
+ } else {
+ snprintf(url, urllen, "%s%s", FILE_SCHEME_PREFIX, unix_path);
}
+ free(unix_path);
+ /* We don't want '/' to be escaped. */
+ ret = url_escape(url, FILE_SCHEME_PREFIX_LEN, false, "/", &escurl);
free(url);
-}
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
-/**
- * Ensures output logging stream is correctly configured
- */
-static bool nslog_stream_configure(FILE *fptr)
-{
- /* set log stream to be non-buffering */
- setbuf(fptr, NULL);
+ ret = nsurl_create(escurl, url_out);
+ free(escurl);
- return true;
+ return ret;
}
-/** Normal entry point from OS */
-int main(int argc, char** argv)
+
+/**
+ * Create a path from a nsurl using posix file handling.
+ *
+ * @parm[in] url The url to encode.
+ * @param[out] path_out A string containing the result path which should
+ * be freed by the caller.
+ * @return NSERROR_OK and the path is written to \a path or error code
+ * on faliure.
+ */
+static nserror ro_nsurl_to_path(struct nsurl *url, char **path_out)
{
- char path[40];
- int length;
- char logging_env[2];
- os_var_type type;
- int used = -1; /* slightly better with older OSLib versions */
- os_error *error;
- nserror ret;
+ lwc_string *urlpath;
+ char *unpath;
+ char *path;
+ bool match;
+ lwc_string *scheme;
+ nserror res;
+ char *r;
- /* Consult NetSurf$Logging environment variable to decide if logging
- * is required. */
- error = xos_read_var_val_size("NetSurf$Logging", 0, os_VARTYPE_STRING,
- &used, NULL, &type);
- if (error != NULL || type != os_VARTYPE_STRING || used != -2) {
- verbose_log = true;
- } else {
- error = xos_read_var_val("NetSurf$Logging", logging_env,
- sizeof(logging_env), 0, os_VARTYPE_STRING,
- &used, NULL, &type);
- if (error != NULL || logging_env[0] != '0') {
- verbose_log = true;
- } else {
- verbose_log = false;
- }
+ if ((url == NULL) || (path_out == NULL)) {
+ return NSERROR_BAD_PARAMETER;
}
- /* initialise logging. Not fatal if it fails but not much we
- * can do about it either.
- */
- nslog_init(nslog_stream_configure, &argc, argv);
+ scheme = nsurl_get_component(url, NSURL_SCHEME);
- /* user options setup */
- ret = nsoption_init(set_defaults, &nsoptions, &nsoptions_default);
- if (ret != NSERROR_OK) {
- die("Options failed to initialise");
+ if (lwc_string_caseless_isequal(scheme, corestring_lwc_file,
+ &match) != lwc_error_ok)
+ {
+ return NSERROR_BAD_PARAMETER;
+ }
+ lwc_string_unref(scheme);
+ if (match == false) {
+ return NSERROR_BAD_PARAMETER;
}
- nsoption_read("NetSurf:Choices", NULL);
- nsoption_commandline(&argc, argv, NULL);
-
- /* Choose the interface language to use */
- ro_gui_choose_language();
- /* select language-specific Messages */
- if (((length = snprintf(path,
- sizeof(path),
- "NetSurf:Resources.%s.Messages",
- nsoption_charp(language))) < 0) ||
- (length >= (int)sizeof(path))) {
- die("Failed to locate Messages resource.");
+ urlpath = nsurl_get_component(url, NSURL_PATH);
+ if (urlpath == NULL) {
+ return NSERROR_BAD_PARAMETER;
}
- /* common initialisation */
- ret = netsurf_init(path);
- if (ret != NSERROR_OK) {
- die("NetSurf failed to initialise");
+ res = url_unescape(lwc_string_data(urlpath), &unpath);
+ lwc_string_unref(urlpath);
+ if (res != NSERROR_OK) {
+ return res;
}
- artworks_init();
- draw_init();
- sprite_init();
+ /* RISC OS path should not be more than 100 characters longer */
+ path = malloc(strlen(unpath) + 100);
+ if (path == NULL) {
+ free(unpath);
+ return NSERROR_NOMEM;
+ }
- /* Load some extra RISC OS specific Messages */
- messages_load("NetSurf:Resources.LangNames");
+ r = __riscosify(unpath, 0, __RISCOSIFY_NO_SUFFIX,
+ path, strlen(unpath) + 100, 0);
+ free(unpath);
+ if (r == NULL) {
+ free(path);
+ return NSERROR_NOMEM;
+ }
- gui_init(argc, argv);
+ *path_out = path;
- gui_init2(argc, argv);
+ return NSERROR_OK;
+}
- netsurf_main_loop();
- netsurf_exit();
+/**
+ * Ensures output logging stream is correctly configured.
+ */
+static bool nslog_stream_configure(FILE *fptr)
+{
+ /* set log stream to be non-buffering */
+ setbuf(fptr, NULL);
- return 0;
+ return true;
}
/**
* Close down the gui (RISC OS).
*/
-
-void gui_quit(void)
+static void gui_quit(void)
{
urldb_save_cookies(nsoption_charp(cookie_jar));
urldb_save(nsoption_charp(url_save));
@@ -937,237 +1576,9 @@ void gui_quit(void)
/**
- * Handles a signal
- */
-
-void ro_gui_signal(int sig)
-{
- static const os_error error = { 1, "NetSurf has detected a serious "
- "error and must exit. Please submit a bug report, "
- "attaching the browser log file." };
- os_colour old_sand, old_glass;
-
- ro_gui_cleanup();
-
- xhourglass_on();
- xhourglass_colours(0x0000ffff, 0x000000ff, &old_sand, &old_glass);
- nsoption_dump(stderr, NULL);
- /*rufl_dump_state();*/
-
-#ifndef __ELF__
- /* save WimpSlot and DA to files if NetSurf$CoreDump exists */
- int used;
- xos_read_var_val_size("NetSurf$CoreDump", 0, 0, &used, 0, 0);
- if (used) {
- int curr_slot;
- xwimp_slot_size(-1, -1, &curr_slot, 0, 0);
- LOG(("saving WimpSlot, size 0x%x", curr_slot));
- xosfile_save("$.NetSurf_Slot", 0x8000, 0,
- (byte *) 0x8000,
- (byte *) 0x8000 + curr_slot);
-
- if (__dynamic_num != -1) {
- int size;
- byte *base_address;
- xosdynamicarea_read(__dynamic_num, &size,
- &base_address, 0, 0, 0, 0, 0);
- LOG(("saving DA %i, base %p, size 0x%x",
- __dynamic_num,
- base_address, size));
- xosfile_save("$.NetSurf_DA",
- (bits) base_address, 0,
- base_address,
- base_address + size);
- }
- }
-#else
- /* Save WimpSlot and UnixLib managed DAs when UnixEnv$coredump
- * defines a coredump directory. */
- _kernel_oserror *err = __unixlib_write_coredump (NULL);
- if (err != NULL)
- LOG(("Coredump failed: %s", err->errmess));
-#endif
-
- xhourglass_colours(old_sand, old_glass, 0, 0);
- xhourglass_off();
-
- __write_backtrace(sig);
-
- xwimp_report_error_by_category(&error,
- wimp_ERROR_BOX_GIVEN_CATEGORY |
- wimp_ERROR_BOX_CATEGORY_ERROR <<
- wimp_ERROR_BOX_CATEGORY_SHIFT,
- "NetSurf", "!netsurf",
- (osspriteop_area *) 1, "Quit", 0);
- xos_cli("Filer_Run <Wimp$ScrapDir>.WWW.NetSurf.Log");
-
- _Exit(sig);
-}
-
-
-/**
- * Ensures the gui exits cleanly.
- */
-
-void ro_gui_cleanup(void)
-{
- ro_gui_buffer_close();
- xhourglass_off();
- /* Uninstall NetSurf-specific fonts */
- xos_cli("FontRemove NetSurf:Resources.Fonts.");
-}
-
-
-/**
- * Poll the OS for events (RISC OS).
- *
- * \param active return as soon as possible
- */
-
-void gui_poll(bool active)
-{
- wimp_event_no event;
- wimp_block block;
- const wimp_poll_flags mask = wimp_MASK_LOSE | wimp_MASK_GAIN |
- wimp_SAVE_FP;
- os_t track_poll_offset;
-
- /* Poll wimp. */
- xhourglass_off();
- track_poll_offset = ro_mouse_poll_interval();
- if (active) {
- event = wimp_poll(mask, &block, 0);
- } else if (sched_active || (track_poll_offset > 0) ||
- browser_reformat_pending) {
- os_t t = os_read_monotonic_time();
-
- if (track_poll_offset > 0)
- t += track_poll_offset;
- else
- t += 10;
-
- if (sched_active && (sched_time - t) < 0)
- t = sched_time;
-
- event = wimp_poll_idle(mask, &block, t, 0);
- } else {
- event = wimp_poll(wimp_MASK_NULL | mask, &block, 0);
- }
-
- xhourglass_on();
- gui_last_poll = clock();
- ro_gui_handle_event(event, &block);
-
- /* Only run scheduled callbacks on a null poll
- * We cannot do this in the null event handler, as that may be called
- * from gui_multitask(). Scheduled callbacks must only be run from the
- * top-level.
- */
- if (event == wimp_NULL_REASON_CODE)
- schedule_run();
-
- ro_gui_window_update_boxes();
-
- if (browser_reformat_pending && event == wimp_NULL_REASON_CODE)
- ro_gui_window_process_reformats();
-}
-
-
-/**
- * Process a Wimp_Poll event.
- *
- * \param event wimp event number
- * \param block parameter block
- */
-
-void ro_gui_handle_event(wimp_event_no event, wimp_block *block)
-{
- switch (event) {
- case wimp_NULL_REASON_CODE:
- ro_gui_throb();
- ro_mouse_poll();
- break;
-
- case wimp_REDRAW_WINDOW_REQUEST:
- ro_gui_wimp_event_redraw_window(&block->redraw);
- break;
-
- case wimp_OPEN_WINDOW_REQUEST:
- ro_gui_open_window_request(&block->open);
- break;
-
- case wimp_CLOSE_WINDOW_REQUEST:
- ro_gui_close_window_request(&block->close);
- break;
-
- case wimp_POINTER_LEAVING_WINDOW:
- ro_mouse_pointer_leaving_window(&block->leaving);
- break;
-
- case wimp_POINTER_ENTERING_WINDOW:
- ro_gui_wimp_event_pointer_entering_window(&block->entering);
- break;
-
- case wimp_MOUSE_CLICK:
- ro_gui_wimp_event_mouse_click(&block->pointer);
- break;
-
- case wimp_USER_DRAG_BOX:
- ro_mouse_drag_end(&block->dragged);
- break;
-
- case wimp_KEY_PRESSED:
- ro_gui_keypress(&(block->key));
- break;
-
- case wimp_MENU_SELECTION:
- ro_gui_menu_selection(&(block->selection));
- break;
-
- /* Scroll requests fall back to a generic handler because we
- * might get these events for any window from a scroll-wheel.
- */
-
- case wimp_SCROLL_REQUEST:
- if (!ro_gui_wimp_event_scroll_window(&(block->scroll)))
- ro_gui_scroll(&(block->scroll));
- break;
-
- case wimp_USER_MESSAGE:
- case wimp_USER_MESSAGE_RECORDED:
- case wimp_USER_MESSAGE_ACKNOWLEDGE:
- ro_gui_user_message(event, &(block->message));
- break;
- }
-}
-
-
-/**
- * Handle Open_Window_Request events.
- */
-
-void ro_gui_open_window_request(wimp_open *open)
-{
- os_error *error;
-
- if (ro_gui_wimp_event_open_window(open))
- return;
-
- error = xwimp_open_window(open);
- if (error) {
- LOG(("xwimp_open_window: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("WimpError", error->errmess);
- return;
- }
-}
-
-
-/**
* Handle Close_Window_Request events.
*/
-
-void ro_gui_close_window_request(wimp_close *close)
+static void ro_gui_close_window_request(wimp_close *close)
{
if (ro_gui_alt_pressed())
ro_gui_window_close_all();
@@ -1180,9 +1591,8 @@ void ro_gui_close_window_request(wimp_close *close)
/**
- * Handle Key_Pressed events.
+ * Handle key press paste callback.
*/
-
static void ro_gui_keypress_cb(void *pw)
{
wimp_key *key = (wimp_key *) pw;
@@ -1199,14 +1609,20 @@ static void ro_gui_keypress_cb(void *pw)
free(key);
}
-void ro_gui_keypress(wimp_key *key)
+
+/**
+ * Handle gui keypress.
+ */
+static void ro_gui_keypress(wimp_key *key)
{
if (key->c == wimp_KEY_ESCAPE &&
(gui_current_drag_type == GUI_DRAG_SAVE ||
gui_current_drag_type == GUI_DRAG_DOWNLOAD_SAVE)) {
- /* Allow Escape key to be used for cancelling a drag save
- (easier than finding somewhere safe to abort the drag) */
+ /* Allow Escape key to be used for cancelling a drag
+ * save (easier than finding somewhere safe to abort
+ * the drag)
+ */
ro_gui_drag_box_cancel();
gui_current_drag_type = GUI_DRAG_NONE;
} else if (key->c == 22 /* Ctrl-V */) {
@@ -1233,7 +1649,7 @@ void ro_gui_keypress(wimp_key *key)
/**
* Handle the three User_Message events.
*/
-void ro_gui_user_message(wimp_event_no event, wimp_message *message)
+static void ro_gui_user_message(wimp_event_no event, wimp_message *message)
{
/* attempt automatic routing */
if (ro_message_handle_message(event, message))
@@ -1263,7 +1679,8 @@ void ro_gui_user_message(wimp_event_no event, wimp_message *message)
break;
case message_MENUS_DELETED:
- ro_gui_menu_closed();
+ ro_gui_menu_message_deleted((wimp_message_menus_deleted *)
+ &message->data);
break;
case message_CLAIM_ENTITY:
@@ -1367,769 +1784,169 @@ void ro_gui_user_message(wimp_event_no event, wimp_message *message)
/**
- * Ensure that the filename in a data transfer message is NUL terminated
- * (some applications, especially BASIC programs use CR)
+ * Process a Wimp_Poll event.
*
- * \param message message to be corrected
- */
-
-void ro_msg_terminate_filename(wimp_full_message_data_xfer *message)
-{
- const char *ep = (char*)message + message->size;
- char *p = message->file_name;
-
- if ((size_t)message->size >= sizeof(*message))
- ep = (char*)message + sizeof(*message) - 1;
-
- while (p < ep && *p >= ' ') p++;
- *p = '\0';
-}
-
-
-/**
- * Handle Message_DataLoad (file dragged in).
+ * \param event wimp event number
+ * \param block parameter block
*/
-
-void ro_msg_dataload(wimp_message *message)
+static void ro_gui_handle_event(wimp_event_no event, wimp_block *block)
{
- int file_type = message->data.data_xfer.file_type;
- int tree_file_type = file_type;
- char *urltxt = NULL;
- char *title = NULL;
- struct gui_window *g;
- os_error *oserror;
- nsurl *url;
- nserror error;
-
- g = ro_gui_window_lookup(message->data.data_xfer.w);
- if (g) {
- if (ro_gui_window_dataload(g, message))
- return;
- }
- else {
- g = ro_gui_toolbar_lookup(message->data.data_xfer.w);
- if (g && ro_gui_toolbar_dataload(g, message))
- return;
- }
-
- switch (file_type) {
- case FILETYPE_ACORN_URI:
- urltxt = ro_gui_uri_file_parse(message->data.data_xfer.file_name,
- &title);
- tree_file_type = 0xfaf;
- break;
- case FILETYPE_ANT_URL:
- urltxt = ro_gui_url_file_parse(message->data.data_xfer.file_name);
- tree_file_type = 0xfaf;
- break;
- case FILETYPE_IEURL:
- urltxt = ro_gui_ieurl_file_parse(message->data.data_xfer.file_name);
- tree_file_type = 0xfaf;
+ switch (event) {
+ case wimp_NULL_REASON_CODE:
+ ro_gui_throb();
+ ro_mouse_poll();
break;
- case FILETYPE_HTML:
- case FILETYPE_JNG:
- case FILETYPE_CSS:
- case FILETYPE_MNG:
- case FILETYPE_GIF:
- case FILETYPE_BMP:
- case FILETYPE_ICO:
- case osfile_TYPE_DRAW:
- case FILETYPE_PNG:
- case FILETYPE_JPEG:
- case osfile_TYPE_SPRITE:
- case osfile_TYPE_TEXT:
- case FILETYPE_ARTWORKS:
- case FILETYPE_SVG:
- /* display the actual file */
- urltxt = path_to_url(message->data.data_xfer.file_name);
+ case wimp_REDRAW_WINDOW_REQUEST:
+ ro_gui_wimp_event_redraw_window(&block->redraw);
break;
- default:
- return;
- }
-
- if (!urltxt)
- /* error has already been reported by one of the
- * functions called above */
- return;
-
-
- error = nsurl_create(urltxt, &url);
- if (error == NSERROR_OK) {
- if (g) {
- error = browser_window_navigate(g->bw,
- url,
- NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
- NULL,
- NULL,
- NULL);
-
-#ifdef DROPURLHOTLIST /** @todo This was commented out should it be removed? */
- } else if (ro_gui_hotlist_check_window(
- message->data.data_xfer.w)) {
- /* Drop URL into hotlist */
- ro_gui_hotlist_url_drop(message, urltxt);
-#endif
- } else {
- error = browser_window_create(
- BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
- url,
- NULL,
- NULL,
- NULL);
- }
- nsurl_unref(url);
- }
- if (error != NSERROR_OK) {
- warn_user(messages_get_errorcode(error), 0);
- }
-
- free(urltxt);
-
- /* send DataLoadAck */
- message->action = message_DATA_LOAD_ACK;
- message->your_ref = message->my_ref;
- oserror = xwimp_send_message(wimp_USER_MESSAGE, message,
- message->sender);
- if (oserror) {
- LOG(("xwimp_send_message: 0x%x: %s",
- oserror->errnum, oserror->errmess));
- warn_user("WimpError", oserror->errmess);
- return;
- }
-
-}
-
-
-/**
- * Parse an Acorn URI file.
- *
- * \param file_name file to read
- * \param uri_title pointer to receive title data, or NULL for no data
- * \return URL from file, or 0 on error and error reported
- */
-
-char *ro_gui_uri_file_parse(const char *file_name, char **uri_title)
-{
- /* See the "Acorn URI Handler Functional Specification" for the
- * definition of the URI file format. */
- char line[400];
- char *url = NULL;
- FILE *fp;
-
- *uri_title = NULL;
- fp = fopen(file_name, "rb");
- if (!fp) {
- LOG(("fopen(\"%s\", \"rb\"): %i: %s",
- file_name, errno, strerror(errno)));
- warn_user("LoadError", strerror(errno));
- return 0;
- }
-
- /* "URI" */
- if (!ro_gui_uri_file_parse_line(fp, line) || strcmp(line, "URI") != 0)
- goto uri_syntax_error;
-
- /* version */
- if (!ro_gui_uri_file_parse_line(fp, line) ||
- strspn(line, "0123456789") != strlen(line))
- goto uri_syntax_error;
-
- /* URI */
- if (!ro_gui_uri_file_parse_line(fp, line))
- goto uri_syntax_error;
- url = strdup(line);
- if (!url) {
- warn_user("NoMemory", 0);
- fclose(fp);
- return 0;
- }
-
- /* title */
- if (!ro_gui_uri_file_parse_line(fp, line))
- goto uri_syntax_error;
- if (uri_title && line[0] && ((line[0] != '*') || line[1])) {
- *uri_title = strdup(line);
- if (!*uri_title) /* non-fatal */
- warn_user("NoMemory", 0);
- }
- fclose(fp);
-
- return url;
-
-uri_syntax_error:
- fclose(fp);
- warn_user("URIError", 0);
- return 0;
-}
-
-
-/**
- * Read a "line" from an Acorn URI file.
- *
- * \param fp file pointer to read from
- * \param b buffer for line, size 400 bytes
- * \return true on success, false on EOF
- */
-
-bool ro_gui_uri_file_parse_line(FILE *fp, char *b)
-{
- int c;
- unsigned int i = 0;
-
- c = getc(fp);
- if (c == EOF)
- return false;
-
- /* skip comment lines */
- while (c == '#') {
- do { c = getc(fp); } while (c != EOF && 32 <= c);
- if (c == EOF)
- return false;
- do { c = getc(fp); } while (c != EOF && c < 32);
- if (c == EOF)
- return false;
- }
-
- /* read "line" */
- do {
- if (i == 399)
- return false;
- b[i++] = c;
- c = getc(fp);
- } while (c != EOF && 32 <= c);
-
- /* skip line ending control characters */
- while (c != EOF && c < 32)
- c = getc(fp);
-
- if (c != EOF)
- ungetc(c, fp);
-
- b[i] = 0;
- return true;
-}
-
-
-/**
- * Parse an ANT URL file.
- *
- * \param file_name file to read
- * \return URL from file, or 0 on error and error reported
- */
-
-char *ro_gui_url_file_parse(const char *file_name)
-{
- char line[400];
- char *url;
- FILE *fp;
-
- fp = fopen(file_name, "r");
- if (!fp) {
- LOG(("fopen(\"%s\", \"r\"): %i: %s",
- file_name, errno, strerror(errno)));
- warn_user("LoadError", strerror(errno));
- return 0;
- }
-
- if (!fgets(line, sizeof line, fp)) {
- if (ferror(fp)) {
- LOG(("fgets: %i: %s",
- errno, strerror(errno)));
- warn_user("LoadError", strerror(errno));
- } else
- warn_user("LoadError", messages_get("EmptyError"));
- fclose(fp);
- return 0;
- }
-
- fclose(fp);
-
- if (line[strlen(line) - 1] == '\n')
- line[strlen(line) - 1] = '\0';
-
- url = strdup(line);
- if (!url) {
- warn_user("NoMemory", 0);
- return 0;
- }
-
- return url;
-}
-
-
-/**
- * Parse an IEURL file.
- *
- * \param file_name file to read
- * \return URL from file, or 0 on error and error reported
- */
-
-char *ro_gui_ieurl_file_parse(const char *file_name)
-{
- char line[400];
- char *url = 0;
- FILE *fp;
-
- fp = fopen(file_name, "r");
- if (!fp) {
- LOG(("fopen(\"%s\", \"r\"): %i: %s",
- file_name, errno, strerror(errno)));
- warn_user("LoadError", strerror(errno));
- return 0;
- }
-
- while (fgets(line, sizeof line, fp)) {
- if (strncmp(line, "URL=", 4) == 0) {
- if (line[strlen(line) - 1] == '\n')
- line[strlen(line) - 1] = '\0';
- url = strdup(line + 4);
- if (!url) {
- fclose(fp);
- warn_user("NoMemory", 0);
- return 0;
- }
+ case wimp_OPEN_WINDOW_REQUEST:
+ ro_gui_open_window_request(&block->open);
break;
- }
- }
- if (ferror(fp)) {
- LOG(("fgets: %i: %s",
- errno, strerror(errno)));
- warn_user("LoadError", strerror(errno));
- fclose(fp);
- return 0;
- }
-
- fclose(fp);
-
- if (!url)
- warn_user("URIError", 0);
-
- return url;
-}
-
-
-/**
- * Handle Message_DataSave
- */
-
-void ro_msg_datasave(wimp_message *message)
-{
- wimp_full_message_data_xfer *dataxfer = (wimp_full_message_data_xfer*)message;
-
- /* remove ghost caret if drag-and-drop protocol was used */
-// ro_gui_selection_drag_reset();
-
- ro_msg_terminate_filename(dataxfer);
- if (ro_gui_selection_prepare_paste_datasave(dataxfer))
- return;
-
- switch (dataxfer->file_type) {
- case FILETYPE_ACORN_URI:
- case FILETYPE_ANT_URL:
- case FILETYPE_IEURL:
- case FILETYPE_HTML:
- case FILETYPE_JNG:
- case FILETYPE_CSS:
- case FILETYPE_MNG:
- case FILETYPE_GIF:
- case FILETYPE_BMP:
- case FILETYPE_ICO:
- case osfile_TYPE_DRAW:
- case FILETYPE_PNG:
- case FILETYPE_JPEG:
- case osfile_TYPE_SPRITE:
- case osfile_TYPE_TEXT:
- case FILETYPE_ARTWORKS:
- case FILETYPE_SVG: {
- os_error *error;
-
- dataxfer->your_ref = dataxfer->my_ref;
- dataxfer->size = offsetof(wimp_full_message_data_xfer, file_name) + 16;
- dataxfer->action = message_DATA_SAVE_ACK;
- dataxfer->est_size = -1;
- memcpy(dataxfer->file_name, "<Wimp$Scrap>", 13);
+ case wimp_CLOSE_WINDOW_REQUEST:
+ ro_gui_close_window_request(&block->close);
+ break;
- error = xwimp_send_message(wimp_USER_MESSAGE, (wimp_message*)dataxfer, message->sender);
- if (error) {
- LOG(("xwimp_send_message: 0x%x: %s", error->errnum, error->errmess));
- warn_user("WimpError", error->errmess);
- }
- }
- break;
- }
-}
+ case wimp_POINTER_LEAVING_WINDOW:
+ ro_mouse_pointer_leaving_window(&block->leaving);
+ break;
+ case wimp_POINTER_ENTERING_WINDOW:
+ ro_gui_wimp_event_pointer_entering_window(&block->entering);
+ break;
-/**
- * Handle Message_DataSaveAck.
- */
+ case wimp_MOUSE_CLICK:
+ ro_gui_wimp_event_mouse_click(&block->pointer);
+ break;
-void ro_msg_datasave_ack(wimp_message *message)
-{
- ro_msg_terminate_filename((wimp_full_message_data_xfer*)message);
+ case wimp_USER_DRAG_BOX:
+ ro_mouse_drag_end(&block->dragged);
+ break;
- if (ro_print_ack(message))
- return;
+ case wimp_KEY_PRESSED:
+ ro_gui_keypress(&(block->key));
+ break;
- switch (gui_current_drag_type) {
- case GUI_DRAG_DOWNLOAD_SAVE:
- ro_gui_download_datasave_ack(message);
+ case wimp_MENU_SELECTION:
+ ro_gui_menu_selection(&(block->selection));
break;
- case GUI_DRAG_SAVE:
- ro_gui_save_datasave_ack(message);
- gui_current_drag_type = GUI_DRAG_NONE;
+ /* Scroll requests fall back to a generic handler because we
+ * might get these events for any window from a scroll-wheel.
+ */
+
+ case wimp_SCROLL_REQUEST:
+ if (!ro_gui_wimp_event_scroll_window(&(block->scroll)))
+ ro_gui_scroll(&(block->scroll));
break;
- default:
+ case wimp_USER_MESSAGE:
+ case wimp_USER_MESSAGE_RECORDED:
+ case wimp_USER_MESSAGE_ACKNOWLEDGE:
+ ro_gui_user_message(event, &(block->message));
break;
}
-
- gui_current_drag_type = GUI_DRAG_NONE;
}
/**
- * Handle Message_DataOpen (double-click on file in the Filer).
+ * Poll the RISC OS wimp for events.
*/
-
-void ro_msg_dataopen(wimp_message *message)
+static void riscos_poll(bool active)
{
- int file_type = message->data.data_xfer.file_type;
- char *url = 0;
- size_t len;
- os_error *oserror;
- nsurl *urlns;
- nserror error;
+ wimp_event_no event;
+ wimp_block block;
+ const wimp_poll_flags mask = wimp_MASK_LOSE | wimp_MASK_GAIN | wimp_SAVE_FP;
+ os_t track_poll_offset;
- if (file_type == 0xb28) /* ANT URL file */
- url = ro_gui_url_file_parse(message->data.data_xfer.file_name);
- else if (file_type == 0xfaf) /* HTML file */
- url = path_to_url(message->data.data_xfer.file_name);
- else if (file_type == 0x1ba) /* IEURL file */
- url = ro_gui_ieurl_file_parse(message->
- data.data_xfer.file_name);
- else if (file_type == 0x2000) { /* application */
- len = strlen(message->data.data_xfer.file_name);
- if (len < 9 || strcmp(".!NetSurf",
- message->data.data_xfer.file_name + len - 9))
- return;
- if (nsoption_charp(homepage_url) &&
- nsoption_charp(homepage_url)[0]) {
- url = strdup(nsoption_charp(homepage_url));
+ /* Poll wimp. */
+ xhourglass_off();
+ track_poll_offset = ro_mouse_poll_interval();
+ if (sched_active || (track_poll_offset > 0)) {
+ os_t t = os_read_monotonic_time();
+
+ if (track_poll_offset > 0) {
+ t += track_poll_offset;
} else {
- url = strdup(NETSURF_HOMEPAGE);
+ t += 10;
}
- if (!url)
- warn_user("NoMemory", 0);
- } else
- return;
-
- /* send DataLoadAck */
- message->action = message_DATA_LOAD_ACK;
- message->your_ref = message->my_ref;
- oserror = xwimp_send_message(wimp_USER_MESSAGE, message, message->sender);
- if (oserror) {
- LOG(("xwimp_send_message: 0x%x: %s",
- oserror->errnum, oserror->errmess));
- warn_user("WimpError", oserror->errmess);
- return;
- }
-
- if (!url)
- /* error has already been reported by one of the
- * functions called above */
- return;
-
- error = nsurl_create(url, &urlns);
- free(url);
- if (error == NSERROR_OK) {
- /* create a new window with the file */
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
- urlns,
- NULL,
- NULL,
- NULL);
- nsurl_unref(urlns);
- }
- if (error != NSERROR_OK) {
- warn_user(messages_get_errorcode(error), 0);
- }
-}
-
-/**
- * Handle PreQuit message
- *
- * \param message PreQuit message from Wimp
- */
-
-void ro_msg_prequit(wimp_message *message)
-{
- if (!ro_gui_prequit()) {
- os_error *error;
-
- /* we're objecting to the close down */
- message->your_ref = message->my_ref;
- error = xwimp_send_message(wimp_USER_MESSAGE_ACKNOWLEDGE,
- message, message->sender);
- if (error) {
- LOG(("xwimp_send_message: 0x%x:%s", error->errnum, error->errmess));
- warn_user("WimpError", error->errmess);
+ if (sched_active && (sched_time - t) < 0) {
+ t = sched_time;
}
- }
-}
-
-
-/**
- * Handle SaveDesktop message
- *
- * \param message SaveDesktop message from Wimp
- */
-void ro_msg_save_desktop(wimp_message *message)
-{
- os_error *error;
-
- error = xosgbpb_writew(message->data.save_desktopw.file,
- (const byte*)"Run ", 4, NULL);
- if (!error) {
- error = xosgbpb_writew(message->data.save_desktopw.file,
- (const byte*)NETSURF_DIR, strlen(NETSURF_DIR), NULL);
- if (!error)
- error = xos_bputw('\n', message->data.save_desktopw.file);
+ event = wimp_poll_idle(mask, &block, t, 0);
+ } else {
+ event = wimp_poll(wimp_MASK_NULL | mask, &block, 0);
}
- if (error) {
- LOG(("xosgbpb_writew/xos_bputw: 0x%x:%s", error->errnum, error->errmess));
- warn_user("SaveError", error->errmess);
+ xhourglass_on();
+ gui_last_poll = clock();
+ ro_gui_handle_event(event, &block);
- /* we must cancel the save by acknowledging the message */
- message->your_ref = message->my_ref;
- error = xwimp_send_message(wimp_USER_MESSAGE_ACKNOWLEDGE,
- message, message->sender);
- if (error) {
- LOG(("xwimp_send_message: 0x%x:%s", error->errnum, error->errmess));
- warn_user("WimpError", error->errmess);
- }
+ /* Only run scheduled callbacks on a null poll
+ * We cannot do this in the null event handler, as that may be called
+ * from gui_multitask(). Scheduled callbacks must only be run from the
+ * top-level.
+ */
+ if (event == wimp_NULL_REASON_CODE) {
+ schedule_run();
}
-}
-
-/**
- * Handle WindowInfo message (part of the iconising protocol)
- *
- * \param message WindowInfo message from the Iconiser
- */
-
-void ro_msg_window_info(wimp_message *message)
-{
- wimp_full_message_window_info *wi;
- struct gui_window *g;
-
- /* allow the user to turn off thumbnail icons */
- if (!nsoption_bool(thumbnail_iconise))
- return;
-
- wi = (wimp_full_message_window_info*)message;
- g = ro_gui_window_lookup(wi->w);
-
- /* ic_<task name> will suffice for our other windows */
- if (g) {
- ro_gui_window_iconise(g, wi);
- ro_gui_dialog_close_persistent(wi->w);
- }
+ ro_gui_window_update_boxes();
}
/**
- * Convert a RISC OS pathname to a file: URL.
- *
- * \param path RISC OS pathname
- * \return URL, allocated on heap, or 0 on failure
+ * Handle Open_Window_Request events.
*/
-
-char *path_to_url(const char *path)
+void ro_gui_open_window_request(wimp_open *open)
{
- int spare;
- char *canonical_path; /* canonicalised RISC OS path */
- char *unix_path; /* unix path */
- char *escurl;
os_error *error;
- url_func_result url_err;
- int urllen;
- char *url; /* resulting url */
- /* calculate the canonical risc os path */
- error = xosfscontrol_canonicalise_path(path, 0, 0, 0, 0, &spare);
- if (error) {
- LOG(("xosfscontrol_canonicalise_path failed: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("PathToURL", error->errmess);
- return NULL;
- }
-
- canonical_path = malloc(1 - spare);
- if (canonical_path == NULL) {
- LOG(("malloc failed"));
- warn_user("NoMemory", 0);
- free(canonical_path);
- return NULL;
- }
+ if (ro_gui_wimp_event_open_window(open))
+ return;
- error = xosfscontrol_canonicalise_path(path, canonical_path, 0, 0, 1 - spare, 0);
+ error = xwimp_open_window(open);
if (error) {
- LOG(("xosfscontrol_canonicalise_path failed: 0x%x: %s",
+ LOG(("xwimp_open_window: 0x%x: %s",
error->errnum, error->errmess));
- warn_user("PathToURL", error->errmess);
- free(canonical_path);
- return NULL;
- }
-
- /* create a unix path from teh cananocal risc os one */
- unix_path = __unixify(canonical_path, __RISCOSIFY_NO_REVERSE_SUFFIX, NULL, 0, 0);
-
- if (unix_path == NULL) {
- LOG(("__unixify failed: %s", canonical_path));
- free(canonical_path);
- return NULL;
- }
- free(canonical_path);
-
- /* convert the unix path into a url */
- urllen = strlen(unix_path) + FILE_SCHEME_PREFIX_LEN + 1;
- url = malloc(urllen);
- if (url == NULL) {
- LOG(("Unable to allocate url"));
- free(unix_path);
- return NULL;
- }
-
- if (*unix_path == '/') {
- snprintf(url, urllen, "%s%s", FILE_SCHEME_PREFIX, unix_path + 1);
- } else {
- snprintf(url, urllen, "%s%s", FILE_SCHEME_PREFIX, unix_path);
- }
- free(unix_path);
-
- /* We don't want '/' to be escaped. */
- url_err = url_escape(url, FILE_SCHEME_PREFIX_LEN, false, "/", &escurl);
- free(url); url = NULL;
- if (url_err != URL_FUNC_OK) {
- LOG(("url_escape failed: %s", url));
- return NULL;
+ warn_user("WimpError", error->errmess);
+ return;
}
-
- return escurl;
}
/**
- * Convert a file: URL to a RISC OS pathname.
- *
- * \param url a file: URL
- * \return RISC OS pathname, allocated on heap, or 0 on failure
+ * source bounce callback.
*/
-
-char *url_to_path(const char *url)
+static void ro_gui_view_source_bounce(wimp_message *message)
{
- char *path;
char *filename;
- char *respath;
- url_func_result res; /* result from url routines */
- char *r;
-
- res = url_path(url, &path);
- if (res != URL_FUNC_OK) {
- warn_user("NoMemory", 0);
- return NULL;
- }
-
- res = url_unescape(path, &respath);
- free(path);
- if (res != URL_FUNC_OK) {
- return NULL;
- }
-
- /* RISC OS path should not be more than 100 characters longer */
- filename = malloc(strlen(respath) + 100);
- if (!filename) {
- free(respath);
- warn_user("NoMemory", 0);
- return NULL;
- }
-
- r = __riscosify(respath, 0, __RISCOSIFY_NO_SUFFIX,
- filename, strlen(respath) + 100, 0);
-
- free(respath);
- if (r == 0) {
- free(filename);
- LOG(("__riscosify failed"));
- return NULL;
- }
-
- return filename;
-}
-
-
-/**
- * Get screen properties following a mode change.
- */
-
-void ro_gui_get_screen_properties(void)
-{
- static const ns_os_vdu_var_list vars = {
- os_MODEVAR_XWIND_LIMIT,
- {
- os_MODEVAR_YWIND_LIMIT,
- os_MODEVAR_XEIG_FACTOR,
- os_MODEVAR_YEIG_FACTOR,
- os_VDUVAR_END_LIST
- }
- };
os_error *error;
- int vals[4];
+ char command[256];
- error = xos_read_vdu_variables(PTR_OS_VDU_VAR_LIST(&vars), vals);
+ /* run the file as text */
+ filename = ((wimp_full_message_data_xfer *)message)->file_name;
+ sprintf(command, "@RunType_FFF %s", filename);
+ error = xwimp_start_task(command, 0);
if (error) {
- LOG(("xos_read_vdu_variables: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("MiscError", error->errmess);
- return;
+ LOG(("xwimp_start_task failed: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
}
- screen_info.width = (vals[0] + 1) << vals[2];
- screen_info.height = (vals[1] + 1) << vals[3];
-}
-
-
-/**
- * Find screen size in OS units.
- */
-
-void ro_gui_screen_size(int *width, int *height)
-{
- *width = screen_info.width;
- *height = screen_info.height;
}
/**
* Send the source of a content to a text editor.
*/
-
void ro_gui_view_source(hlcache_handle *c)
{
os_error *error;
- char full_name[256];
- char *temp_name, *r;
+ char *temp_name;
wimp_full_message_data_xfer message;
int objtype;
bool done = false;
@@ -2150,8 +1967,7 @@ void ro_gui_view_source(hlcache_handle *c)
}
/* try to load local files directly. */
- temp_name = url_to_path(nsurl_access(hlcache_handle_get_url(c)));
- if (temp_name) {
+ if (netsurf_nsurl_to_path(hlcache_handle_get_url(c), &temp_name) == NSERROR_OK) {
error = xosfile_read_no_path(temp_name, &objtype, 0, 0, 0, 0);
if ((!error) && (objtype == osfile_IS_FILE)) {
snprintf(message.file_name, 212, "%s", temp_name);
@@ -2167,11 +1983,14 @@ void ro_gui_view_source(hlcache_handle *c)
* allow it to be re-used next time NetSurf is started. The
* memory overhead from doing this is under 1 byte per
* filename. */
+ char *r;
+ char full_name[256];
const char *filename = filename_request();
if (!filename) {
warn_user("NoMemory", 0);
return;
}
+
snprintf(full_name, 256, "%s/%s", TEMP_FILENAME_PREFIX,
filename);
full_name[255] = '\0';
@@ -2182,6 +2001,7 @@ void ro_gui_view_source(hlcache_handle *c)
return;
}
message.file_name[211] = '\0';
+
error = xosfile_save_stamped(message.file_name,
ro_content_filetype(c),
(byte *) source_data,
@@ -2210,63 +2030,43 @@ void ro_gui_view_source(hlcache_handle *c)
}
-void ro_gui_view_source_bounce(wimp_message *message)
+/**
+ * Broadcast an URL that we can't handle.
+ */
+static nserror gui_launch_url(struct nsurl *url)
{
- char *filename;
- os_error *error;
- char command[256];
-
- /* run the file as text */
- filename = ((wimp_full_message_data_xfer *)message)->file_name;
- sprintf(command, "@RunType_FFF %s", filename);
- error = xwimp_start_task(command, 0);
- if (error) {
- LOG(("xwimp_start_task failed: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("WimpError", error->errmess);
- }
+ /* Try ant broadcast */
+ ro_url_broadcast(nsurl_access(url));
+ return NSERROR_OK;
}
/**
- * Send the debug dump of a content to a text editor.
+ * Choose the language to use.
*/
-
-void ro_gui_dump_browser_window(struct browser_window *bw)
+static void ro_gui_choose_language(void)
{
- os_error *error;
-
- /* open file for dump */
- FILE *stream = fopen("<Wimp$ScrapDir>.WWW.NetSurf.dump", "w");
- if (!stream) {
- LOG(("fopen: errno %i", errno));
- warn_user("SaveError", strerror(errno));
- return;
- }
-
- browser_window_debug_dump(bw, stream);
-
- fclose(stream);
+ /* if option_language exists and is valid, use that */
+ if (nsoption_charp(language)) {
+ char path[40];
+ if (2 < strlen(nsoption_charp(language)))
+ nsoption_charp(language)[2] = 0;
+ sprintf(path, "NetSurf:Resources.%s", nsoption_charp(language));
- /* launch file in editor */
- error = xwimp_start_task("Filer_Run <Wimp$ScrapDir>.WWW.NetSurf.dump",
- 0);
- if (error) {
- LOG(("xwimp_start_task failed: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("WimpError", error->errmess);
+ if (is_dir(path)) {
+ nsoption_setnull_charp(accept_language,
+ strdup(nsoption_charp(language)));
+ return;
+ }
+ nsoption_set_charp(language, NULL);
}
-}
-
-/**
- * Broadcast an URL that we can't handle.
- */
-
-void gui_launch_url(const char *url)
-{
- /* Try ant broadcast first */
- ro_url_broadcast(url);
+ nsoption_set_charp(language, strdup(ro_gui_default_language()));
+ if (nsoption_charp(language) == NULL)
+ die("Out of memory");
+ nsoption_set_charp(accept_language, strdup(nsoption_charp(language)));
+ if (nsoption_charp(accept_language) == NULL)
+ die("Out of memory");
}
@@ -2276,7 +2076,6 @@ void gui_launch_url(const char *url)
* \param warning message key for warning message
* \param detail additional message, or 0
*/
-
void warn_user(const char *warning, const char *detail)
{
LOG(("%s %s", warning, detail));
@@ -2318,7 +2117,6 @@ void warn_user(const char *warning, const char *detail)
*
* Should only be used during initialisation.
*/
-
void die(const char * const error)
{
os_error warn_error;
@@ -2345,81 +2143,390 @@ void die(const char * const error)
*
* \return true iff it's okay to shutdown immediately
*/
-
bool ro_gui_prequit(void)
{
return ro_gui_download_prequit();
}
+
void PDF_Password(char **owner_pass, char **user_pass, char *path)
{
- /*TODO:this waits to be written, until then no PDF encryption*/
+ /** @todo this waits to be written, until then no PDF encryption */
*owner_pass = NULL;
}
+
/**
- * Return the filename part of a full path
+ * Generate a riscos path from one or more component elemnts.
+ *
+ * Constructs a complete path element from passed components. The
+ * second (and subsequent) components have a slash substituted for all
+ * riscos directory separators.
*
- * \param path full path and filename
- * \return filename (will be freed with free())
+ * If a string is allocated it must be freed by the caller.
+ *
+ * @param[in,out] str pointer to string pointer if this is NULL enough
+ * storage will be allocated for the complete path.
+ * @param[in,out] size The size of the space available if \a str not
+ * NULL on input and if not NULL set to the total
+ * output length on output.
+ * @param[in] nemb The number of elements.
+ * @param[in] ap The elements of the path as string pointers.
+ * @return NSERROR_OK and the complete path is written to str
+ * or error code on faliure.
*/
+static nserror riscos_mkpath(char **str, size_t *size, size_t nelm, va_list ap)
+{
+ const char *elm[16];
+ size_t elm_len[16];
+ size_t elm_idx;
+ char *fname;
+ size_t fname_len = 0;
+ char *curp;
+ size_t idx;
+
+ /* check the parameters are all sensible */
+ if ((nelm == 0) || (nelm > 16)) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if ((*str != NULL) && (size == NULL)) {
+ /* if the caller is providing the buffer they must say
+ * how much space is available.
+ */
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ /* calculate how much storage we need for the complete path
+ * with all the elements.
+ */
+ for (elm_idx = 0; elm_idx < nelm; elm_idx++) {
+ elm[elm_idx] = va_arg(ap, const char *);
+ /* check the argument is not NULL */
+ if (elm[elm_idx] == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ elm_len[elm_idx] = strlen(elm[elm_idx]);
+ fname_len += elm_len[elm_idx];
+ }
+ fname_len += nelm; /* allow for separators and terminator */
+
+ /* ensure there is enough space */
+ fname = *str;
+ if (fname != NULL) {
+ if (fname_len > *size) {
+ return NSERROR_NOSPACE;
+ }
+ } else {
+ fname = malloc(fname_len);
+ if (fname == NULL) {
+ return NSERROR_NOMEM;
+ }
+ }
+
+ /* copy the elements in with directory separator */
+ curp = fname;
-char *filename_from_path(char *path)
+ /* first element is not altered */
+ memmove(curp, elm[0], elm_len[0]);
+ curp += elm_len[0];
+ /* ensure there is a delimiter */
+ if (curp[-1] != DIR_SEP) {
+ *curp = DIR_SEP;
+ curp++;
+ }
+
+ /* subsequent elemnts have slashes substituted with directory
+ * separators.
+ */
+ for (elm_idx = 1; elm_idx < nelm; elm_idx++) {
+ for (idx = 0; idx < elm_len[elm_idx]; idx++) {
+ if (elm[elm_idx][idx] == DIR_SEP) {
+ *curp = '/';
+ } else {
+ *curp = elm[elm_idx][idx];
+ }
+ curp++;
+ }
+ *curp = DIR_SEP;
+ curp++;
+ }
+ curp[-1] = 0; /* NULL terminate */
+
+ assert((curp - fname) <= (int)fname_len);
+
+ *str = fname;
+ if (size != NULL) {
+ *size = fname_len;
+ }
+
+ return NSERROR_OK;
+
+}
+
+
+/**
+ * Get the basename of a file using posix path handling.
+ *
+ * This gets the last element of a path and returns it. The returned
+ * element has all forward slashes translated into riscos directory
+ * separators.
+ *
+ * @param[in] path The path to extract the name from.
+ * @param[in,out] str Pointer to string pointer if this is NULL enough
+ * storage will be allocated for the path element.
+ * @param[in,out] size The size of the space available if \a
+ * str not NULL on input and set to the total
+ * output length on output.
+ * @return NSERROR_OK and the complete path is written to str
+ * or error code on faliure.
+ */
+static nserror riscos_basename(const char *path, char **str, size_t *size)
{
- char *leafname;
+ const char *leafname;
+ char *fname;
char *temp;
- int leaflen;
-
- temp = strrchr(path, '.');
- if (!temp)
- temp = path; /* already leafname */
- else
- temp += 1;
- leaflen = strlen(temp);
+ if (path == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
- leafname = malloc(leaflen + 1);
+ leafname = strrchr(path, DIR_SEP);
if (!leafname) {
- LOG(("malloc failed"));
- return NULL;
+ leafname = path;
+ } else {
+ leafname += 1;
+ }
+
+ fname = strdup(leafname);
+ if (fname == NULL) {
+ return NSERROR_NOMEM;
}
- memcpy(leafname, temp, leaflen + 1);
+ /** @todo check this leafname translation is actually required */
/* and s/\//\./g */
- for (temp = leafname; *temp; temp++)
- if (*temp == '/')
- *temp = '.';
+ for (temp = fname; *temp != 0; temp++) {
+ if (*temp == '/') {
+ *temp = DIR_SEP;
+ }
+ }
- return leafname;
+ *str = fname;
+ if (size != NULL) {
+ *size = strlen(fname);
+ }
+ return NSERROR_OK;
}
+
/**
- * Add a path component/filename to an existing path
+ * Ensure that all directory elements needed to store a filename exist.
+ *
+ * Given a path of x.y.z directories x and x.y will be created.
*
- * \param path buffer containing platform-native format path + free space
- * \param length length of buffer "path"
- * \param newpart string containing unix-format path component to add to path
- * \return true on success
+ * @param fname The filename to ensure the path to exists.
+ * @return NSERROR_OK on success or error code on failure.
*/
+static nserror riscos_mkdir_all(const char *fname)
+{
+ char *dname;
+ char *cur;
+
+ dname = strdup(fname);
-bool path_add_part(char *path, int length, const char *newpart)
+ cur = dname;
+ while ((cur = strchr(cur, '.'))) {
+ *cur = '\0';
+ xosfile_create_dir(dname, 0);
+ *cur++ = '.';
+ }
+
+ free(dname);
+
+ return NSERROR_OK;
+}
+
+/**
+ * Find screen size in OS units.
+ */
+void ro_gui_screen_size(int *width, int *height)
{
- size_t path_len = strlen(path);
+ *width = screen_info.width;
+ *height = screen_info.height;
+}
- /* Append directory separator, if there isn't one */
- if (path[path_len - 1] != '.') {
- strncat(path, ".", length);
- path_len += 1;
+
+/**
+ * Send the debug dump of a content to a text editor.
+ */
+void ro_gui_dump_browser_window(struct browser_window *bw)
+{
+ os_error *error;
+
+ /* open file for dump */
+ FILE *stream = fopen("<Wimp$ScrapDir>.WWW.NetSurf.dump", "w");
+ if (!stream) {
+ LOG(("fopen: errno %i", errno));
+ warn_user("SaveError", strerror(errno));
+ return;
}
- strncat(path, newpart, length);
+ browser_window_debug_dump(bw, stream, CONTENT_DEBUG_RENDER);
+
+ fclose(stream);
- /* Newpart is either a directory name, or a file leafname
- * Either way, we must replace all dots with forward slashes */
- for (path = path + path_len; *path; path++) {
- if (*path == '.')
- *path = '/';
+ /* launch file in editor */
+ error = xwimp_start_task("Filer_Run <Wimp$ScrapDir>.WWW.NetSurf.dump",
+ 0);
+ if (error) {
+ LOG(("xwimp_start_task failed: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
}
+}
- return true;
+
+static struct gui_file_table riscos_file_table = {
+ .mkpath = riscos_mkpath,
+ .basename = riscos_basename,
+ .nsurl_to_path = ro_nsurl_to_path,
+ .path_to_nsurl = ro_path_to_nsurl,
+ .mkdir_all = riscos_mkdir_all,
+};
+
+static struct gui_fetch_table riscos_fetch_table = {
+ .filetype = fetch_filetype,
+
+ .get_resource_url = gui_get_resource_url,
+ .mimetype = fetch_mimetype,
+};
+
+static struct gui_browser_table riscos_browser_table = {
+ .poll = riscos_poll,
+ .schedule = riscos_schedule,
+
+ .quit = gui_quit,
+ .launch_url = gui_launch_url,
+ .create_form_select_menu = gui_create_form_select_menu,
+ .cert_verify = gui_cert_verify,
+ .login = gui_401login_open,
+};
+
+
+static char *get_cachepath(void)
+{
+ char *cachedir;
+ char *cachepath = NULL;
+ nserror ret;
+
+ cachedir = getenv("Cache$Dir");
+ if ((cachedir == NULL) || (cachedir[0] == 0)) {
+ LOG(("cachedir was null"));
+ return NULL;
+ }
+ ret = netsurf_mkpath(&cachepath, NULL, 2, cachedir, "NetSurf");
+ if (ret != NSERROR_OK) {
+ return NULL;
+ }
+ return cachepath;
+}
+
+/**
+ * Normal entry point from RISC OS.
+ */
+int main(int argc, char** argv)
+{
+ char *cachepath;
+ char path[40];
+ int length;
+ os_var_type type;
+ int used = -1; /* slightly better with older OSLib versions */
+ os_error *error;
+ nserror ret;
+ struct netsurf_table riscos_table = {
+ .browser = &riscos_browser_table,
+ .window = riscos_window_table,
+ .clipboard = riscos_clipboard_table,
+ .download = riscos_download_table,
+ .fetch = &riscos_fetch_table,
+ .file = &riscos_file_table,
+ .utf8 = riscos_utf8_table,
+ .search = riscos_search_table,
+ .llcache = filesystem_llcache_table,
+ };
+
+ ret = netsurf_register(&riscos_table);
+ if (ret != NSERROR_OK) {
+ die("NetSurf operation table failed registration");
+ }
+
+ /* Consult NetSurf$Logging environment variable to decide if logging
+ * is required. */
+ error = xos_read_var_val_size("NetSurf$Logging", 0, os_VARTYPE_STRING,
+ &used, NULL, &type);
+ if (error != NULL || type != os_VARTYPE_STRING || used != -2) {
+ verbose_log = true;
+ } else {
+ char logging_env[2];
+ error = xos_read_var_val("NetSurf$Logging", logging_env,
+ sizeof(logging_env), 0, os_VARTYPE_STRING,
+ &used, NULL, &type);
+ if (error != NULL || logging_env[0] != '0') {
+ verbose_log = true;
+ } else {
+ verbose_log = false;
+ }
+ }
+
+ /* initialise logging. Not fatal if it fails but not much we
+ * can do about it either.
+ */
+ nslog_init(nslog_stream_configure, &argc, argv);
+
+ /* user options setup */
+ ret = nsoption_init(set_defaults, &nsoptions, &nsoptions_default);
+ if (ret != NSERROR_OK) {
+ die("Options failed to initialise");
+ }
+ nsoption_read("NetSurf:Choices", NULL);
+ nsoption_commandline(&argc, argv, NULL);
+
+ /* Choose the interface language to use */
+ ro_gui_choose_language();
+
+ /* select language-specific Messages */
+ if (((length = snprintf(path,
+ sizeof(path),
+ "NetSurf:Resources.%s.Messages",
+ nsoption_charp(language))) < 0) ||
+ (length >= (int)sizeof(path))) {
+ die("Failed to locate Messages resource.");
+ }
+
+ /* obtain cache path */
+ cachepath = get_cachepath();
+
+ /* common initialisation */
+ ret = netsurf_init(path, cachepath);
+ free(cachepath);
+ if (ret != NSERROR_OK) {
+ die("NetSurf failed to initialise core");
+ }
+
+ artworks_init();
+ draw_init();
+ sprite_init();
+
+ /* Load some extra RISC OS specific Messages */
+ messages_load("NetSurf:Resources.LangNames");
+
+ ret = gui_init(argc, argv);
+ if (ret != NSERROR_OK) {
+ warn_user(messages_get_errorcode(ret), 0);
+ }
+
+ netsurf_main_loop();
+
+ netsurf_exit();
+
+ return 0;
}
diff --git a/riscos/gui.h b/riscos/gui.h
index 827af8108..3403f551e 100644
--- a/riscos/gui.h
+++ b/riscos/gui.h
@@ -21,20 +21,17 @@
#ifndef _NETSURF_RISCOS_GUI_H_
#define _NETSURF_RISCOS_GUI_H_
-#include <stdbool.h>
-#include <stdlib.h>
-#include "oslib/osspriteop.h"
-#include "oslib/wimp.h"
-#include "rufl.h"
-#include "desktop/browser.h"
-#include "content/content_type.h"
-#include "utils/config.h"
+#include <oslib/wimp.h>
#define RISCOS5 0xAA
#define THUMBNAIL_WIDTH 100
#define THUMBNAIL_HEIGHT 86
+/* The maximum size for user-editable URLs in the RISC OS GUI. */
+
+#define RO_GUI_MAX_URL_SIZE 2048
+
extern int os_version;
extern const char * NETSURF_DIR;
@@ -47,6 +44,11 @@ struct tree;
struct node;
struct history;
struct css_style;
+struct ssl_cert_info;
+struct nsurl;
+struct hlcache_handle;
+
+enum gui_pointer_shape;
extern wimp_t task_handle; /**< RISC OS wimp task handle. */
@@ -70,12 +72,6 @@ typedef enum { GUI_DRAG_NONE, GUI_DRAG_DOWNLOAD_SAVE, GUI_DRAG_SAVE }
extern ro_gui_drag_type gui_current_drag_type;
-/** desktop font, size and style being used */
-extern char ro_gui_desktop_font_family[];
-extern int ro_gui_desktop_font_size;
-extern rufl_style ro_gui_desktop_font_style;
-
-
/** RISC OS data for a browser window. */
struct gui_window {
/** Associated platform-independent browser window data. */
@@ -123,9 +119,12 @@ const char *ro_gui_default_language(void);
void ro_gui_download_init(void);
void ro_gui_download_datasave_ack(wimp_message *message);
bool ro_gui_download_prequit(void);
+extern struct gui_download_table *riscos_download_table;
/* in 401login.c */
void ro_gui_401login_init(void);
+void gui_401login_open(struct nsurl *url, const char *realm,
+ nserror (*cb)(bool proceed, void *pw), void *cbpw);
/* in window.c */
bool ro_gui_window_dataload(struct gui_window *g, wimp_message *message);
@@ -135,7 +134,6 @@ void ro_gui_window_iconise(struct gui_window *g,
bool ro_gui_toolbar_dataload(struct gui_window *g, wimp_message *message);
void ro_gui_window_redraw_all(void);
void ro_gui_window_update_boxes(void);
-void ro_gui_window_process_reformats(void);
void ro_gui_window_quit(void);
/* void ro_gui_window_close_all(void); */
#define ro_gui_window_close_all ro_gui_window_quit /* no need for a separate fn */
@@ -147,50 +145,50 @@ bool ro_gui_window_to_window_pos(struct gui_window *g, int x, int y,
os_coord *pos);
bool ro_gui_window_to_screen_pos(struct gui_window *g, int x, int y,
os_coord *pos);
-browser_mouse_state ro_gui_mouse_click_state(wimp_mouse_state buttons,
+enum browser_mouse_state ro_gui_mouse_click_state(wimp_mouse_state buttons,
wimp_icon_flags type);
-browser_mouse_state ro_gui_mouse_drag_state(wimp_mouse_state buttons,
+enum browser_mouse_state ro_gui_mouse_drag_state(wimp_mouse_state buttons,
wimp_icon_flags type);
bool ro_gui_shift_pressed(void);
bool ro_gui_ctrl_pressed(void);
bool ro_gui_alt_pressed(void);
+void gui_window_set_pointer(struct gui_window *g, enum gui_pointer_shape shape);
+void gui_create_form_select_menu(struct browser_window *bw, struct form_control *control);
/* in history.c */
void ro_gui_history_init(void);
-void ro_gui_history_open(struct browser_window *bw, struct history *history,
- bool pointer);
-
-/* in filetype.c */
-int ro_content_filetype(struct hlcache_handle *c);
-int ro_content_native_type(struct hlcache_handle *c);
-int ro_content_filetype_from_mime_type(lwc_string *mime_type);
-int ro_content_filetype_from_type(content_type type);
-bits ro_filetype_from_unix_path(const char *unix_path);
+void ro_gui_history_open(struct gui_window *g, bool pointer);
/* in schedule.c */
extern bool sched_active;
extern os_t sched_time;
+
+/**
+ * Process events up to current time.
+ */
bool schedule_run(void);
+/**
+ * Schedule a callback.
+ *
+ * \param t interval before the callback should be made in ms
+ * \param callback callback function
+ * \param p user parameter, passed to callback function
+ *
+ * The callback function will be called as soon as possible after t ms have
+ * passed.
+ */
+nserror riscos_schedule(int t, void (*callback)(void *p), void *p);
+
/* in search.c */
void ro_gui_search_init(void);
void ro_gui_search_prepare(struct browser_window *g);
+struct gui_search_table *riscos_search_table;
/* in print.c */
void ro_gui_print_init(void);
void ro_gui_print_prepare(struct gui_window *g);
-/* in font.c */
-void nsfont_init(void);
-bool nsfont_exists(const char *font_family);
-const char *nsfont_fallback_font(void);
-bool nsfont_paint(const plot_font_style_t *fstyle, const char *string,
- size_t length, int x, int y);
-void nsfont_read_style(const plot_font_style_t *fstyle,
- const char **font_family, unsigned int *font_size,
- rufl_style *font_style);
-void ro_gui_wimp_get_desktop_font(void);
-
/* in plotters.c */
extern const struct plotter_table ro_plotters;
extern int ro_plot_origin_x;
@@ -199,6 +197,11 @@ extern int ro_plot_origin_y;
/* in theme_install.c */
bool ro_gui_theme_install_apply(wimp_w w);
+/* in sslcert.c */
+void gui_cert_verify(struct nsurl *url,
+ const struct ssl_cert_info *certs, unsigned long num,
+ nserror (*cb)(bool proceed, void *pw), void *cbpw);
+
/* icon numbers */
#define ICON_STATUS_RESIZE 0
#define ICON_STATUS_TEXT 1
diff --git a/riscos/gui/button_bar.c b/riscos/gui/button_bar.c
index 7ca67f165..d92433d0b 100644
--- a/riscos/gui/button_bar.c
+++ b/riscos/gui/button_bar.c
@@ -26,18 +26,20 @@
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
-#include "oslib/dragasprite.h"
-#include "oslib/os.h"
-#include "oslib/osspriteop.h"
-#include "oslib/wimp.h"
-#include "oslib/wimpspriteop.h"
+#include <oslib/dragasprite.h>
+#include <oslib/os.h>
+#include <oslib/osspriteop.h>
+#include <oslib/wimp.h>
+#include <oslib/wimpspriteop.h>
+
+#include "utils/log.h"
+#include "utils/utils.h"
+
#include "riscos/gui/button_bar.h"
#include "riscos/gui.h"
#include "riscos/mouse.h"
#include "riscos/theme.h"
#include "riscos/wimp.h"
-#include "utils/log.h"
-#include "utils/utils.h"
#define BUTTONBAR_SPRITE_NAME_LENGTH 12
#define BUTTONBAR_VALIDATION_LENGTH 40
@@ -131,7 +133,6 @@ struct button_bar *ro_gui_button_bar_create(struct theme_descriptor *theme,
{
struct button_bar *button_bar;
struct button_bar_button *icon, *new_icon;
- bool failed;
int def;
/* Allocate memory. */
@@ -170,12 +171,10 @@ struct button_bar *ro_gui_button_bar_create(struct theme_descriptor *theme,
/* Process the button icon definitions */
icon = NULL;
- failed = false;
for (def = 0; buttons[def].icon != NULL; def++) {
new_icon = malloc(sizeof(struct button_bar_button));
if (new_icon == NULL) {
- failed = true;
break;
}
@@ -248,7 +247,6 @@ bool ro_gui_button_bar_rebuild(struct button_bar *button_bar,
wimp_w window, bool edit)
{
struct button_bar_button *button;
- os_error *error;
int height;
@@ -276,7 +274,6 @@ bool ro_gui_button_bar_rebuild(struct button_bar *button_bar,
button_bar->separators = (height == 0) ? false : true;
button = button_bar->buttons;
- error = NULL;
while (button != NULL) {
button->x_size = 0;
@@ -488,7 +485,6 @@ bool ro_gui_button_bar_icon_update(struct button_bar *button_bar)
wimp_icon_create icon;
struct button_bar_button *button, *b;
os_error *error;
- bool on_bar;
if (button_bar == NULL || button_bar->window == NULL)
@@ -497,7 +493,7 @@ bool ro_gui_button_bar_icon_update(struct button_bar *button_bar)
button = button_bar->buttons;
while (button != NULL) {
- on_bar = false;
+ bool on_bar = false;
/* Check if the icon is currently on the bar. */
@@ -725,8 +721,6 @@ bool ro_gui_button_bar_click(struct button_bar *button_bar,
struct button_bar_button *button;
os_coord pos;
os_box box;
- os_error *error;
- char *sprite;
if (button_bar == NULL || button_bar->hidden)
return false;
@@ -751,6 +745,8 @@ bool ro_gui_button_bar_click(struct button_bar *button_bar,
if (button != NULL && (!button->shaded || drag_separator ||
button_bar->edit_source != NULL)) {
+ char *sprite;
+ os_error *error;
drag_start = button_bar;
drag_opt = button->opt_key;
@@ -1191,7 +1187,6 @@ struct button_bar_button *ro_gui_button_bar_find_coords(
bool *separator, bool *right)
{
struct button_bar_button *button;
- int x0, y0, x1, y1;
if (button_bar == NULL)
return NULL;
@@ -1200,6 +1195,7 @@ struct button_bar_button *ro_gui_button_bar_find_coords(
while (button != NULL) {
/* Match button extents. */
+ int x0, y0, x1, y1;
x0 = button_bar->extent.x0 + button->x_pos;
y0 = button_bar->extent.y0 + button->y_pos;
diff --git a/riscos/gui/progress_bar.c b/riscos/gui/progress_bar.c
index 445797611..09b3edb45 100644
--- a/riscos/gui/progress_bar.c
+++ b/riscos/gui/progress_bar.c
@@ -29,10 +29,11 @@
#include "oslib/osspriteop.h"
#include "oslib/wimp.h"
#include "oslib/wimpspriteop.h"
+
#include "desktop/plotters.h"
#include "utils/log.h"
-#include "utils/schedule.h"
#include "utils/utils.h"
+
#include "riscos/gui.h"
#include "riscos/tinct.h"
#include "riscos/wimp_event.h"
@@ -159,8 +160,9 @@ void ro_gui_progress_bar_destroy(struct progress_bar *pb)
os_error *error;
assert(pb);
- if (pb->animating)
- schedule_remove(ro_gui_progress_bar_animate, pb);
+ if (pb->animating) {
+ riscos_schedule(-1, ro_gui_progress_bar_animate, pb);
+ }
ro_gui_wimp_event_finalise(pb->w);
error = xwimp_delete_window(pb->w);
if (error) {
@@ -292,12 +294,14 @@ void ro_gui_progress_bar_update(struct progress_bar *pb, int width, int height)
/* update the animation state */
if ((pb->value == 0) || (pb->value == pb->range)) {
- if (pb->animating)
- schedule_remove(ro_gui_progress_bar_animate, pb);
+ if (pb->animating) {
+ riscos_schedule(-1, ro_gui_progress_bar_animate, pb);
+ }
pb->animating = false;
} else {
- if (!pb->animating)
- schedule(20, ro_gui_progress_bar_animate, pb);
+ if (!pb->animating) {
+ riscos_schedule(200, ro_gui_progress_bar_animate, pb);
+ }
pb->animating = true;
}
@@ -324,6 +328,11 @@ void ro_gui_progress_bar_update(struct progress_bar *pb, int width, int height)
redraw.box = pb->visible;
redraw.box.x0 = cur.x1;
error = xwimp_update_window(&redraw, &more);
+ if (error) {
+ LOG(("Error getting update window: 0x%x: %s",
+ error->errnum, error->errmess));
+ return;
+ }
if (more)
ro_gui_progress_bar_redraw_window(&redraw, pb);
}
@@ -372,12 +381,17 @@ void ro_gui_progress_bar_animate(void *p)
if (pb->offset < 0)
pb->offset += progress_width * 2;
- if (pb->animating)
- schedule(20, ro_gui_progress_bar_animate, pb);
+ if (pb->animating) {
+ riscos_schedule(200, ro_gui_progress_bar_animate, pb);
+ }
redraw.w = pb->w;
redraw.box = pb->visible;
error = xwimp_update_window(&redraw, &more);
+ if (error != NULL) {
+ LOG(("Error getting update window: '%s'", error->errmess));
+ return;
+ }
if (more)
ro_gui_progress_bar_redraw_window(&redraw, pb);
}
@@ -394,9 +408,8 @@ void ro_gui_progress_bar_animate(void *p)
void ro_gui_progress_bar_calculate(struct progress_bar *pb, int width,
int height)
{
- os_error *error;
int icon_width, icon_height;
- int icon_x0 = 0, icon_y0 = 0, progress_x0, progress_x1, progress_ymid = 0;
+ int icon_x0 = 0, icon_y0 = 0, progress_x0, progress_x1;
osspriteop_header *icon = NULL;
bool icon_redraw = false;
@@ -417,14 +430,17 @@ void ro_gui_progress_bar_calculate(struct progress_bar *pb, int width,
/* get the icon information */
if (progress_bar_definition.sprite_area != wimpspriteop_AREA) {
- progress_ymid = height / 2;
+ int progress_ymid = height / 2;
+ os_error *error;
error = xosspriteop_read_sprite_info(osspriteop_USER_AREA,
progress_bar_definition.sprite_area,
(osspriteop_id)pb->icon,
&icon_width, &icon_height, 0, 0);
- error = xosspriteop_select_sprite(osspriteop_USER_AREA,
- progress_bar_definition.sprite_area,
- (osspriteop_id)pb->icon, &icon);
+ if (!error) {
+ error = xosspriteop_select_sprite(osspriteop_USER_AREA,
+ progress_bar_definition.sprite_area,
+ (osspriteop_id)pb->icon, &icon);
+ }
if (!error) {
progress_x0 += 32 + MARGIN;
width -= 32 + MARGIN;
@@ -467,7 +483,6 @@ void ro_gui_progress_bar_calculate(struct progress_bar *pb, int width,
void ro_gui_progress_bar_redraw_window(wimp_draw *redraw,
struct progress_bar *pb)
{
- os_error *error;
osbool more = true;
struct rect clip;
int progress_ymid;
@@ -484,6 +499,7 @@ void ro_gui_progress_bar_redraw_window(wimp_draw *redraw,
/* redraw the window */
while (more) {
+ os_error *error;
if (pb->icon)
_swix(Tinct_PlotAlpha, _IN(2) | _IN(3) | _IN(4) | _IN(7),
pb->icon_img,
diff --git a/riscos/gui/status_bar.c b/riscos/gui/status_bar.c
index 899fe99b6..57a32ae7f 100644
--- a/riscos/gui/status_bar.c
+++ b/riscos/gui/status_bar.c
@@ -30,12 +30,13 @@
#include "oslib/wimpspriteop.h"
#include "desktop/plotters.h"
#include "utils/log.h"
-#include "utils/schedule.h"
#include "utils/utils.h"
+
#include "riscos/gui.h"
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
#include "riscos/wimputils.h"
+#include "riscos/font.h"
#include "riscos/gui/progress_bar.h"
#include "riscos/gui/status_bar.h"
@@ -171,7 +172,7 @@ void ro_gui_status_bar_destroy(struct status_bar *sb)
ro_gui_progress_bar_destroy(sb->pb);
/* Remove any scheduled redraw callbacks */
- schedule_remove(ro_gui_status_bar_redraw_callback, (void *) sb);
+ riscos_schedule(-1, ro_gui_status_bar_redraw_callback, (void *) sb);
free(sb);
}
@@ -213,15 +214,13 @@ unsigned int ro_gui_status_bar_get_width(struct status_bar *sb)
*/
void ro_gui_status_bar_set_visible(struct status_bar *sb, bool visible)
{
- os_error *error;
-
assert(sb);
sb->visible = visible;
if (visible) {
ro_gui_status_bar_resize(sb);
} else {
- error = xwimp_close_window(sb->w);
+ os_error *error = xwimp_close_window(sb->w);
if (error) {
LOG(("xwimp_close_window: 0x%x:%s",
error->errnum, error->errmess));
@@ -271,7 +270,6 @@ void ro_gui_status_bar_set_progress_range(struct status_bar *sb,
unsigned int range)
{
unsigned int old_range;
- os_error *error;
assert(sb);
@@ -282,7 +280,7 @@ void ro_gui_status_bar_set_progress_range(struct status_bar *sb,
if ((old_range == 0) && (range != 0)) {
ro_gui_status_position_progress_bar(sb);
} else if ((old_range != 0) && (range == 0)) {
- error = xwimp_close_window(
+ os_error *error = xwimp_close_window(
ro_gui_progress_bar_get_window(sb->pb));
if (error) {
LOG(("xwimp_close_window: 0x%x:%s",
@@ -331,7 +329,7 @@ void ro_gui_status_bar_set_text(struct status_bar *sb, const char *text)
* { callback, handle } pair is registered at once.
*/
if (sb->visible && text != NULL) {
- schedule(1, ro_gui_status_bar_redraw_callback, (void *) sb);
+ riscos_schedule(10, ro_gui_status_bar_redraw_callback, sb);
}
}
@@ -344,9 +342,8 @@ void ro_gui_status_bar_set_text(struct status_bar *sb, const char *text)
*/
void ro_gui_status_bar_resize(struct status_bar *sb)
{
- int window_width, window_height;
+ int window_width;
int status_width, status_height;
- int redraw_left, redraw_right;
wimp_window_state state;
os_error *error;
os_box extent;
@@ -363,7 +360,6 @@ void ro_gui_status_bar_resize(struct status_bar *sb)
return;
}
window_width = state.visible.x1 - state.visible.x0;
- window_height = state.visible.y1 - state.visible.y0;
/* recalculate the scaled width */
@@ -375,6 +371,8 @@ void ro_gui_status_bar_resize(struct status_bar *sb)
/* resize the status/resize icons */
if (status_width != sb->width) {
/* update the window extent */
+ int redraw_left, redraw_right;
+
extent.x0 = 0;
extent.y0 = 0;
extent.x1 = status_width;
diff --git a/riscos/gui/throbber.c b/riscos/gui/throbber.c
index 05860a923..5e2c87678 100644
--- a/riscos/gui/throbber.c
+++ b/riscos/gui/throbber.c
@@ -285,12 +285,12 @@ bool ro_gui_throbber_icon_update(struct throbber *throbber)
bool ro_gui_throbber_icon_resize(struct throbber *throbber)
{
- os_error *error;
if (throbber->window == NULL)
return false;
if (throbber->icon != -1) {
+ os_error *error;
error = xwimp_resize_icon(throbber->window, throbber->icon,
throbber->extent.x0, throbber->extent.y0,
throbber->extent.x1, throbber->extent.y1);
diff --git a/riscos/gui/url_bar.c b/riscos/gui/url_bar.c
index 845f8b3e8..d89004856 100644
--- a/riscos/gui/url_bar.c
+++ b/riscos/gui/url_bar.c
@@ -1,6 +1,6 @@
/*
* Copyright 2004, 2005 Richard Wilson <info@tinct.net>
- * Copyright 2011 Stephen Fryatt <stevef@netsurf-browser.org>
+ * Copyright 2011-2014 Stephen Fryatt <stevef@netsurf-browser.org>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -30,15 +30,25 @@
#include "oslib/os.h"
#include "oslib/osspriteop.h"
#include "oslib/wimp.h"
+
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/utf8.h"
+#include "utils/utils.h"
+#include "content/hlcache.h"
+#include "content/content.h"
+#include "desktop/browser.h"
+
+#include "riscos/gui.h"
#include "riscos/hotlist.h"
#include "riscos/gui/url_bar.h"
#include "riscos/theme.h"
#include "riscos/url_suggest.h"
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/utils.h"
+#include "riscos/window.h"
+#include "riscos/ucstables.h"
+#include "riscos/filetype.h"
#define URLBAR_HEIGHT 52
#define URLBAR_FAVICON_SIZE 16
@@ -48,8 +58,6 @@
#define URLBAR_MIN_WIDTH 52
#define URLBAR_GRIGHT_GUTTER 8
#define URLBAR_FAVICON_NAME_LENGTH 12
-#define URLBAR_INITIAL_LENGTH 256
-#define URLBAR_EXTEND_LENGTH 128
struct url_bar {
/** The applied theme (or NULL to use the default) */
@@ -166,7 +174,7 @@ struct url_bar *ro_gui_url_bar_create(struct theme_descriptor *theme)
url_bar->hotlist.extent.x1 = 0;
url_bar->hotlist.extent.y1 = 0;
- url_bar->text_size = URLBAR_INITIAL_LENGTH;
+ url_bar->text_size = RO_GUI_MAX_URL_SIZE;
url_bar->text_buffer = malloc(url_bar->text_size);
strncpy(url_bar->text_buffer, "", url_bar->text_size);
@@ -851,8 +859,7 @@ bool ro_gui_url_bar_menu_select(struct url_bar *url_bar, wimp_i i,
browser_window_navigate(g->bw,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -941,24 +948,68 @@ void ro_gui_url_bar_set_url(struct url_bar *url_bar, const char *url,
{
wimp_caret caret;
os_error *error;
- const char *set_url;
+ char *local_text = NULL;
+ const char *local_url;
nsurl *n;
- if (url_bar == NULL || url_bar->text_buffer == NULL)
+ if (url_bar == NULL || url_bar->text_buffer == NULL || url == NULL)
return;
- if (nsurl_create(url, &n) == NSERROR_OK) {
+ /* Before we do anything with the URL, get it into local encoding so
+ * that behaviour is consistant with the rest of the URL Bar module
+ * (which will act on the icon's text buffer, which is always in local
+ * encoding).
+ */
+
+ if (is_utf8) {
+ nserror err;
+
+ err = utf8_to_local_encoding(url, 0, &local_text);
+ if (err != NSERROR_OK) {
+ /* A bad encoding should never happen, so assert this */
+ assert(err != NSERROR_BAD_ENCODING);
+ LOG(("utf8_to_enc failed"));
+ /* Paranoia */
+ local_text = NULL;
+ }
+ local_url = (local_text != NULL) ? local_text : url;
+ } else {
+ local_url = url;
+ }
+
+ /* Copy the text into the icon buffer. If the text is too long, blank
+ * the buffer and warn the user.
+ */
+
+ if (strlen(local_url) >= url_bar->text_size) {
+ strncpy(url_bar->text_buffer, "", url_bar->text_size - 1);
+ url_bar->text_buffer[url_bar->text_size - 1] = '\0';
+ warn_user("LongURL", NULL);
+ LOG(("Long URL (%d chars): %s", strlen(url), url));
+ } else {
+ strncpy(url_bar->text_buffer, local_url,
+ url_bar->text_size - 1);
+ url_bar->text_buffer[url_bar->text_size - 1] = '\0';
+ }
+
+ if (local_text != NULL)
+ free(local_text);
+
+ /* Set the hotlist flag. */
+
+ if (nsurl_create(url_bar->text_buffer, &n) == NSERROR_OK) {
ro_gui_url_bar_set_hotlist(url_bar, ro_gui_hotlist_has_page(n));
nsurl_unref(n);
}
- if (url_bar->text_icon == -1) {
- strncpy(url_bar->text_buffer, url, url_bar->text_size);
+ /* If there's no icon, then there's nothing else to do... */
+
+ if (url_bar->text_icon == -1)
return;
- }
- ro_gui_set_icon_string(url_bar->window, url_bar->text_icon,
- url, is_utf8);
+ /* ...if there is, redraw the icon and fix the caret's position. */
+
+ ro_gui_redraw_icon(url_bar->window, url_bar->text_icon);
error = xwimp_get_caret_position(&caret);
if (error) {
@@ -970,7 +1021,7 @@ void ro_gui_url_bar_set_url(struct url_bar *url_bar, const char *url,
if (set_caret || (caret.w == url_bar->window &&
caret.i == url_bar->text_icon)) {
- set_url = ro_gui_get_icon_string(url_bar->window,
+ const char *set_url = ro_gui_get_icon_string(url_bar->window,
url_bar->text_icon);
error = xwimp_set_caret_position(url_bar->window,
@@ -1013,9 +1064,9 @@ static void ro_gui_url_bar_set_hotlist(struct url_bar *url_bar, bool set)
{
if (url_bar == NULL || set == url_bar->hotlist.set)
return;
-
+
url_bar->hotlist.set = set;
-
+
if (!url_bar->hidden) {
xwimp_force_redraw(url_bar->window,
url_bar->hotlist.extent.x0,
@@ -1097,7 +1148,7 @@ bool ro_gui_url_bar_test_for_text_field_keypress(struct url_bar *url_bar,
return false;
/* Update hotlist indicator */
-
+
url = (const char *) url_bar->text_buffer;
if (url != NULL && nsurl_create(url, &n) == NSERROR_OK) {
ro_gui_url_bar_set_hotlist(url_bar, ro_gui_hotlist_has_page(n));
@@ -1278,4 +1329,3 @@ void ro_gui_url_bar_fini(void)
hlcache_handle_release(url_bar_res[i].c);
}
}
-
diff --git a/riscos/gui/url_bar.h b/riscos/gui/url_bar.h
index 034f74df6..0f41a4b01 100644
--- a/riscos/gui/url_bar.h
+++ b/riscos/gui/url_bar.h
@@ -39,6 +39,7 @@ typedef enum {
} url_bar_action;
struct url_bar;
+struct hlcache_handle;
/**
* Initialise the url bar module.
diff --git a/riscos/help.c b/riscos/help.c
index 14d34af15..fe5725071 100644
--- a/riscos/help.c
+++ b/riscos/help.c
@@ -20,31 +20,26 @@
* Interactive help (implementation).
*/
-#include <assert.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include "oslib/help.h"
-#include "oslib/os.h"
-#include "oslib/taskmanager.h"
-#include "oslib/wimp.h"
-#include "desktop/tree.h"
-#include "riscos/cookies.h"
-#include "riscos/global_history.h"
-#include "riscos/gui.h"
-#include "riscos/hotlist.h"
-#include "riscos/help.h"
-#include "riscos/iconbar.h"
-#include "riscos/menus.h"
+#include <oslib/wimp.h>
+#include <oslib/taskmanager.h>
+
#include "utils/nsoption.h"
-#include "riscos/treeview.h"
-#include "riscos/wimp.h"
-#include "riscos/wimp_event.h"
-#include "riscos/window.h"
-#include "utils/messages.h"
#include "utils/log.h"
-#include "utils/utf8.h"
#include "utils/utils.h"
+#include "utils/messages.h"
+#include "utils/utf8.h"
+#include "riscos/treeview.h"
+#include "riscos/help.h"
+#include "riscos/wimp_event.h"
+#include "riscos/hotlist.h"
+#include "riscos/global_history.h"
+#include "riscos/cookies.h"
+#include "riscos/wimp.h"
+#include "riscos/iconbar.h"
+#include "riscos/window.h"
+#include "riscos/ucstables.h"
+#include "riscos/gui.h"
/* Recognised help keys
====================
@@ -102,7 +97,7 @@ void ro_gui_interactive_help_request(wimp_message *message)
bool greyed = false;
wimp_menu *test_menu;
os_error *error;
- const char *auto_text, *auto_suffix;
+ const char *auto_text;
int i;
/* check we aren't turned off */
@@ -125,8 +120,9 @@ void ro_gui_interactive_help_request(wimp_message *message)
/* do the basic window checks */
auto_text = ro_gui_wimp_event_get_help_prefix(window);
if (auto_text != NULL) {
- auto_suffix = ro_gui_wimp_event_get_help_suffix(window, icon,
- &message_data->pos, message_data->buttons);
+ const char *auto_suffix = ro_gui_wimp_event_get_help_suffix(
+ window, icon, &message_data->pos,
+ message_data->buttons);
if (auto_suffix == NULL)
sprintf(message_token, "%s%i", auto_text, (int)icon);
@@ -222,10 +218,8 @@ static void ro_gui_interactive_help_broadcast(wimp_message *message,
{
const char *translated_token;
help_full_message_reply *reply;
- char *base_token;
char *local_token;
os_error *error;
- utf8_convert_ret err;
/* start off with an empty reply */
reply = (help_full_message_reply *)message;
@@ -237,7 +231,7 @@ static void ro_gui_interactive_help_broadcast(wimp_message *message,
/* no default help for 'g' suffix */
if (token[strlen(token) - 1] != 'g') {
/* find the base key from the token */
- base_token = token;
+ char *base_token = token;
while (base_token[0] != 0x00) {
if ((base_token[0] == '-') ||
((base_token[0] >= '0') &&
@@ -253,11 +247,11 @@ static void ro_gui_interactive_help_broadcast(wimp_message *message,
/* copy our message string */
if (translated_token != token) {
/* convert to local encoding */
- err = utf8_to_local_encoding(translated_token, 0,
+ nserror err = utf8_to_local_encoding(translated_token, 0,
&local_token);
- if (err != UTF8_CONVERT_OK) {
+ if (err != NSERROR_OK) {
/* badenc should never happen */
- assert(err != UTF8_CONVERT_BADENC);
+ assert(err != NSERROR_BAD_ENCODING);
/* simply use UTF-8 string */
strncpy(reply->reply, translated_token, 235);
}
@@ -292,7 +286,6 @@ bool ro_gui_interactive_help_available(void)
taskmanager_task task;
int context = 0;
os_t time;
- os_error *error;
/* generic test: any help request within the last 100cs */
xos_read_monotonic_time(&time);
@@ -301,6 +294,7 @@ bool ro_gui_interactive_help_available(void)
/* special cases: check known application names */
do {
+ os_error *error;
error = xtaskmanager_enumerate_tasks(context, &task,
sizeof(taskmanager_task), &context, 0);
if (error) {
diff --git a/riscos/history.c b/riscos/history.c
index a4aedc6b5..3b8b63ae1 100644
--- a/riscos/history.c
+++ b/riscos/history.c
@@ -27,10 +27,9 @@
#include <stdlib.h>
#include <string.h>
#include "oslib/wimp.h"
-#include "desktop/local_history.h"
+#include "desktop/browser_history.h"
#include "desktop/plotters.h"
#include "riscos/dialog.h"
-#include "desktop/browser_private.h"
#include "utils/nsoption.h"
#include "riscos/gui.h"
#include "riscos/mouse.h"
@@ -38,12 +37,10 @@
#include "riscos/wimp_event.h"
#include "riscos/wimputils.h"
#include "utils/log.h"
-#include "utils/url.h"
#include "utils/utils.h"
static struct browser_window *history_bw;
-static struct history *history_current = 0;
/* Last position of mouse in window. */
static int mouse_x = 0;
/* Last position of mouse in window. */
@@ -77,25 +74,24 @@ void ro_gui_history_init(void)
/**
* Open history window.
*
- * \param bw browser window to open history for
- * \param history history to open
- * \param at_pointer open the window at the pointer
+ * \param g The riscos window to open history for.
+ * \param at_pointer open the window at the pointer.
*/
-void ro_gui_history_open(struct browser_window *bw,
- struct history *history, bool at_pointer)
+void ro_gui_history_open(struct gui_window *g, bool at_pointer)
{
+ struct browser_window *bw;
int width, height;
os_box box = {0, 0, 0, 0};
wimp_window_state state;
os_error *error;
- assert(history);
-
- history_current = history;
+ assert(g != NULL);
+ assert(g->bw != NULL);
+ bw = g->bw;
history_bw = bw;
- history_size(history, &width, &height);
+ browser_window_history_size(bw, &width, &height);
width *= 2;
height *= 2;
@@ -132,8 +128,7 @@ void ro_gui_history_open(struct browser_window *bw,
return;
}
- ro_gui_dialog_open_persistent(bw->window->window, history_window,
- at_pointer);
+ ro_gui_dialog_open_persistent(g->window, history_window, at_pointer);
}
@@ -161,7 +156,7 @@ void ro_gui_history_redraw(wimp_draw *redraw)
while (more) {
ro_plot_origin_x = redraw->box.x0 - redraw->xscroll;
ro_plot_origin_y = redraw->box.y1 - redraw->yscroll;
- history_redraw(history_current, &ctx);
+ browser_window_history_redraw(history_bw, &ctx);
error = xwimp_get_rectangle(redraw, &more);
if (error) {
LOG(("xwimp_get_rectangle: 0x%x: %s",
@@ -237,7 +232,7 @@ void ro_gui_history_mouse_at(wimp_pointer *pointer, void *data)
x = (pointer->pos.x - (state.visible.x0 - state.xscroll)) / 2;
y = -(pointer->pos.y - (state.visible.y1 - state.yscroll)) / 2;
- url = history_position_url(history_current, x, y);
+ url = browser_window_history_position_url(history_bw, x, y);
if (!url) {
/* not over a tree entry => close tooltip window. */
error = xwimp_close_window(dialog_tooltip);
@@ -348,7 +343,7 @@ bool ro_gui_history_click(wimp_pointer *pointer)
x = (pointer->pos.x - (state.visible.x0 - state.xscroll)) / 2;
y = -(pointer->pos.y - (state.visible.y1 - state.yscroll)) / 2;
- history_click(history_bw, history_current, x, y,
+ browser_window_history_click(history_bw, x, y,
pointer->buttons == wimp_CLICK_ADJUST);
return true;
diff --git a/riscos/hotlist.c b/riscos/hotlist.c
index f47d05e9c..82ad3b0f2 100644
--- a/riscos/hotlist.c
+++ b/riscos/hotlist.c
@@ -1,6 +1,6 @@
/*
* Copyright 2004, 2005 Richard Wilson <info@tinct.net>
- * Copyright 2010 Stephen Fryatt <stevef@netsurf-browser.org>
+ * Copyright 2010, 2013 Stephen Fryatt <stevef@netsurf-browser.org>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -30,26 +30,29 @@
#include "oslib/osfile.h"
#include "oslib/osmodule.h"
#include "oslib/wimp.h"
+
#include "content/content.h"
#include "content/hlcache.h"
#include "content/urldb.h"
#include "desktop/hotlist.h"
#include "desktop/tree.h"
+#include "desktop/gui.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/utils.h"
+#include "utils/nsoption.h"
+
+#include "riscos/gui.h"
#include "riscos/dialog.h"
#include "riscos/hotlist.h"
#include "riscos/menus.h"
#include "riscos/message.h"
-#include "utils/nsoption.h"
#include "riscos/save.h"
#include "riscos/toolbar.h"
#include "riscos/treeview.h"
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/schedule.h"
-#include "utils/utils.h"
-#include "utils/url.h"
+#include "riscos/query.h"
static void ro_gui_hotlist_toolbar_update_buttons(void);
static void ro_gui_hotlist_toolbar_save_buttons(char *config);
@@ -217,12 +220,12 @@ void ro_gui_hotlist_destroy(void)
void ro_gui_hotlist_open(void)
{
- os_error *error;
- char command[2048];
+ if (nsoption_bool(external_hotlists) &&
+ nsoption_charp(external_hotlist_app) != NULL &&
+ *nsoption_charp(external_hotlist_app) != '\0') {
+ char command[2048];
+ os_error *error;
- if (nsoption_bool(external_hotlists) &&
- nsoption_charp(external_hotlist_app) != NULL &&
- *nsoption_charp(external_hotlist_app) != '\0') {
snprintf(command, sizeof(command), "Filer_Run %s",
nsoption_charp(external_hotlist_app));
error = xos_cli(command);
@@ -542,7 +545,7 @@ void ro_gui_hotlist_add_page(nsurl *url)
* message didn't bounce.
*/
- schedule(0, ro_gui_hotlist_scheduled_callback, NULL);
+ riscos_schedule(0, ro_gui_hotlist_scheduled_callback, NULL);
}
@@ -568,7 +571,7 @@ static void ro_gui_hotlist_addurl_bounce(wimp_message *message)
/* There's no longer any need to listen for the next Null poll. */
- schedule_remove(ro_gui_hotlist_scheduled_callback, NULL);
+ riscos_schedule(-1, ro_gui_hotlist_scheduled_callback, NULL);
}
@@ -732,4 +735,3 @@ void ro_gui_hotlist_url_drop(wimp_message *message, const char *url)
nsurl_unref(nsurl);
}
#endif
-
diff --git a/riscos/hotlist.h b/riscos/hotlist.h
index 4cb5a1ff3..0b87a2e96 100644
--- a/riscos/hotlist.h
+++ b/riscos/hotlist.h
@@ -1,6 +1,6 @@
/*
* Copyright 2006 Richard Wilson <info@tinct.net>
- * Copyright 2010 Stephen Fryatt <stevef@netsurf-browser.org>
+ * Copyright 2010, 2013 Stephen Fryatt <stevef@netsurf-browser.org>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -45,10 +45,9 @@ void ro_gui_hotlist_open(void);
void ro_gui_hotlist_save(void);
bool ro_gui_hotlist_check_window(wimp_w window);
bool ro_gui_hotlist_check_menu(wimp_menu *menu);
-void ro_gui_hotlist_add_page(nsurl *url);
+void ro_gui_hotlist_add_page(struct nsurl *url);
void ro_gui_hotlist_add_cleanup(void);
-void ro_gui_hotlist_remove_page(nsurl *url);
-bool ro_gui_hotlist_has_page(nsurl *url);
+void ro_gui_hotlist_remove_page(struct nsurl *url);
+bool ro_gui_hotlist_has_page(struct nsurl *url);
#endif
-
diff --git a/riscos/iconbar.c b/riscos/iconbar.c
index f6c094291..f29b019a2 100644
--- a/riscos/iconbar.c
+++ b/riscos/iconbar.c
@@ -28,21 +28,26 @@
#include <string.h>
#include <time.h>
#include <features.h>
-#include "oslib/os.h"
-#include "oslib/osbyte.h"
-#include "oslib/wimp.h"
+#include <oslib/os.h>
+#include <oslib/osbyte.h>
+#include <oslib/wimp.h>
+
+#include "utils/nsoption.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/utils.h"
+#include "utils/nsurl.h"
+#include "desktop/netsurf.h"
+#include "desktop/browser.h"
+
+#include "riscos/gui.h"
#include "riscos/configure.h"
#include "riscos/cookies.h"
#include "riscos/dialog.h"
#include "riscos/global_history.h"
#include "riscos/hotlist.h"
#include "riscos/iconbar.h"
-#include "desktop/browser.h"
-#include "utils/nsoption.h"
#include "riscos/wimp_event.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/utils.h"
static bool ro_gui_iconbar_click(wimp_pointer *pointer);
@@ -133,8 +138,7 @@ bool ro_gui_iconbar_click(wimp_pointer *pointer)
/* create an initial browser window */
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -204,9 +208,7 @@ bool ro_gui_iconbar_menu_select(wimp_w w, wimp_i i, wimp_menu *menu,
case HELP_OPEN_CONTENTS:
error = nsurl_create("http://www.netsurf-browser.org/documentation/", &url);
if (error == NSERROR_OK) {
- error = browser_window_create(
- BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
diff --git a/riscos/image.c b/riscos/image.c
index 56feb2b96..07baecd60 100644
--- a/riscos/image.c
+++ b/riscos/image.c
@@ -17,16 +17,17 @@
*/
#include <stdbool.h>
-#include "swis.h"
-#include "oslib/colourtrans.h"
-#include "oslib/osspriteop.h"
-#include "riscos/image.h"
-#include "riscos/gui.h"
+#include <swis.h>
+#include <oslib/colourtrans.h>
+#include <oslib/osspriteop.h>
+
#include "utils/nsoption.h"
-#include "riscos/tinct.h"
#include "utils/log.h"
#include "utils/utils.h"
+#include "riscos/image.h"
+#include "riscos/gui.h"
+#include "riscos/tinct.h"
static bool image_redraw_tinct(osspriteop_id header, int x, int y,
int req_width, int req_height, int width, int height,
diff --git a/riscos/menus.c b/riscos/menus.c
index e51fc34c5..4158d23af 100644
--- a/riscos/menus.c
+++ b/riscos/menus.c
@@ -31,15 +31,20 @@
#include "oslib/osgbpb.h"
#include "oslib/territory.h"
#include "oslib/wimp.h"
+
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/utils.h"
+#include "utils/utf8.h"
#include "content/content.h"
#include "content/hlcache.h"
#include "content/urldb.h"
#include "desktop/cookie_manager.h"
#include "desktop/browser.h"
#include "desktop/gui.h"
-#include "desktop/local_history.h"
#include "desktop/netsurf.h"
#include "desktop/textinput.h"
+
#include "riscos/dialog.h"
#include "riscos/configure.h"
#include "riscos/cookies.h"
@@ -56,11 +61,7 @@
#include "riscos/url_suggest.h"
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/url.h"
-#include "utils/utils.h"
-#include "utils/utf8.h"
+#include "riscos/ucstables.h"
struct menu_definition_entry {
menu_action action; /**< menu action */
@@ -77,7 +78,7 @@ struct menu_definition {
struct menu_definition *next; /**< next menu */
};
-
+static void ro_gui_menu_closed(void);
static void ro_gui_menu_define_menu_add(struct menu_definition *definition,
const struct ns_menu *menu, int depth,
wimp_menu_entry *parent_entry,
@@ -118,6 +119,7 @@ wimp_menu *image_quality_menu, *proxy_type_menu, *languages_menu;
/**
* Create menu structures.
*/
+
void ro_gui_menu_init(void)
{
/* image quality menu */
@@ -212,6 +214,7 @@ void ro_gui_menu_init(void)
* \param y The y position.
* \param w The window that the menu belongs to.
*/
+
void ro_gui_menu_create(wimp_menu *menu, int x, int y, wimp_w w)
{
os_error *error;
@@ -251,6 +254,7 @@ void ro_gui_menu_create(wimp_menu *menu, int x, int y, wimp_w w)
* \param w window handle
* \param i icon handle
*/
+
void ro_gui_popup_menu(wimp_menu *menu, wimp_w w, wimp_i i)
{
wimp_window_state state;
@@ -285,29 +289,24 @@ void ro_gui_popup_menu(wimp_menu *menu, wimp_w w, wimp_i i)
/**
- * Clean up after a menu has been closed, or forcible close an open menu.
- */
-void ro_gui_menu_closed(void)
+ * Forcibly close any menu or transient dialogue box that is currently open.
+ */
+
+void ro_gui_menu_destroy(void)
{
os_error *error;
- if (current_menu) {
- error = xwimp_create_menu(wimp_CLOSE_MENU, 0, 0);
- if (error) {
- LOG(("xwimp_create_menu: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("MenuError", error->errmess);
- }
-
- ro_gui_wimp_event_menus_closed(current_menu_window,
- current_menu_icon, current_menu);
+ if (current_menu == NULL)
+ return;
- current_menu = NULL;
+ error = xwimp_create_menu(wimp_CLOSE_MENU, 0, 0);
+ if (error) {
+ LOG(("xwimp_create_menu: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("MenuError", error->errmess);
}
- current_menu_window = NULL;
- current_menu_icon = 0;
- current_menu_open = false;
+ ro_gui_menu_closed();
}
@@ -439,6 +438,38 @@ void ro_gui_menu_warning(wimp_message_menu_warning *warning)
}
}
+
+/**
+ * Handle Message_MenusDeleted, removing our current record of an open menu
+ * if it matches the deleted menu handle.
+ *
+ * \param *deleted The message block.
+ */
+
+void ro_gui_menu_message_deleted(wimp_message_menus_deleted *deleted)
+{
+ if (deleted != NULL && deleted->menu == current_menu)
+ ro_gui_menu_closed();
+}
+
+
+/**
+ * Clean up after a menu has been closed, or forcibly close an open menu.
+ */
+
+static void ro_gui_menu_closed(void)
+{
+ if (current_menu != NULL)
+ ro_gui_wimp_event_menus_closed(current_menu_window,
+ current_menu_icon, current_menu);
+
+ current_menu = NULL;
+ current_menu_window = NULL;
+ current_menu_icon = 0;
+ current_menu_open = false;
+}
+
+
/**
* Update the current menu by sending it a Menu Prepare event through wimp_event
* and then reopening it if the contents has changed.
@@ -451,7 +482,6 @@ void ro_gui_menu_warning(wimp_message_menu_warning *warning)
void ro_gui_menu_refresh(wimp_menu *menu)
{
int checksum = 0;
- os_error *error;
if (!current_menu_open)
return;
@@ -465,6 +495,7 @@ void ro_gui_menu_refresh(wimp_menu *menu)
/* \TODO -- Call the menu's event handler here. */
if (checksum != ro_gui_menu_get_checksum()) {
+ os_error *error;
error = xwimp_create_menu(current_menu, 0, 0);
if (error) {
LOG(("xwimp_create_menu: 0x%x: %s",
@@ -535,17 +566,17 @@ void ro_gui_menu_define_menu_add(struct menu_definition *definition,
wimp_menu_entry *parent_entry, int first, int last,
const char *prefix, int prefix_length)
{
- int entry, id, cur_depth;
+ int entry;
int entries = 0;
int matches[last - first + 1];
- const char *match;
const char *text, *menu_text;
wimp_menu *new_menu;
struct menu_definition_entry *definition_entry;
/* step 1: store the matches for depth and subset string */
for (entry = first; entry < last; entry++) {
- cur_depth = 0;
+ const char *match;
+ int cur_depth = 0;
match = menu->entries[entry].text;
/* skip specials at start of string */
@@ -595,7 +626,7 @@ void ro_gui_menu_define_menu_add(struct menu_definition *definition,
/* and then create the entries */
for (entry = 0; entry < entries; entry++) {
/* add the entry */
- id = matches[entry];
+ int id = matches[entry];
text = menu->entries[id].text;
@@ -875,8 +906,7 @@ bool ro_gui_menu_translate(struct menu_definition *menu)
int alphabet;
struct menu_definition_entry *entry;
char *translated;
- utf8_convert_ret err;
-
+ nserror err;
/* read current alphabet */
error = xosbyte1(osbyte_ALPHABET_NUMBER, 127, 0, &alphabet);
@@ -895,8 +925,8 @@ bool ro_gui_menu_translate(struct menu_definition *menu)
free(menu->menu->title_data.indirected_text.text);
err = utf8_to_local_encoding(messages_get(menu->title_key),
0, &translated);
- if (err != UTF8_CONVERT_OK) {
- assert(err != UTF8_CONVERT_BADENC);
+ if (err != NSERROR_OK) {
+ assert(err != NSERROR_BAD_ENCODING);
LOG(("utf8_to_enc failed"));
return false;
}
@@ -912,8 +942,8 @@ bool ro_gui_menu_translate(struct menu_definition *menu)
free(entry->menu_entry->data.indirected_text.text);
err = utf8_to_local_encoding(messages_get(entry->entry_key),
0, &translated);
- if (err != UTF8_CONVERT_OK) {
- assert(err != UTF8_CONVERT_BADENC);
+ if (err != NSERROR_OK) {
+ assert(err != NSERROR_BAD_ENCODING);
LOG(("utf8_to_enc failed"));
return false;
}
diff --git a/riscos/menus.h b/riscos/menus.h
index 033b01117..7faa87ed6 100644
--- a/riscos/menus.h
+++ b/riscos/menus.h
@@ -19,10 +19,6 @@
#ifndef _NETSURF_RISCOS_MENUS_H_
#define _NETSURF_RISCOS_MENUS_H_
-#include <stdbool.h>
-#include "oslib/wimp.h"
-#include "riscos/gui.h"
-
extern wimp_menu *image_quality_menu, *proxy_type_menu, *languages_menu;
extern wimp_menu *current_menu;
@@ -168,11 +164,12 @@ struct ns_menu {
void ro_gui_menu_init(void);
void ro_gui_menu_create(wimp_menu* menu, int x, int y, wimp_w w);
-void ro_gui_menu_closed(void);
+void ro_gui_menu_destroy(void);
void ro_gui_popup_menu(wimp_menu *menu, wimp_w w, wimp_i i);
void ro_gui_menu_window_changed(wimp_w from, wimp_w to);
void ro_gui_menu_selection(wimp_selection* selection);
void ro_gui_menu_warning(wimp_message_menu_warning *warning);
+void ro_gui_menu_message_deleted(wimp_message_menus_deleted *deleted);
void ro_gui_menu_refresh(wimp_menu *menu);
void ro_gui_menu_init_structure(wimp_menu *menu, int entries);
const char *ro_gui_menu_find_menu_entry_key(wimp_menu *menu,
diff --git a/riscos/message.c b/riscos/message.c
index 5a9bb15fa..bfb33a8c9 100644
--- a/riscos/message.c
+++ b/riscos/message.c
@@ -188,14 +188,14 @@ struct active_message *ro_message_add(unsigned int message_code,
bool ro_message_handle_message(wimp_event_no event, wimp_message *message)
{
struct active_message *test;
- bool handled = false;
- int ref;
assert(message);
if (event == wimp_USER_MESSAGE_ACKNOWLEDGE) {
/* handle message acknowledgement */
- ref = message->my_ref;
+ bool handled = false;
+ int ref = message->my_ref;
+
if (ref == 0)
return false;
diff --git a/riscos/mouse.c b/riscos/mouse.c
index a20965e31..e934c1cf4 100644
--- a/riscos/mouse.c
+++ b/riscos/mouse.c
@@ -163,9 +163,11 @@ void ro_mouse_drag_end(wimp_dragged *dragged)
* Start tracking the mouse in a window, providing a function to be called on
* null polls and optionally one to be called when it leaves the window.
*
- * \param *drag_end Callback for when the pointer leaves the window, or
- * NULL for none.
- * \param *drag_track Callback for mouse tracking while the pointer remains
+ * \param *poll_end Callback for when the pointer leaves the window, or
+ * NULL for none. Claimants can receive *leaving==NULL if
+ * a new tracker is started before a PointerLeaving event
+ * is received.
+ * \param *poll_track Callback for mouse tracking while the pointer remains
* in the window, or NULL for none.
* \param *data Data to be passed to the callback functions, or NULL.
*/
@@ -175,12 +177,31 @@ void ro_mouse_track_start(void (*poll_end)(wimp_leaving *leaving, void *data),
void *data)
{
/* It should never be possible for the mouse to be in two windows
- * at the same time!
+ * at the same time! However, some third-party extensions to RISC OS
+ * appear to make this possible (MouseAxess being one), so in the
+ * event that there's still a claimant we tidy them up first and then
+ * log the fact in case there are any unexpected consequences.
+ *
+ * NB: The Poll End callback will get called with *leaving == NULL in
+ * this situation, as there's no PointerLeaving event to pass on.
*/
- assert(ro_mouse_poll_end_callback == NULL &&
- ro_mouse_poll_track_callback == NULL &&
- ro_mouse_poll_data == NULL);
+ if (ro_mouse_poll_end_callback != NULL ||
+ ro_mouse_poll_track_callback != NULL ||
+ ro_mouse_poll_data != NULL) {
+ if (ro_mouse_poll_end_callback != NULL &&
+ ro_mouse_ignore_leaving_event == false)
+ ro_mouse_poll_end_callback(NULL, ro_mouse_poll_data);
+
+ LOG(("Unexpected mouse track termination."));
+
+ ro_mouse_ignore_leaving_event = false;
+ ro_mouse_poll_end_callback = NULL;
+ ro_mouse_poll_track_callback = NULL;
+ ro_mouse_poll_data = NULL;
+ }
+
+ /* Now record details of the new claimant. */
ro_mouse_poll_end_callback = poll_end;
ro_mouse_poll_track_callback = poll_track;
diff --git a/riscos/mouse.h b/riscos/mouse.h
index bcb3b50bd..8a7405a2f 100644
--- a/riscos/mouse.h
+++ b/riscos/mouse.h
@@ -65,9 +65,11 @@ void ro_mouse_drag_end(wimp_dragged *dragged);
* Start tracking the mouse in a window, providing a function to be called on
* null polls and optionally one to be called when it leaves the window.
*
- * \param *drag_end Callback for when the pointer leaves the window, or
- * NULL for none.
- * \param *drag_track Callback for mouse tracking while the pointer remains
+ * \param *poll_end Callback for when the pointer leaves the window, or
+ * NULL for none. Claimants can receive *leaving==NULL if
+ * a new tracker is started before a PointerLeaving event
+ * is received.
+ * \param *poll_track Callback for mouse tracking while the pointer remains
* in the window, or NULL for none.
* \param *data Data to be passed to the callback functions, or NULL.
*/
diff --git a/riscos/plotters.c b/riscos/plotters.c
index 966b6cb68..6e49c2278 100644
--- a/riscos/plotters.c
+++ b/riscos/plotters.c
@@ -25,13 +25,16 @@
#include "oslib/colourtrans.h"
#include "oslib/draw.h"
#include "oslib/os.h"
+
+#include "utils/log.h"
#include "desktop/plotters.h"
#include "render/font.h"
+
#include "riscos/bitmap.h"
#include "riscos/image.h"
#include "riscos/gui.h"
+#include "riscos/font.h"
#include "riscos/oslib_pre7.h"
-#include "utils/log.h"
static bool ro_plot_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *style);
@@ -77,9 +80,8 @@ bool ro_plot_patterned_lines = true;
bool ro_plot_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *style)
{
- os_error *error;
-
- if (style->fill_type != PLOT_OP_TYPE_NONE) {
+ if (style->fill_type != PLOT_OP_TYPE_NONE) {
+ os_error *error;
error = xcolourtrans_set_gcol(style->fill_colour << 8,
colourtrans_USE_ECFS_GCOL,
os_ACTION_OVERWRITE, 0, 0);
@@ -145,17 +147,17 @@ bool ro_plot_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *style
bool ro_plot_line(int x0, int y0, int x1, int y1, const plot_style_t *style)
{
- const int path[] = { draw_MOVE_TO,
- (ro_plot_origin_x + x0 * 2) * 256,
- (ro_plot_origin_y - y0 * 2 - 1) * 256,
- draw_LINE_TO,
- (ro_plot_origin_x + x1 * 2) * 256,
- (ro_plot_origin_y - y1 * 2 - 1) * 256,
- draw_END_PATH };
- bool dotted = false;
- bool dashed = false;
-
if (style->stroke_type != PLOT_OP_TYPE_NONE) {
+ const int path[] = { draw_MOVE_TO,
+ (ro_plot_origin_x + x0 * 2) * 256,
+ (ro_plot_origin_y - y0 * 2 - 1) * 256,
+ draw_LINE_TO,
+ (ro_plot_origin_x + x1 * 2) * 256,
+ (ro_plot_origin_y - y1 * 2 - 1) * 256,
+ draw_END_PATH };
+ bool dotted = false;
+ bool dashed = false;
+
if (style->stroke_type == PLOT_OP_TYPE_DOT)
dotted = true;
diff --git a/riscos/print.c b/riscos/print.c
index 0df77ef6b..1d9ed3e43 100644
--- a/riscos/print.c
+++ b/riscos/print.c
@@ -21,28 +21,33 @@
#include <assert.h>
#include <string.h>
-#include "swis.h"
-#include "oslib/font.h"
-#include "oslib/hourglass.h"
-#include "oslib/osfile.h"
-#include "oslib/osfind.h"
-#include "oslib/pdriver.h"
-#include "oslib/wimp.h"
-#include "rufl.h"
+#include <swis.h>
+#include <oslib/font.h>
+#include <oslib/hourglass.h>
+#include <oslib/osfile.h>
+#include <oslib/osfind.h>
+#include <oslib/pdriver.h>
+#include <oslib/wimp.h>
+#include <rufl.h>
+
#include "utils/config.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/utils.h"
+#include "utils/nsoption.h"
#include "content/content.h"
#include "content/hlcache.h"
-#include "desktop/browser_private.h"
-#include "utils/nsoption.h"
+#include "desktop/browser.h"
#include "desktop/plotters.h"
+
+#include "riscos/gui.h"
#include "riscos/dialog.h"
#include "riscos/menus.h"
#include "riscos/print.h"
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/utils.h"
+#include "riscos/filetype.h"
+#include "riscos/font.h"
#define ICON_PRINT_TO_BOTTOM 1
@@ -90,6 +95,7 @@ static unsigned int print_fonts_count;
/** Error in print_fonts_plot_text() or print_fonts_callback(). */
static const char *print_fonts_error;
+void gui_window_redraw_window(struct gui_window *g);
static bool ro_gui_print_click(wimp_pointer *pointer);
static bool ro_gui_print_apply(wimp_w w);
@@ -276,7 +282,8 @@ bool ro_gui_print_apply(wimp_w w)
print_bg_images = ro_gui_get_icon_selected_state(dialog_print,
ICON_PRINT_BG_IMAGES);
- print_send_printsave(ro_print_current_window->bw->current_content);
+ print_send_printsave(browser_window_get_content(
+ ro_print_current_window->bw));
return true;
}
@@ -524,7 +531,7 @@ void ro_print_cleanup(void)
print_text_black = false;
print_prev_message = 0;
print_max_sheets = -1;
- ro_gui_menu_closed();
+ ro_gui_menu_destroy();
ro_gui_dialog_close(dialog_print);
}
@@ -542,7 +549,7 @@ bool print_document(struct gui_window *g, const char *filename)
int left, right, top, bottom, width, height;
int saved_width, saved_height;
int yscroll = 0, sheets = print_max_sheets;
- hlcache_handle *h = g->bw->current_content;
+ hlcache_handle *h = browser_window_get_content(g->bw);
const char *error_message;
pdriver_features features;
os_fw fhandle, old_job = 0;
diff --git a/riscos/print.h b/riscos/print.h
index 446ad2449..d997dce99 100644
--- a/riscos/print.h
+++ b/riscos/print.h
@@ -19,11 +19,6 @@
#ifndef _NETSURF_RISCOS_PRINT_H_
#define _NETSURF_RISCOS_PRINT_H_
-#include "utils/config.h"
-
-#include <stdbool.h>
-#include "oslib/wimp.h"
-
struct gui_window;
extern struct gui_window *ro_print_current_window;
diff --git a/riscos/query.c b/riscos/query.c
index 6401ad2b8..aa7492196 100644
--- a/riscos/query.c
+++ b/riscos/query.c
@@ -18,18 +18,20 @@
#include <stdlib.h>
#include <string.h>
-
#include <stdbool.h>
-#include "riscos/dialog.h"
-#include "riscos/query.h"
-#include "riscos/wimp.h"
-#include "riscos/wimp_event.h"
#include "utils/log.h"
#include "utils/messages.h"
#include "utils/utf8.h"
#include "utils/utils.h"
+#include "riscos/gui.h"
+#include "riscos/query.h"
+#include "riscos/wimp.h"
+#include "riscos/wimp_event.h"
+#include "riscos/ucstables.h"
+#include "riscos/dialog.h"
+
#define ICON_QUERY_MESSAGE 0
#define ICON_QUERY_YES 1
#define ICON_QUERY_NO 2
@@ -150,7 +152,7 @@ query_id query_user_xy(const char *query, const char *detail,
int len;
int tx;
char *local_text = NULL;
- utf8_convert_ret err;
+ nserror err;
qw = malloc(sizeof(struct gui_query_window));
if (!qw) {
@@ -171,8 +173,8 @@ query_id query_user_xy(const char *query, const char *detail,
/* set the text of the 'Yes' button and size accordingly */
err = utf8_to_local_encoding(yes, 0, &local_text);
- if (err != UTF8_CONVERT_OK) {
- assert(err != UTF8_CONVERT_BADENC);
+ if (err != NSERROR_OK) {
+ assert(err != NSERROR_BAD_ENCODING);
LOG(("utf8_to_local_encoding_failed"));
local_text = NULL;
}
@@ -201,8 +203,8 @@ query_id query_user_xy(const char *query, const char *detail,
/* set the text of the 'No' button and size accordingly */
err = utf8_to_local_encoding(no, 0, &local_text);
- if (err != UTF8_CONVERT_OK) {
- assert(err != UTF8_CONVERT_BADENC);
+ if (err != NSERROR_OK) {
+ assert(err != NSERROR_BAD_ENCODING);
LOG(("utf8_to_local_encoding_failed"));
local_text = NULL;
}
diff --git a/riscos/query.h b/riscos/query.h
index 92e3e292e..857cce063 100644
--- a/riscos/query.h
+++ b/riscos/query.h
@@ -23,10 +23,32 @@
#include "oslib/wimp.h"
#include "utils/utils.h"
+enum query_response {
+ QUERY_CONTINUE,
+ QUERY_YES,
+ QUERY_NO,
+ QUERY_ESCAPE
+};
+
+typedef int query_id;
+
+#define QUERY_INVALID ((query_id)-1)
+
+typedef struct
+{
+ void (*confirm)(query_id id, enum query_response res, void *pw);
+ void (*cancel)(query_id, enum query_response res, void *pw);
+} query_callback;
+
+
query_id query_user_xy(const char *query, const char *detail,
const query_callback *cb, void *pw, const char *yes, const char *no,
int x, int y);
void ro_gui_query_init(void);
void ro_gui_query_window_bring_to_front(query_id id);
+query_id query_user(const char *query, const char *detail,
+ const query_callback *cb, void *pw, const char *yes, const char *no);
+void query_close(query_id);
+
#endif
diff --git a/riscos/save.c b/riscos/save.c
index 4d1740397..cc8612bb5 100644
--- a/riscos/save.c
+++ b/riscos/save.c
@@ -35,6 +35,13 @@
#include "oslib/osspriteop.h"
#include "oslib/wimp.h"
#include "oslib/wimpspriteop.h"
+
+#include "utils/config.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/url.h"
+#include "utils/utf8.h"
+#include "utils/utils.h"
#include "content/content.h"
#include "content/hlcache.h"
#include "desktop/hotlist.h"
@@ -43,8 +50,10 @@
#include "desktop/save_complete.h"
#include "desktop/save_text.h"
#include "desktop/thumbnail.h"
+#include "desktop/gui.h"
#include "image/bitmap.h"
#include "render/form.h"
+
#include "riscos/bitmap.h"
#include "riscos/dialog.h"
#include "riscos/gui.h"
@@ -60,12 +69,8 @@
#include "riscos/thumbnail.h"
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
-#include "utils/config.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/url.h"
-#include "utils/utf8.h"
-#include "utils/utils.h"
+#include "riscos/ucstables.h"
+#include "riscos/filetype.h"
//typedef enum
//{
@@ -357,8 +362,8 @@ bool ro_gui_save_ok(wimp_w w)
* \param g gui window
*/
-void gui_drag_save_object(gui_save_type save_type, hlcache_handle *c,
- struct gui_window *g)
+void gui_drag_save_object(struct gui_window *g, hlcache_handle *c,
+ gui_save_type save_type)
{
wimp_pointer pointer;
char icon_buf[20];
@@ -614,7 +619,6 @@ static void ro_gui_save_drag_end(wimp_dragged *drag, void *data)
os_error *error;
char *dp, *ep;
char *local_name = NULL;
- utf8_convert_ret err;
if (dragbox_active)
ro_gui_drag_box_cancel();
@@ -650,10 +654,11 @@ static void ro_gui_save_drag_end(wimp_dragged *drag, void *data)
if (!saving_from_dialog) {
/* saving directly from browser window, choose a
* name based upon the URL */
+ nserror err;
err = utf8_to_local_encoding(save_leafname, 0, &local_name);
- if (err != UTF8_CONVERT_OK) {
+ if (err != NSERROR_OK) {
/* badenc should never happen */
- assert(err != UTF8_CONVERT_BADENC);
+ assert(err != NSERROR_BAD_ENCODING);
local_name = NULL;
}
name = local_name ? local_name : save_leafname;
@@ -1216,9 +1221,8 @@ void ro_gui_save_set_state(hlcache_handle *h, gui_save_type save_type,
const char *name = gui_save_table[save_type].name;
bool done = false;
char *nice = NULL;
- utf8_convert_ret err;
+ nserror err;
char *local_name;
- size_t i;
assert(icon_len >= 13);
@@ -1247,7 +1251,8 @@ void ro_gui_save_set_state(hlcache_handle *h, gui_save_type save_type,
/* leafname */
if (url && url_nice(url, &nice, nsoption_bool(strip_extensions)) ==
- URL_FUNC_OK) {
+ NSERROR_OK) {
+ size_t i;
for (i = 0; nice[i]; i++) {
if (nice[i] == '.')
nice[i] = '/';
@@ -1270,13 +1275,14 @@ void ro_gui_save_set_state(hlcache_handle *h, gui_save_type save_type,
leaf_buf[leaf_len - 1] = 0;
err = utf8_to_local_encoding(name, 0, &local_name);
- if (err != UTF8_CONVERT_OK) {
+ if (err != NSERROR_OK) {
/* badenc should never happen */
- assert(err != UTF8_CONVERT_BADENC);
+ assert(err != NSERROR_BAD_ENCODING);
local_name = NULL;
}
- name = local_name ? local_name : name;
+ if (local_name != NULL)
+ name = local_name;
/* sprite name used for icon and dragging */
if (save_type == GUI_SAVE_COMPLETE) {
diff --git a/riscos/save.h b/riscos/save.h
index 34a4a6ba9..d3ca5c214 100644
--- a/riscos/save.h
+++ b/riscos/save.h
@@ -25,19 +25,23 @@
#include <stdbool.h>
#include "oslib/wimp.h"
-#include "desktop/gui.h"
+
+enum gui_save_type;
+
+void gui_drag_save_object(struct gui_window *g, struct hlcache_handle *c, enum gui_save_type save_type);
+void gui_drag_save_selection(struct gui_window *g, const char *selection);
wimp_w ro_gui_saveas_create(const char *template_name);
void ro_gui_saveas_quit(void);
-void ro_gui_save_prepare(gui_save_type save_type, struct hlcache_handle *h,
+void ro_gui_save_prepare(enum gui_save_type save_type, struct hlcache_handle *h,
char *s, const char *url,
const char *title);
void ro_gui_save_start_drag(wimp_pointer *pointer);
-void ro_gui_drag_save_link(gui_save_type save_type, const char *url,
+void ro_gui_drag_save_link(enum gui_save_type save_type, const char *url,
const char *title, struct gui_window *g);
void ro_gui_drag_icon(int x, int y, const char *sprite);
void ro_gui_drag_box_cancel(void);
-void ro_gui_send_datasave(gui_save_type save_type, wimp_full_message_data_xfer *message, wimp_t to);
+void ro_gui_send_datasave(enum gui_save_type save_type, wimp_full_message_data_xfer *message, wimp_t to);
void ro_gui_save_datasave_ack(wimp_message *message);
bool ro_gui_save_ok(wimp_w w);
void ro_gui_convert_save_path(char *dp, size_t len, const char *p);
diff --git a/riscos/save_draw.c b/riscos/save_draw.c
index e0823323b..e8b7faae6 100644
--- a/riscos/save_draw.c
+++ b/riscos/save_draw.c
@@ -26,18 +26,21 @@
#include <assert.h>
#include <limits.h>
-#include "oslib/draw.h"
-#include "oslib/osfile.h"
-#include "pencil.h"
+#include <oslib/draw.h>
+#include <oslib/osfile.h>
+#include <pencil.h>
+
+#include "utils/log.h"
+#include "utils/types.h"
+#include "utils/utils.h"
#include "content/content.h"
#include "content/hlcache.h"
#include "desktop/plotters.h"
+
#include "riscos/bitmap.h"
#include "riscos/gui.h"
#include "riscos/save_draw.h"
-#include "utils/log.h"
-#include "utils/types.h"
-#include "utils/utils.h"
+#include "riscos/font.h"
static bool ro_save_draw_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *style);
static bool ro_save_draw_line(int x0, int y0, int x1, int y1, const plot_style_t *style);
diff --git a/riscos/schedule.c b/riscos/schedule.c
index 257f2e72f..59cb97d9b 100644
--- a/riscos/schedule.c
+++ b/riscos/schedule.c
@@ -24,10 +24,11 @@
#include <stdbool.h>
#include <stdlib.h>
+
#include "oslib/os.h"
-#include "riscos/gui.h"
#include "utils/log.h"
-#include "utils/schedule.h"
+
+#include "riscos/gui.h"
/** Entry in the queue of scheduled callbacks. */
@@ -50,32 +51,65 @@ bool sched_active = false;
/** Time of soonest scheduled event (valid only if sched_active is true). */
os_t sched_time;
-
/**
- * Schedule a callback.
+ * Unschedule a callback.
*
- * \param t interval before the callback should be made / cs
* \param callback callback function
* \param p user parameter, passed to callback function
*
- * The callback function will be called as soon as possible after t cs have
- * passed.
+ * All scheduled callbacks matching both callback and p are removed.
*/
-void schedule(int t, void (*callback)(void *p), void *p)
+static nserror schedule_remove(void (*callback)(void *p), void *p)
+{
+ struct sched_entry *entry, *prev;
+
+ prev = &sched_queue;
+
+ for (entry = prev->next; entry; entry = prev->next) {
+ if (entry->callback != callback || entry->p != p) {
+ prev = entry;
+ continue;
+ }
+
+ prev->next = entry->next;
+ free(entry);
+
+ /* There can only ever be one match, and we've found it */
+ break;
+ }
+
+ if (sched_queue.next) {
+ sched_active = true;
+ sched_time = sched_queue.next->time;
+ } else {
+ sched_active = false;
+ }
+
+ return NSERROR_OK;
+}
+
+/* exported function documented in riscos/gui.h */
+nserror riscos_schedule(int t, void (*callback)(void *p), void *p)
{
struct sched_entry *entry;
struct sched_entry *queue;
os_t time;
+ nserror ret;
- schedule_remove(callback, p);
+ ret = schedule_remove(callback, p);
+ if ((t < 0) || (ret != NSERROR_OK)) {
+ return ret;
+ }
+
+ t = t / 10; /* convert to centiseconds */
time = os_read_monotonic_time() + t;
entry = malloc(sizeof *entry);
if (!entry) {
LOG(("malloc failed"));
- return;
+ return NSERROR_NOMEM;
}
entry->time = time;
@@ -91,61 +125,31 @@ void schedule(int t, void (*callback)(void *p), void *p)
sched_active = true;
sched_time = sched_queue.next->time;
-}
-
-/**
- * Unschedule a callback.
- *
- * \param callback callback function
- * \param p user parameter, passed to callback function
- *
- * All scheduled callbacks matching both callback and p are removed.
- */
-
-void schedule_remove(void (*callback)(void *p), void *p)
-{
- struct sched_entry *entry, *next;
-
- for (entry = &sched_queue; entry->next; entry = entry->next) {
- if (entry->next->callback != callback || entry->next->p != p)
- continue;
- next = entry->next;
- entry->next = entry->next->next;
- free(next);
- if (!entry->next)
- break;
- }
-
- if (sched_queue.next) {
- sched_active = true;
- sched_time = sched_queue.next->time;
- } else
- sched_active = false;
+ return NSERROR_OK;
}
-/**
- * Process events up to current time.
- */
-
+/* exported function documented in riscos/gui.h */
bool schedule_run(void)
{
struct sched_entry *entry;
- void (*callback)(void *p);
- void *p;
os_t now;
now = os_read_monotonic_time();
while (sched_queue.next && sched_queue.next->time <= now) {
+ void (*callback)(void *p);
+ void *p;
+
entry = sched_queue.next;
callback = entry->callback;
p = entry->p;
sched_queue.next = entry->next;
free(entry);
- /* The callback may call schedule() or schedule_remove(), so
- * leave the queue in a safe state. */
+ /* The callback may call riscos_schedule(), so leave
+ * the queue in a safe state.
+ */
callback(p);
}
diff --git a/riscos/search.c b/riscos/search.c
index 3d3b7ba4a..e5e3d987d 100644
--- a/riscos/search.c
+++ b/riscos/search.c
@@ -27,20 +27,22 @@
#include <string.h>
#include "oslib/hourglass.h"
#include "oslib/wimp.h"
-#include "utils/config.h"
+
#include "content/content.h"
#include "content/hlcache.h"
#include "desktop/browser.h"
#include "desktop/gui.h"
-#include "desktop/browser_private.h"
+#include "desktop/browser.h"
#include "desktop/search.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/utils.h"
+
+#include "riscos/gui.h"
#include "riscos/dialog.h"
#include "riscos/menus.h"
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/utils.h"
#define RECENT_SEARCHES 8
@@ -48,12 +50,10 @@ struct search_static_data {
char *recent_searches[RECENT_SEARCHES];
bool search_insert;
struct browser_window *search_window;
- search_flags_t flags;
- char *string;
};
static struct search_static_data search_data =
- {{NULL}, false, NULL, 0, NULL};
+ { { NULL }, false, NULL };
static wimp_MENU(RECENT_SEARCHES) menu_recent;
wimp_menu *recent_search_menu = (wimp_menu *)&menu_recent;
@@ -76,14 +76,16 @@ static void ro_gui_search_set_status(bool found, void *p);
static void ro_gui_search_set_hourglass(bool active, void *p);
static void ro_gui_search_add_recent(const char *string, void *p);
-static struct gui_search_callbacks ro_gui_search_callbacks = {
- ro_gui_search_set_forward_state,
- ro_gui_search_set_back_state,
+static struct gui_search_table search_table = {
ro_gui_search_set_status,
ro_gui_search_set_hourglass,
- ro_gui_search_add_recent
+ ro_gui_search_add_recent,
+ ro_gui_search_set_forward_state,
+ ro_gui_search_set_back_state,
};
+struct gui_search_table *riscos_search_table = &search_table;
+
void ro_gui_search_init(void)
{
dialog_search = ro_gui_dialog_create("search");
@@ -122,8 +124,7 @@ bool ro_gui_search_next(wimp_w w)
search_data.search_insert = true;
search_flags_t flags = SEARCH_FLAG_FORWARDS |
ro_gui_search_update_flags();
- browser_window_search(search_data.search_window,
- &ro_gui_search_callbacks, NULL, flags,
+ browser_window_search(search_data.search_window, NULL, flags,
ro_gui_get_icon_string(dialog_search,
ICON_SEARCH_TEXT));
return false;
@@ -163,8 +164,7 @@ bool ro_gui_search_click(wimp_pointer *pointer)
search_data.search_insert = true;
flags = ~SEARCH_FLAG_FORWARDS &
ro_gui_search_update_flags();
- browser_window_search(search_data.search_window,
- &ro_gui_search_callbacks, NULL,
+ browser_window_search(search_data.search_window, NULL,
flags,
ro_gui_get_icon_string(dialog_search,
ICON_SEARCH_TEXT));
@@ -172,8 +172,7 @@ bool ro_gui_search_click(wimp_pointer *pointer)
case ICON_SEARCH_CASE_SENSITIVE:
flags = SEARCH_FLAG_FORWARDS |
ro_gui_search_update_flags();
- browser_window_search(search_data.search_window,
- &ro_gui_search_callbacks, NULL,
+ browser_window_search(search_data.search_window, NULL,
flags,
ro_gui_get_icon_string(dialog_search,
ICON_SEARCH_TEXT));
@@ -182,8 +181,7 @@ bool ro_gui_search_click(wimp_pointer *pointer)
flags = ro_gui_get_icon_selected_state(
pointer->w, pointer->i) ?
SEARCH_FLAG_SHOWALL : SEARCH_FLAG_NONE;
- browser_window_search(search_data.search_window,
- &ro_gui_search_callbacks, NULL,
+ browser_window_search(search_data.search_window, NULL,
flags,
ro_gui_get_icon_string(dialog_search,
ICON_SEARCH_TEXT));
@@ -262,21 +260,37 @@ bool ro_gui_search_prepare_menu(void)
}
/**
- * Open the search dialog
+ * Determine of the browser window is searchable.
*
- * \param bw the browser window to search
+ * \param bw The browser window to check.
*/
-void ro_gui_search_prepare(struct browser_window *bw)
+static bool ro_gui_search_bw_searchable(struct browser_window *bw)
{
hlcache_handle *h;
assert(bw != NULL);
- h = bw->current_content;
+ h = browser_window_get_content(bw);
/* only handle html/textplain contents */
+ /** \todo Should have content_is_searchable() api */
if ((!h) || (content_get_type(h) != CONTENT_HTML &&
content_get_type(h) != CONTENT_TEXTPLAIN))
+ return false;
+
+ return true;
+}
+
+
+/**
+ * Open the search dialog
+ *
+ * \param bw the browser window to search
+ */
+void ro_gui_search_prepare(struct browser_window *bw)
+{
+ /* only handle searchable contents */
+ if (!ro_gui_search_bw_searchable(bw))
return;
/* if the search dialogue is reopened over a new window, we may
@@ -313,8 +327,7 @@ bool ro_gui_search_keypress(wimp_key *key)
case 1: {
flags = ro_gui_search_update_flags()
^ SEARCH_FLAG_SHOWALL;
- browser_window_search(search_data.search_window,
- &ro_gui_search_callbacks, NULL,
+ browser_window_search(search_data.search_window, NULL,
flags,
ro_gui_get_icon_string(dialog_search,
ICON_SEARCH_TEXT));
@@ -327,8 +340,7 @@ bool ro_gui_search_keypress(wimp_key *key)
ICON_SEARCH_CASE_SENSITIVE, !state);
flags = SEARCH_FLAG_FORWARDS |
ro_gui_search_update_flags();
- browser_window_search(search_data.search_window,
- &ro_gui_search_callbacks, NULL,
+ browser_window_search(search_data.search_window, NULL,
flags,
ro_gui_get_icon_string(dialog_search,
ICON_SEARCH_TEXT));
@@ -337,8 +349,7 @@ bool ro_gui_search_keypress(wimp_key *key)
search_data.search_insert = true;
flags = ~SEARCH_FLAG_FORWARDS &
ro_gui_search_update_flags();
- browser_window_search(search_data.search_window,
- &ro_gui_search_callbacks, NULL,
+ browser_window_search(search_data.search_window, NULL,
flags,
ro_gui_get_icon_string(dialog_search,
ICON_SEARCH_TEXT));
@@ -347,8 +358,7 @@ bool ro_gui_search_keypress(wimp_key *key)
search_data.search_insert = true;
flags = SEARCH_FLAG_FORWARDS |
ro_gui_search_update_flags();
- browser_window_search(search_data.search_window,
- &ro_gui_search_callbacks, NULL,
+ browser_window_search(search_data.search_window, NULL,
flags,
ro_gui_get_icon_string(dialog_search,
ICON_SEARCH_TEXT));
@@ -360,10 +370,6 @@ bool ro_gui_search_keypress(wimp_key *key)
* a new search */
browser_window_search_clear(
search_data.search_window);
- ro_gui_search_set_forward_state(true,
- search_data.search_window);
- ro_gui_search_set_back_state(true,
- search_data.search_window);
search_data.search_insert = true;
}
if (key->c == 8 || /* backspace */
@@ -376,7 +382,7 @@ bool ro_gui_search_keypress(wimp_key *key)
ro_gui_search_set_back_state(true,
search_data.search_window);
browser_window_search(search_data.search_window,
- &ro_gui_search_callbacks, NULL,
+ NULL,
flags,
ro_gui_get_icon_string(
dialog_search,
@@ -396,8 +402,6 @@ bool ro_gui_search_keypress(wimp_key *key)
void ro_gui_search_end(wimp_w w)
{
browser_window_search_clear(search_data.search_window);
- ro_gui_search_set_forward_state(true, search_data.search_window);
- ro_gui_search_set_back_state(true, search_data.search_window);
}
/**
diff --git a/riscos/sslcert.c b/riscos/sslcert.c
index 1395d274e..a9c79687c 100644
--- a/riscos/sslcert.c
+++ b/riscos/sslcert.c
@@ -27,6 +27,7 @@
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
+
#include "oslib/wimp.h"
#include "content/content.h"
#include "content/hlcache.h"
@@ -36,6 +37,9 @@
#include "desktop/sslcert_viewer.h"
#include "desktop/gui.h"
#include "desktop/tree.h"
+#include "utils/log.h"
+#include "utils/utils.h"
+
#include "riscos/dialog.h"
#include "riscos/sslcert.h"
#include "riscos/textarea.h"
@@ -43,8 +47,7 @@
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
#include "riscos/wimputils.h"
-#include "utils/log.h"
-#include "utils/utils.h"
+#include "riscos/gui.h"
#define ICON_SSL_PANE 1
#define ICON_SSL_REJECT 3
diff --git a/riscos/sslcert.h b/riscos/sslcert.h
index 7fba9d3f2..17fce5552 100644
--- a/riscos/sslcert.h
+++ b/riscos/sslcert.h
@@ -24,6 +24,8 @@
#ifndef _NETSURF_RISCOS_SSLCERT_H_
#define _NETSURF_RISCOS_SSLCERT_H_
+struct node;
+
void ro_gui_cert_preinitialise(void);
void ro_gui_cert_postinitialise(void);
void ro_gui_cert_open(struct tree *tree, struct node *node);
diff --git a/riscos/templates/de b/riscos/templates/de
index 905d57ec0..c840caa4b 100644
--- a/riscos/templates/de
+++ b/riscos/templates/de
@@ -28,7 +28,7 @@ wimp_window {
wimp_window {
template_name:"con_cache"
- visible:500,860,1088,1100
+ visible:500,672,1088,1100
xscroll:0
yscroll:0
next:wimp_TOP
@@ -41,7 +41,7 @@ wimp_window {
scroll_inner:wimp_COLOUR_VERY_LIGHT_GREY
highlight_bg:wimp_COLOUR_CREAM
extra_flags:
- extent:0,-240,588,0
+ extent:0,-428,588,0
title_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED
work_flags:
sprite_area:&1
@@ -69,7 +69,7 @@ wimp_window {
text_and_sprite.validation:""
}
wimp_icon {
- extent:80,-100,200,-56
+ extent:44,-100,164,-56
icon_flags:wimp_ICON_TEXT | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_ICON_RJUSTIFIED
icon_esg:0
icon_fg:wimp_COLOUR_BLACK
@@ -79,7 +79,7 @@ wimp_window {
text.validation:""
}
wimp_icon {
- extent:204,-104,372,-52
+ extent:168,-104,336,-52
icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED | wimp_ICON_INDIRECTED | wimp_BUTTON_WRITABLE
icon_esg:0
icon_fg:wimp_COLOUR_BLACK
@@ -89,7 +89,7 @@ wimp_window {
text.validation:"Pptr_write;Kta"
}
wimp_icon {
- extent:388,-96,420,-64
+ extent:352,-96,384,-64
icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_BUTTON_REPEAT
icon_esg:0
icon_fg:wimp_COLOUR_BLACK
@@ -99,7 +99,7 @@ wimp_window {
text_and_sprite.validation:"r5;sdown,pdown"
}
wimp_icon {
- extent:420,-96,452,-64
+ extent:384,-96,416,-64
icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_BUTTON_REPEAT
icon_esg:0
icon_fg:wimp_COLOUR_BLACK
@@ -109,7 +109,7 @@ wimp_window {
text_and_sprite.validation:"r5;sup,pup"
}
wimp_icon {
- extent:460,-100,516,-56
+ extent:424,-100,480,-56
icon_flags:wimp_ICON_TEXT | wimp_ICON_VCENTRED | wimp_ICON_RJUSTIFIED
icon_esg:0
icon_fg:wimp_COLOUR_BLACK
@@ -117,7 +117,123 @@ wimp_window {
text_only:"MB"
}
wimp_icon {
- extent:24,-208,188,-156
+ extent:16,-312,568,-152
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text.text:""
+ text.size:*
+ text.validation:"R4"
+ }
+ wimp_icon {
+ extent:32,-180,268,-136
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_and_sprite.text:" Disc cache "
+ text_and_sprite.size:*
+ text_and_sprite.validation:""
+ }
+ wimp_icon {
+ extent:44,-232,164,-188
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_ICON_RJUSTIFIED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text.text:"Größe"
+ text.size:13
+ text.validation:""
+ }
+ wimp_icon {
+ extent:168,-236,336,-184
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED | wimp_ICON_INDIRECTED | wimp_BUTTON_WRITABLE
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_WHITE
+ text.text:"512"
+ text.size:10
+ text.validation:"Pptr_write;Kta;A0-9"
+ }
+ wimp_icon {
+ extent:352,-228,384,-196
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_BUTTON_REPEAT
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_and_sprite.text:""
+ text_and_sprite.size:*
+ text_and_sprite.validation:"r5;sdown,pdown"
+ }
+ wimp_icon {
+ extent:384,-228,416,-196
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_BUTTON_REPEAT
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_and_sprite.text:""
+ text_and_sprite.size:*
+ text_and_sprite.validation:"r5;sup,pup"
+ }
+ wimp_icon {
+ extent:424,-232,480,-192
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_VCENTRED | wimp_ICON_RJUSTIFIED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_only:"MB"
+ }
+ wimp_icon {
+ extent:44,-292,164,-248
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_ICON_RJUSTIFIED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text.text:"Expiry"
+ text.size:13
+ text.validation:""
+ }
+ wimp_icon {
+ extent:168,-296,336,-244
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED | wimp_ICON_INDIRECTED | wimp_BUTTON_WRITABLE
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_WHITE
+ text.text:"512"
+ text.size:10
+ text.validation:"Pptr_write;Kta;A0-9"
+ }
+ wimp_icon {
+ extent:352,-288,384,-256
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_BUTTON_REPEAT
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_and_sprite.text:""
+ text_and_sprite.size:*
+ text_and_sprite.validation:"r5;sdown,pdown"
+ }
+ wimp_icon {
+ extent:384,-288,416,-256
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_BUTTON_REPEAT
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_and_sprite.text:""
+ text_and_sprite.size:*
+ text_and_sprite.validation:"r5;sup,pup"
+ }
+ wimp_icon {
+ extent:424,-292,500,-252
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_VCENTRED | wimp_ICON_RJUSTIFIED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_only:"days"
+ }
+ wimp_icon {
+ extent:24,-396,188,-344
icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED | wimp_ICON_INDIRECTED | wimp_BUTTON_CLICK
icon_esg:0
icon_fg:wimp_COLOUR_BLACK
@@ -127,7 +243,7 @@ wimp_window {
text.validation:"R5,3"
}
wimp_icon {
- extent:204,-208,368,-156
+ extent:204,-396,368,-344
icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED | wimp_ICON_INDIRECTED | wimp_BUTTON_CLICK
icon_esg:0
icon_fg:wimp_COLOUR_BLACK
@@ -137,7 +253,7 @@ wimp_window {
text.validation:"R5,3"
}
wimp_icon {
- extent:384,-216,568,-148
+ extent:384,-404,568,-336
icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED | wimp_ICON_INDIRECTED | wimp_BUTTON_CLICK
icon_esg:0
icon_fg:wimp_COLOUR_BLACK
@@ -1683,7 +1799,7 @@ wimp_window {
icon_fg:wimp_COLOUR_BLACK
icon_bg:wimp_COLOUR_WHITE
text.text:""
- text.size:128
+ text.size:1
text.validation:"Pptr_write;Kta"
}
wimp_icon {
diff --git a/riscos/templates/en b/riscos/templates/en
index a943b1e91..fbad63abf 100644
--- a/riscos/templates/en
+++ b/riscos/templates/en
@@ -28,7 +28,7 @@ wimp_window {
wimp_window {
template_name:"con_cache"
- visible:184,870,772,1110
+ visible:184,682,772,1110
xscroll:0
yscroll:0
next:wimp_TOP
@@ -41,7 +41,7 @@ wimp_window {
scroll_inner:wimp_COLOUR_VERY_LIGHT_GREY
highlight_bg:wimp_COLOUR_CREAM
extra_flags:
- extent:0,-240,588,0
+ extent:0,-428,588,0
title_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED
work_flags:
sprite_area:&1
@@ -117,7 +117,123 @@ wimp_window {
text_only:"MB"
}
wimp_icon {
- extent:24,-208,188,-156
+ extent:16,-312,568,-152
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text.text:""
+ text.size:*
+ text.validation:"R4"
+ }
+ wimp_icon {
+ extent:32,-180,268,-136
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_and_sprite.text:" Disc cache "
+ text_and_sprite.size:*
+ text_and_sprite.validation:""
+ }
+ wimp_icon {
+ extent:44,-232,164,-188
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_ICON_RJUSTIFIED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text.text:"Size"
+ text.size:13
+ text.validation:""
+ }
+ wimp_icon {
+ extent:168,-236,336,-184
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED | wimp_ICON_INDIRECTED | wimp_BUTTON_WRITABLE
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_WHITE
+ text.text:"512"
+ text.size:10
+ text.validation:"Pptr_write;Kta;A0-9"
+ }
+ wimp_icon {
+ extent:352,-228,384,-196
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_BUTTON_REPEAT
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_and_sprite.text:""
+ text_and_sprite.size:*
+ text_and_sprite.validation:"r5;sdown,pdown"
+ }
+ wimp_icon {
+ extent:384,-228,416,-196
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_BUTTON_REPEAT
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_and_sprite.text:""
+ text_and_sprite.size:*
+ text_and_sprite.validation:"r5;sup,pup"
+ }
+ wimp_icon {
+ extent:424,-232,480,-192
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_VCENTRED | wimp_ICON_RJUSTIFIED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_only:"MB"
+ }
+ wimp_icon {
+ extent:44,-292,164,-248
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_ICON_RJUSTIFIED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text.text:"Expiry"
+ text.size:13
+ text.validation:""
+ }
+ wimp_icon {
+ extent:168,-296,336,-244
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED | wimp_ICON_INDIRECTED | wimp_BUTTON_WRITABLE
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_WHITE
+ text.text:"512"
+ text.size:10
+ text.validation:"Pptr_write;Kta;A0-9"
+ }
+ wimp_icon {
+ extent:352,-288,384,-256
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_BUTTON_REPEAT
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_and_sprite.text:""
+ text_and_sprite.size:*
+ text_and_sprite.validation:"r5;sdown,pdown"
+ }
+ wimp_icon {
+ extent:384,-288,416,-256
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_BUTTON_REPEAT
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_and_sprite.text:""
+ text_and_sprite.size:*
+ text_and_sprite.validation:"r5;sup,pup"
+ }
+ wimp_icon {
+ extent:424,-292,500,-252
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_VCENTRED | wimp_ICON_RJUSTIFIED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_only:"days"
+ }
+ wimp_icon {
+ extent:24,-396,188,-344
icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED | wimp_ICON_INDIRECTED | wimp_BUTTON_CLICK
icon_esg:0
icon_fg:wimp_COLOUR_BLACK
@@ -127,7 +243,7 @@ wimp_window {
text.validation:"R5,3"
}
wimp_icon {
- extent:204,-208,368,-156
+ extent:204,-396,368,-344
icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED | wimp_ICON_INDIRECTED | wimp_BUTTON_CLICK
icon_esg:0
icon_fg:wimp_COLOUR_BLACK
@@ -137,7 +253,7 @@ wimp_window {
text.validation:"R5,3"
}
wimp_icon {
- extent:384,-216,568,-148
+ extent:384,-404,568,-336
icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED | wimp_ICON_INDIRECTED | wimp_BUTTON_CLICK
icon_esg:0
icon_fg:wimp_COLOUR_BLACK
@@ -1891,7 +2007,7 @@ wimp_window {
icon_fg:wimp_COLOUR_BLACK
icon_bg:wimp_COLOUR_WHITE
text.text:""
- text.size:128
+ text.size:1
text.validation:"Pptr_write;Kta"
}
wimp_icon {
diff --git a/riscos/templates/fr b/riscos/templates/fr
index 30bcbfaf5..11612dd5c 100644
--- a/riscos/templates/fr
+++ b/riscos/templates/fr
@@ -28,7 +28,7 @@ wimp_window {
wimp_window {
template_name:"con_cache"
- visible:564,724,1152,964
+ visible:564,536,1152,964
xscroll:0
yscroll:0
next:wimp_TOP
@@ -41,7 +41,7 @@ wimp_window {
scroll_inner:wimp_COLOUR_VERY_LIGHT_GREY
highlight_bg:wimp_COLOUR_CREAM
extra_flags:
- extent:0,-240,588,0
+ extent:0,-428,588,0
title_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED
work_flags:
sprite_area:&1
@@ -117,7 +117,123 @@ wimp_window {
text_only:"MB"
}
wimp_icon {
- extent:24,-208,188,-156
+ extent:16,-312,568,-152
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text.text:""
+ text.size:*
+ text.validation:"R4"
+ }
+ wimp_icon {
+ extent:32,-180,268,-136
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_and_sprite.text:" Disc cache "
+ text_and_sprite.size:*
+ text_and_sprite.validation:""
+ }
+ wimp_icon {
+ extent:44,-232,164,-188
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_ICON_RJUSTIFIED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text.text:"Taille"
+ text.size:13
+ text.validation:""
+ }
+ wimp_icon {
+ extent:168,-236,336,-184
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED | wimp_ICON_INDIRECTED | wimp_BUTTON_WRITABLE
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_WHITE
+ text.text:"512"
+ text.size:10
+ text.validation:"Pptr_write;Kta;A0-9"
+ }
+ wimp_icon {
+ extent:352,-228,384,-196
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_BUTTON_REPEAT
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_and_sprite.text:""
+ text_and_sprite.size:*
+ text_and_sprite.validation:"r5;sdown,pdown"
+ }
+ wimp_icon {
+ extent:384,-228,416,-196
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_BUTTON_REPEAT
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_and_sprite.text:""
+ text_and_sprite.size:*
+ text_and_sprite.validation:"r5;sup,pup"
+ }
+ wimp_icon {
+ extent:424,-232,480,-192
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_VCENTRED | wimp_ICON_RJUSTIFIED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_only:"MB"
+ }
+ wimp_icon {
+ extent:44,-292,164,-248
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_ICON_RJUSTIFIED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text.text:"Expiry"
+ text.size:13
+ text.validation:""
+ }
+ wimp_icon {
+ extent:168,-296,336,-244
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED | wimp_ICON_INDIRECTED | wimp_BUTTON_WRITABLE
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_WHITE
+ text.text:"512"
+ text.size:10
+ text.validation:"Pptr_write;Kta;A0-9"
+ }
+ wimp_icon {
+ extent:352,-288,384,-256
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_BUTTON_REPEAT
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_and_sprite.text:""
+ text_and_sprite.size:*
+ text_and_sprite.validation:"r5;sdown,pdown"
+ }
+ wimp_icon {
+ extent:384,-288,416,-256
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_BUTTON_REPEAT
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_and_sprite.text:""
+ text_and_sprite.size:*
+ text_and_sprite.validation:"r5;sup,pup"
+ }
+ wimp_icon {
+ extent:424,-292,500,-252
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_VCENTRED | wimp_ICON_RJUSTIFIED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_only:"days"
+ }
+ wimp_icon {
+ extent:24,-396,188,-344
icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED | wimp_ICON_INDIRECTED | wimp_BUTTON_CLICK
icon_esg:0
icon_fg:wimp_COLOUR_BLACK
@@ -127,7 +243,7 @@ wimp_window {
text.validation:"R5,3"
}
wimp_icon {
- extent:204,-208,368,-156
+ extent:204,-396,368,-344
icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED | wimp_ICON_INDIRECTED | wimp_BUTTON_CLICK
icon_esg:0
icon_fg:wimp_COLOUR_BLACK
@@ -137,7 +253,7 @@ wimp_window {
text.validation:"R5,3"
}
wimp_icon {
- extent:384,-216,568,-148
+ extent:384,-404,568,-336
icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED | wimp_ICON_INDIRECTED | wimp_BUTTON_CLICK
icon_esg:0
icon_fg:wimp_COLOUR_BLACK
@@ -1695,7 +1811,7 @@ wimp_window {
icon_fg:wimp_COLOUR_BLACK
icon_bg:wimp_COLOUR_WHITE
text.text:""
- text.size:128
+ text.size:1
text.validation:"Pptr_write;Kta"
}
wimp_icon {
diff --git a/riscos/templates/nl b/riscos/templates/nl
index dcc8af5f4..adef82198 100644
--- a/riscos/templates/nl
+++ b/riscos/templates/nl
@@ -28,7 +28,7 @@ wimp_window {
wimp_window {
template_name:"con_cache"
- visible:184,870,772,1110
+ visible:184,682,772,1110
xscroll:0
yscroll:0
next:wimp_TOP
@@ -41,7 +41,7 @@ wimp_window {
scroll_inner:wimp_COLOUR_VERY_LIGHT_GREY
highlight_bg:wimp_COLOUR_CREAM
extra_flags:
- extent:0,-240,588,0
+ extent:0,-428,588,0
title_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED
work_flags:
sprite_area:&1
@@ -69,7 +69,7 @@ wimp_window {
text_and_sprite.validation:""
}
wimp_icon {
- extent:44,-104,164,-60
+ extent:40,-104,164,-60
icon_flags:wimp_ICON_TEXT | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_ICON_RJUSTIFIED
icon_esg:0
icon_fg:wimp_COLOUR_BLACK
@@ -117,7 +117,123 @@ wimp_window {
text_only:"MB"
}
wimp_icon {
- extent:24,-208,188,-156
+ extent:16,-312,568,-152
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text.text:""
+ text.size:*
+ text.validation:"R4"
+ }
+ wimp_icon {
+ extent:32,-180,268,-136
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_and_sprite.text:" Disc cache "
+ text_and_sprite.size:*
+ text_and_sprite.validation:""
+ }
+ wimp_icon {
+ extent:40,-232,164,-188
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_ICON_RJUSTIFIED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text.text:"Omvang"
+ text.size:13
+ text.validation:""
+ }
+ wimp_icon {
+ extent:168,-236,336,-184
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED | wimp_ICON_INDIRECTED | wimp_BUTTON_WRITABLE
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_WHITE
+ text.text:"512"
+ text.size:10
+ text.validation:"Pptr_write;Kta;A0-9"
+ }
+ wimp_icon {
+ extent:352,-228,384,-196
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_BUTTON_REPEAT
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_and_sprite.text:""
+ text_and_sprite.size:*
+ text_and_sprite.validation:"r5;sdown,pdown"
+ }
+ wimp_icon {
+ extent:384,-228,416,-196
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_BUTTON_REPEAT
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_and_sprite.text:""
+ text_and_sprite.size:*
+ text_and_sprite.validation:"r5;sup,pup"
+ }
+ wimp_icon {
+ extent:424,-232,480,-192
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_VCENTRED | wimp_ICON_RJUSTIFIED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_only:"MB"
+ }
+ wimp_icon {
+ extent:44,-292,164,-248
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_ICON_RJUSTIFIED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text.text:"Expiry"
+ text.size:13
+ text.validation:""
+ }
+ wimp_icon {
+ extent:168,-296,336,-244
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED | wimp_ICON_INDIRECTED | wimp_BUTTON_WRITABLE
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_WHITE
+ text.text:"512"
+ text.size:10
+ text.validation:"Pptr_write;Kta;A0-9"
+ }
+ wimp_icon {
+ extent:352,-288,384,-256
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_BUTTON_REPEAT
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_and_sprite.text:""
+ text_and_sprite.size:*
+ text_and_sprite.validation:"r5;sdown,pdown"
+ }
+ wimp_icon {
+ extent:384,-288,416,-256
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_BUTTON_REPEAT
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_and_sprite.text:""
+ text_and_sprite.size:*
+ text_and_sprite.validation:"r5;sup,pup"
+ }
+ wimp_icon {
+ extent:424,-292,500,-252
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_VCENTRED | wimp_ICON_RJUSTIFIED
+ icon_esg:0
+ icon_fg:wimp_COLOUR_BLACK
+ icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
+ text_only:"days"
+ }
+ wimp_icon {
+ extent:24,-396,188,-344
icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED | wimp_ICON_INDIRECTED | wimp_BUTTON_CLICK
icon_esg:0
icon_fg:wimp_COLOUR_BLACK
@@ -127,7 +243,7 @@ wimp_window {
text.validation:"R5,3"
}
wimp_icon {
- extent:204,-208,368,-156
+ extent:204,-396,368,-344
icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED | wimp_ICON_INDIRECTED | wimp_BUTTON_CLICK
icon_esg:0
icon_fg:wimp_COLOUR_BLACK
@@ -137,7 +253,7 @@ wimp_window {
text.validation:"R5,3"
}
wimp_icon {
- extent:384,-216,568,-148
+ extent:384,-404,568,-336
icon_flags:wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_FILLED | wimp_ICON_INDIRECTED | wimp_BUTTON_CLICK
icon_esg:0
icon_fg:wimp_COLOUR_BLACK
@@ -1895,7 +2011,7 @@ wimp_window {
icon_fg:wimp_COLOUR_BLACK
icon_bg:wimp_COLOUR_WHITE
text.text:""
- text.size:128
+ text.size:1
text.validation:"Pptr_write;Kta"
}
wimp_icon {
diff --git a/riscos/textarea.c b/riscos/textarea.c
index 86774fad4..303b7e771 100644
--- a/riscos/textarea.c
+++ b/riscos/textarea.c
@@ -24,13 +24,17 @@
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
-#include "swis.h"
-#include "oslib/colourtrans.h"
-#include "oslib/osbyte.h"
-#include "oslib/serviceinternational.h"
-#include "oslib/wimp.h"
-#include "oslib/wimpspriteop.h"
-#include "rufl.h"
+#include <swis.h>
+#include <oslib/colourtrans.h>
+#include <oslib/osbyte.h>
+#include <oslib/serviceinternational.h>
+#include <oslib/wimp.h>
+#include <oslib/wimpspriteop.h>
+
+#include "utils/log.h"
+#include "utils/utf8.h"
+#include "desktop/browser.h"
+
#include "riscos/gui.h"
#include "riscos/oslib_pre7.h"
#include "riscos/textarea.h"
@@ -38,8 +42,6 @@
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
#include "riscos/wimputils.h"
-#include "utils/log.h"
-#include "utils/utf8.h"
#define MARGIN_LEFT 8
#define MARGIN_RIGHT 8
@@ -909,11 +911,8 @@ bool ro_textarea_key_press(wimp_key *key)
uint32_t c = (uint32_t) key->c;
wimp_key keypress;
struct text_area *ta;
- char utf8[7];
- size_t utf8_len;
bool redraw = false;
unsigned int c_pos;
- os_error *error;
ta = (struct text_area *)ro_gui_wimp_event_get_user_data(key->w);
@@ -923,6 +922,9 @@ bool ro_textarea_key_press(wimp_key *key)
if (!(c & IS_WIMP_KEY ||
(c <= 0x001f || (0x007f <= c && c <= 0x009f)))) {
/* normal character - insert */
+ char utf8[7];
+ size_t utf8_len;
+
utf8_len = utf8_from_ucs4(c, utf8);
utf8[utf8_len] = '\0';
@@ -932,6 +934,7 @@ bool ro_textarea_key_press(wimp_key *key)
redraw = true;
} else {
+ os_error *error;
/** \todo handle command keys */
switch (c & ~IS_WIMP_KEY) {
case 8: /* Backspace */
@@ -1065,8 +1068,7 @@ void ro_textarea_redraw(wimp_draw *redraw)
void ro_textarea_redraw_internal(wimp_draw *redraw, bool update)
{
struct text_area *ta;
- int clip_x0, clip_y0, clip_x1, clip_y1;
- int line0, line1, line;
+ int line;
osbool more;
rufl_code code;
os_error *error;
@@ -1084,9 +1086,9 @@ void ro_textarea_redraw_internal(wimp_draw *redraw, bool update)
}
while (more) {
- clip_x0 = redraw->clip.x0 - (redraw->box.x0-redraw->xscroll);
+ int line0, line1;
+ int clip_y0, clip_y1;
clip_y0 = (redraw->box.y1-redraw->yscroll) - redraw->clip.y1;
- clip_x1 = redraw->clip.x1 - (redraw->box.x0-redraw->xscroll);
clip_y1 = (redraw->box.y1-redraw->yscroll) - redraw->clip.y0;
error = xcolourtrans_set_gcol(
diff --git a/riscos/textselection.c b/riscos/textselection.c
index ab8ea5c3a..f002e0773 100644
--- a/riscos/textselection.c
+++ b/riscos/textselection.c
@@ -25,25 +25,29 @@
#include <string.h>
#include "oslib/osfile.h"
#include "oslib/wimp.h"
+
+#include "utils/log.h"
+#include "utils/utf8.h"
+#include "utils/utils.h"
#include "content/hlcache.h"
#include "desktop/gui.h"
#include "desktop/textinput.h"
+#include "desktop/browser.h"
+
#include "riscos/gui.h"
#include "riscos/menus.h"
#include "riscos/message.h"
#include "riscos/mouse.h"
#include "riscos/save.h"
#include "riscos/textselection.h"
-#include "utils/log.h"
-#include "utils/utf8.h"
-#include "utils/utils.h"
+#include "riscos/ucstables.h"
+
#ifndef wimp_DRAG_CLAIM_SUPPRESS_DRAGBOX
#define wimp_DRAG_CLAIM_SUPPRESS_DRAGBOX ((wimp_drag_claim_flags) 0x2u)
#endif
-
/** Receive of Dragging message has claimed it */
static bool dragging_claimed = false;
static wimp_t dragging_claimant;
@@ -186,20 +190,6 @@ static void ro_gui_selection_drag_end(wimp_dragged *drag, void *data)
browser_window_mouse_track(g->bw, 0, pos.x, pos.y);
}
-
-/**
- * Perform tasks after a selection has been cleared.
- *
- * \param g gui window
- */
-
-void gui_clear_selection(struct gui_window *g)
-{
- /* Refresh any open menu, in case it's the browser window menu. */
- ro_gui_menu_refresh(0);
-}
-
-
/**
* Core tells front end to put given text in clipboard
*
@@ -208,7 +198,7 @@ void gui_clear_selection(struct gui_window *g)
* \param styles Array of styles given to text runs, owned by core, or NULL
* \param n_styles Number of text run styles in array
*/
-void gui_set_clipboard(const char *buffer, size_t length,
+static void gui_set_clipboard(const char *buffer, size_t length,
nsclipboard_styles styles[], int n_styles)
{
char *new_cb;
@@ -259,7 +249,7 @@ void gui_set_clipboard(const char *buffer, size_t length,
* \param buffer UTF-8 text, allocated by front end, ownership yielded to core
* \param length Byte length of UTF-8 text in buffer
*/
-void gui_get_clipboard(char **buffer, size_t *length)
+static void gui_get_clipboard(char **buffer, size_t *length)
{
*buffer = NULL;
*length = 0;
@@ -403,9 +393,6 @@ bool ro_gui_selection_prepare_paste_dataload(
wimp_full_message_data_xfer *dataxfer)
{
FILE *fp;
- long size;
- char *local_cb;
- utf8_convert_ret ret;
/* Ignore messages that aren't for us */
if (dataxfer->your_ref == 0 || dataxfer->your_ref != paste_prev_message)
@@ -413,18 +400,20 @@ bool ro_gui_selection_prepare_paste_dataload(
fp = fopen(dataxfer->file_name, "r");
if (fp != NULL) {
+ long size;
fseek(fp, 0, SEEK_END);
size = ftell(fp);
fseek(fp, 0, SEEK_SET);
if (size > 0) {
- local_cb = malloc(size);
+ char *local_cb = malloc(size);
if (local_cb != NULL) {
+ nserror ret;
fread(local_cb, 1, size, fp);
ret = utf8_from_local_encoding(local_cb, size,
&clipboard);
- if (ret == UTF8_CONVERT_OK) {
+ if (ret == NSERROR_OK) {
clip_length = strlen(clipboard);
}
@@ -523,13 +512,13 @@ void ro_gui_selection_data_request(wimp_full_message_data_request *req)
bool ro_gui_save_clipboard(const char *path)
{
char *local_cb;
- utf8_convert_ret ret;
+ nserror ret;
os_error *error;
assert(clip_length > 0 && clipboard);
ret = utf8_to_local_encoding(clipboard, clip_length, &local_cb);
- if (ret != UTF8_CONVERT_OK) {
+ if (ret != NSERROR_OK) {
warn_user("SaveError", "Could not convert");
return false;
}
@@ -666,3 +655,10 @@ void ro_gui_dragging_bounced(wimp_message *message)
{
dragging_claimed = false;
}
+
+static struct gui_clipboard_table clipboard_table = {
+ .get = gui_get_clipboard,
+ .set = gui_set_clipboard,
+};
+
+struct gui_clipboard_table *riscos_clipboard_table = &clipboard_table;
diff --git a/riscos/textselection.h b/riscos/textselection.h
index c6f96f0e9..400e3dd26 100644
--- a/riscos/textselection.h
+++ b/riscos/textselection.h
@@ -24,7 +24,10 @@
#define _NETSURF_RISCOS_TEXTSELECTION_H_
#include "oslib/wimp.h"
-#include "desktop/gui.h"
+
+struct gui_clipboard_table *riscos_clipboard_table;
+
+void gui_start_selection(struct gui_window *g);
typedef void (*ro_gui_selection_prepare_paste_cb)(void *pw);
diff --git a/riscos/theme.c b/riscos/theme.c
index f1b7ae249..a12ed926d 100644
--- a/riscos/theme.c
+++ b/riscos/theme.c
@@ -176,11 +176,10 @@ static void ro_gui_theme_get_available_in_dir(const char *directory)
int context = 0;
int read_count;
osgbpb_INFO(100) info;
- os_error *error;
while (context != -1) {
/* read some directory info */
- error = xosgbpb_dir_entries_info(directory,
+ os_error *error = xosgbpb_dir_entries_info(directory,
(osgbpb_info_list *) &info, 1, context,
sizeof(info), 0, &read_count, &context);
if (error) {
diff --git a/riscos/theme_install.c b/riscos/theme_install.c
index 0d436dce8..f29596c88 100644
--- a/riscos/theme_install.c
+++ b/riscos/theme_install.c
@@ -22,20 +22,22 @@
#include <assert.h>
#include <stdbool.h>
-#include "oslib/osfile.h"
+#include <oslib/osfile.h>
+#include <oslib/wimp.h>
+
+#include "utils/nsoption.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/utils.h"
#include "content/content.h"
#include "content/hlcache.h"
#include "desktop/browser.h"
+
#include "riscos/dialog.h"
#include "riscos/gui.h"
-#include "utils/nsoption.h"
#include "riscos/theme.h"
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/url.h"
-#include "utils/utils.h"
static hlcache_handle *theme_install_content = NULL;
@@ -85,17 +87,14 @@ void theme_install_start(hlcache_handle *c)
nserror theme_install_callback(hlcache_handle *handle,
const hlcache_event *event, void *pw)
{
- char buffer[256];
- int author_indent = 0;
-
switch (event->type) {
- case CONTENT_MSG_READY:
- break;
case CONTENT_MSG_DONE:
{
const char *source_data;
unsigned long source_size;
+ int author_indent = 0;
+ char buffer[256];
theme_install_content = handle;
@@ -129,11 +128,7 @@ nserror theme_install_callback(hlcache_handle *handle,
warn_user(event->data.error, 0);
break;
- case CONTENT_MSG_STATUS:
- break;
-
default:
- assert(0);
break;
}
diff --git a/riscos/thumbnail.c b/riscos/thumbnail.c
index 66864554b..2bdd37251 100644
--- a/riscos/thumbnail.c
+++ b/riscos/thumbnail.c
@@ -85,7 +85,6 @@ bool thumbnail_create(hlcache_handle *content, struct bitmap *bitmap,
struct thumbnail_save_area *save_area;
osspriteop_area *sprite_area = NULL;
osspriteop_header *sprite_header = NULL;
- _kernel_oserror *error;
struct redraw_context ctx = {
.interactive = false,
.background_images = true,
@@ -137,6 +136,8 @@ bool thumbnail_create(hlcache_handle *content, struct bitmap *bitmap,
/* if we changed to 8bpp then go back to 32bpp */
if (thumbnail_32bpp_available != 1) {
const uint8_t *pixbufp = bitmap_get_buffer(bitmap);
+ _kernel_oserror *error;
+
if (!pixbufp || !bitmap->sprite_area) {
free(sprite_area);
return false;
diff --git a/riscos/toolbar.c b/riscos/toolbar.c
index 93c4438c3..bd76e23de 100644
--- a/riscos/toolbar.c
+++ b/riscos/toolbar.c
@@ -593,8 +593,6 @@ bool ro_toolbar_process(struct toolbar *toolbar, int width, bool reformat)
wimp_window_state state;
os_box extent;
int old_height, old_width;
- int xeig, yeig;
- os_coord pixel = {1, 1};
if (!toolbar)
return false;
@@ -602,12 +600,6 @@ bool ro_toolbar_process(struct toolbar *toolbar, int width, bool reformat)
old_height = toolbar->current_height;
old_width = toolbar->current_width;
- /* calculate 1px in OS units */
-
- ro_convert_pixels_to_os_units(&pixel, (os_mode)-1);
- xeig = pixel.x;
- yeig = pixel.y;
-
/* Measure the parent window width if the caller has asked us to
* calculate the clip width ourselves. Otherwise, if a clip width
* has been specified, set the clip to that.
@@ -847,8 +839,8 @@ void ro_toolbar_refresh_widget_dimensions(struct toolbar *toolbar)
toolbar->full_height = 0;
}
toolbar->full_width = 2 * TOOLBAR_WIDGET_GUTTER +
- (row_width > toolbar->editor_size.x) ?
- row_width : toolbar->editor_size.x;
+ ((row_width > toolbar->editor_size.x) ?
+ row_width : toolbar->editor_size.x);
}
@@ -1579,7 +1571,7 @@ bool ro_toolbar_set_button_order(struct toolbar *toolbar, char order[])
void ro_toolbar_set_button_shaded_state(struct toolbar *toolbar,
button_bar_action action, bool shaded)
{
- if (toolbar == NULL && toolbar->buttons == NULL)
+ if (toolbar == NULL || toolbar->buttons == NULL)
return;
ro_gui_button_bar_shade_button(toolbar->buttons, action, shaded);
@@ -1686,7 +1678,7 @@ void ro_toolbar_set_content_favicon(struct toolbar *toolbar,
void ro_toolbar_update_urlsuggest(struct toolbar *toolbar)
{
- if (toolbar != NULL && toolbar->url != NULL)
+ if (toolbar == NULL || toolbar->url == NULL)
return;
ro_gui_url_bar_update_urlsuggest(toolbar->url);
@@ -1774,8 +1766,6 @@ bool ro_toolbar_get_editing(struct toolbar *toolbar)
bool ro_toolbar_toggle_edit(struct toolbar *toolbar)
{
- char *new_buttons;
-
if (toolbar == NULL || toolbar->editor == NULL)
return false;
@@ -1799,6 +1789,7 @@ bool ro_toolbar_toggle_edit(struct toolbar *toolbar)
if (!toolbar->editing && toolbar->buttons != NULL &&
toolbar->callbacks != NULL &&
toolbar->callbacks->save_buttons != NULL) {
+ char *new_buttons;
new_buttons = ro_gui_button_bar_get_config(toolbar->buttons);
toolbar->callbacks->save_buttons(toolbar->client_data,
new_buttons);
diff --git a/riscos/treeview.c b/riscos/treeview.c
index 4cf3d425e..d33704c8d 100644
--- a/riscos/treeview.c
+++ b/riscos/treeview.c
@@ -427,7 +427,6 @@ void ro_treeview_scroll(wimp_scroll *scroll)
void ro_treeview_redraw_loop(wimp_draw *redraw, ro_treeview *tv, osbool more)
{
- os_error *error;
struct redraw_context ctx = {
.interactive = true,
.background_images = true,
@@ -435,14 +434,16 @@ void ro_treeview_redraw_loop(wimp_draw *redraw, ro_treeview *tv, osbool more)
};
while (more) {
- ro_plot_origin_x = redraw->box.x0 + tv->origin.x -
- redraw->xscroll;
- ro_plot_origin_y = redraw->box.y1 + tv->origin.y -
- redraw->yscroll;
+ os_error *error;
if (tv != NULL && tv->tree != NULL) {
struct rect clip;
+ ro_plot_origin_x = redraw->box.x0 + tv->origin.x -
+ redraw->xscroll;
+ ro_plot_origin_y = redraw->box.y1 + tv->origin.y -
+ redraw->yscroll;
+
clip.x0 = (redraw->clip.x0 - ro_plot_origin_x) / 2;
clip.y0 = (ro_plot_origin_y - redraw->clip.y1) / 2;
@@ -610,7 +611,6 @@ void ro_treeview_set_window_extent(ro_treeview *tv, int width, int height)
wimp_window_state state;
int new_x, new_y;
int visible_x, visible_y;
- int new_x_scroll, new_y_scroll;
/* Calculate the new window extents, in RISC OS units. */
@@ -657,8 +657,8 @@ void ro_treeview_set_window_extent(ro_treeview *tv, int width, int height)
if ((state.flags & wimp_WINDOW_OPEN) &&
(visible_x > new_x || visible_y < new_y)) {
- new_x_scroll = state.xscroll;
- new_y_scroll = state.yscroll;
+ int new_x_scroll = state.xscroll;
+ int new_y_scroll = state.yscroll;
if (visible_x > new_x)
new_x_scroll = new_x - (state.visible.x1
diff --git a/riscos/ucstables.c b/riscos/ucstables.c
index 970caf122..f9b6b3648 100644
--- a/riscos/ucstables.c
+++ b/riscos/ucstables.c
@@ -27,10 +27,13 @@
#include <oslib/territory.h>
#include "utils/config.h"
-#include "riscos/ucstables.h"
+#include "utils/errors.h"
#include "utils/log.h"
#include "utils/utf8.h"
#include "utils/utils.h"
+#include "desktop/gui.h"
+
+#include "riscos/ucstables.h"
/* Common values (ASCII) */
#define common \
@@ -446,17 +449,16 @@ static const struct special {
* \param string The string to convert
* \param len The length (in bytes) of the string, or 0
* \param result Pointer to location in which to store result
- * \return The appropriate utf8_convert_ret value
+ * \return An nserror code
*/
-utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len,
- char **result)
+nserror utf8_to_local_encoding(const char *string, size_t len, char **result)
{
os_error *error;
int alphabet, i;
size_t off, prev_off;
char *temp, *cur_pos;
const char *enc;
- utf8_convert_ret err;
+ nserror err;
assert(string);
assert(result);
@@ -473,19 +475,19 @@ utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len,
/* UTF-8 -> simply copy string */
if (alphabet == 111 /* UTF-8 */) {
*result = strndup(string, len);
- return UTF8_CONVERT_OK;
+ return NSERROR_OK;
}
/* get encoding name */
enc = (alphabet <= CONT_ENC_END ? localencodings[alphabet - 100]
: (alphabet == 120 ?
- localencodings[CONT_ENC_END + 1]
+ localencodings[CONT_ENC_END - 100 + 1]
: localencodings[0]));
/* create output buffer */
*(result) = malloc(len + 1);
if (!(*result))
- return UTF8_CONVERT_NOMEM;
+ return NSERROR_NOMEM;
*(*result) = '\0';
prev_off = 0;
@@ -508,10 +510,10 @@ utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len,
if (off - prev_off > 0) {
err = utf8_to_enc(string + prev_off, enc,
off - prev_off, &temp);
- if (err != UTF8_CONVERT_OK) {
- assert(err != UTF8_CONVERT_BADENC);
+ if (err != NSERROR_OK) {
+ assert(err != NSERROR_BAD_ENCODING);
free(*result);
- return UTF8_CONVERT_NOMEM;
+ return NSERROR_NOMEM;
}
strcat(cur_pos, temp);
@@ -533,10 +535,10 @@ utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len,
if (prev_off < len) {
err = utf8_to_enc(string + prev_off, enc, len - prev_off,
&temp);
- if (err != UTF8_CONVERT_OK) {
- assert(err != UTF8_CONVERT_BADENC);
+ if (err != NSERROR_OK) {
+ assert(err != NSERROR_BAD_ENCODING);
free(*result);
- return UTF8_CONVERT_NOMEM;
+ return NSERROR_NOMEM;
}
strcat(cur_pos, temp);
@@ -544,7 +546,7 @@ utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len,
free(temp);
}
- return UTF8_CONVERT_OK;
+ return NSERROR_OK;
}
/**
@@ -553,10 +555,9 @@ utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len,
* \param string The string to convert
* \param len The length (in bytes) of the string, or 0
* \param result Pointer to location in which to store result
- * \return The appropriate utf8_convert_ret value
+ * \return An nserror code
*/
-utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len,
- char **result)
+nserror utf8_from_local_encoding(const char *string, size_t len, char **result)
{
os_error *error;
int alphabet, i, num_specials = 0, result_alloc;
@@ -564,7 +565,7 @@ utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len,
size_t off, prev_off, cur_off;
char *temp;
const char *enc;
- utf8_convert_ret err;
+ nserror err;
assert(string && result);
@@ -581,16 +582,16 @@ utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len,
if (alphabet == 111 /* UTF-8 */) {
temp = strndup(string, len);
if (!temp)
- return UTF8_CONVERT_NOMEM;
+ return NSERROR_NOMEM;
*result = temp;
- return UTF8_CONVERT_OK;
+ return NSERROR_OK;
}
/* get encoding name */
enc = (alphabet <= CONT_ENC_END ? localencodings[alphabet - 100]
: (alphabet == 120 ?
- localencodings[CONT_ENC_END + 1]
+ localencodings[CONT_ENC_END - 100 + 1]
: localencodings[0]));
/* create output buffer (oversized) */
@@ -598,7 +599,7 @@ utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len,
*(result) = malloc(result_alloc);
if (!(*result))
- return UTF8_CONVERT_NOMEM;
+ return NSERROR_NOMEM;
*(*result) = '\0';
prev_off = 0;
@@ -619,11 +620,11 @@ utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len,
if (off - prev_off > 0) {
err = utf8_from_enc(string + prev_off, enc,
off - prev_off, &temp, NULL);
- if (err != UTF8_CONVERT_OK) {
- assert(err != UTF8_CONVERT_BADENC);
+ if (err != NSERROR_OK) {
+ assert(err != NSERROR_BAD_ENCODING);
LOG(("utf8_from_enc failed"));
free(*result);
- return UTF8_CONVERT_NOMEM;
+ return NSERROR_NOMEM;
}
strcat((*result) + cur_off, temp);
@@ -647,7 +648,7 @@ utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len,
(3 * SPECIAL_CHUNK_SIZE));
if (!temp) {
free(*result);
- return UTF8_CONVERT_NOMEM;
+ return NSERROR_NOMEM;
}
*result = temp;
@@ -661,11 +662,11 @@ utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len,
if (prev_off < len) {
err = utf8_from_enc(string + prev_off, enc, len - prev_off,
&temp, NULL);
- if (err != UTF8_CONVERT_OK) {
- assert(err != UTF8_CONVERT_BADENC);
+ if (err != NSERROR_OK) {
+ assert(err != NSERROR_BAD_ENCODING);
LOG(("utf8_from_enc failed"));
free(*result);
- return UTF8_CONVERT_NOMEM;
+ return NSERROR_NOMEM;
}
strcat((*result) + cur_off, temp);
@@ -680,9 +681,16 @@ utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len,
if (!temp) {
LOG(("realloc failed"));
free(*result);
- return UTF8_CONVERT_NOMEM;
+ return NSERROR_NOMEM;
}
*result = temp;
- return UTF8_CONVERT_OK;
+ return NSERROR_OK;
}
+
+static struct gui_utf8_table utf8_table = {
+ .utf8_to_local = utf8_to_local_encoding,
+ .local_to_utf8 = utf8_from_local_encoding,
+};
+
+struct gui_utf8_table *riscos_utf8_table = &utf8_table;
diff --git a/riscos/ucstables.h b/riscos/ucstables.h
index 0be065897..e5d838249 100644
--- a/riscos/ucstables.h
+++ b/riscos/ucstables.h
@@ -21,4 +21,9 @@
* This is only used if nothing claims Service_International,8
*/
+struct gui_utf8_table *riscos_utf8_table;
+
+nserror utf8_to_local_encoding(const char *string, size_t len, char **result);
+nserror utf8_from_local_encoding(const char *string, size_t len, char **result);
+
const int *ucstable_from_alphabet(int alphabet);
diff --git a/riscos/uri.c b/riscos/uri.c
index 70f75bc09..bf789ee17 100644
--- a/riscos/uri.c
+++ b/riscos/uri.c
@@ -74,8 +74,7 @@ void ro_uri_message_received(wimp_message *msg)
error = nsurl_create(uri_requested, &url);
free(uri_requested);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
diff --git a/riscos/url_complete.c b/riscos/url_complete.c
index 01774f62f..6881de7ea 100644
--- a/riscos/url_complete.c
+++ b/riscos/url_complete.c
@@ -25,19 +25,23 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "oslib/wimp.h"
-#include "content/urldb.h"
+#include <oslib/wimp.h>
+
#include "utils/log.h"
+#include "utils/nsoption.h"
+#include "utils/utils.h"
+#include "content/urldb.h"
+#include "desktop/browser.h"
+
#include "riscos/global_history.h"
#include "riscos/gui.h"
#include "riscos/mouse.h"
-#include "utils/nsoption.h"
#include "riscos/toolbar.h"
#include "riscos/url_complete.h"
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
#include "riscos/wimputils.h"
-#include "utils/utils.h"
+#include "riscos/filetype.h"
#define MAXIMUM_VISIBLE_LINES 7
@@ -96,7 +100,6 @@ bool ro_gui_url_complete_keypress(struct toolbar *toolbar, uint32_t key)
wimp_window_state state;
char *match_url;
const char *url;
- int i, lines;
int old_selection;
int height;
os_error *error;
@@ -144,7 +147,8 @@ bool ro_gui_url_complete_keypress(struct toolbar *toolbar, uint32_t key)
(strcmp(match_url, url_complete_matched_string))) {
/* memorize the current matches */
- lines = MAXIMUM_VISIBLE_LINES;
+ int i;
+ int lines = MAXIMUM_VISIBLE_LINES;
if (lines > url_complete_matches_available)
lines = url_complete_matches_available;
if (url_complete_matches) {
@@ -528,8 +532,7 @@ void ro_gui_url_complete_redraw(wimp_draw *redraw)
{
osbool more;
os_error *error;
- int clip_y0, clip_y1, origin_y;
- int first_line, last_line, line;
+ int line;
const struct url_data *data;
int type;
@@ -564,9 +567,10 @@ void ro_gui_url_complete_redraw(wimp_draw *redraw)
/* redraw */
more = wimp_redraw_window(redraw);
while (more) {
- origin_y = redraw->box.y1 - redraw->yscroll;
- clip_y0 = redraw->clip.y0 - origin_y;
- clip_y1 = redraw->clip.y1 - origin_y;
+ int first_line, last_line;
+ int origin_y = redraw->box.y1 - redraw->yscroll;
+ int clip_y0 = redraw->clip.y0 - origin_y;
+ int clip_y1 = redraw->clip.y1 - origin_y;
first_line = (-clip_y1) / 44;
last_line = (-clip_y0 + 43) / 44;
@@ -656,9 +660,8 @@ bool ro_gui_url_complete_click(wimp_pointer *pointer)
{
wimp_window_state state;
os_error *error;
- int selection, old_selection;
+ int selection;
struct gui_window *g;
- const char *url;
if ((mouse_x == pointer->pos.x) && (mouse_y == pointer->pos.y) &&
(!pointer->buttons))
@@ -678,7 +681,11 @@ bool ro_gui_url_complete_click(wimp_pointer *pointer)
selection = (state.visible.y1 - pointer->pos.y - state.yscroll) / 44;
if (selection != url_complete_matches_selection) {
+ int old_selection;
+
if (url_complete_matches_selection == -1) {
+ const char *url;
+
g = ro_gui_window_lookup(url_complete_parent);
if (!g)
return false;
@@ -734,8 +741,7 @@ bool ro_gui_url_complete_click(wimp_pointer *pointer)
browser_window_navigate(g->bw,
url_complete_matches[url_complete_matches_selection],
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
diff --git a/riscos/url_protocol.c b/riscos/url_protocol.c
index 171b6205f..76d403147 100644
--- a/riscos/url_protocol.c
+++ b/riscos/url_protocol.c
@@ -126,8 +126,7 @@ void ro_url_message_received(wimp_message *message)
}
/* create new browser window */
- errorns = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ errorns = browser_window_create(BW_CREATE_HISTORY,
nsurl,
NULL,
NULL,
diff --git a/riscos/url_suggest.c b/riscos/url_suggest.c
index 32e772cca..78cde5cfb 100644
--- a/riscos/url_suggest.c
+++ b/riscos/url_suggest.c
@@ -21,9 +21,13 @@
*/
#include <assert.h>
+#include <string.h>
+#include <stdlib.h>
+
#include "oslib/wimp.h"
#include "content/content_type.h"
#include "content/urldb.h"
+
#include "riscos/menus.h"
#include "riscos/url_suggest.h"
#include "utils/messages.h"
@@ -89,7 +93,6 @@ bool ro_gui_url_suggest_get_menu_available(void)
bool ro_gui_url_suggest_prepare_menu(void)
{
- int i;
struct url_suggest_item *list, *next;
/* Fetch the URLs we want to include from URLdb. */
@@ -108,7 +111,7 @@ bool ro_gui_url_suggest_prepare_menu(void)
assert(suggest_entries <= URL_SUGGEST_MAX_URLS);
if (suggest_entries > 0) {
- i = suggest_entries;
+ int i = suggest_entries;
list = suggest_list;
suggest_list = NULL;
@@ -156,11 +159,11 @@ bool ro_gui_url_suggest_callback(nsurl *url, const struct url_data *data)
{
int count;
unsigned int weight;
- struct url_suggest_item **list, *new, *old;
+ struct url_suggest_item **list, *new;
/* Ignore unvisited URLs, and those that don't apply to HTML or Text. */
- if (data->visits <= 0 || (data->type != CONTENT_HTML &&
+ if (data->visits == 0 || (data->type != CONTENT_HTML &&
data->type != CONTENT_TEXTPLAIN))
return true;
@@ -206,7 +209,7 @@ bool ro_gui_url_suggest_callback(nsurl *url, const struct url_data *data)
*/
while (suggest_list != NULL && suggest_entries > URL_SUGGEST_MAX_URLS) {
- old = suggest_list;
+ struct url_suggest_item *old = suggest_list;
suggest_list = suggest_list->next;
free(old);
diff --git a/riscos/wimp.c b/riscos/wimp.c
index 87860ad35..f59fa675a 100644
--- a/riscos/wimp.c
+++ b/riscos/wimp.c
@@ -40,6 +40,7 @@
#include "utils/log.h"
#include "utils/utf8.h"
#include "utils/utils.h"
+#include "riscos/ucstables.h"
static void ro_gui_wimp_cache_furniture_sizes(wimp_w w);
@@ -273,12 +274,12 @@ void ro_gui_set_icon_string(wimp_w w, wimp_i i, const char *text, bool is_utf8)
unsigned int button_type;
if (is_utf8) {
- utf8_convert_ret err;
+ nserror err;
/* convert text to local encoding */
err = utf8_to_local_encoding(text, 0, &local_text);
- if (err != UTF8_CONVERT_OK) {
+ if (err != NSERROR_OK) {
/* A bad encoding should never happen, so assert this */
- assert(err != UTF8_CONVERT_BADENC);
+ assert(err != NSERROR_BAD_ENCODING);
LOG(("utf8_to_enc failed"));
/* Paranoia */
local_text = NULL;
@@ -677,7 +678,7 @@ void ro_gui_set_window_title(wimp_w w, const char *text)
wimp_window_info_base window;
os_error *error;
char *title_local_enc;
- utf8_convert_ret err;
+ nserror err;
/* Get the window details
*/
@@ -692,10 +693,10 @@ void ro_gui_set_window_title(wimp_w w, const char *text)
/* convert text to local encoding */
err = utf8_to_local_encoding(text, 0, &title_local_enc);
- if (err != UTF8_CONVERT_OK) {
+ if (err != NSERROR_OK) {
/* A bad encoding should never happen,
* so assert this */
- assert(err != UTF8_CONVERT_BADENC);
+ assert(err != NSERROR_BAD_ENCODING);
LOG(("utf8_to_enc failed"));
return;
}
diff --git a/riscos/wimp_event.c b/riscos/wimp_event.c
index e87962039..d42d2b08a 100644
--- a/riscos/wimp_event.c
+++ b/riscos/wimp_event.c
@@ -32,6 +32,7 @@
#include "oslib/serviceinternational.h"
#include "oslib/wimp.h"
#include "desktop/gui.h"
+#include "riscos/gui.h"
#include "riscos/dialog.h"
#include "riscos/menus.h"
#include "riscos/ucstables.h"
@@ -633,7 +634,6 @@ bool ro_gui_wimp_event_mouse_click(wimp_pointer *pointer)
int current, step, stepping, min, max, decimal_places;
wimp_window_state open;
wimp_caret caret;
- os_error *error;
bool prepared;
w = pointer->w;
@@ -701,6 +701,7 @@ bool ro_gui_wimp_event_mouse_click(wimp_pointer *pointer)
* button, then close the menu (which closes us) and then finally
* re-open ourselves. ugh! */
if (current_menu != NULL) {
+ os_error *error;
open.w = pointer->w;
error = xwimp_get_window_state(&open);
if (error) {
@@ -718,8 +719,7 @@ bool ro_gui_wimp_event_mouse_click(wimp_pointer *pointer)
}
ro_gui_dialog_add_persistent(current_menu_window,
pointer->w);
- ro_gui_menu_closed();
- gui_poll(true);
+ ro_gui_menu_destroy();
error = xwimp_open_window(PTR_WIMP_OPEN(&open));
if (error) {
LOG(("xwimp_open_window: 0x%x: %s",
@@ -768,7 +768,7 @@ bool ro_gui_wimp_event_mouse_click(wimp_pointer *pointer)
if (pointer->buttons & wimp_CLICK_SELECT) {
ro_gui_dialog_close(pointer->w);
ro_gui_wimp_event_close_window(pointer->w);
- ro_gui_menu_closed();
+ ro_gui_menu_destroy();
} else {
ro_gui_wimp_event_restore(pointer->w);
}
@@ -850,7 +850,7 @@ void ro_gui_wimp_event_ok_click(struct event_window *window,
if (state & wimp_CLICK_SELECT) {
ro_gui_dialog_close(window->w);
ro_gui_wimp_event_close_window(window->w);
- ro_gui_menu_closed();
+ ro_gui_menu_destroy();
} else {
ro_gui_wimp_event_memorise(window->w);
}
@@ -1045,7 +1045,7 @@ bool ro_gui_wimp_event_keypress(wimp_key *key)
return false;
ro_gui_dialog_close(key->w);
ro_gui_wimp_event_close_window(key->w);
- ro_gui_menu_closed();
+ ro_gui_menu_destroy();
return true;
/* Return performs the OK action */
case wimp_KEY_RETURN:
@@ -1163,25 +1163,25 @@ bool ro_gui_wimp_event_pointer_entering_window(wimp_entering *entering)
bool ro_gui_wimp_event_process_window_menu_click(wimp_pointer *pointer)
{
struct event_window *window;
- int xpos, ypos, line_height, gap_height, entry;
window = ro_gui_wimp_event_find_window(pointer->w);
if ((window) && (window->window_menu)
&& (pointer->buttons == wimp_CLICK_MENU)) {
+ int xpos, ypos;
+
if (window->menu_prepare)
if (!window->menu_prepare(window->w, wimp_ICON_WINDOW,
window->window_menu, pointer))
return false;
if (window->window_menu_iconbar) {
- xpos = pointer->pos.x;
- ypos = 96;
-
- line_height = window->window_menu->height +
+ int entry = 0;
+ int line_height = window->window_menu->height +
window->window_menu->gap;
- gap_height = 24; /* The fixed dotted line height */
+ int gap_height = 24; /* The fixed dotted line height */
- entry = 0;
+ xpos = pointer->pos.x;
+ ypos = 96;
do {
ypos += line_height;
if ((window->window_menu->
@@ -1340,7 +1340,6 @@ bool ro_gui_wimp_event_register_checkbox(wimp_w w, wimp_i i)
bool ro_gui_wimp_event_register_radio(wimp_w w, wimp_i *i)
{
struct event_window *window;
- struct icon_event *event;
window = ro_gui_wimp_event_get_window(w);
if (!window)
@@ -1348,7 +1347,8 @@ bool ro_gui_wimp_event_register_radio(wimp_w w, wimp_i *i)
window->max_radio_group++;
while (*i != -1) {
- event = ro_gui_wimp_event_get_event(w, *i, EVENT_RADIO);
+ struct icon_event *event = ro_gui_wimp_event_get_event(w, *i,
+ EVENT_RADIO);
if (!event)
return false;
event->data.radio_group = window->max_radio_group;
@@ -1772,7 +1772,7 @@ bool ro_gui_wimp_event_submenu_warning(wimp_w w, wimp_i i, wimp_menu *menu,
}
/**
- * Handle menus being closed. This is called from ro_gui_menu_closed(), in
+ * Handle menus being closed. This is called from the menus modules, in
* every scenario when one of our own menus is open.
*
* \param w the window to owning the menu
diff --git a/riscos/window.c b/riscos/window.c
index f6b274a20..1b9ed3330 100644
--- a/riscos/window.c
+++ b/riscos/window.c
@@ -5,7 +5,7 @@
* Copyright 2004 Andrew Timmins <atimmins@blueyonder.co.uk>
* Copyright 2005 Richard Wilson <info@tinct.net>
* Copyright 2005 Adrian Lees <adrianl@users.sourceforge.net>
- * Copyright 2010, 2011 Stephen Fryatt <stevef@netsurf-browser.org>
+ * Copyright 2010-2014 Stephen Fryatt <stevef@netsurf-browser.org>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -40,16 +40,25 @@
#include "oslib/osspriteop.h"
#include "oslib/wimp.h"
#include "oslib/wimpspriteop.h"
+
#include "utils/config.h"
+#include "utils/nsoption.h"
+#include "utils/log.h"
+#include "utils/talloc.h"
+#include "utils/url.h"
+#include "utils/file.h"
+#include "utils/utf8.h"
+#include "utils/utils.h"
+#include "utils/messages.h"
#include "content/content.h"
#include "content/hlcache.h"
#include "content/urldb.h"
#include "css/css.h"
+#include "desktop/browser_history.h"
#include "desktop/browser_private.h"
#include "desktop/cookie_manager.h"
#include "desktop/scrollbar.h"
#include "desktop/frames.h"
-#include "desktop/local_history.h"
#include "desktop/mouse.h"
#include "desktop/plotters.h"
#include "desktop/textinput.h"
@@ -58,6 +67,7 @@
#include "desktop/gui.h"
#include "render/form.h"
#include "render/html.h"
+
#include "riscos/bitmap.h"
#include "riscos/buffer.h"
#include "riscos/cookies.h"
@@ -69,7 +79,6 @@
#include "riscos/hotlist.h"
#include "riscos/menus.h"
#include "riscos/mouse.h"
-#include "utils/nsoption.h"
#include "riscos/oslib_pre7.h"
#include "riscos/save.h"
#include "riscos/content-handlers/sprite.h"
@@ -82,13 +91,10 @@
#include "riscos/wimp_event.h"
#include "riscos/wimputils.h"
#include "riscos/window.h"
-#include "utils/log.h"
-#include "utils/talloc.h"
-#include "utils/url.h"
-#include "utils/utf8.h"
-#include "utils/utils.h"
-#include "utils/messages.h"
+#include "riscos/ucstables.h"
+#include "riscos/filetype.h"
+void gui_window_redraw_window(struct gui_window *g);
static void gui_window_set_extent(struct gui_window *g, int width, int height);
@@ -131,8 +137,6 @@ static bool ro_gui_window_navigate_up(struct gui_window *g, const char *url);
static void ro_gui_window_action_home(struct gui_window *g);
static void ro_gui_window_action_new_window(struct gui_window *g);
static void ro_gui_window_action_local_history(struct gui_window *g);
-static void ro_gui_window_action_navigate_back_new(struct gui_window *g);
-static void ro_gui_window_action_navigate_forward_new(struct gui_window *g);
static void ro_gui_window_action_save(struct gui_window *g,
gui_save_type save_type);
static void ro_gui_window_action_search(struct gui_window *g);
@@ -150,8 +154,9 @@ static void ro_gui_window_update_theme(void *data, bool ok);
static bool ro_gui_window_import_text(struct gui_window *g,
const char *filename);
-static void ro_gui_window_clone_options(struct browser_window *new_bw,
- struct browser_window *old_bw);
+static void ro_gui_window_clone_options(
+ struct gui_window *new_gui,
+ struct gui_window *old_gui);
static bool ro_gui_window_prepare_form_select_menu(struct browser_window *bw,
struct form_control *control);
@@ -372,24 +377,49 @@ void ro_gui_window_initialise(void)
*/
/**
+ * Place the caret in a browser window.
+ *
+ * \param g window with caret
+ * \param x coordinates of caret
+ * \param y coordinates of caret
+ * \param height height of caret
+ * \param clip clip rectangle, or NULL if none
+ */
+
+static void gui_window_place_caret(struct gui_window *g, int x, int y, int height,
+ const struct rect *clip)
+{
+ os_error *error;
+
+ error = xwimp_set_caret_position(g->window, -1,
+ x * 2, -(y + height) * 2, height * 2, -1);
+ if (error) {
+ LOG(("xwimp_set_caret_position: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
+ }
+}
+
+/**
* Create and open a new browser window.
*
- * \param bw browser_window structure to update
- * \param clone the browser window to clone options from, or NULL for default
- * \return gui_window, or 0 on error and error reported
+ * \param bw bw to create gui_window for
+ * \param existing an existing gui_window, may be NULL
+ * \param flags flags for gui window creation
+ * \return gui window, or NULL on error
*/
-struct gui_window *gui_create_browser_window(struct browser_window *bw,
- struct browser_window *clone, bool new_tab)
+static struct gui_window *gui_window_create(struct browser_window *bw,
+ struct gui_window *existing,
+ gui_window_create_flags flags)
{
- int screen_width, screen_height, win_width, win_height, scroll_width;
+ int screen_width, screen_height;
static int window_count = 2;
wimp_window window;
wimp_window_state state;
os_error *error;
bool open_centred = true;
struct gui_window *g;
- struct browser_window *top;
g = malloc(sizeof *g);
if (!g) {
@@ -406,9 +436,10 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
g->iconise_icon = -1;
/* Set the window position */
- if (clone && clone->window && nsoption_bool(window_size_clone)) {
- for (top = clone; top->parent; top = top->parent);
- state.w = top->window->window;
+ if (existing != NULL &&
+ flags & GW_CREATE_CLONE &&
+ nsoption_bool(window_size_clone)) {
+ state.w = existing->window;
error = xwimp_get_window_state(&state);
if (error) {
LOG(("xwimp_get_window_state: 0x%x: %s",
@@ -421,19 +452,24 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
window.visible.y1 = state.visible.y1 - 48;
open_centred = false;
} else {
+ int win_width, win_height;
ro_gui_screen_size(&screen_width, &screen_height);
/* Check if we have a preferred position */
if ((nsoption_int(window_screen_width) != 0) &&
(nsoption_int(window_screen_height) != 0)) {
- win_width = (nsoption_int(window_width) * screen_width) /
- nsoption_int(window_screen_width);
- win_height = (nsoption_int(window_height) * screen_height) /
- nsoption_int(window_screen_height);
- window.visible.x0 = (nsoption_int(window_x) * screen_width) /
- nsoption_int(window_screen_width);
- window.visible.y0 = (nsoption_int(window_y) * screen_height) /
- nsoption_int(window_screen_height);
+ win_width = (nsoption_int(window_width) *
+ screen_width) /
+ nsoption_int(window_screen_width);
+ win_height = (nsoption_int(window_height) *
+ screen_height) /
+ nsoption_int(window_screen_height);
+ window.visible.x0 = (nsoption_int(window_x) *
+ screen_width) /
+ nsoption_int(window_screen_width);
+ window.visible.y0 = (nsoption_int(window_y) *
+ screen_height) /
+ nsoption_int(window_screen_height);
if (nsoption_bool(window_stagger)) {
window.visible.y0 += 96 -
(48 * (window_count % 5));
@@ -505,7 +541,7 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
wimp_WINDOW_TOGGLE_ICON;
if (open_centred) {
- scroll_width = ro_get_vscroll_width(NULL);
+ int scroll_width = ro_get_vscroll_width(NULL);
window.visible.x0 -= scroll_width;
}
@@ -566,8 +602,7 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
ro_gui_window_menu_close);
/* Set the window options */
- bw->window = g;
- ro_gui_window_clone_options(bw, clone);
+ ro_gui_window_clone_options(g, existing);
ro_gui_window_update_toolbar_buttons(g);
/* Open the window at the top of the stack */
@@ -600,7 +635,7 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
* \param g gui_window to destroy
*/
-void gui_window_destroy(struct gui_window *g)
+static void gui_window_destroy(struct gui_window *g)
{
os_error *error;
wimp_w w;
@@ -628,7 +663,7 @@ void gui_window_destroy(struct gui_window *g)
ro_gui_url_complete_close();
ro_gui_dialog_close_persistent(w);
if (current_menu_window == w)
- ro_gui_menu_closed();
+ ro_gui_menu_destroy();
ro_gui_window_remove_update_boxes(g);
/* delete window */
@@ -651,15 +686,14 @@ void gui_window_destroy(struct gui_window *g)
* \param title new window title, copied
*/
-void gui_window_set_title(struct gui_window *g, const char *title)
+static void gui_window_set_title(struct gui_window *g, const char *title)
{
- int scale_disp;
-
assert(g);
assert(title);
if (g->bw->scale != 1.0) {
- scale_disp = g->bw->scale * 100;
+ int scale_disp = g->bw->scale * 100;
+
if (ABS((float)scale_disp - g->bw->scale * 100) >= 0.05)
snprintf(g->title, sizeof g->title, "%s (%.1f%%)",
title, g->bw->scale * 100);
@@ -706,11 +740,11 @@ void gui_window_redraw_window(struct gui_window *g)
/**
* Redraw an area of a window.
*
- * \param g gui_window
- * \param data content_msg_data union with filled in redraw data
+ * \param g The window to update
+ * \param rect The area of the window to update.
*/
-void gui_window_update_box(struct gui_window *g, const struct rect *rect)
+static void gui_window_update_box(struct gui_window *g, const struct rect *rect)
{
bool use_buffer;
int x0, y0, x1, y1;
@@ -765,7 +799,7 @@ void gui_window_update_box(struct gui_window *g, const struct rect *rect)
* \return true iff successful
*/
-bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
+static bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
{
wimp_window_state state;
os_error *error;
@@ -798,7 +832,7 @@ bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
* \param sy point to place at top-left of window
*/
-void gui_window_set_scroll(struct gui_window *g, int sx, int sy)
+static void gui_window_set_scroll(struct gui_window *g, int sx, int sy)
{
wimp_window_state state;
os_error *error;
@@ -831,7 +865,7 @@ void gui_window_set_scroll(struct gui_window *g, int sx, int sy)
* \param x1 right point to ensure visible
* \param y1 top point to ensure visible
*/
-void gui_window_scroll_visible(struct gui_window *g, int x0, int y0, int x1, int y1)
+static void gui_window_scroll_visible(struct gui_window *g, int x0, int y0, int x1, int y1)
{
wimp_window_state state;
os_error *error;
@@ -915,7 +949,7 @@ void gui_window_scroll_visible(struct gui_window *g, int x0, int y0, int x1, int
* \param scaled whether to return scaled values
*/
-void gui_window_get_dimensions(struct gui_window *g, int *width, int *height, bool scaled)
+static void gui_window_get_dimensions(struct gui_window *g, int *width, int *height, bool scaled)
{
/* use the cached window sizes */
*width = g->old_width / 2;
@@ -934,14 +968,10 @@ void gui_window_get_dimensions(struct gui_window *g, int *width, int *height, bo
* \param g gui_window to update the extent of
*/
-void gui_window_update_extent(struct gui_window *g)
+static void gui_window_update_extent(struct gui_window *g)
{
os_error *error;
wimp_window_info info;
- wimp_window_state state;
- bool update;
- unsigned int flags;
- int scroll = 0;
assert(g);
@@ -956,26 +986,13 @@ void gui_window_update_extent(struct gui_window *g)
/* scroll on toolbar height change */
if (g->toolbar) {
- scroll = ro_toolbar_height(g->toolbar) - info.extent.y1;
+ int scroll = ro_toolbar_height(g->toolbar) - info.extent.y1;
info.yscroll += scroll;
}
- /* only allow a further reformat if we've gained/lost scrollbars */
- flags = info.flags & (wimp_WINDOW_HSCROLL | wimp_WINDOW_VSCROLL);
- update = g->bw->reformat_pending;
+ /* Handle change of extents */
g->update_extent = true;
ro_gui_window_open(PTR_WIMP_OPEN(&info));
-
- state.w = g->window;
- error = xwimp_get_window_state(&state);
- if (error) {
- LOG(("xwimp_get_window_state: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("WimpError", error->errmess);
- return;
- }
- if (flags == (state.flags & (wimp_WINDOW_HSCROLL | wimp_WINDOW_VSCROLL)))
- g->bw->reformat_pending = update;
}
@@ -986,7 +1003,7 @@ void gui_window_update_extent(struct gui_window *g)
* \param text new status text
*/
-void gui_window_set_status(struct gui_window *g, const char *text)
+static void gui_window_set_status(struct gui_window *g, const char *text)
{
if (g->status_bar)
ro_gui_status_bar_set_text(g->status_bar, text);
@@ -1037,30 +1054,7 @@ void gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape)
}
-/**
- * Remove the mouse pointer from the screen
- */
-
-void gui_window_hide_pointer(struct gui_window *g)
-{
- os_error *error;
-
- error = xwimpspriteop_set_pointer_shape(NULL, 0x30, 0, 0, 0, 0);
- if (error) {
- LOG(("xwimpspriteop_set_pointer_shape: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("WimpError", error->errmess);
- }
-}
-
-
-/**
- * Set the contents of a window's address bar.
- *
- * \param g gui_window to update
- * \param url new url for address bar
- */
-
+/* exported function documented in riscos/window.h */
void gui_window_set_url(struct gui_window *g, const char *url)
{
if (!g->toolbar)
@@ -1077,7 +1071,7 @@ void gui_window_set_url(struct gui_window *g, const char *url)
* \param g window with start of load
*/
-void gui_window_start_throbber(struct gui_window *g)
+static void gui_window_start_throbber(struct gui_window *g)
{
ro_gui_window_update_toolbar_buttons(g);
ro_gui_menu_refresh(ro_gui_browser_window_menu);
@@ -1093,7 +1087,7 @@ void gui_window_start_throbber(struct gui_window *g)
* \param g window with start of load
*/
-void gui_window_stop_throbber(struct gui_window *g)
+static void gui_window_stop_throbber(struct gui_window *g)
{
ro_gui_window_update_toolbar_buttons(g);
ro_gui_menu_refresh(ro_gui_browser_window_menu);
@@ -1105,7 +1099,7 @@ void gui_window_stop_throbber(struct gui_window *g)
* set favicon
*/
-void gui_window_set_icon(struct gui_window *g, hlcache_handle *icon)
+static void gui_window_set_icon(struct gui_window *g, hlcache_handle *icon)
{
if (g == NULL || g->toolbar == NULL)
return;
@@ -1113,38 +1107,6 @@ void gui_window_set_icon(struct gui_window *g, hlcache_handle *icon)
ro_toolbar_set_site_favicon(g->toolbar, icon);
}
-/**
-* set gui display of a retrieved favicon representing the search provider
-* \param ico may be NULL for local calls; then access current cache from
-* search_web_ico()
-*/
-void gui_window_set_search_ico(hlcache_handle *ico)
-{
-}
-
-/**
- * Place the caret in a browser window.
- *
- * \param g window with caret
- * \param x coordinates of caret
- * \param y coordinates of caret
- * \param height height of caret
- * \param clip clip rectangle, or NULL if none
- */
-
-void gui_window_place_caret(struct gui_window *g, int x, int y, int height,
- const struct rect *clip)
-{
- os_error *error;
-
- error = xwimp_set_caret_position(g->window, -1,
- x * 2, -(y + height) * 2, height * 2, -1);
- if (error) {
- LOG(("xwimp_set_caret_position: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("WimpError", error->errmess);
- }
-}
/**
@@ -1153,7 +1115,7 @@ void gui_window_place_caret(struct gui_window *g, int x, int y, int height,
* \param g window with caret
*/
-void gui_window_remove_caret(struct gui_window *g)
+static void gui_window_remove_caret(struct gui_window *g)
{
wimp_caret caret;
os_error *error;
@@ -1181,7 +1143,7 @@ void gui_window_remove_caret(struct gui_window *g)
* \param g the gui_window that has new content
*/
-void gui_window_new_content(struct gui_window *g)
+static void gui_window_new_content(struct gui_window *g)
{
ro_gui_menu_refresh(ro_gui_browser_window_menu);
ro_gui_window_update_toolbar_buttons(g);
@@ -1193,10 +1155,10 @@ void gui_window_new_content(struct gui_window *g)
/**
* Starts drag scrolling of a browser window
*
- * \param gw gui window
+ * \param g the window to scroll
*/
-bool gui_window_scroll_start(struct gui_window *g)
+static bool gui_window_scroll_start(struct gui_window *g)
{
wimp_window_info_base info;
wimp_pointer pointer;
@@ -1260,17 +1222,16 @@ bool gui_window_scroll_start(struct gui_window *g)
* \return true iff succesful
*/
-bool gui_window_drag_start(struct gui_window *g, gui_drag_type type,
+static bool gui_window_drag_start(struct gui_window *g, gui_drag_type type,
const struct rect *rect)
{
wimp_pointer pointer;
- os_error *error;
wimp_drag drag;
if (rect != NULL) {
/* We have a box to constrain the pointer to, for the drag
* duration */
- error = xwimp_get_pointer_info(&pointer);
+ os_error *error = xwimp_get_pointer_info(&pointer);
if (error) {
LOG(("xwimp_get_pointer_info 0x%x : %s",
error->errnum, error->errmess));
@@ -1316,10 +1277,11 @@ bool gui_window_drag_start(struct gui_window *g, gui_drag_type type,
/**
* Save the specified content as a link.
*
- * \param g gui_window containing the content
- * \param c the content to save
+ * \param g The window containing the content
+ * \param url The url of the link
+ * \param title The title of the link
*/
-void gui_window_save_link(struct gui_window *g, const char *url,
+static void gui_window_save_link(struct gui_window *g, const char *url,
const char *title)
{
ro_gui_save_prepare(GUI_SAVE_LINK_URL, NULL, NULL, url, title);
@@ -1339,11 +1301,9 @@ void gui_window_set_extent(struct gui_window *g, int width, int height)
{
int screen_width;
int toolbar_height = 0;
- hlcache_handle *h;
wimp_window_state state;
os_error *error;
- h = g->bw->current_content;
if (g->toolbar)
toolbar_height = ro_toolbar_full_height(g->toolbar);
@@ -1375,9 +1335,11 @@ void gui_window_set_extent(struct gui_window *g, int width, int height)
height -= ro_get_hscroll_height(g->window);
height -= ro_get_title_height(g->window);
}
- if (h) {
- width = max(width, content_get_width(h) * 2 * g->bw->scale);
- height = max(height, content_get_height(h) * 2 * g->bw->scale);
+ if (browser_window_has_content(g->bw)) {
+ int w, h;
+ browser_window_get_extents(g->bw, true, &w, &h);
+ width = max(width, w * 2);
+ height = max(height, h * 2);
}
os_box extent = { 0, -height, width, toolbar_height };
error = xwimp_set_extent(g->window, &extent);
@@ -1417,7 +1379,7 @@ void gui_create_form_select_menu(struct browser_window *bw,
LOG(("xwimp_get_pointer_info: 0x%x: %s",
error->errnum, error->errmess));
warn_user("WimpError", error->errmess);
- ro_gui_menu_closed();
+ ro_gui_menu_destroy();
return;
}
@@ -1522,8 +1484,7 @@ void ro_gui_window_open(wimp_open *open)
struct gui_window *g = (struct gui_window *)ro_gui_wimp_event_get_user_data(open->w);
int width = open->visible.x1 - open->visible.x0;
int height = open->visible.y1 - open->visible.y0;
- int size, fheight, fwidth, toolbar_height = 0;
- bool no_vscroll, no_hscroll;
+ int toolbar_height = 0;
float new_scale = 0;
hlcache_handle *h;
wimp_window_state state;
@@ -1563,24 +1524,22 @@ void ro_gui_window_open(wimp_open *open)
/* handle 'auto' scroll bars' and non-fitting scrollbar removal */
if ((g->bw->scrolling == SCROLLING_AUTO) ||
(g->bw->scrolling == SCROLLING_YES)) {
+ int size;
+
/* windows lose scrollbars when containing a frameset */
- no_hscroll = false;
- no_vscroll = g->bw->children;
+ bool no_hscroll = false;
+ bool no_vscroll = g->bw->children;
/* hscroll */
size = ro_get_hscroll_height(NULL);
if (g->bw->border)
size -= 2;
- fheight = height;
- if (state.flags & wimp_WINDOW_HSCROLL)
- fheight += size;
if (!no_hscroll) {
if (!(state.flags & wimp_WINDOW_HSCROLL)) {
height -= size;
state.visible.y0 += size;
if (h) {
- g->bw->reformat_pending = true;
- browser_reformat_pending = true;
+ browser_window_schedule_reformat(g->bw);
}
}
state.flags |= wimp_WINDOW_HSCROLL;
@@ -1589,8 +1548,7 @@ void ro_gui_window_open(wimp_open *open)
height += size;
state.visible.y0 -= size;
if (h) {
- g->bw->reformat_pending = true;
- browser_reformat_pending = true;
+ browser_window_schedule_reformat(g->bw);
}
}
state.flags &= ~wimp_WINDOW_HSCROLL;
@@ -1600,16 +1558,12 @@ void ro_gui_window_open(wimp_open *open)
size = ro_get_vscroll_width(NULL);
if (g->bw->border)
size -= 2;
- fwidth = width;
- if (state.flags & wimp_WINDOW_VSCROLL)
- fwidth += size;
if (!no_vscroll) {
if (!(state.flags & wimp_WINDOW_VSCROLL)) {
width -= size;
state.visible.x1 -= size;
if (h) {
- g->bw->reformat_pending = true;
- browser_reformat_pending = true;
+ browser_window_schedule_reformat(g->bw);
}
}
state.flags |= wimp_WINDOW_VSCROLL;
@@ -1618,8 +1572,7 @@ void ro_gui_window_open(wimp_open *open)
width += size;
state.visible.x1 += size;
if (h) {
- g->bw->reformat_pending = true;
- browser_reformat_pending = true;
+ browser_window_schedule_reformat(g->bw);
}
}
state.flags &= ~wimp_WINDOW_VSCROLL;
@@ -1632,8 +1585,7 @@ void ro_gui_window_open(wimp_open *open)
if ((g->old_width > 0) && (g->old_width != width) &&
(ro_gui_ctrl_pressed()))
new_scale = (g->bw->scale * width) / g->old_width;
- g->bw->reformat_pending = true;
- browser_reformat_pending = true;
+ browser_window_schedule_reformat(g->bw);
}
if (g->update_extent || g->old_width != width ||
g->old_height != height) {
@@ -1690,8 +1642,8 @@ void ro_gui_window_close(wimp_w w)
struct gui_window *g = (struct gui_window *)ro_gui_wimp_event_get_user_data(w);
wimp_pointer pointer;
os_error *error;
- char *temp_name, *r;
- char *filename;
+ char *temp_name;
+ char *filename = NULL;
hlcache_handle *h = NULL;
bool destroy;
@@ -1706,12 +1658,15 @@ void ro_gui_window_close(wimp_w w)
h = g->bw->current_content;
if (pointer.buttons & wimp_CLICK_ADJUST) {
destroy = !ro_gui_shift_pressed();
- filename = (h && hlcache_handle_get_url(h)) ?
- url_to_path(nsurl_access(hlcache_handle_get_url(h))) :
- NULL;
- if (filename) {
+
+ if (h && hlcache_handle_get_url(h)) {
+ netsurf_nsurl_to_path(hlcache_handle_get_url(h),
+ &filename);
+ }
+ if (filename != NULL) {
temp_name = malloc(strlen(filename) + 32);
if (temp_name) {
+ char *r;
sprintf(temp_name, "Filer_OpenDir %s",
filename);
r = temp_name + strlen(temp_name);
@@ -1798,25 +1753,12 @@ bool ro_gui_window_click(wimp_pointer *pointer)
bool ro_gui_window_keypress(wimp_key *key)
{
struct gui_window *g;
- hlcache_handle *h;
- os_error *error;
- wimp_pointer pointer;
uint32_t c = (uint32_t) key->c;
g = (struct gui_window *) ro_gui_wimp_event_get_user_data(key->w);
if (g == NULL)
return false;
- h = g->bw->current_content;
-
- error = xwimp_get_pointer_info(&pointer);
- if (error) {
- LOG(("xwimp_get_pointer_info: 0x%x: %s\n",
- error->errnum, error->errmess));
- warn_user("WimpError", error->errmess);
- return false;
- }
-
/* First send the key to the browser window, eg. form fields. */
if ((unsigned)c < 0x20 || (0x7f <= c && c <= 0x9f) ||
@@ -1893,7 +1835,7 @@ bool ro_gui_window_keypress(wimp_key *key)
bool ro_gui_window_toolbar_keypress(void *data, wimp_key *key)
{
- struct gui_window *g = (struct gui_window *) data;
+ struct gui_window *g = (struct gui_window *) data;
if (g != NULL)
return ro_gui_window_handle_local_keypress(g, key, true);
@@ -1917,27 +1859,44 @@ bool ro_gui_window_toolbar_keypress(void *data, wimp_key *key)
bool ro_gui_window_handle_local_keypress(struct gui_window *g, wimp_key *key,
bool is_toolbar)
{
- hlcache_handle *h;
- const char *toolbar_url;
- float scale;
- uint32_t c = (uint32_t) key->c;
- wimp_scroll_direction xscroll = wimp_SCROLL_NONE;
- wimp_scroll_direction yscroll = wimp_SCROLL_NONE;
- nsurl *url;
- nserror error;
+ hlcache_handle *h;
+ struct contextual_content cont;
+ os_error *ro_error;
+ wimp_pointer pointer;
+ os_coord pos;
+ float scale;
+ uint32_t c = (uint32_t) key->c;
+ wimp_scroll_direction xscroll = wimp_SCROLL_NONE;
+ wimp_scroll_direction yscroll = wimp_SCROLL_NONE;
+ nsurl *url;
if (g == NULL)
return false;
+ ro_error = xwimp_get_pointer_info(&pointer);
+ if (ro_error) {
+ LOG(("xwimp_get_pointer_info: 0x%x: %s\n",
+ ro_error->errnum, ro_error->errmess));
+ warn_user("WimpError", ro_error->errmess);
+ return false;
+ }
+
+ if (!ro_gui_window_to_window_pos(g, pointer.pos.x, pointer.pos.y, &pos))
+ return false;
+
+
h = g->bw->current_content;
+ browser_window_get_contextual_content(g->bw, pos.x, pos.y, &cont);
+
switch (c) {
case IS_WIMP_KEY + wimp_KEY_F1: /* Help. */
{
- error = nsurl_create("http://www.netsurf-browser.org/documentation/", &url);
+ nserror error = nsurl_create(
+ "http://www.netsurf-browser.org/documentation/",
+ &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -2015,7 +1974,7 @@ bool ro_gui_window_handle_local_keypress(struct gui_window *g, wimp_key *key,
return true;
case IS_WIMP_KEY + wimp_KEY_F8: /* View source */
- ro_gui_view_source(h);
+ ro_gui_view_source((cont.main != NULL) ? cont.main : h);
return true;
case IS_WIMP_KEY + wimp_KEY_F9:
@@ -2043,6 +2002,7 @@ bool ro_gui_window_handle_local_keypress(struct gui_window *g, wimp_key *key,
case wimp_KEY_RETURN:
if (is_toolbar) {
+ const char *toolbar_url;
toolbar_url = ro_toolbar_get_url(g->toolbar);
if (toolbar_url != NULL)
ro_gui_window_launch_url(g, toolbar_url);
@@ -2418,9 +2378,9 @@ bool ro_gui_window_menu_prepare(wimp_w w, wimp_i i, wimp_menu *menu,
ro_gui_menu_set_entry_shaded(menu, HOTLIST_ADD_URL, h == NULL);
ro_gui_menu_set_entry_shaded(menu, HISTORY_SHOW_LOCAL,
- (bw == NULL || (bw->history == NULL) ||
- !(h != NULL || history_back_available(bw->history) ||
- history_forward_available(bw->history))));
+ (bw == NULL ||
+ !(h != NULL || browser_window_back_available(bw) ||
+ browser_window_forward_available(bw))));
/* Help Submenu */
@@ -2447,7 +2407,6 @@ void ro_gui_window_menu_warning(wimp_w w, wimp_i i, wimp_menu *menu,
wimp_selection *selection, menu_action action)
{
struct gui_window *g;
- struct browser_window *bw;
hlcache_handle *h;
struct toolbar *toolbar;
bool export;
@@ -2457,8 +2416,7 @@ void ro_gui_window_menu_warning(wimp_w w, wimp_i i, wimp_menu *menu,
g = (struct gui_window *) ro_gui_wimp_event_get_user_data(w);
toolbar = g->toolbar;
- bw = g->bw;
- h = bw->current_content;
+ h = g->bw->current_content;
switch (action) {
case BROWSER_PAGE_INFO:
@@ -2495,9 +2453,9 @@ void ro_gui_window_menu_warning(wimp_w w, wimp_i i, wimp_menu *menu,
break;
case BROWSER_SELECTION_SAVE:
- if (browser_window_get_editor_flags(bw) & BW_EDITOR_CAN_COPY)
+ if (browser_window_get_editor_flags(g->bw) & BW_EDITOR_CAN_COPY)
ro_gui_save_prepare(GUI_SAVE_TEXT_SELECTION, NULL,
- browser_window_get_selection(bw),
+ browser_window_get_selection(g->bw),
NULL, NULL);
break;
@@ -2686,8 +2644,7 @@ bool ro_gui_window_menu_select(wimp_w w, wimp_i i, wimp_menu *menu,
case HELP_OPEN_CONTENTS:
error = nsurl_create("http://www.netsurf-browser.org/documentation/", &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -2699,8 +2656,7 @@ bool ro_gui_window_menu_select(wimp_w w, wimp_i i, wimp_menu *menu,
case HELP_OPEN_GUIDE:
error = nsurl_create("http://www.netsurf-browser.org/documentation/guide", &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -2712,8 +2668,7 @@ bool ro_gui_window_menu_select(wimp_w w, wimp_i i, wimp_menu *menu,
case HELP_OPEN_INFORMATION:
error = nsurl_create("http://www.netsurf-browser.org/documentation/info", &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -2725,8 +2680,7 @@ bool ro_gui_window_menu_select(wimp_w w, wimp_i i, wimp_menu *menu,
case HELP_OPEN_CREDITS:
error = nsurl_create("about:credits", &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -2738,8 +2692,7 @@ bool ro_gui_window_menu_select(wimp_w w, wimp_i i, wimp_menu *menu,
case HELP_OPEN_LICENCE:
error = nsurl_create("about:licence", &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -2848,10 +2801,9 @@ bool ro_gui_window_menu_select(wimp_w w, wimp_i i, wimp_menu *menu,
error = nsurl_create(current_menu_url, &url);
if (error == NSERROR_OK) {
error = browser_window_navigate(bw,
- url,
- hlcache_handle_get_url(h),
- BROWSER_WINDOW_DOWNLOAD |
- BROWSER_WINDOW_VERIFIABLE,
+ url,
+ hlcache_handle_get_url(h),
+ BW_NAVIGATE_DOWNLOAD,
NULL,
NULL,
NULL);
@@ -2864,8 +2816,9 @@ bool ro_gui_window_menu_select(wimp_w w, wimp_i i, wimp_menu *menu,
if (current_menu_url != NULL) {
error = nsurl_create(current_menu_url, &url);
if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ error = browser_window_create(
+ BW_CREATE_HISTORY |
+ BW_CREATE_CLONE,
url,
hlcache_handle_get_url(h),
bw,
@@ -2957,12 +2910,12 @@ bool ro_gui_window_menu_select(wimp_w w, wimp_i i, wimp_menu *menu,
ro_gui_window_action_home(g);
break;
case BROWSER_NAVIGATE_BACK:
- if (bw != NULL && bw->history != NULL)
- history_back(bw, bw->history);
+ if (bw != NULL)
+ browser_window_history_back(bw, false);
break;
case BROWSER_NAVIGATE_FORWARD:
- if (bw != NULL && bw->history != NULL)
- history_forward(bw, bw->history);
+ if (bw != NULL)
+ browser_window_history_forward(bw, false);
break;
case BROWSER_NAVIGATE_UP:
if (bw != NULL && h != NULL)
@@ -3035,12 +2988,12 @@ bool ro_gui_window_menu_select(wimp_w w, wimp_i i, wimp_menu *menu,
}
break;
case BROWSER_WINDOW_STAGGER:
- nsoption_set_bool(window_stagger,
+ nsoption_set_bool(window_stagger,
!nsoption_bool(window_stagger));
ro_gui_save_options();
break;
case BROWSER_WINDOW_COPY:
- nsoption_set_bool(window_size_clone,
+ nsoption_set_bool(window_size_clone,
!nsoption_bool(window_size_clone));
ro_gui_save_options();
break;
@@ -3122,7 +3075,7 @@ void ro_gui_window_scroll(wimp_scroll *scroll)
inc = 0.02; /* RO5 sends the msg 5 times;
* don't ask me why
*
- * \TODO -- this is liable to break if
+ * @todo this is liable to break if
* HID is configured optimally for
* frame scrolling. *5 appears to be
* an artifact of non-HID mode scrolling.
@@ -3606,7 +3559,6 @@ void ro_gui_window_toolbar_click(void *data,
{
struct gui_window *g = data;
struct browser_window *new_bw;
- gui_save_type save_type;
if (g == NULL)
return;
@@ -3615,6 +3567,9 @@ void ro_gui_window_toolbar_click(void *data,
if (action_type == TOOLBAR_ACTION_URL) {
switch (action.url) {
case TOOLBAR_URL_DRAG_URL:
+ {
+ gui_save_type save_type;
+
if (g->bw->current_content == NULL)
break;
@@ -3628,6 +3583,7 @@ void ro_gui_window_toolbar_click(void *data,
ro_gui_drag_save_link(save_type,
nsurl_access(hlcache_handle_get_url(h)),
content_get_title(h), g);
+ }
break;
case TOOLBAR_URL_SELECT_HOTLIST:
@@ -3637,7 +3593,7 @@ void ro_gui_window_toolbar_click(void *data,
case TOOLBAR_URL_ADJUST_HOTLIST:
ro_gui_window_action_remove_bookmark(g);
break;
-
+
default:
break;
}
@@ -3655,21 +3611,23 @@ void ro_gui_window_toolbar_click(void *data,
switch (action.button) {
case TOOLBAR_BUTTON_BACK:
- if (g->bw != NULL && g->bw->history != NULL)
- history_back(g->bw, g->bw->history);
+ if (g->bw != NULL)
+ browser_window_history_back(g->bw, false);
break;
case TOOLBAR_BUTTON_BACK_NEW:
- ro_gui_window_action_navigate_back_new(g);
+ if (g->bw != NULL)
+ browser_window_history_back(g->bw, true);
break;
case TOOLBAR_BUTTON_FORWARD:
- if (g->bw != NULL && g->bw->history != NULL)
- history_forward(g->bw, g->bw->history);
+ if (g->bw != NULL)
+ browser_window_history_forward(g->bw, false);
break;
case TOOLBAR_BUTTON_FORWARD_NEW:
- ro_gui_window_action_navigate_forward_new(g);
+ if (g->bw != NULL)
+ browser_window_history_forward(g->bw, true);
break;
case TOOLBAR_BUTTON_STOP:
@@ -3739,7 +3697,8 @@ void ro_gui_window_toolbar_click(void *data,
hlcache_handle *h = g->bw->current_content;
nserror error;
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE,
+ error = browser_window_create(
+ BW_CREATE_HISTORY | BW_CREATE_CLONE,
NULL,
NULL,
g->bw,
@@ -3749,7 +3708,7 @@ void ro_gui_window_toolbar_click(void *data,
warn_user(messages_get_errorcode(error), 0);
} else {
/* do it without loading the content
- * into the new window
+ * into the new window
*/
ro_gui_window_navigate_up(new_bw->window,
nsurl_access(hlcache_handle_get_url(h)));
@@ -3768,8 +3727,8 @@ void ro_gui_window_toolbar_click(void *data,
/**
* Handle Message_DataLoad (file dragged in) for a toolbar
*
- * \TODO -- This belongs in the toolbar module, and should be moved there
- * once the module is able to usefully handle its own events.
+ * @todo This belongs in the toolbar module, and should be moved there
+ * once the module is able to usefully handle its own events.
*
* \param g window
* \param message Message_DataLoad block
@@ -3820,13 +3779,13 @@ bool ro_gui_window_check_menu(wimp_menu *menu)
* Return boolean flags to show what RISC OS types we can sensibly convert
* the given object into.
*
- * \TODO -- This should probably be somewhere else but in window.c, and
- * should probably even be done in content_().
+ * \todo This should probably be somewhere else but in window.c, and
+ * should probably even be done in content_().
*
- * \param *h The object to test.
- * \param *export_draw true on exit if a drawfile would be possible.
- * \param *export_sprite true on exit if a sprite would be possible.
- * \return true if valid data is returned; else false.
+ * \param h The object to test.
+ * \param export_draw true on exit if a drawfile would be possible.
+ * \param export_sprite true on exit if a sprite would be possible.
+ * \return true if valid data is returned; else false.
*/
bool ro_gui_window_content_export_types(hlcache_handle *h,
@@ -3865,20 +3824,19 @@ bool ro_gui_window_content_export_types(hlcache_handle *h,
/**
* Return true if a browser window can navigate upwards.
*
- * \TODO -- This should probably be somewhere else but in window.c.
+ * \todo This should probably be somewhere else but in window.c.
*
- * \param *bw the browser window to test.
- * \return true if navigation up is possible; else false.
+ * \param bw the browser window to test.
+ * \return true if navigation up is possible otherwise false.
*/
bool ro_gui_window_up_available(struct browser_window *bw)
{
bool result = false;
nsurl *parent;
- nserror err;
if (bw != NULL && bw->current_content != NULL) {
- err = nsurl_parent(hlcache_handle_get_url(
+ nserror err = nsurl_parent(hlcache_handle_get_url(
bw->current_content), &parent);
if (err == NSERROR_OK) {
result = nsurl_compare(hlcache_handle_get_url(
@@ -3903,7 +3861,6 @@ void ro_gui_window_prepare_pageinfo(struct gui_window *g)
hlcache_handle *h = g->bw->current_content;
char icon_buf[20] = "file_xxx";
char enc_buf[40];
- char enc_token[10] = "Encoding0";
const char *icon = icon_buf;
const char *title, *url;
lwc_string *mime;
@@ -3925,6 +3882,7 @@ void ro_gui_window_prepare_pageinfo(struct gui_window *g)
if (content_get_type(h) == CONTENT_HTML) {
if (html_get_encoding(h)) {
+ char enc_token[10] = "Encoding0";
enc_token[8] = '0' + html_get_encoding_source(h);
snprintf(enc_buf, sizeof enc_buf, "%s (%s)",
html_get_encoding(h),
@@ -3997,39 +3955,29 @@ void ro_gui_window_prepare_objectinfo(hlcache_handle *object, const char *href)
/**
* Launch a new url in the given window.
*
- * \param g gui_window to update
- * \param url url to be launched
+ * \param g gui_window to update
+ * \param url1 url to be launched
*/
void ro_gui_window_launch_url(struct gui_window *g, const char *url1)
{
- char *url2; /** @todo The risc os maintainer needs to examine why the url is copied here */
- nsurl *url;
nserror error;
+ nsurl *url;
- ro_gui_url_complete_close();
-
- url2 = strdup(url1);
- if (url2 != NULL) {
-
- gui_window_set_url(g, url2);
+ if (url1 == NULL)
+ return;
- error = nsurl_create(url2, &url);
- if (error != NSERROR_OK) {
- warn_user(messages_get_errorcode(error), 0);
- } else {
- browser_window_navigate(g->bw,
- url,
- NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
- NULL,
- NULL,
- NULL);
- nsurl_unref(url);
- }
+ ro_gui_url_complete_close();
+ gui_window_set_url(g, url1);
- free(url2);
+ error = nsurl_create(url1, &url);
+ if (error != NSERROR_OK) {
+ warn_user(messages_get_errorcode(error), 0);
+ } else {
+ browser_window_navigate(g->bw, url,
+ NULL, BW_NAVIGATE_HISTORY,
+ NULL, NULL, NULL);
+ nsurl_unref(url);
}
}
@@ -4062,8 +4010,7 @@ bool ro_gui_window_navigate_up(struct gui_window *g, const char *url)
browser_window_navigate(g->bw,
parent,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -4099,8 +4046,7 @@ void ro_gui_window_action_home(struct gui_window *g)
error = browser_window_navigate(g->bw,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -4113,62 +4059,6 @@ void ro_gui_window_action_home(struct gui_window *g)
/**
- * Navigate back from a browser window into a new window.
- *
- * \param *g The browser window to act on.
- */
-
-void ro_gui_window_action_navigate_back_new(struct gui_window *g)
-{
- struct browser_window *new_bw;
- nserror error;
-
- if (g == NULL || g->bw == NULL)
- return;
-
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE,
- NULL,
- NULL,
- g->bw,
- &new_bw);
-
- if (error != NSERROR_OK) {
- warn_user(messages_get_errorcode(error), 0);
- } else {
- history_back(new_bw, new_bw->history);
- }
-}
-
-
-/**
- * Navigate forward from a browser window into a new window.
- *
- * \param *g The browser window to act on.
- */
-
-void ro_gui_window_action_navigate_forward_new(struct gui_window *g)
-{
- struct browser_window *new_bw;
- nserror error;
-
- if (g == NULL || g->bw == NULL)
- return;
-
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE,
- NULL,
- NULL,
- g->bw,
- &new_bw);
-
- if (error != NSERROR_OK) {
- warn_user(messages_get_errorcode(error), 0);
- } else {
- history_forward(new_bw, new_bw->history);
- }
-}
-
-
-/**
* Open a new browser window.
*
* \param *g The browser window to act on.
@@ -4181,7 +4071,7 @@ void ro_gui_window_action_new_window(struct gui_window *g)
if (g == NULL || g->bw == NULL || g->bw->current_content == NULL)
return;
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE,
+ error = browser_window_create(BW_CREATE_CLONE,
hlcache_handle_get_url(g->bw->current_content),
NULL,
g->bw,
@@ -4202,7 +4092,7 @@ void ro_gui_window_action_new_window(struct gui_window *g)
void ro_gui_window_action_local_history(struct gui_window *g)
{
if (g != NULL && g->bw != NULL && g->bw->history != NULL)
- ro_gui_history_open(g->bw, g->bw->history, true);
+ ro_gui_history_open(g, true);
}
@@ -4455,35 +4345,25 @@ void ro_gui_window_update_boxes(void)
/**
- * Process pending reformats
+ * callback from core to reformat a window.
*/
-
-void ro_gui_window_process_reformats(void)
+static void riscos_window_reformat(struct gui_window *gw)
{
- struct gui_window *g;
-
- browser_reformat_pending = false;
- for (g = window_list; g; g = g->next) {
- if (!g->bw->reformat_pending)
- continue;
- g->bw->reformat_pending = false;
- browser_window_reformat(g->bw, false,
- g->old_width / 2,
- g->old_height / 2);
+ if (gw != NULL) {
+ browser_window_reformat(gw->bw, false,
+ gw->old_width / 2,
+ gw->old_height / 2);
}
}
-
/**
* Destroy all browser windows.
*/
void ro_gui_window_quit(void)
{
- struct gui_window *cur;
-
while (window_list) {
- cur = window_list;
+ struct gui_window *cur = window_list;
window_list = window_list->next;
browser_window_destroy(cur->bw);
@@ -4623,11 +4503,10 @@ void ro_gui_window_update_theme(void *data, bool ok)
*/
/**
- * Import text file into window or its toolbar
+ * Import text file into window
*
* \param g gui window containing textarea
* \param filename pathname of file to be imported
- * \param toolbar true iff imported to toolbar rather than main window
* \return true iff successful
*/
@@ -4637,7 +4516,7 @@ bool ro_gui_window_import_text(struct gui_window *g, const char *filename)
os_error *error;
char *buf, *utf8_buf, *sp;
int size;
- utf8_convert_ret ret;
+ nserror ret;
const char *ep;
char *p;
@@ -4672,9 +4551,9 @@ bool ro_gui_window_import_text(struct gui_window *g, const char *filename)
}
ret = utf8_from_local_encoding(buf, size, &utf8_buf);
- if (ret != UTF8_CONVERT_OK) {
+ if (ret != NSERROR_OK) {
/* bad encoding shouldn't happen */
- assert(ret != UTF8_CONVERT_BADENC);
+ assert(ret != NSERROR_BAD_ENCODING);
LOG(("utf8_from_local_encoding failed"));
free(buf);
warn_user("NoMemory", NULL);
@@ -4705,29 +4584,19 @@ bool ro_gui_window_import_text(struct gui_window *g, const char *filename)
/**
* Clones a browser window's options.
*
- * \param new_bw the new browser window
- * \param old_bw the browser window to clone from, or NULL for default
+ * \param new_gui the new gui window
+ * \param old_gui the gui window to clone from, or NULL for default
*/
-void ro_gui_window_clone_options(struct browser_window *new_bw,
- struct browser_window *old_bw)
+void ro_gui_window_clone_options(
+ struct gui_window *new_gui,
+ struct gui_window *old_gui)
{
- struct gui_window *old_gui = NULL;
- struct gui_window *new_gui;
-
- assert(new_bw);
-
- /* Get our GUIs
- */
- new_gui = new_bw->window;
-
- if (old_bw)
- old_gui = old_bw->window;
+ assert(new_gui);
/* Clone the basic options
*/
if (!old_gui) {
- new_bw->scale = ((float)nsoption_int(scale)) / 100;
new_gui->option.buffer_animations = nsoption_bool(buffer_animations);
new_gui->option.buffer_everything = nsoption_bool(buffer_everything);
} else {
@@ -4818,7 +4687,7 @@ bool ro_gui_window_prepare_form_select_menu(struct browser_window *bw,
char *text_convert, *temp;
struct form_option *option;
bool reopen = true;
- utf8_convert_ret err;
+ nserror err;
assert(control);
@@ -4826,7 +4695,7 @@ bool ro_gui_window_prepare_form_select_menu(struct browser_window *bw,
option = option->next)
entries++;
if (entries == 0) {
- ro_gui_menu_closed();
+ ro_gui_menu_destroy();
return false;
}
@@ -4850,17 +4719,17 @@ bool ro_gui_window_prepare_form_select_menu(struct browser_window *bw,
gui_form_select_menu = malloc(wimp_SIZEOF_MENU(entries));
if (!gui_form_select_menu) {
warn_user("NoMemory", 0);
- ro_gui_menu_closed();
+ ro_gui_menu_destroy();
return false;
}
err = utf8_to_local_encoding(messages_get("SelectMenu"), 0,
&text_convert);
- if (err != UTF8_CONVERT_OK) {
+ if (err != NSERROR_OK) {
/* badenc should never happen */
- assert(err != UTF8_CONVERT_BADENC);
+ assert(err != NSERROR_BAD_ENCODING);
LOG(("utf8_to_local_encoding failed"));
warn_user("NoMemory", 0);
- ro_gui_menu_closed();
+ ro_gui_menu_destroy();
return false;
}
gui_form_select_menu->title_data.indirected_text.text =
@@ -4885,19 +4754,19 @@ bool ro_gui_window_prepare_form_select_menu(struct browser_window *bw,
if (!temp) {
LOG(("cnv_space2nbsp failed"));
warn_user("NoMemory", 0);
- ro_gui_menu_closed();
+ ro_gui_menu_destroy();
return false;
}
err = utf8_to_local_encoding(temp,
0, &text_convert);
- if (err != UTF8_CONVERT_OK) {
+ if (err != NSERROR_OK) {
/* A bad encoding should never happen,
* so assert this */
- assert(err != UTF8_CONVERT_BADENC);
+ assert(err != NSERROR_BAD_ENCODING);
LOG(("utf8_to_enc failed"));
warn_user("NoMemory", 0);
- ro_gui_menu_closed();
+ ro_gui_menu_destroy();
return false;
}
@@ -4931,9 +4800,7 @@ void ro_gui_window_process_form_select_menu(struct gui_window *g,
assert(g != NULL);
if (selection->items[0] >= 0)
- form_select_process_selection(
- ro_gui_select_menu_bw->current_content,
- gui_form_select_control,
+ form_select_process_selection(gui_form_select_control,
selection->items[0]);
}
@@ -4945,8 +4812,8 @@ void ro_gui_window_process_form_select_menu(struct gui_window *g,
/**
* Convert a RISC OS window handle to a gui_window.
*
- * \param w RISC OS window handle
- * \return pointer to a structure if found, 0 otherwise
+ * \param window RISC OS window handle.
+ * \return A pointer to a riscos gui window if found or NULL.
*/
struct gui_window *ro_gui_window_lookup(wimp_w window)
@@ -4955,15 +4822,15 @@ struct gui_window *ro_gui_window_lookup(wimp_w window)
for (g = window_list; g; g = g->next)
if (g->window == window)
return g;
- return 0;
+ return NULL;
}
/**
* Convert a toolbar RISC OS window handle to a gui_window.
*
- * \param w RISC OS window handle of a toolbar
- * \return pointer to a structure if found, 0 otherwise
+ * \param window RISC OS window handle of a toolbar
+ * \return pointer to a structure if found, NULL otherwise
*/
struct gui_window *ro_gui_toolbar_lookup(wimp_w window)
@@ -5256,3 +5123,38 @@ bool ro_gui_alt_pressed(void)
return (alt == 0xff);
}
+static struct gui_window_table window_table = {
+ .create = gui_window_create,
+ .destroy = gui_window_destroy,
+ .redraw = gui_window_redraw_window,
+ .update = gui_window_update_box,
+ .get_scroll = gui_window_get_scroll,
+ .set_scroll = gui_window_set_scroll,
+ .get_dimensions = gui_window_get_dimensions,
+ .update_extent = gui_window_update_extent,
+ .reformat = riscos_window_reformat,
+
+ .set_title = gui_window_set_title,
+ .set_url = gui_window_set_url,
+ .set_icon = gui_window_set_icon,
+ .set_status = gui_window_set_status,
+ .set_pointer = gui_window_set_pointer,
+ .place_caret = gui_window_place_caret,
+ .remove_caret = gui_window_remove_caret,
+ .save_link = gui_window_save_link,
+ .drag_start = gui_window_drag_start,
+ .scroll_visible = gui_window_scroll_visible,
+ .scroll_start = gui_window_scroll_start,
+ .new_content = gui_window_new_content,
+ .start_throbber = gui_window_start_throbber,
+ .stop_throbber = gui_window_stop_throbber,
+
+ /* from save */
+ .drag_save_object = gui_drag_save_object,
+ .drag_save_selection =gui_drag_save_selection,
+
+ /* from textselection */
+ .start_selection = gui_start_selection,
+};
+
+struct gui_window_table *riscos_window_table = &window_table;
diff --git a/riscos/window.h b/riscos/window.h
index adbd999f9..c4daf8bb8 100644
--- a/riscos/window.h
+++ b/riscos/window.h
@@ -25,9 +25,21 @@
#ifndef _NETSURF_RISCOS_WINDOW_H_
#define _NETSURF_RISCOS_WINDOW_H_
+struct gui_window;
+
+extern struct gui_window_table *riscos_window_table;
+
void ro_gui_window_initialise(void);
bool ro_gui_window_check_menu(wimp_menu *menu);
+/**
+ * Set the contents of a window's address bar.
+ *
+ * \param g gui_window to update
+ * \param url new url for address bar
+ */
+void gui_window_set_url(struct gui_window *g, const char *url);
+
#endif
diff --git a/test/Makefile b/test/Makefile
index ecd2b501a..cf0f89724 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -22,9 +22,9 @@ urldbtest_SRCS := content/urldb.c utils/url.c utils/utils.c utils/log.c \
urldbtest_CFLAGS := $(shell pkg-config --cflags libwapcaplet libdom) -O2
urldbtest_LDFLAGS := $(shell pkg-config --libs libwapcaplet libdom)
-nsurl_SRCS := utils/log.c utils/nsurl.c test/nsurl.c
-nsurl_CFLAGS := $(shell pkg-config --cflags libwapcaplet)
-nsurl_LDFLAGS := $(shell pkg-config --libs libwapcaplet)
+nsurl_SRCS := utils/corestrings.c utils/log.c utils/nsurl.c utils/idna.c utils/utf8proc.c test/nsurl.c
+nsurl_CFLAGS := $(shell pkg-config --cflags libwapcaplet libdom)
+nsurl_LDFLAGS := $(shell pkg-config --libs libwapcaplet libdom)
nsoption_SRCS := utils/log.c utils/nsoption.c test/nsoption.c
nsoption_CFLAGS := -Dnsgtk
diff --git a/test/nsurl.c b/test/nsurl.c
index 66bc05780..20774c41f 100644
--- a/test/nsurl.c
+++ b/test/nsurl.c
@@ -6,12 +6,10 @@
#include <libwapcaplet/libwapcaplet.h>
#include "desktop/netsurf.h"
+#include "utils/corestrings.h"
#include "utils/log.h"
#include "utils/nsurl.h"
-/* desktop/netsurf.h */
-bool verbose_log = true;
-
struct test_pairs {
const char* test;
const char* res;
@@ -30,9 +28,10 @@ static void netsurf_lwc_iterator(lwc_string *str, void *pw)
}
static const struct test_pairs create_tests[] = {
- { "http:", "http:" },
- { "http:/", "http:" },
- { "http://", "http:" },
+ { "", NULL },
+ { "http:", NULL },
+ { "http:/", NULL },
+ { "http://", NULL },
{ "http:a", "http://a/" },
{ "http:a/", "http://a/" },
{ "http:a/b", "http://a/b" },
@@ -142,6 +141,7 @@ static const struct test_pairs join_tests[] = {
{ " / ", "http://a/" },
{ " ? ", "http://a/b/c/d;p?" },
{ " h ", "http://a/b/c/h" },
+ { "http://<!--#echo var=", "http://<!--/#echo%20var="},
/* [1] Extra slash beyond rfc3986 5.4.1 example, since we're
* testing normalisation in addition to joining */
/* [2] Using the strict parsers option */
@@ -182,6 +182,13 @@ int main(void)
const struct test_triplets *ttest;
int passed = 0;
int count = 0;
+ nserror err;
+
+ verbose_log = true;
+
+ if (corestrings_init() != NSERROR_OK) {
+ assert(0 && "Failed to init corestrings.");
+ }
/* Create base URL */
if (nsurl_create("http://a/b/c/d;p?q", &base) != NSERROR_OK) {
@@ -228,8 +235,22 @@ int main(void)
/* Create tests */
LOG(("Testing nsurl_create"));
for (test = create_tests; test->test != NULL; test++) {
- if (nsurl_create(test->test, &base) != NSERROR_OK) {
- LOG(("Failed to create URL:\n\t\t%s.", test->test));
+ err = nsurl_create(test->test, &base);
+ if (err != NSERROR_OK || test->res == NULL) {
+ if (test->res == NULL && err != NSERROR_OK) {
+ LOG(("\tPASS: \"%s\"\t--> BAD INPUT",
+ test->test));
+ passed++;
+ } else if (test->res != NULL && err != NSERROR_OK) {
+ LOG(("Failed to create URL:\n\t\t%s.",
+ test->test));
+ } else {
+ LOG(("\tFAIL: \"%s\"\t--> %s",
+ test->test, nsurl_access(base)));
+ LOG(("\t\tExpecting BAD INPUT"));
+ }
+ if (err == NSERROR_OK)
+ nsurl_unref(base);
} else {
if (strcmp(nsurl_access(base), test->res) == 0) {
LOG(("\tPASS: \"%s\"\t--> %s",
@@ -286,6 +307,8 @@ int main(void)
LOG(("Failed %d out of %d", count - passed, count));
}
+ corestrings_fini();
+
LOG(("Remaining lwc strings:"));
lwc_iterate_strings(netsurf_lwc_iterator, NULL);
diff --git a/utils/DerivedJoiningType.txt b/utils/DerivedJoiningType.txt
new file mode 100644
index 000000000..d4dcc85f6
--- /dev/null
+++ b/utils/DerivedJoiningType.txt
@@ -0,0 +1,318 @@
+# DerivedJoiningType-5.2.0.txt
+# Date: 2009-05-28, 20:37:39 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2009 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see http://www.unicode.org/reports/tr44/
+
+# ================================================
+
+# Type T is derived, as described in ArabicShaping.txt
+
+# All code points not explicitly listed for Joining_Type
+# have the value Non_Joining (U).
+
+# @missing: 0000..10FFFF; Non_Joining
+
+# ================================================
+
+# Joining_Type=Join_Causing
+
+0640 ; C # Lm ARABIC TATWEEL
+07FA ; C # Lm NKO LAJANYALAN
+200D ; C # Cf ZERO WIDTH JOINER
+
+# Total code points: 3
+
+# ================================================
+
+# Joining_Type=Dual_Joining
+
+0626 ; D # Lo ARABIC LETTER YEH WITH HAMZA ABOVE
+0628 ; D # Lo ARABIC LETTER BEH
+062A..062E ; D # Lo [5] ARABIC LETTER TEH..ARABIC LETTER KHAH
+0633..063F ; D # Lo [13] ARABIC LETTER SEEN..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE
+0641..0647 ; D # Lo [7] ARABIC LETTER FEH..ARABIC LETTER HEH
+0649..064A ; D # Lo [2] ARABIC LETTER ALEF MAKSURA..ARABIC LETTER YEH
+066E..066F ; D # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF
+0678..0687 ; D # Lo [16] ARABIC LETTER HIGH HAMZA YEH..ARABIC LETTER TCHEHEH
+069A..06BF ; D # Lo [38] ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE..ARABIC LETTER TCHEH WITH DOT ABOVE
+06C1..06C2 ; D # Lo [2] ARABIC LETTER HEH GOAL..ARABIC LETTER HEH GOAL WITH HAMZA ABOVE
+06CC ; D # Lo ARABIC LETTER FARSI YEH
+06CE ; D # Lo ARABIC LETTER YEH WITH SMALL V
+06D0..06D1 ; D # Lo [2] ARABIC LETTER E..ARABIC LETTER YEH WITH THREE DOTS BELOW
+06FA..06FC ; D # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW
+06FF ; D # Lo ARABIC LETTER HEH WITH INVERTED V
+0712..0714 ; D # Lo [3] SYRIAC LETTER BETH..SYRIAC LETTER GAMAL GARSHUNI
+071A..071D ; D # Lo [4] SYRIAC LETTER HETH..SYRIAC LETTER YUDH
+071F..0727 ; D # Lo [9] SYRIAC LETTER KAPH..SYRIAC LETTER REVERSED PE
+0729 ; D # Lo SYRIAC LETTER QAPH
+072B ; D # Lo SYRIAC LETTER SHIN
+072D..072E ; D # Lo [2] SYRIAC LETTER PERSIAN BHETH..SYRIAC LETTER PERSIAN GHAMAL
+074E..0758 ; D # Lo [11] SYRIAC LETTER SOGDIAN KHAPH..ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW
+075C..076A ; D # Lo [15] ARABIC LETTER SEEN WITH FOUR DOTS ABOVE..ARABIC LETTER LAM WITH BAR
+076D..0770 ; D # Lo [4] ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE..ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS
+0772 ; D # Lo ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE
+0775..0777 ; D # Lo [3] ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE..ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW
+077A..077F ; D # Lo [6] ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE..ARABIC LETTER KAF WITH TWO DOTS ABOVE
+07CA..07EA ; D # Lo [33] NKO LETTER A..NKO LETTER JONA RA
+
+# Total code points: 188
+
+# ================================================
+
+# Joining_Type=Right_Joining
+
+0622..0625 ; R # Lo [4] ARABIC LETTER ALEF WITH MADDA ABOVE..ARABIC LETTER ALEF WITH HAMZA BELOW
+0627 ; R # Lo ARABIC LETTER ALEF
+0629 ; R # Lo ARABIC LETTER TEH MARBUTA
+062F..0632 ; R # Lo [4] ARABIC LETTER DAL..ARABIC LETTER ZAIN
+0648 ; R # Lo ARABIC LETTER WAW
+0671..0673 ; R # Lo [3] ARABIC LETTER ALEF WASLA..ARABIC LETTER ALEF WITH WAVY HAMZA BELOW
+0675..0677 ; R # Lo [3] ARABIC LETTER HIGH HAMZA ALEF..ARABIC LETTER U WITH HAMZA ABOVE
+0688..0699 ; R # Lo [18] ARABIC LETTER DDAL..ARABIC LETTER REH WITH FOUR DOTS ABOVE
+06C0 ; R # Lo ARABIC LETTER HEH WITH YEH ABOVE
+06C3..06CB ; R # Lo [9] ARABIC LETTER TEH MARBUTA GOAL..ARABIC LETTER VE
+06CD ; R # Lo ARABIC LETTER YEH WITH TAIL
+06CF ; R # Lo ARABIC LETTER WAW WITH DOT ABOVE
+06D2..06D3 ; R # Lo [2] ARABIC LETTER YEH BARREE..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D5 ; R # Lo ARABIC LETTER AE
+06EE..06EF ; R # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V
+0710 ; R # Lo SYRIAC LETTER ALAPH
+0715..0719 ; R # Lo [5] SYRIAC LETTER DALATH..SYRIAC LETTER ZAIN
+071E ; R # Lo SYRIAC LETTER YUDH HE
+0728 ; R # Lo SYRIAC LETTER SADHE
+072A ; R # Lo SYRIAC LETTER RISH
+072C ; R # Lo SYRIAC LETTER TAW
+072F ; R # Lo SYRIAC LETTER PERSIAN DHALATH
+074D ; R # Lo SYRIAC LETTER SOGDIAN ZHAIN
+0759..075B ; R # Lo [3] ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH..ARABIC LETTER REH WITH STROKE
+076B..076C ; R # Lo [2] ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE..ARABIC LETTER REH WITH HAMZA ABOVE
+0771 ; R # Lo ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS
+0773..0774 ; R # Lo [2] ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE..ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+0778..0779 ; R # Lo [2] ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE..ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+
+# Total code points: 74
+
+# ================================================
+
+# Joining_Type=Transparent
+
+00AD ; T # Cf SOFT HYPHEN
+0300..036F ; T # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X
+0483..0487 ; T # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE
+0488..0489 ; T # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN
+0591..05BD ; T # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG
+05BF ; T # Mn HEBREW POINT RAFE
+05C1..05C2 ; T # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+05C4..05C5 ; T # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT
+05C7 ; T # Mn HEBREW POINT QAMATS QATAN
+0610..061A ; T # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA
+064B..065E ; T # Mn [20] ARABIC FATHATAN..ARABIC FATHA WITH TWO DOTS
+0670 ; T # Mn ARABIC LETTER SUPERSCRIPT ALEF
+06D6..06DC ; T # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN
+06DE ; T # Me ARABIC START OF RUB EL HIZB
+06DF..06E4 ; T # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA
+06E7..06E8 ; T # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON
+06EA..06ED ; T # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM
+070F ; T # Cf SYRIAC ABBREVIATION MARK
+0711 ; T # Mn SYRIAC LETTER SUPERSCRIPT ALAPH
+0730..074A ; T # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH
+07A6..07B0 ; T # Mn [11] THAANA ABAFILI..THAANA SUKUN
+07EB..07F3 ; T # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE
+0816..0819 ; T # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH
+081B..0823 ; T # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A
+0825..0827 ; T # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U
+0829..082D ; T # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA
+0900..0902 ; T # Mn [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA
+093C ; T # Mn DEVANAGARI SIGN NUKTA
+0941..0948 ; T # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI
+094D ; T # Mn DEVANAGARI SIGN VIRAMA
+0951..0955 ; T # Mn [5] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN CANDRA LONG E
+0962..0963 ; T # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
+0981 ; T # Mn BENGALI SIGN CANDRABINDU
+09BC ; T # Mn BENGALI SIGN NUKTA
+09C1..09C4 ; T # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR
+09CD ; T # Mn BENGALI SIGN VIRAMA
+09E2..09E3 ; T # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
+0A01..0A02 ; T # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
+0A3C ; T # Mn GURMUKHI SIGN NUKTA
+0A41..0A42 ; T # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
+0A47..0A48 ; T # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
+0A4B..0A4D ; T # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA
+0A51 ; T # Mn GURMUKHI SIGN UDAAT
+0A70..0A71 ; T # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK
+0A75 ; T # Mn GURMUKHI SIGN YAKASH
+0A81..0A82 ; T # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
+0ABC ; T # Mn GUJARATI SIGN NUKTA
+0AC1..0AC5 ; T # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E
+0AC7..0AC8 ; T # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
+0ACD ; T # Mn GUJARATI SIGN VIRAMA
+0AE2..0AE3 ; T # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
+0B01 ; T # Mn ORIYA SIGN CANDRABINDU
+0B3C ; T # Mn ORIYA SIGN NUKTA
+0B3F ; T # Mn ORIYA VOWEL SIGN I
+0B41..0B44 ; T # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR
+0B4D ; T # Mn ORIYA SIGN VIRAMA
+0B56 ; T # Mn ORIYA AI LENGTH MARK
+0B62..0B63 ; T # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL
+0B82 ; T # Mn TAMIL SIGN ANUSVARA
+0BC0 ; T # Mn TAMIL VOWEL SIGN II
+0BCD ; T # Mn TAMIL SIGN VIRAMA
+0C3E..0C40 ; T # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
+0C46..0C48 ; T # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
+0C4A..0C4D ; T # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA
+0C55..0C56 ; T # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
+0C62..0C63 ; T # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL
+0CBC ; T # Mn KANNADA SIGN NUKTA
+0CBF ; T # Mn KANNADA VOWEL SIGN I
+0CC6 ; T # Mn KANNADA VOWEL SIGN E
+0CCC..0CCD ; T # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA
+0CE2..0CE3 ; T # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
+0D41..0D44 ; T # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR
+0D4D ; T # Mn MALAYALAM SIGN VIRAMA
+0D62..0D63 ; T # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL
+0DCA ; T # Mn SINHALA SIGN AL-LAKUNA
+0DD2..0DD4 ; T # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6 ; T # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA
+0E31 ; T # Mn THAI CHARACTER MAI HAN-AKAT
+0E34..0E3A ; T # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
+0E47..0E4E ; T # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
+0EB1 ; T # Mn LAO VOWEL SIGN MAI KAN
+0EB4..0EB9 ; T # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU
+0EBB..0EBC ; T # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO
+0EC8..0ECD ; T # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA
+0F18..0F19 ; T # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F35 ; T # Mn TIBETAN MARK NGAS BZUNG NYI ZLA
+0F37 ; T # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F39 ; T # Mn TIBETAN MARK TSA -PHRU
+0F71..0F7E ; T # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
+0F80..0F84 ; T # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA
+0F86..0F87 ; T # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS
+0F90..0F97 ; T # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA
+0F99..0FBC ; T # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FC6 ; T # Mn TIBETAN SYMBOL PADMA GDAN
+102D..1030 ; T # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU
+1032..1037 ; T # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW
+1039..103A ; T # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT
+103D..103E ; T # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA
+1058..1059 ; T # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL
+105E..1060 ; T # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA
+1071..1074 ; T # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE
+1082 ; T # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA
+1085..1086 ; T # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y
+108D ; T # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE
+109D ; T # Mn MYANMAR VOWEL SIGN AITON AI
+135F ; T # Mn ETHIOPIC COMBINING GEMINATION MARK
+1712..1714 ; T # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA
+1732..1734 ; T # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD
+1752..1753 ; T # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
+1772..1773 ; T # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
+17B4..17B5 ; T # Cf [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
+17B7..17BD ; T # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
+17C6 ; T # Mn KHMER SIGN NIKAHIT
+17C9..17D3 ; T # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT
+17DD ; T # Mn KHMER SIGN ATTHACAN
+180B..180D ; T # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+18A9 ; T # Mn MONGOLIAN LETTER ALI GALI DAGALGA
+1920..1922 ; T # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
+1927..1928 ; T # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
+1932 ; T # Mn LIMBU SMALL LETTER ANUSVARA
+1939..193B ; T # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I
+1A17..1A18 ; T # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U
+1A56 ; T # Mn TAI THAM CONSONANT SIGN MEDIAL LA
+1A58..1A5E ; T # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA
+1A60 ; T # Mn TAI THAM SIGN SAKOT
+1A62 ; T # Mn TAI THAM VOWEL SIGN MAI SAT
+1A65..1A6C ; T # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW
+1A73..1A7C ; T # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN
+1A7F ; T # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT
+1B00..1B03 ; T # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG
+1B34 ; T # Mn BALINESE SIGN REREKAN
+1B36..1B3A ; T # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA
+1B3C ; T # Mn BALINESE VOWEL SIGN LA LENGA
+1B42 ; T # Mn BALINESE VOWEL SIGN PEPET
+1B6B..1B73 ; T # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG
+1B80..1B81 ; T # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR
+1BA2..1BA5 ; T # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU
+1BA8..1BA9 ; T # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG
+1C2C..1C33 ; T # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T
+1C36..1C37 ; T # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA
+1CD0..1CD2 ; T # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA
+1CD4..1CE0 ; T # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA
+1CE2..1CE8 ; T # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL
+1CED ; T # Mn VEDIC SIGN TIRYAK
+1DC0..1DE6 ; T # Mn [39] COMBINING DOTTED GRAVE ACCENT..COMBINING LATIN SMALL LETTER Z
+1DFD..1DFF ; T # Mn [3] COMBINING ALMOST EQUAL TO BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+200B ; T # Cf ZERO WIDTH SPACE
+200E..200F ; T # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK
+202A..202E ; T # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE
+2060..2064 ; T # Cf [5] WORD JOINER..INVISIBLE PLUS
+206A..206F ; T # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES
+20D0..20DC ; T # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE
+20DD..20E0 ; T # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH
+20E1 ; T # Mn COMBINING LEFT RIGHT ARROW ABOVE
+20E2..20E4 ; T # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE
+20E5..20F0 ; T # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE
+2CEF..2CF1 ; T # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS
+2DE0..2DFF ; T # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS
+302A..302F ; T # Mn [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK
+3099..309A ; T # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+A66F ; T # Mn COMBINING CYRILLIC VZMET
+A670..A672 ; T # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN
+A67C..A67D ; T # Mn [2] COMBINING CYRILLIC KAVYKA..COMBINING CYRILLIC PAYEROK
+A6F0..A6F1 ; T # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS
+A802 ; T # Mn SYLOTI NAGRI SIGN DVISVARA
+A806 ; T # Mn SYLOTI NAGRI SIGN HASANTA
+A80B ; T # Mn SYLOTI NAGRI SIGN ANUSVARA
+A825..A826 ; T # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E
+A8C4 ; T # Mn SAURASHTRA SIGN VIRAMA
+A8E0..A8F1 ; T # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA
+A926..A92D ; T # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU
+A947..A951 ; T # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R
+A980..A982 ; T # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR
+A9B3 ; T # Mn JAVANESE SIGN CECAK TELU
+A9B6..A9B9 ; T # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT
+A9BC ; T # Mn JAVANESE VOWEL SIGN PEPET
+AA29..AA2E ; T # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE
+AA31..AA32 ; T # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE
+AA35..AA36 ; T # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA
+AA43 ; T # Mn CHAM CONSONANT SIGN FINAL NG
+AA4C ; T # Mn CHAM CONSONANT SIGN FINAL M
+AAB0 ; T # Mn TAI VIET MAI KANG
+AAB2..AAB4 ; T # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U
+AAB7..AAB8 ; T # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA
+AABE..AABF ; T # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK
+AAC1 ; T # Mn TAI VIET TONE MAI THO
+ABE5 ; T # Mn MEETEI MAYEK VOWEL SIGN ANAP
+ABE8 ; T # Mn MEETEI MAYEK VOWEL SIGN UNAP
+ABED ; T # Mn MEETEI MAYEK APUN IYEK
+FB1E ; T # Mn HEBREW POINT JUDEO-SPANISH VARIKA
+FE00..FE0F ; T # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
+FE20..FE26 ; T # Mn [7] COMBINING LIGATURE LEFT HALF..COMBINING CONJOINING MACRON
+FEFF ; T # Cf ZERO WIDTH NO-BREAK SPACE
+FFF9..FFFB ; T # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR
+101FD ; T # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
+10A01..10A03 ; T # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05..10A06 ; T # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
+10A0C..10A0F ; T # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
+10A38..10A3A ; T # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW
+10A3F ; T # Mn KHAROSHTHI VIRAMA
+11080..11081 ; T # Mn [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA
+110B3..110B6 ; T # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI
+110B9..110BA ; T # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA
+110BD ; T # Cf KAITHI NUMBER SIGN
+1D167..1D169 ; T # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
+1D173..1D17A ; T # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
+1D17B..1D182 ; T # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
+1D185..1D18B ; T # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D1AA..1D1AD ; T # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+1D242..1D244 ; T # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME
+E0001 ; T # Cf LANGUAGE TAG
+E0020..E007F ; T # Cf [96] TAG SPACE..CANCEL TAG
+E0100..E01EF ; T # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
+
+# Total code points: 1308
+
+# EOF
diff --git a/utils/Makefile b/utils/Makefile
index aef579948..b1a6df4fc 100644
--- a/utils/Makefile
+++ b/utils/Makefile
@@ -2,6 +2,7 @@
S_UTILS := base64.c corestrings.c filename.c filepath.c hashtable.c \
libdom.c locale.c log.c messages.c nsurl.c talloc.c url.c \
- utf8.c utils.c useragent.c bloom.c nsoption.c
+ utf8.c utils.c useragent.c bloom.c nsoption.c file.c idna.c \
+ punycode.c utf8proc.c
S_UTILS := $(addprefix utils/,$(S_UTILS))
diff --git a/utils/base64.c b/utils/base64.c
index 06647168b..85d67a6f7 100644
--- a/utils/base64.c
+++ b/utils/base64.c
@@ -435,7 +435,8 @@ int main(int argc, char *argv[])
base64_decode(argv[1], strlen(argv[1]), out, &outz));
fprintf(stderr, "bytes decoded: %d\n", outz);
fwrite(out, outz, 1, stdout);
-
+
+ free(out);
return 0;
}
#endif
diff --git a/utils/config.h b/utils/config.h
index bc96b8f6a..21a2e4a5a 100644
--- a/utils/config.h
+++ b/utils/config.h
@@ -24,20 +24,31 @@
/* Try to detect which features the target OS supports */
-#if (defined(_GNU_SOURCE) && !defined(__APPLE__) || defined(__HAIKU__))
+#if (defined(_GNU_SOURCE) && !defined(__APPLE__) || defined(__HAIKU__) || (defined(_POSIX_C_SOURCE) && ((_POSIX_C_SOURCE - 0) >= 200809L)))
#define HAVE_STRNDUP
#else
#undef HAVE_STRNDUP
char *strndup(const char *s, size_t n);
#endif
-#if (defined(_GNU_SOURCE) || defined(__APPLE__) || defined(__HAIKU__))
+#if (defined(_GNU_SOURCE) || defined(__APPLE__) || defined(__HAIKU__) || defined(__OpenBSD__))
#define HAVE_STRCASESTR
#else
#undef HAVE_STRCASESTR
char *strcasestr(const char *haystack, const char *needle);
#endif
+/* Although these platforms might have strftime or strptime they
+ * appear not to support the time_t seconds format specifier.
+ */
+#if (defined(_WIN32) || defined(riscos) || defined(__HAIKU__) || defined(__BEOS__) || defined(__amigaos4__) || defined(__AMIGA__) || defined(__MINT__))
+#undef HAVE_STRPTIME
+#undef HAVE_STRFTIME
+#else
+#define HAVE_STRPTIME
+#define HAVE_STRFTIME
+#endif
+
/* For some reason, UnixLib defines this unconditionally.
* Assume we're using UnixLib if building for RISC OS. */
#if ((defined(_GNU_SOURCE) && !defined(__APPLE__)) || defined(riscos))
@@ -47,15 +58,18 @@ char *strcasestr(const char *haystack, const char *needle);
char *strchrnul(const char *s, int c);
#endif
+#define HAVE_SYS_SELECT
#define HAVE_INETATON
#if (defined(_WIN32))
#undef HAVE_INETATON
+#undef HAVE_SYS_SELECT
#include <winsock2.h>
#define EAFNOSUPPORT WSAEAFNOSUPPORT
int inet_aton(const char *cp, struct in_addr *inp);
#else
#include <netinet/in.h>
#include <arpa/inet.h>
+#include <sys/select.h>
#endif
#define HAVE_INETPTON
diff --git a/utils/container.c b/utils/container.c
index 97f1d7eaf..e5894ec7e 100644
--- a/utils/container.c
+++ b/utils/container.c
@@ -89,10 +89,16 @@ inline static size_t container_filelen(FILE *fd)
return 0;
}
- fseek(fd, 0, SEEK_END);
+ if (fseek(fd, 0, SEEK_END) != 0) {
+ LOG(("Could not get seek to end of file"));
+ return 0;
+ }
a = ftell(fd);
- fseek(fd, o, SEEK_SET);
+ if (fseek(fd, o, SEEK_SET) != 0) {
+ LOG(("Could not reset seek position in file"));
+ return 0;
+ }
if (a == -1) {
LOG(("could not ascertain size of file in theme container; omitting"));
return 0;
@@ -119,9 +125,10 @@ static void container_add_to_dir(struct container_ctx *ctx,
ctx->entries += 1;
ctx->directory = temp;
- strncpy((char *)ctx->directory[ctx->entries - 1].filename,
- (char *)entryname, sizeof(ctx->directory[
- ctx->entries - 1].filename));
+ snprintf((char*)ctx->directory[ctx->entries - 1].filename,
+ sizeof(ctx->directory[ctx->entries - 1].filename),
+ "%s", (char *)entryname);
+
ctx->directory[ctx->entries - 1].startoffset = offset;
ctx->directory[ctx->entries - 1].len = length;
ctx->directory[ctx->entries - 1].flags1 = 0;
@@ -188,12 +195,16 @@ static void container_process(struct container_ctx *ctx)
fileno(ctx->fh), 0);
#else
ctx->data = malloc(ctx->header.diroffset);
- fseek(ctx->fh, 0, SEEK_SET);
+ if (fseek(ctx->fh, 0, SEEK_SET) != 0) {
+ return;
+ }
val = fread(ctx->data, ctx->header.diroffset, 1, ctx->fh);
if (val == 0)
LOG(("empty read diroffset"));
#endif
- fseek(ctx->fh, ctx->header.diroffset, SEEK_SET);
+ if (fseek(ctx->fh, ctx->header.diroffset, SEEK_SET) != 0) {
+ return;
+ }
/* now work through the directory structure taking it apart into
* our structure */
#define BEREAD(x) do { val = fread(&(x), 4, 1, ctx->fh); if (val == 0)\
@@ -321,8 +332,14 @@ struct container_ctx *container_create(const char *filename,
ctx->entries = 0;
ctx->directory = NULL;
ctx->header.parser = htonl(3);
- strncpy((char *)ctx->header.name, (char *)name, 32);
- strncpy((char *)ctx->header.author, (char *)author, 64);
+
+ snprintf((char *)ctx->header.name,
+ sizeof(ctx->header.name),
+ "%s", (char *)name);
+
+ snprintf((char *)ctx->header.author,
+ sizeof(ctx->header.author),
+ "%s", (char *)author);
val = fwrite("NSTM", 4, 1, ctx->fh);
if (val == 0)
@@ -343,7 +360,11 @@ struct container_ctx *container_create(const char *filename,
* we don't know where it'll be yet!
*/
- fseek(ctx->fh, 108, SEEK_SET);
+ if (fseek(ctx->fh, 108, SEEK_SET) == -1) {
+ LOG(("directory offset seek failed"));
+ free(ctx);
+ return NULL;
+ }
return ctx;
}
@@ -369,15 +390,17 @@ void container_close(struct container_ctx *ctx)
flen = (flen + 3) & (~3); /* round up to nearest 4 bytes */
/* write this location to the header */
- fseek(ctx->fh, 104, SEEK_SET);
- nflen = htonl(flen);
- val = fwrite(&nflen, 4, 1, ctx->fh);
- if (val == 0)
- LOG(("empty write directory location"));
+ if (fseek(ctx->fh, 104, SEEK_SET) == 0) {
+ nflen = htonl(flen);
+ val = fwrite(&nflen, 4, 1, ctx->fh);
+ if (val == 0)
+ LOG(("empty write directory location"));
- /* seek to where the directory will be, and write it */
- fseek(ctx->fh, flen, SEEK_SET);
- container_write_dir(ctx);
+ /* seek to where the directory will be, and write it */
+ if (fseek(ctx->fh, flen, SEEK_SET) == 0) {
+ container_write_dir(ctx);
+ }
+ }
} else if (ctx->processed) {
#ifdef WITH_MMAP
@@ -438,13 +461,20 @@ char *container_extract_theme(const char *themefile, const char *dirbasename)
strcpy(dirname, dirbasename);
strcat(dirname, themename);
if (stat(dirname, &statbuf) != -1) {
+ /* directory exists */
+ warn_user("DirectoryError", dirname);
+ container_close(cctx);
+ free(dirname);
+ free(themename);
+ return NULL;
+ }
+ if (mkdir(dirname, S_IRWXU) != 0) {
warn_user("DirectoryError", dirname);
container_close(cctx);
free(dirname);
free(themename);
return NULL;
}
- mkdir(dirname, S_IRWXU);
for (e = container_iterate(cctx, &state), i = 0; i < cctx->entries;
e = container_iterate(cctx, &state), i++) {
diff --git a/utils/corestrings.c b/utils/corestrings.c
index efdd0e07f..cb340e9a6 100644
--- a/utils/corestrings.c
+++ b/utils/corestrings.c
@@ -27,6 +27,7 @@
/* lwc_string strings */
lwc_string *corestring_lwc_a;
+lwc_string *corestring_lwc_about;
lwc_string *corestring_lwc_abscenter;
lwc_string *corestring_lwc_absmiddle;
lwc_string *corestring_lwc_align;
@@ -42,10 +43,12 @@ lwc_string *corestring_lwc_charset;
lwc_string *corestring_lwc_checkbox;
lwc_string *corestring_lwc_circle;
lwc_string *corestring_lwc_col;
+lwc_string *corestring_lwc_data;
lwc_string *corestring_lwc_default;
lwc_string *corestring_lwc_div;
lwc_string *corestring_lwc_embed;
lwc_string *corestring_lwc_file;
+lwc_string *corestring_lwc_filename;
lwc_string *corestring_lwc_font;
lwc_string *corestring_lwc_frame;
lwc_string *corestring_lwc_frameset;
@@ -59,11 +62,14 @@ lwc_string *corestring_lwc_head;
lwc_string *corestring_lwc_hidden;
lwc_string *corestring_lwc_hr;
lwc_string *corestring_lwc_html;
+lwc_string *corestring_lwc_http;
lwc_string *corestring_lwc_https;
+lwc_string *corestring_lwc_icon;
lwc_string *corestring_lwc_iframe;
lwc_string *corestring_lwc_image;
lwc_string *corestring_lwc_img;
lwc_string *corestring_lwc_input;
+lwc_string *corestring_lwc_javascript;
lwc_string *corestring_lwc_justify;
lwc_string *corestring_lwc_left;
lwc_string *corestring_lwc_li;
@@ -87,9 +93,11 @@ lwc_string *corestring_lwc_rect;
lwc_string *corestring_lwc_rectangle;
lwc_string *corestring_lwc_refresh;
lwc_string *corestring_lwc_reset;
+lwc_string *corestring_lwc_resource;
lwc_string *corestring_lwc_right;
lwc_string *corestring_lwc_search;
lwc_string *corestring_lwc_select;
+lwc_string *corestring_lwc_shortcut_icon;
lwc_string *corestring_lwc_src;
lwc_string *corestring_lwc_style;
lwc_string *corestring_lwc_submit;
@@ -116,6 +124,7 @@ lwc_string *corestring_lwc__top;
/* dom_string strings */
dom_string *corestring_dom_a;
+dom_string *corestring_dom_alt;
dom_string *corestring_dom_abort;
dom_string *corestring_dom_afterprint;
dom_string *corestring_dom_align;
@@ -136,14 +145,18 @@ dom_string *corestring_dom_cellspacing;
dom_string *corestring_dom_change;
dom_string *corestring_dom_charset;
dom_string *corestring_dom_class;
+dom_string *corestring_dom_classid;
dom_string *corestring_dom_click;
dom_string *corestring_dom_close;
+dom_string *corestring_dom_codebase;
dom_string *corestring_dom_color;
dom_string *corestring_dom_cols;
+dom_string *corestring_dom_colspan;
dom_string *corestring_dom_content;
dom_string *corestring_dom_contextmenu;
dom_string *corestring_dom_coords;
dom_string *corestring_dom_cuechange;
+dom_string *corestring_dom_data;
dom_string *corestring_dom_dblclick;
dom_string *corestring_dom_defer;
dom_string *corestring_dom_DOMAttrModified;
@@ -162,6 +175,7 @@ dom_string *corestring_dom_emptied;
dom_string *corestring_dom_ended;
dom_string *corestring_dom_error;
dom_string *corestring_dom_focus;
+dom_string *corestring_dom_frameborder;
dom_string *corestring_dom_hashchange;
dom_string *corestring_dom_height;
dom_string *corestring_dom_href;
@@ -180,6 +194,8 @@ dom_string *corestring_dom_loadeddata;
dom_string *corestring_dom_loadedmetadata;
dom_string *corestring_dom_loadstart;
dom_string *corestring_dom_map;
+dom_string *corestring_dom_marginheight;
+dom_string *corestring_dom_marginwidth;
dom_string *corestring_dom_media;
dom_string *corestring_dom_message;
dom_string *corestring_dom_mousedown;
@@ -190,6 +206,7 @@ dom_string *corestring_dom_mouseup;
dom_string *corestring_dom_mousewheel;
dom_string *corestring_dom_name;
dom_string *corestring_dom_nohref;
+dom_string *corestring_dom_noresize;
dom_string *corestring_dom_offline;
dom_string *corestring_dom_online;
dom_string *corestring_dom_pagehide;
@@ -206,10 +223,13 @@ dom_string *corestring_dom_rel;
dom_string *corestring_dom_reset;
dom_string *corestring_dom_resize;
dom_string *corestring_dom_rows;
+dom_string *corestring_dom_rowspan;
dom_string *corestring_dom_scroll;
+dom_string *corestring_dom_scrolling;
dom_string *corestring_dom_seeked;
dom_string *corestring_dom_seeking;
dom_string *corestring_dom_select;
+dom_string *corestring_dom_selected;
dom_string *corestring_dom_shape;
dom_string *corestring_dom_show;
dom_string *corestring_dom_size;
@@ -224,16 +244,33 @@ dom_string *corestring_dom_target;
dom_string *corestring_dom_text;
dom_string *corestring_dom_text_javascript;
dom_string *corestring_dom_timeupdate;
+dom_string *corestring_dom_title;
dom_string *corestring_dom_type;
dom_string *corestring_dom_unload;
dom_string *corestring_dom_valign;
+dom_string *corestring_dom_value;
dom_string *corestring_dom_vlink;
dom_string *corestring_dom_volumechange;
dom_string *corestring_dom_vspace;
dom_string *corestring_dom_waiting;
dom_string *corestring_dom_width;
+dom_string *corestring_dom_BUTTON;
+dom_string *corestring_dom_INPUT;
+dom_string *corestring_dom_SELECT;
+dom_string *corestring_dom_TEXTAREA;
+dom_string *corestring_dom_button;
+dom_string *corestring_dom_image;
+dom_string *corestring_dom_radio;
+dom_string *corestring_dom_checkbox;
+dom_string *corestring_dom_file;
+dom_string *corestring_dom_on;
+dom_string *corestring_dom___ns_key_box_node_data;
dom_string *corestring_dom___ns_key_libcss_node_data;
+dom_string *corestring_dom___ns_key_file_name_node_data;
+dom_string *corestring_dom___ns_key_image_coords_node_data;
+/* nsurl URLs */
+nsurl *corestring_nsurl_about_blank;
/*
* Free the core strings
@@ -249,6 +286,7 @@ void corestrings_fini(void)
} while (0)
CSS_LWC_STRING_UNREF(a);
+ CSS_LWC_STRING_UNREF(about);
CSS_LWC_STRING_UNREF(abscenter);
CSS_LWC_STRING_UNREF(absmiddle);
CSS_LWC_STRING_UNREF(align);
@@ -264,10 +302,12 @@ void corestrings_fini(void)
CSS_LWC_STRING_UNREF(checkbox);
CSS_LWC_STRING_UNREF(circle);
CSS_LWC_STRING_UNREF(col);
+ CSS_LWC_STRING_UNREF(data);
CSS_LWC_STRING_UNREF(default);
CSS_LWC_STRING_UNREF(div);
CSS_LWC_STRING_UNREF(embed);
CSS_LWC_STRING_UNREF(file);
+ CSS_LWC_STRING_UNREF(filename);
CSS_LWC_STRING_UNREF(font);
CSS_LWC_STRING_UNREF(frame);
CSS_LWC_STRING_UNREF(frameset);
@@ -281,11 +321,14 @@ void corestrings_fini(void)
CSS_LWC_STRING_UNREF(hidden);
CSS_LWC_STRING_UNREF(hr);
CSS_LWC_STRING_UNREF(html);
+ CSS_LWC_STRING_UNREF(http);
CSS_LWC_STRING_UNREF(https);
+ CSS_LWC_STRING_UNREF(icon);
CSS_LWC_STRING_UNREF(iframe);
CSS_LWC_STRING_UNREF(image);
CSS_LWC_STRING_UNREF(img);
CSS_LWC_STRING_UNREF(input);
+ CSS_LWC_STRING_UNREF(javascript);
CSS_LWC_STRING_UNREF(justify);
CSS_LWC_STRING_UNREF(left);
CSS_LWC_STRING_UNREF(li);
@@ -309,9 +352,11 @@ void corestrings_fini(void)
CSS_LWC_STRING_UNREF(rectangle);
CSS_LWC_STRING_UNREF(refresh);
CSS_LWC_STRING_UNREF(reset);
+ CSS_LWC_STRING_UNREF(resource);
CSS_LWC_STRING_UNREF(right);
CSS_LWC_STRING_UNREF(search);
CSS_LWC_STRING_UNREF(select);
+ CSS_LWC_STRING_UNREF(shortcut_icon);
CSS_LWC_STRING_UNREF(src);
CSS_LWC_STRING_UNREF(style);
CSS_LWC_STRING_UNREF(submit);
@@ -350,6 +395,7 @@ void corestrings_fini(void)
CSS_DOM_STRING_UNREF(abort);
CSS_DOM_STRING_UNREF(afterprint);
CSS_DOM_STRING_UNREF(align);
+ CSS_DOM_STRING_UNREF(alt);
CSS_DOM_STRING_UNREF(area);
CSS_DOM_STRING_UNREF(async);
CSS_DOM_STRING_UNREF(background);
@@ -367,14 +413,18 @@ void corestrings_fini(void)
CSS_DOM_STRING_UNREF(change);
CSS_DOM_STRING_UNREF(charset);
CSS_DOM_STRING_UNREF(class);
+ CSS_DOM_STRING_UNREF(classid);
CSS_DOM_STRING_UNREF(click);
CSS_DOM_STRING_UNREF(close);
+ CSS_DOM_STRING_UNREF(codebase);
CSS_DOM_STRING_UNREF(color);
CSS_DOM_STRING_UNREF(cols);
+ CSS_DOM_STRING_UNREF(colspan);
CSS_DOM_STRING_UNREF(content);
CSS_DOM_STRING_UNREF(contextmenu);
CSS_DOM_STRING_UNREF(coords);
CSS_DOM_STRING_UNREF(cuechange);
+ CSS_DOM_STRING_UNREF(data);
CSS_DOM_STRING_UNREF(dblclick);
CSS_DOM_STRING_UNREF(defer);
CSS_DOM_STRING_UNREF(DOMAttrModified);
@@ -393,6 +443,7 @@ void corestrings_fini(void)
CSS_DOM_STRING_UNREF(ended);
CSS_DOM_STRING_UNREF(error);
CSS_DOM_STRING_UNREF(focus);
+ CSS_DOM_STRING_UNREF(frameborder);
CSS_DOM_STRING_UNREF(hashchange);
CSS_DOM_STRING_UNREF(height);
CSS_DOM_STRING_UNREF(href);
@@ -411,6 +462,8 @@ void corestrings_fini(void)
CSS_DOM_STRING_UNREF(loadedmetadata);
CSS_DOM_STRING_UNREF(loadstart);
CSS_DOM_STRING_UNREF(map);
+ CSS_DOM_STRING_UNREF(marginheight);
+ CSS_DOM_STRING_UNREF(marginwidth);
CSS_DOM_STRING_UNREF(media);
CSS_DOM_STRING_UNREF(message);
CSS_DOM_STRING_UNREF(mousedown);
@@ -421,6 +474,7 @@ void corestrings_fini(void)
CSS_DOM_STRING_UNREF(mousewheel);
CSS_DOM_STRING_UNREF(name);
CSS_DOM_STRING_UNREF(nohref);
+ CSS_DOM_STRING_UNREF(noresize);
CSS_DOM_STRING_UNREF(offline);
CSS_DOM_STRING_UNREF(online);
CSS_DOM_STRING_UNREF(pagehide);
@@ -437,10 +491,13 @@ void corestrings_fini(void)
CSS_DOM_STRING_UNREF(reset);
CSS_DOM_STRING_UNREF(resize);
CSS_DOM_STRING_UNREF(rows);
+ CSS_DOM_STRING_UNREF(rowspan);
CSS_DOM_STRING_UNREF(scroll);
+ CSS_DOM_STRING_UNREF(scrolling);
CSS_DOM_STRING_UNREF(seeked);
CSS_DOM_STRING_UNREF(seeking);
CSS_DOM_STRING_UNREF(select);
+ CSS_DOM_STRING_UNREF(selected);
CSS_DOM_STRING_UNREF(shape);
CSS_DOM_STRING_UNREF(show);
CSS_DOM_STRING_UNREF(size);
@@ -455,16 +512,38 @@ void corestrings_fini(void)
CSS_DOM_STRING_UNREF(text);
CSS_DOM_STRING_UNREF(text_javascript);
CSS_DOM_STRING_UNREF(timeupdate);
+ CSS_DOM_STRING_UNREF(title);
CSS_DOM_STRING_UNREF(type);
CSS_DOM_STRING_UNREF(unload);
CSS_DOM_STRING_UNREF(valign);
+ CSS_DOM_STRING_UNREF(value);
CSS_DOM_STRING_UNREF(vlink);
CSS_DOM_STRING_UNREF(volumechange);
CSS_DOM_STRING_UNREF(vspace);
CSS_DOM_STRING_UNREF(waiting);
CSS_DOM_STRING_UNREF(width);
+ /* DOM node names, not really CSS */
+ CSS_DOM_STRING_UNREF(BUTTON);
+ CSS_DOM_STRING_UNREF(INPUT);
+ CSS_DOM_STRING_UNREF(SELECT);
+ CSS_DOM_STRING_UNREF(TEXTAREA);
+ /* DOM input types, not really CSS */
+ CSS_DOM_STRING_UNREF(button);
+ CSS_DOM_STRING_UNREF(image);
+ CSS_DOM_STRING_UNREF(radio);
+ CSS_DOM_STRING_UNREF(checkbox);
+ CSS_DOM_STRING_UNREF(file);
+ CSS_DOM_STRING_UNREF(on);
+ /* DOM userdata keys, not really CSS */
+ CSS_DOM_STRING_UNREF(__ns_key_box_node_data);
CSS_DOM_STRING_UNREF(__ns_key_libcss_node_data);
+ CSS_DOM_STRING_UNREF(__ns_key_file_name_node_data);
+ CSS_DOM_STRING_UNREF(__ns_key_image_coords_node_data);
#undef CSS_DOM_STRING_UNREF
+
+ /* nsurl URLs */
+ if (corestring_nsurl_about_blank != NULL)
+ nsurl_unref(corestring_nsurl_about_blank);
}
@@ -491,6 +570,7 @@ nserror corestrings_init(void)
} while(0)
CSS_LWC_STRING_INTERN(a);
+ CSS_LWC_STRING_INTERN(about);
CSS_LWC_STRING_INTERN(abscenter);
CSS_LWC_STRING_INTERN(absmiddle);
CSS_LWC_STRING_INTERN(align);
@@ -506,10 +586,12 @@ nserror corestrings_init(void)
CSS_LWC_STRING_INTERN(checkbox);
CSS_LWC_STRING_INTERN(circle);
CSS_LWC_STRING_INTERN(col);
+ CSS_LWC_STRING_INTERN(data);
CSS_LWC_STRING_INTERN(default);
CSS_LWC_STRING_INTERN(div);
CSS_LWC_STRING_INTERN(embed);
CSS_LWC_STRING_INTERN(file);
+ CSS_LWC_STRING_INTERN(filename);
CSS_LWC_STRING_INTERN(font);
CSS_LWC_STRING_INTERN(frame);
CSS_LWC_STRING_INTERN(frameset);
@@ -523,11 +605,14 @@ nserror corestrings_init(void)
CSS_LWC_STRING_INTERN(hidden);
CSS_LWC_STRING_INTERN(hr);
CSS_LWC_STRING_INTERN(html);
+ CSS_LWC_STRING_INTERN(http);
CSS_LWC_STRING_INTERN(https);
+ CSS_LWC_STRING_INTERN(icon);
CSS_LWC_STRING_INTERN(iframe);
CSS_LWC_STRING_INTERN(image);
CSS_LWC_STRING_INTERN(img);
CSS_LWC_STRING_INTERN(input);
+ CSS_LWC_STRING_INTERN(javascript);
CSS_LWC_STRING_INTERN(justify);
CSS_LWC_STRING_INTERN(left);
CSS_LWC_STRING_INTERN(li);
@@ -550,6 +635,7 @@ nserror corestrings_init(void)
CSS_LWC_STRING_INTERN(rectangle);
CSS_LWC_STRING_INTERN(refresh);
CSS_LWC_STRING_INTERN(reset);
+ CSS_LWC_STRING_INTERN(resource);
CSS_LWC_STRING_INTERN(right);
CSS_LWC_STRING_INTERN(search);
CSS_LWC_STRING_INTERN(select);
@@ -587,6 +673,13 @@ nserror corestrings_init(void)
goto error;
}
+ lerror = lwc_intern_string("shortcut icon", SLEN("shortcut icon"),
+ &corestring_lwc_shortcut_icon);
+ if ((lerror != lwc_error_ok) || (corestring_lwc_shortcut_icon == NULL)) {
+ error = NSERROR_NOMEM;
+ goto error;
+ }
+
lerror = lwc_intern_string("text/css", SLEN("text/css"),
&corestring_lwc_text_css);
if ((lerror != lwc_error_ok) || (corestring_lwc_text_css == NULL)) {
@@ -612,6 +705,7 @@ nserror corestrings_init(void)
CSS_DOM_STRING_INTERN(abort);
CSS_DOM_STRING_INTERN(afterprint);
CSS_DOM_STRING_INTERN(align);
+ CSS_DOM_STRING_INTERN(alt);
CSS_DOM_STRING_INTERN(area);
CSS_DOM_STRING_INTERN(async);
CSS_DOM_STRING_INTERN(background);
@@ -629,14 +723,18 @@ nserror corestrings_init(void)
CSS_DOM_STRING_INTERN(change);
CSS_DOM_STRING_INTERN(charset);
CSS_DOM_STRING_INTERN(class);
+ CSS_DOM_STRING_INTERN(classid);
CSS_DOM_STRING_INTERN(click);
CSS_DOM_STRING_INTERN(close);
+ CSS_DOM_STRING_INTERN(codebase);
CSS_DOM_STRING_INTERN(color);
CSS_DOM_STRING_INTERN(cols);
+ CSS_DOM_STRING_INTERN(colspan);
CSS_DOM_STRING_INTERN(content);
CSS_DOM_STRING_INTERN(contextmenu);
CSS_DOM_STRING_INTERN(coords);
CSS_DOM_STRING_INTERN(cuechange);
+ CSS_DOM_STRING_INTERN(data);
CSS_DOM_STRING_INTERN(dblclick);
CSS_DOM_STRING_INTERN(defer);
CSS_DOM_STRING_INTERN(DOMAttrModified);
@@ -655,6 +753,7 @@ nserror corestrings_init(void)
CSS_DOM_STRING_INTERN(ended);
CSS_DOM_STRING_INTERN(error);
CSS_DOM_STRING_INTERN(focus);
+ CSS_DOM_STRING_INTERN(frameborder);
CSS_DOM_STRING_INTERN(hashchange);
CSS_DOM_STRING_INTERN(height);
CSS_DOM_STRING_INTERN(href);
@@ -673,6 +772,8 @@ nserror corestrings_init(void)
CSS_DOM_STRING_INTERN(loadedmetadata);
CSS_DOM_STRING_INTERN(loadstart);
CSS_DOM_STRING_INTERN(map);
+ CSS_DOM_STRING_INTERN(marginheight);
+ CSS_DOM_STRING_INTERN(marginwidth);
CSS_DOM_STRING_INTERN(media);
CSS_DOM_STRING_INTERN(message);
CSS_DOM_STRING_INTERN(mousedown);
@@ -683,6 +784,7 @@ nserror corestrings_init(void)
CSS_DOM_STRING_INTERN(mousewheel);
CSS_DOM_STRING_INTERN(name);
CSS_DOM_STRING_INTERN(nohref);
+ CSS_DOM_STRING_INTERN(noresize);
CSS_DOM_STRING_INTERN(offline);
CSS_DOM_STRING_INTERN(online);
CSS_DOM_STRING_INTERN(pagehide);
@@ -699,10 +801,13 @@ nserror corestrings_init(void)
CSS_DOM_STRING_INTERN(reset);
CSS_DOM_STRING_INTERN(resize);
CSS_DOM_STRING_INTERN(rows);
+ CSS_DOM_STRING_INTERN(rowspan);
CSS_DOM_STRING_INTERN(scroll);
+ CSS_DOM_STRING_INTERN(scrolling);
CSS_DOM_STRING_INTERN(seeked);
CSS_DOM_STRING_INTERN(seeking);
CSS_DOM_STRING_INTERN(select);
+ CSS_DOM_STRING_INTERN(selected);
CSS_DOM_STRING_INTERN(shape);
CSS_DOM_STRING_INTERN(show);
CSS_DOM_STRING_INTERN(size);
@@ -716,15 +821,33 @@ nserror corestrings_init(void)
CSS_DOM_STRING_INTERN(target);
CSS_DOM_STRING_INTERN(text);
CSS_DOM_STRING_INTERN(timeupdate);
+ CSS_DOM_STRING_INTERN(title);
CSS_DOM_STRING_INTERN(type);
CSS_DOM_STRING_INTERN(unload);
CSS_DOM_STRING_INTERN(valign);
+ CSS_DOM_STRING_INTERN(value);
CSS_DOM_STRING_INTERN(vlink);
CSS_DOM_STRING_INTERN(volumechange);
CSS_DOM_STRING_INTERN(vspace);
CSS_DOM_STRING_INTERN(waiting);
CSS_DOM_STRING_INTERN(width);
+ /* DOM node names, not really CSS */
+ CSS_DOM_STRING_INTERN(BUTTON);
+ CSS_DOM_STRING_INTERN(INPUT);
+ CSS_DOM_STRING_INTERN(SELECT);
+ CSS_DOM_STRING_INTERN(TEXTAREA);
+ /* DOM input types, not really CSS */
+ CSS_DOM_STRING_INTERN(button);
+ CSS_DOM_STRING_INTERN(image);
+ CSS_DOM_STRING_INTERN(radio);
+ CSS_DOM_STRING_INTERN(checkbox);
+ CSS_DOM_STRING_INTERN(file);
+ CSS_DOM_STRING_INTERN(on);
+ /* DOM userdata keys, not really CSS */
+ CSS_DOM_STRING_INTERN(__ns_key_box_node_data);
CSS_DOM_STRING_INTERN(__ns_key_libcss_node_data);
+ CSS_DOM_STRING_INTERN(__ns_key_file_name_node_data);
+ CSS_DOM_STRING_INTERN(__ns_key_image_coords_node_data);
#undef CSS_DOM_STRING_INTERN
exc = dom_string_create_interned((const uint8_t *) "text/javascript",
@@ -743,6 +866,11 @@ nserror corestrings_init(void)
goto error;
}
+ error = nsurl_create("about:blank", &corestring_nsurl_about_blank);
+ if (error != NSERROR_OK) {
+ goto error;
+ }
+
return NSERROR_OK;
error:
diff --git a/utils/corestrings.h b/utils/corestrings.h
index c50cc3113..b41d1f859 100644
--- a/utils/corestrings.h
+++ b/utils/corestrings.h
@@ -24,6 +24,7 @@
#define NETSURF_UTILS_CORESTRINGS_H_
#include <libwapcaplet/libwapcaplet.h>
+#include "utils/nsurl.h"
#include "utils/errors.h"
nserror corestrings_init(void);
@@ -31,6 +32,7 @@ void corestrings_fini(void);
/* lwc_string strings */
extern lwc_string *corestring_lwc_a;
+extern lwc_string *corestring_lwc_about;
extern lwc_string *corestring_lwc_abscenter;
extern lwc_string *corestring_lwc_absmiddle;
extern lwc_string *corestring_lwc_align;
@@ -46,10 +48,12 @@ extern lwc_string *corestring_lwc_charset;
extern lwc_string *corestring_lwc_checkbox;
extern lwc_string *corestring_lwc_circle;
extern lwc_string *corestring_lwc_col;
+extern lwc_string *corestring_lwc_data;
extern lwc_string *corestring_lwc_default;
extern lwc_string *corestring_lwc_div;
extern lwc_string *corestring_lwc_embed;
extern lwc_string *corestring_lwc_file;
+extern lwc_string *corestring_lwc_filename;
extern lwc_string *corestring_lwc_font;
extern lwc_string *corestring_lwc_frame;
extern lwc_string *corestring_lwc_frameset;
@@ -63,18 +67,21 @@ extern lwc_string *corestring_lwc_head;
extern lwc_string *corestring_lwc_hidden;
extern lwc_string *corestring_lwc_hr;
extern lwc_string *corestring_lwc_html;
+extern lwc_string *corestring_lwc_http;
extern lwc_string *corestring_lwc_https;
+extern lwc_string *corestring_lwc_icon;
extern lwc_string *corestring_lwc_iframe;
extern lwc_string *corestring_lwc_image;
extern lwc_string *corestring_lwc_img;
extern lwc_string *corestring_lwc_input;
+extern lwc_string *corestring_lwc_javascript;
extern lwc_string *corestring_lwc_justify;
extern lwc_string *corestring_lwc_left;
extern lwc_string *corestring_lwc_li;
extern lwc_string *corestring_lwc_link;
extern lwc_string *corestring_lwc_meta;
extern lwc_string *corestring_lwc_middle;
-extern lwc_string *corestring_lwc_multipart_form_data;
+extern lwc_string *corestring_lwc_multipart_form_data; /* multipart/form-data */
extern lwc_string *corestring_lwc_no;
extern lwc_string *corestring_lwc_noscript;
extern lwc_string *corestring_lwc_object;
@@ -91,9 +98,11 @@ extern lwc_string *corestring_lwc_rect;
extern lwc_string *corestring_lwc_rectangle;
extern lwc_string *corestring_lwc_refresh;
extern lwc_string *corestring_lwc_reset;
+extern lwc_string *corestring_lwc_resource;
extern lwc_string *corestring_lwc_right;
extern lwc_string *corestring_lwc_search;
extern lwc_string *corestring_lwc_select;
+extern lwc_string *corestring_lwc_shortcut_icon; /* shortcut icon */
extern lwc_string *corestring_lwc_src;
extern lwc_string *corestring_lwc_style;
extern lwc_string *corestring_lwc_submit;
@@ -103,7 +112,7 @@ extern lwc_string *corestring_lwc_td;
extern lwc_string *corestring_lwc_text;
extern lwc_string *corestring_lwc_textarea;
extern lwc_string *corestring_lwc_texttop;
-extern lwc_string *corestring_lwc_text_css;
+extern lwc_string *corestring_lwc_text_css; /* text/css */
extern lwc_string *corestring_lwc_tfoot;
extern lwc_string *corestring_lwc_th;
extern lwc_string *corestring_lwc_thead;
@@ -122,6 +131,7 @@ struct dom_string;
/* dom_string strings */
extern struct dom_string *corestring_dom_a;
+extern struct dom_string *corestring_dom_alt;
extern struct dom_string *corestring_dom_abort;
extern struct dom_string *corestring_dom_afterprint;
extern struct dom_string *corestring_dom_align;
@@ -142,14 +152,18 @@ extern struct dom_string *corestring_dom_cellspacing;
extern struct dom_string *corestring_dom_change;
extern struct dom_string *corestring_dom_charset;
extern struct dom_string *corestring_dom_class;
+extern struct dom_string *corestring_dom_classid;
extern struct dom_string *corestring_dom_click;
extern struct dom_string *corestring_dom_close;
+extern struct dom_string *corestring_dom_codebase;
extern struct dom_string *corestring_dom_color;
extern struct dom_string *corestring_dom_cols;
+extern struct dom_string *corestring_dom_colspan;
extern struct dom_string *corestring_dom_content;
extern struct dom_string *corestring_dom_contextmenu;
extern struct dom_string *corestring_dom_coords;
extern struct dom_string *corestring_dom_cuechange;
+extern struct dom_string *corestring_dom_data;
extern struct dom_string *corestring_dom_dblclick;
extern struct dom_string *corestring_dom_defer;
extern struct dom_string *corestring_dom_DOMAttrModified;
@@ -168,12 +182,13 @@ extern struct dom_string *corestring_dom_emptied;
extern struct dom_string *corestring_dom_ended;
extern struct dom_string *corestring_dom_error;
extern struct dom_string *corestring_dom_focus;
+extern struct dom_string *corestring_dom_frameborder;
extern struct dom_string *corestring_dom_hashchange;
extern struct dom_string *corestring_dom_height;
extern struct dom_string *corestring_dom_href;
extern struct dom_string *corestring_dom_hreflang;
extern struct dom_string *corestring_dom_hspace;
-extern struct dom_string *corestring_dom_http_equiv;
+extern struct dom_string *corestring_dom_http_equiv; /* http-equiv */
extern struct dom_string *corestring_dom_id;
extern struct dom_string *corestring_dom_input;
extern struct dom_string *corestring_dom_invalid;
@@ -186,6 +201,8 @@ extern struct dom_string *corestring_dom_loadeddata;
extern struct dom_string *corestring_dom_loadedmetadata;
extern struct dom_string *corestring_dom_loadstart;
extern struct dom_string *corestring_dom_map;
+extern struct dom_string *corestring_dom_marginheight;
+extern struct dom_string *corestring_dom_marginwidth;
extern struct dom_string *corestring_dom_media;
extern struct dom_string *corestring_dom_message;
extern struct dom_string *corestring_dom_mousedown;
@@ -196,6 +213,7 @@ extern struct dom_string *corestring_dom_mouseup;
extern struct dom_string *corestring_dom_mousewheel;
extern struct dom_string *corestring_dom_name;
extern struct dom_string *corestring_dom_nohref;
+extern struct dom_string *corestring_dom_noresize;
extern struct dom_string *corestring_dom_offline;
extern struct dom_string *corestring_dom_online;
extern struct dom_string *corestring_dom_pagehide;
@@ -212,10 +230,13 @@ extern struct dom_string *corestring_dom_rel;
extern struct dom_string *corestring_dom_reset;
extern struct dom_string *corestring_dom_resize;
extern struct dom_string *corestring_dom_rows;
+extern struct dom_string *corestring_dom_rowspan;
extern struct dom_string *corestring_dom_scroll;
+extern struct dom_string *corestring_dom_scrolling;
extern struct dom_string *corestring_dom_seeked;
extern struct dom_string *corestring_dom_seeking;
extern struct dom_string *corestring_dom_select;
+extern struct dom_string *corestring_dom_selected;
extern struct dom_string *corestring_dom_shape;
extern struct dom_string *corestring_dom_show;
extern struct dom_string *corestring_dom_size;
@@ -228,17 +249,39 @@ extern struct dom_string *corestring_dom_submit;
extern struct dom_string *corestring_dom_suspend;
extern struct dom_string *corestring_dom_target;
extern struct dom_string *corestring_dom_text;
-extern struct dom_string *corestring_dom_text_javascript;
+extern struct dom_string *corestring_dom_text_javascript; /* text/javascript */
extern struct dom_string *corestring_dom_timeupdate;
+extern struct dom_string *corestring_dom_title;
extern struct dom_string *corestring_dom_type;
extern struct dom_string *corestring_dom_unload;
extern struct dom_string *corestring_dom_valign;
+extern struct dom_string *corestring_dom_value;
extern struct dom_string *corestring_dom_vlink;
extern struct dom_string *corestring_dom_volumechange;
extern struct dom_string *corestring_dom_vspace;
extern struct dom_string *corestring_dom_waiting;
extern struct dom_string *corestring_dom_width;
+/* DOM node types */
+extern struct dom_string *corestring_dom_BUTTON;
+extern struct dom_string *corestring_dom_INPUT;
+extern struct dom_string *corestring_dom_SELECT;
+extern struct dom_string *corestring_dom_TEXTAREA;
+/* DOM input node types */
+extern struct dom_string *corestring_dom_button;
+/* extern struct dom_string *corestring_dom_submit; */
+/* extern struct dom_string *corestring_dom_reset; */
+extern struct dom_string *corestring_dom_image;
+extern struct dom_string *corestring_dom_radio;
+extern struct dom_string *corestring_dom_checkbox;
+extern struct dom_string *corestring_dom_file;
+extern struct dom_string *corestring_dom_on;
+/* DOM userdata keys */
+extern struct dom_string *corestring_dom___ns_key_box_node_data;
extern struct dom_string *corestring_dom___ns_key_libcss_node_data;
+extern struct dom_string *corestring_dom___ns_key_file_name_node_data;
+extern struct dom_string *corestring_dom___ns_key_image_coords_node_data;
+/* URLs */
+extern nsurl *corestring_nsurl_about_blank;
#endif
diff --git a/utils/errors.h b/utils/errors.h
index 244de0a6b..b9e157c66 100644
--- a/utils/errors.h
+++ b/utils/errors.h
@@ -37,6 +37,8 @@ typedef enum {
NSERROR_NOT_FOUND, /**< Requested item not found */
+ NSERROR_NOT_DIRECTORY, /**< Missing directory */
+
NSERROR_SAVE_FAILED, /**< Failed to save data */
NSERROR_CLONE_FAILED, /**< Failed to clone handle */
@@ -67,7 +69,17 @@ typedef enum {
NSERROR_BAD_URL, /**< Bad URL */
- NSERROR_FRAME_DEPTH /**< Exceeded frame depth */
+ NSERROR_BAD_CONTENT, /**< Bad Content */
+
+ NSERROR_FRAME_DEPTH, /**< Exceeded frame depth */
+
+ NSERROR_PERMISSION, /**< Permission error */
+
+ NSERROR_NOSPACE, /**< Insufficient space */
+
+ NSERROR_BAD_SIZE, /**< Bad size */
+
+ NSERROR_NOT_IMPLEMENTED, /**< Functionality is not implemented */
} nserror;
#endif
diff --git a/utils/file.c b/utils/file.c
new file mode 100644
index 000000000..14441e00e
--- /dev/null
+++ b/utils/file.c
@@ -0,0 +1,305 @@
+/*
+ * Copyright 2014 vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * Table operations for files with posix compliant path separator.
+ */
+
+#include <stdarg.h>
+#include <string.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "desktop/gui_factory.h"
+
+#include "utils/utils.h"
+#include "utils/corestrings.h"
+#include "utils/url.h"
+#include "utils/nsurl.h"
+#include "utils/file.h"
+
+/**
+ * Generate a posix path from one or more component elemnts.
+ *
+ * If a string is allocated it must be freed by the caller.
+ *
+ * @param[in,out] str pointer to string pointer if this is NULL enough
+ * storage will be allocated for the complete path.
+ * @param[in,out] size The size of the space available if \a str not
+ * NULL on input and if not NULL set to the total
+ * output length on output.
+ * @param[in] nemb The number of elements.
+ * @param[in] ... The elements of the path as string pointers.
+ * @return NSERROR_OK and the complete path is written to str
+ * or error code on faliure.
+ */
+static nserror posix_vmkpath(char **str, size_t *size, size_t nelm, va_list ap)
+{
+ return vsnstrjoin(str, size, '/', nelm, ap);
+}
+
+/**
+ * Get the basename of a file using posix path handling.
+ *
+ * This gets the last element of a path and returns it.
+ *
+ * @param[in] path The path to extract the name from.
+ * @param[in,out] str Pointer to string pointer if this is NULL enough
+ * storage will be allocated for the path element.
+ * @param[in,out] size The size of the space available if \a
+ * str not NULL on input and set to the total
+ * output length on output.
+ * @return NSERROR_OK and the complete path is written to str
+ * or error code on faliure.
+ */
+static nserror posix_basename(const char *path, char **str, size_t *size)
+{
+ const char *leafname;
+ char *fname;
+
+ if (path == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ leafname = strrchr(path, '/');
+ if (!leafname) {
+ leafname = path;
+ } else {
+ leafname += 1;
+ }
+
+ fname = strdup(leafname);
+ if (fname == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ *str = fname;
+ if (size != NULL) {
+ *size = strlen(fname);
+ }
+ return NSERROR_OK;
+}
+
+/**
+ * Create a path from a nsurl using posix file handling.
+ *
+ * @parm[in] url The url to encode.
+ * @param[out] path_out A string containing the result path which should
+ * be freed by the caller.
+ * @return NSERROR_OK and the path is written to \a path or error code
+ * on faliure.
+ */
+static nserror posix_nsurl_to_path(struct nsurl *url, char **path_out)
+{
+ lwc_string *urlpath;
+ char *path;
+ bool match;
+ lwc_string *scheme;
+ nserror res;
+
+ if ((url == NULL) || (path_out == NULL)) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ scheme = nsurl_get_component(url, NSURL_SCHEME);
+
+ if (lwc_string_caseless_isequal(scheme, corestring_lwc_file,
+ &match) != lwc_error_ok)
+ {
+ return NSERROR_BAD_PARAMETER;
+ }
+ lwc_string_unref(scheme);
+ if (match == false) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ urlpath = nsurl_get_component(url, NSURL_PATH);
+ if (urlpath == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ res = url_unescape(lwc_string_data(urlpath), &path);
+ lwc_string_unref(urlpath);
+ if (res != NSERROR_OK) {
+ return res;
+ }
+
+ *path_out = path;
+
+ return NSERROR_OK;
+}
+
+/**
+ * Create a nsurl from a path using posix file handling.
+ *
+ * Perform the necessary operations on a path to generate a nsurl.
+ *
+ * @param[in] path The path to convert.
+ * @param[out] url_out pointer to recive the nsurl, The returned url
+ * should be unreferenced by the caller.
+ * @return NSERROR_OK and the url is placed in \a url or error code on
+ * faliure.
+ */
+static nserror posix_path_to_nsurl(const char *path, struct nsurl **url_out)
+{
+ nserror ret;
+ int urllen;
+ char *urlstr;
+ char *escpath; /* escaped version of the path */
+ char *escpaths;
+
+ if ((path == NULL) || (url_out == NULL) || (*path == 0)) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ /* escape the path so it can be placed in a url */
+ ret = url_escape(path, 0, false, "/", &escpath);
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+ /* remove unecessary / as file: paths are already absolute */
+ escpaths = escpath;
+ while (*escpaths == '/') {
+ escpaths++;
+ }
+
+ /* build url as a string for nsurl constructor */
+ urllen = strlen(escpaths) + FILE_SCHEME_PREFIX_LEN + 1;
+ urlstr = malloc(urllen);
+ if (urlstr == NULL) {
+ free(escpath);
+ return NSERROR_NOMEM;
+ }
+
+ snprintf(urlstr, urllen, "%s%s", FILE_SCHEME_PREFIX, escpaths);
+ free(escpath);
+
+ ret = nsurl_create(urlstr, url_out);
+ free(urlstr);
+
+ return ret;
+}
+
+/**
+ * Ensure that all directory elements needed to store a filename exist.
+ *
+ * @param fname The filename to ensure the path to exists.
+ * @return NSERROR_OK on success or error code on failure.
+ */
+static nserror posix_mkdir_all(const char *fname)
+{
+ char *dname;
+ char *sep;
+ struct stat sb;
+
+ dname = strdup(fname);
+
+ sep = strrchr(dname, '/');
+ if (sep == NULL) {
+ /* no directory separator path is just filename so its ok */
+ free(dname);
+ return NSERROR_OK;
+ }
+
+ *sep = 0; /* null terminate directory path */
+
+ if (stat(dname, &sb) == 0) {
+ free(dname);
+ if (S_ISDIR(sb.st_mode)) {
+ /* path to file exists and is a directory */
+ return NSERROR_OK;
+ }
+ return NSERROR_NOT_DIRECTORY;
+ }
+ *sep = '/'; /* restore separator */
+
+ sep = dname;
+ while (*sep == '/') {
+ sep++;
+ }
+ while ((sep = strchr(sep, '/')) != NULL) {
+ *sep = 0;
+ if (stat(dname, &sb) != 0) {
+ if (nsmkdir(dname, S_IRWXU) != 0) {
+ /* could not create path element */
+ free(dname);
+ return NSERROR_NOT_FOUND;
+ }
+ } else {
+ if (! S_ISDIR(sb.st_mode)) {
+ /* path element not a directory */
+ free(dname);
+ return NSERROR_NOT_DIRECTORY;
+ }
+ }
+ *sep = '/'; /* restore separator */
+ /* skip directory separators */
+ while (*sep == '/') {
+ sep++;
+ }
+ }
+
+ free(dname);
+ return NSERROR_OK;
+}
+
+/**
+ * default to using the posix file handling
+ */
+static struct gui_file_table file_table = {
+ .mkpath = posix_vmkpath,
+ .basename = posix_basename,
+ .nsurl_to_path = posix_nsurl_to_path,
+ .path_to_nsurl = posix_path_to_nsurl,
+ .mkdir_all = posix_mkdir_all,
+};
+
+struct gui_file_table *default_file_table = &file_table;
+
+/* exported interface documented in utils/file.h */
+nserror netsurf_mkpath(char **str, size_t *size, size_t nelm, ...)
+{
+ va_list ap;
+ nserror ret;
+
+ va_start(ap, nelm);
+ ret = guit->file->mkpath(str, size, nelm, ap);
+ va_end(ap);
+
+ return ret;
+}
+
+/* exported interface documented in utils/file.h */
+nserror netsurf_nsurl_to_path(struct nsurl *url, char **path_out)
+{
+ return guit->file->nsurl_to_path(url, path_out);
+}
+
+/* exported interface documented in utils/file.h */
+nserror netsurf_path_to_nsurl(const char *path, struct nsurl **url)
+{
+ return guit->file->path_to_nsurl(path, url);
+}
+
+/* exported interface documented in utils/file.h */
+nserror netsurf_mkdir_all(const char *fname)
+{
+ return guit->file->mkdir_all(fname);
+}
diff --git a/utils/file.h b/utils/file.h
new file mode 100644
index 000000000..dbbab300e
--- /dev/null
+++ b/utils/file.h
@@ -0,0 +1,175 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * \file utils/file.h
+ * \brief Default operations table for files.
+ *
+ * These are file operations that depend upon the filesystem the
+ * browser is operating on. These allow the core browser functionality
+ * to be filesystem agnostic.
+ *
+ * The provided defaults operate on POSIX path names with / as a
+ * directory separator in a single hieracy from a root directory.
+ *
+ * Other path conventions require the default operations to be
+ * overridden. For example windows frontend runs on a filesystem with
+ * drive letter and a \\ as a separator.
+ */
+
+#ifndef NETSURF_UTILS_FILE_H
+#define NETSURF_UTILS_FILE_H
+
+#include <stdarg.h>
+
+struct nsurl;
+
+/**
+ * /brief function table for file and filename operations.
+ *
+ * function table implementing an interface to file and filename
+ * functionality appropriate for the OS filesystem. All paths are in
+ * terms of the OS filesystem convention and must not require additional
+ * system specific changes.
+ */
+struct gui_file_table {
+ /* Mandantory entries */
+
+ /**
+ * Generate a path from one or more component elemnts.
+ *
+ * If a string is allocated it must be freed by the caller.
+ *
+ * @param[in,out] str pointer to string pointer if this is NULL enough
+ * storage will be allocated for the complete path.
+ * @param[in,out] size The size of the space available if \a str not
+ * NULL on input and if not NULL set to the total
+ * output length on output.
+ * @param[in] nemb The number of elements.
+ * @param[in] ap The elements of the path as string pointers.
+ * @return NSERROR_OK and the complete path is written to str
+ * or error code on faliure.
+ */
+ nserror (*mkpath)(char **str, size_t *size, size_t nemb, va_list ap);
+
+ /**
+ * Get the basename of a file.
+ *
+ * This gets the last element of a path and returns it.
+ *
+ * @param[in] path The path to extract the name from.
+ * @param[in,out] str Pointer to string pointer if this is NULL enough
+ * storage will be allocated for the path element.
+ * @param[in,out] size The size of the space available if \a
+ * str not NULL on input and set to the total
+ * output length on output.
+ * @return NSERROR_OK and the complete path is written to \a str
+ * or error code on faliure.
+ */
+ nserror (*basename)(const char *path, char **str, size_t *size);
+
+ /**
+ * Create a path from a nsurl.
+ *
+ * @param[in] url The url to encode.
+ * @param[out] path A string containing the result path which
+ * must be freed by the caller.
+ * @return NSERROR_OK and the path is written to \a path
+ * or error code on faliure.
+ */
+ nserror (*nsurl_to_path)(struct nsurl *url, char **path);
+
+ /**
+ * Create a nsurl from a path.
+ *
+ * Perform the necessary operations on a path to generate a nsurl.
+ *
+ * @param[in] path The path to convert.
+ * @param[out] url pointer to recive the nsurl, The returned
+ * url should be unreferenced by the caller.
+ * @return NSERROR_OK and the url is placed in \a url or error
+ * code on faliure.
+ */
+ nserror (*path_to_nsurl)(const char *path, struct nsurl **url);
+
+ /**
+ * Ensure that all directory elements needed to store a filename exist.
+ *
+ * @param[in] fname The filename to ensure the path to exists.
+ * @return NSERROR_OK on success or error code on failure.
+ */
+ nserror (*mkdir_all)(const char *fname);
+};
+
+/** Default (posix) file operation table. */
+struct gui_file_table *default_file_table;
+
+/**
+ * Generate a path from one or more component elemnts.
+ *
+ * If a string is allocated it must be freed by the caller.
+ *
+ * @warning If this is called before the gui operation tables are
+ * initialised the behaviour defaults to posix paths. Ensure this is
+ * the required behaviour.
+ *
+ * @param[in,out] str pointer to string pointer if this is NULL enough
+ * storage will be allocated for the complete path.
+ * @param[in,out] size The size of the space available if \a str not
+ * NULL on input and if not NULL set to the total
+ * output length on output.
+ * @param[in] nemb The number of elements.
+ * @param[in] ... The elements of the path as string pointers.
+ * @return NSERROR_OK and the complete path is written to str
+ * or error code on faliure.
+ */
+nserror netsurf_mkpath(char **str, size_t *size, size_t nelm, ...);
+
+/**
+ * Create a path from a nsurl.
+ *
+ * @parm[in] url The url to encode.
+ * @param[out] path_out A string containing the result path which must be
+ * freed by the caller.
+ * @return NSERROR_OK and the path is written to \a path_out or error code on
+ * faliure.
+ */
+nserror netsurf_nsurl_to_path(struct nsurl *url, char **path_out);
+
+/**
+ * Create a nsurl from a path.
+ *
+ * Perform the necessary operations on a path to generate a nsurl.
+ *
+ * @param[in] path The path to convert.
+ * @param[out] url pointer to recive the nsurl, The returned
+ * url should be unreferenced by the caller.
+ * @return NSERROR_OK and the url is placed in \a url or error
+ * code on faliure.
+ */
+nserror netsurf_path_to_nsurl(const char *path, struct nsurl **url);
+
+/**
+ * Ensure that all directory elements needed to store a filename exist.
+ *
+ * @param fname The filename to ensure the path to exists.
+ * @return NSERROR_OK on success or error code on failure.
+ */
+nserror netsurf_mkdir_all(const char *fname);
+
+#endif
diff --git a/utils/filename.c b/utils/filename.c
index 5306418bf..a89a1ab59 100644
--- a/utils/filename.c
+++ b/utils/filename.c
@@ -183,10 +183,12 @@ bool filename_initialise(void)
for (start = directory; *start != '\0'; start++) {
if (*start == '/') {
*start = '\0';
+ LOG(("Creating \"%s\"", directory));
ret = nsmkdir(directory, S_IRWXU);
- if (ret != 0) {
+ if (ret != 0 && errno != EEXIST) {
+ LOG(("Failed to create directory \"%s\"",
+ directory));
free(directory);
-
return false;
}
diff --git a/utils/filename.h b/utils/filename.h
index bdded7266..709cb541a 100644
--- a/utils/filename.h
+++ b/utils/filename.h
@@ -22,9 +22,9 @@
#include <stdbool.h>
#ifdef riscos
-#define TEMP_FILENAME_PREFIX "<Wimp$ScrapDir>/WWW/NetSurf/Cache"
+#define TEMP_FILENAME_PREFIX "<Wimp$ScrapDir>/WWW/NetSurf/Misc"
#else
-#define TEMP_FILENAME_PREFIX "/tmp/WWW/NetSurf/Cache"
+#define TEMP_FILENAME_PREFIX "/tmp/WWW/NetSurf/Misc"
#endif
const char *filename_request(void);
diff --git a/utils/filepath.c b/utils/filepath.c
index d088777e5..87f9302f4 100644
--- a/utils/filepath.c
+++ b/utils/filepath.c
@@ -31,6 +31,7 @@
#include <unistd.h>
#include <string.h>
+#include "utils/utils.h"
#include "utils/config.h"
#include "utils/filepath.h"
@@ -202,7 +203,13 @@ filepath_generate(char * const *pathv, const char * const *langv)
return respath;
}
-/* expand ${} in a string into environment variables */
+/**
+ * expand ${} in a string into environment variables.
+ *
+ * @param path The pathname to expand.
+ * @param pathlen The length of the path element.
+ * @return A string with the expanded path or NULL on empty expansion or error.
+ */
static char *
expand_path(const char *path, int pathlen)
{
@@ -241,8 +248,14 @@ expand_path(const char *path, int pathlen)
explen - cloop);
explen -= replen;
} else {
+ char *tmp;
envlen = strlen(envv);
- exp = realloc(exp, explen + envlen - replen);
+ tmp = realloc(exp, explen + envlen - replen);
+ if (tmp == NULL) {
+ free(exp);
+ return NULL;
+ }
+ exp = tmp;
memmove(exp + cstart + envlen,
exp + cloop + 1,
explen - cloop );
@@ -317,3 +330,4 @@ void filepath_free_strvec(char **pathv)
}
free(pathv);
}
+
diff --git a/utils/filepath.h b/utils/filepath.h
index ff3ebe90e..ad077e2ce 100644
--- a/utils/filepath.h
+++ b/utils/filepath.h
@@ -16,9 +16,9 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/**
- * \file utils/filepath.h
- * \brief Utility routines to obtain paths to file resources.
+/**
+ * @file utils/filepath.h
+ * @brief Utility routines to obtain paths to file resources.
*/
#ifndef _NETSURF_UTILS_FILEPATH_H_
@@ -26,8 +26,10 @@
#include <stdarg.h>
+#include "utils/errors.h"
-/** Create a normalised file name.
+/**
+ * Create a normalised file name.
*
* If the file described by the format exists and is accessible the
* normalised path is placed in str and a pointer to str returned
@@ -43,14 +45,16 @@
char *filepath_vsfindfile(char *str, const char *format, va_list ap);
-/** Create a normalised file name.
+/**
+ * Create a normalised file name.
*
* Similar to vsfindfile but takes variadic (printf like) parameters
*/
char *filepath_sfindfile(char *str, const char *format, ...);
-/** Create a normalised file name.
+/**
+ * Create a normalised file name.
*
* Similar to sfindfile but allocates its own storage for the
* returned string. The caller must free this sorage.
@@ -58,7 +62,8 @@ char *filepath_sfindfile(char *str, const char *format, ...);
char *filepath_findfile(const char *format, ...);
-/** Searches an array of resource paths for a file.
+/**
+ * Searches an array of resource paths for a file.
*
* Iterates through a vector of resource paths and returns the
* normalised file name of the first acessible file or NULL if no file
@@ -72,7 +77,8 @@ char *filepath_findfile(const char *format, ...);
char *filepath_sfind(char **respathv, char *filepath, const char *filename);
-/** Searches an array of resource paths for a file.
+/**
+ * Searches an array of resource paths for a file.
*
* Similar to filepath_sfind except it allocates its own storage for
* the returned string. The caller must free this sorage.
@@ -80,7 +86,8 @@ char *filepath_sfind(char **respathv, char *filepath, const char *filename);
char *filepath_find(char **respathv, const char *filename);
-/** Searches an array of resource paths for a file optionally forcing a default.
+/**
+ * Searches an array of resource paths for a file optionally forcing a default.
*
* Similar to filepath_sfind except if no resource is found the default
* is used as an additional path element to search, if that still
@@ -91,7 +98,8 @@ char *filepath_sfinddef(char **respathv, char *filepath, const char *filename,
const char *def);
-/** Merge two string vectors into a resource search path vector.
+/**
+ * Merge two string vectors into a resource search path vector.
*
* @param pathv A string vector containing path elemets to scan.
* @param langv A string vector containing language names to enumerate.
@@ -101,7 +109,8 @@ char *filepath_sfinddef(char **respathv, char *filepath, const char *filename,
char **filepath_generate(char * const *pathv, const char * const *langv);
-/** Convert a colon separated list of path elements into a string vector.
+/**
+ * Convert a colon separated list of path elements into a string vector.
*
* @param path A colon separated path.
* @return A pointer to a NULL terminated string vector of valid
@@ -110,10 +119,13 @@ char **filepath_generate(char * const *pathv, const char * const *langv);
char **filepath_path_to_strvec(const char *path);
-/** Free a string vector
+/**
+ * Free a string vector.
*
* Free a string vector allocated by filepath_path_to_strvec
*/
void filepath_free_strvec(char **pathv);
+
+
#endif /* _NETSURF_UTILS_FILEPATH_H_ */
diff --git a/utils/git-testament.pl b/utils/git-testament.pl
index ac4c97e89..5a71a16df 100644
--- a/utils/git-testament.pl
+++ b/utils/git-testament.pl
@@ -73,6 +73,7 @@ if ( $git_present ) {
@bits = split /\s+/, `git describe --tags --exact-match HEAD 2>/dev/null`;
$bits[0] = "" unless exists $bits[0];
$gitinfo{tag} = $bits[0];
+ $gitinfo{branch} = $gitinfo{tag} if ($gitinfo{tag} =~ m@.@);
} else {
$gitinfo{url} = "http://nowhere/tarball/";
$gitinfo{revision} = "unknown";
diff --git a/utils/idna-derived-props-gen.pl b/utils/idna-derived-props-gen.pl
new file mode 100644
index 000000000..515f62a40
--- /dev/null
+++ b/utils/idna-derived-props-gen.pl
@@ -0,0 +1,96 @@
+#!/usr/bin/perl
+#
+# Copyright 2014 Chris Young <chris@unsatisfactorysoftware.co.uk>
+#
+# This file is part of NetSurf, http://www.netsurf-browser.org/
+#
+# NetSurf is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# NetSurf is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+print <<HEADER;
+/* This file is generated by idna-derived-props-gen.pl
+ * DO NOT EDIT BY HAND
+ */
+#ifndef _NETSURF_UTILS_IDNA_PROPS_H_
+#define _NETSURF_UTILS_IDNA_PROPS_H_
+
+typedef enum idna_property {
+ IDNA_P_PVALID = 1,
+ IDNA_P_CONTEXTJ = 2,
+ IDNA_P_CONTEXTO = 3,
+ IDNA_P_DISALLOWED = 4,
+ IDNA_P_UNASSIGNED = 5
+} idna_property;
+
+typedef enum idna_unicode_jt {
+ IDNA_UNICODE_JT_U = 0,
+ IDNA_UNICODE_JT_C = 1,
+ IDNA_UNICODE_JT_D = 2,
+ IDNA_UNICODE_JT_R = 3,
+ IDNA_UNICODE_JT_T = 4,
+ IDNA_UNICODE_JT_L = 5
+} idna_unicode_jt;
+
+
+typedef struct idna_table {
+ int32_t start;
+ int32_t end;
+ union p {
+ idna_property property;
+ idna_unicode_jt jt;
+ } p;
+} idna_table;
+
+idna_table idna_derived[] = {
+HEADER
+
+open(CSVFILE, "idna-tables-5.2.0-properties.csv");
+$line = <CSVFILE>; # discard header line
+
+while($line = <CSVFILE>) {
+ @items = split(/\,/, $line);
+ @codepoints = split(/-/, $items[0]);
+ if($#codepoints == 0) { $codepoints[1] = $codepoints[0]; }
+ print "\t{ 0x" . $codepoints[0] . ", 0x" . $codepoints[1] . ", .p.property = IDNA_P_" . $items[1] . " },\n";
+}
+
+close(CSVFILE);
+
+print <<HEADER;
+ { 0, 0, .p.property = 0}
+};
+
+idna_table idna_joiningtype[] = {
+HEADER
+
+
+open(TXTFILE, "DerivedJoiningType.txt");
+
+while($line = <TXTFILE>) {
+ chop($line);
+ if(substr($line, 0, 1) eq '#') {next;}
+ if(length($line) == 0) {next;}
+ @items = split(/;/, $line);
+ @codepoints = split(/\./, $items[0]);
+ if($#codepoints == 0) { $codepoints[2] = $codepoints[0]; }
+ print "\t{ 0x" . $codepoints[0] . ", 0x" . $codepoints[2] . ", .p.jt = IDNA_UNICODE_JT_" . substr($items[1], 1, 1) . " },\n";
+}
+
+close(TXTFILE);
+
+print <<HEADER;
+ { 0, 0, .p.jt = 0}
+};
+#endif
+HEADER
+
+
diff --git a/utils/idna-tables-5.2.0-properties.csv b/utils/idna-tables-5.2.0-properties.csv
new file mode 100644
index 000000000..a74547bc9
--- /dev/null
+++ b/utils/idna-tables-5.2.0-properties.csv
@@ -0,0 +1,2322 @@
+Codepoint,Property,Description
+0000-002C,DISALLOWED,NULL..COMMA
+002D,PVALID,HYPHEN-MINUS
+002E-002F,DISALLOWED,FULL STOP..SOLIDUS
+0030-0039,PVALID,DIGIT ZERO..DIGIT NINE
+003A-0060,DISALLOWED,COLON..GRAVE ACCENT
+0061-007A,PVALID,LATIN SMALL LETTER A..LATIN SMALL LETTER Z
+007B-00B6,DISALLOWED,LEFT CURLY BRACKET..PILCROW SIGN
+00B7,CONTEXTO,MIDDLE DOT
+00B8-00DE,DISALLOWED,CEDILLA..LATIN CAPITAL LETTER THORN
+00DF-00F6,PVALID,LATIN SMALL LETTER SHARP S..LATIN SMALL LETTER O WITH DIAERESIS
+00F7,DISALLOWED,DIVISION SIGN
+00F8-00FF,PVALID,LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER Y WITH DIAERESIS
+0100,DISALLOWED,LATIN CAPITAL LETTER A WITH MACRON
+0101,PVALID,LATIN SMALL LETTER A WITH MACRON
+0102,DISALLOWED,LATIN CAPITAL LETTER A WITH BREVE
+0103,PVALID,LATIN SMALL LETTER A WITH BREVE
+0104,DISALLOWED,LATIN CAPITAL LETTER A WITH OGONEK
+0105,PVALID,LATIN SMALL LETTER A WITH OGONEK
+0106,DISALLOWED,LATIN CAPITAL LETTER C WITH ACUTE
+0107,PVALID,LATIN SMALL LETTER C WITH ACUTE
+0108,DISALLOWED,LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+0109,PVALID,LATIN SMALL LETTER C WITH CIRCUMFLEX
+010A,DISALLOWED,LATIN CAPITAL LETTER C WITH DOT ABOVE
+010B,PVALID,LATIN SMALL LETTER C WITH DOT ABOVE
+010C,DISALLOWED,LATIN CAPITAL LETTER C WITH CARON
+010D,PVALID,LATIN SMALL LETTER C WITH CARON
+010E,DISALLOWED,LATIN CAPITAL LETTER D WITH CARON
+010F,PVALID,LATIN SMALL LETTER D WITH CARON
+0110,DISALLOWED,LATIN CAPITAL LETTER D WITH STROKE
+0111,PVALID,LATIN SMALL LETTER D WITH STROKE
+0112,DISALLOWED,LATIN CAPITAL LETTER E WITH MACRON
+0113,PVALID,LATIN SMALL LETTER E WITH MACRON
+0114,DISALLOWED,LATIN CAPITAL LETTER E WITH BREVE
+0115,PVALID,LATIN SMALL LETTER E WITH BREVE
+0116,DISALLOWED,LATIN CAPITAL LETTER E WITH DOT ABOVE
+0117,PVALID,LATIN SMALL LETTER E WITH DOT ABOVE
+0118,DISALLOWED,LATIN CAPITAL LETTER E WITH OGONEK
+0119,PVALID,LATIN SMALL LETTER E WITH OGONEK
+011A,DISALLOWED,LATIN CAPITAL LETTER E WITH CARON
+011B,PVALID,LATIN SMALL LETTER E WITH CARON
+011C,DISALLOWED,LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+011D,PVALID,LATIN SMALL LETTER G WITH CIRCUMFLEX
+011E,DISALLOWED,LATIN CAPITAL LETTER G WITH BREVE
+011F,PVALID,LATIN SMALL LETTER G WITH BREVE
+0120,DISALLOWED,LATIN CAPITAL LETTER G WITH DOT ABOVE
+0121,PVALID,LATIN SMALL LETTER G WITH DOT ABOVE
+0122,DISALLOWED,LATIN CAPITAL LETTER G WITH CEDILLA
+0123,PVALID,LATIN SMALL LETTER G WITH CEDILLA
+0124,DISALLOWED,LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0125,PVALID,LATIN SMALL LETTER H WITH CIRCUMFLEX
+0126,DISALLOWED,LATIN CAPITAL LETTER H WITH STROKE
+0127,PVALID,LATIN SMALL LETTER H WITH STROKE
+0128,DISALLOWED,LATIN CAPITAL LETTER I WITH TILDE
+0129,PVALID,LATIN SMALL LETTER I WITH TILDE
+012A,DISALLOWED,LATIN CAPITAL LETTER I WITH MACRON
+012B,PVALID,LATIN SMALL LETTER I WITH MACRON
+012C,DISALLOWED,LATIN CAPITAL LETTER I WITH BREVE
+012D,PVALID,LATIN SMALL LETTER I WITH BREVE
+012E,DISALLOWED,LATIN CAPITAL LETTER I WITH OGONEK
+012F,PVALID,LATIN SMALL LETTER I WITH OGONEK
+0130,DISALLOWED,LATIN CAPITAL LETTER I WITH DOT ABOVE
+0131,PVALID,LATIN SMALL LETTER DOTLESS I
+0132-0134,DISALLOWED,LATIN CAPITAL LIGATURE IJ..LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0135,PVALID,LATIN SMALL LETTER J WITH CIRCUMFLEX
+0136,DISALLOWED,LATIN CAPITAL LETTER K WITH CEDILLA
+0137-0138,PVALID,LATIN SMALL LETTER K WITH CEDILLA..LATIN SMALL LETTER KRA
+0139,DISALLOWED,LATIN CAPITAL LETTER L WITH ACUTE
+013A,PVALID,LATIN SMALL LETTER L WITH ACUTE
+013B,DISALLOWED,LATIN CAPITAL LETTER L WITH CEDILLA
+013C,PVALID,LATIN SMALL LETTER L WITH CEDILLA
+013D,DISALLOWED,LATIN CAPITAL LETTER L WITH CARON
+013E,PVALID,LATIN SMALL LETTER L WITH CARON
+013F-0141,DISALLOWED,LATIN CAPITAL LETTER L WITH MIDDLE DOT..LATIN CAPITAL LETTER L WITH STROKE
+0142,PVALID,LATIN SMALL LETTER L WITH STROKE
+0143,DISALLOWED,LATIN CAPITAL LETTER N WITH ACUTE
+0144,PVALID,LATIN SMALL LETTER N WITH ACUTE
+0145,DISALLOWED,LATIN CAPITAL LETTER N WITH CEDILLA
+0146,PVALID,LATIN SMALL LETTER N WITH CEDILLA
+0147,DISALLOWED,LATIN CAPITAL LETTER N WITH CARON
+0148,PVALID,LATIN SMALL LETTER N WITH CARON
+0149-014A,DISALLOWED,LATIN SMALL LETTER N PRECEDED BY APOSTROPHE..LATIN CAPITAL LETTER ENG
+014B,PVALID,LATIN SMALL LETTER ENG
+014C,DISALLOWED,LATIN CAPITAL LETTER O WITH MACRON
+014D,PVALID,LATIN SMALL LETTER O WITH MACRON
+014E,DISALLOWED,LATIN CAPITAL LETTER O WITH BREVE
+014F,PVALID,LATIN SMALL LETTER O WITH BREVE
+0150,DISALLOWED,LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0151,PVALID,LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0152,DISALLOWED,LATIN CAPITAL LIGATURE OE
+0153,PVALID,LATIN SMALL LIGATURE OE
+0154,DISALLOWED,LATIN CAPITAL LETTER R WITH ACUTE
+0155,PVALID,LATIN SMALL LETTER R WITH ACUTE
+0156,DISALLOWED,LATIN CAPITAL LETTER R WITH CEDILLA
+0157,PVALID,LATIN SMALL LETTER R WITH CEDILLA
+0158,DISALLOWED,LATIN CAPITAL LETTER R WITH CARON
+0159,PVALID,LATIN SMALL LETTER R WITH CARON
+015A,DISALLOWED,LATIN CAPITAL LETTER S WITH ACUTE
+015B,PVALID,LATIN SMALL LETTER S WITH ACUTE
+015C,DISALLOWED,LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+015D,PVALID,LATIN SMALL LETTER S WITH CIRCUMFLEX
+015E,DISALLOWED,LATIN CAPITAL LETTER S WITH CEDILLA
+015F,PVALID,LATIN SMALL LETTER S WITH CEDILLA
+0160,DISALLOWED,LATIN CAPITAL LETTER S WITH CARON
+0161,PVALID,LATIN SMALL LETTER S WITH CARON
+0162,DISALLOWED,LATIN CAPITAL LETTER T WITH CEDILLA
+0163,PVALID,LATIN SMALL LETTER T WITH CEDILLA
+0164,DISALLOWED,LATIN CAPITAL LETTER T WITH CARON
+0165,PVALID,LATIN SMALL LETTER T WITH CARON
+0166,DISALLOWED,LATIN CAPITAL LETTER T WITH STROKE
+0167,PVALID,LATIN SMALL LETTER T WITH STROKE
+0168,DISALLOWED,LATIN CAPITAL LETTER U WITH TILDE
+0169,PVALID,LATIN SMALL LETTER U WITH TILDE
+016A,DISALLOWED,LATIN CAPITAL LETTER U WITH MACRON
+016B,PVALID,LATIN SMALL LETTER U WITH MACRON
+016C,DISALLOWED,LATIN CAPITAL LETTER U WITH BREVE
+016D,PVALID,LATIN SMALL LETTER U WITH BREVE
+016E,DISALLOWED,LATIN CAPITAL LETTER U WITH RING ABOVE
+016F,PVALID,LATIN SMALL LETTER U WITH RING ABOVE
+0170,DISALLOWED,LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0171,PVALID,LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0172,DISALLOWED,LATIN CAPITAL LETTER U WITH OGONEK
+0173,PVALID,LATIN SMALL LETTER U WITH OGONEK
+0174,DISALLOWED,LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0175,PVALID,LATIN SMALL LETTER W WITH CIRCUMFLEX
+0176,DISALLOWED,LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0177,PVALID,LATIN SMALL LETTER Y WITH CIRCUMFLEX
+0178-0179,DISALLOWED,LATIN CAPITAL LETTER Y WITH DIAERESIS..LATIN CAPITAL LETTER Z WITH ACUTE
+017A,PVALID,LATIN SMALL LETTER Z WITH ACUTE
+017B,DISALLOWED,LATIN CAPITAL LETTER Z WITH DOT ABOVE
+017C,PVALID,LATIN SMALL LETTER Z WITH DOT ABOVE
+017D,DISALLOWED,LATIN CAPITAL LETTER Z WITH CARON
+017E,PVALID,LATIN SMALL LETTER Z WITH CARON
+017F,DISALLOWED,LATIN SMALL LETTER LONG S
+0180,PVALID,LATIN SMALL LETTER B WITH STROKE
+0181-0182,DISALLOWED,LATIN CAPITAL LETTER B WITH HOOK..LATIN CAPITAL LETTER B WITH TOPBAR
+0183,PVALID,LATIN SMALL LETTER B WITH TOPBAR
+0184,DISALLOWED,LATIN CAPITAL LETTER TONE SIX
+0185,PVALID,LATIN SMALL LETTER TONE SIX
+0186-0187,DISALLOWED,LATIN CAPITAL LETTER OPEN O..LATIN CAPITAL LETTER C WITH HOOK
+0188,PVALID,LATIN SMALL LETTER C WITH HOOK
+0189-018B,DISALLOWED,LATIN CAPITAL LETTER AFRICAN D..LATIN CAPITAL LETTER D WITH TOPBAR
+018C-018D,PVALID,LATIN SMALL LETTER D WITH TOPBAR..LATIN SMALL LETTER TURNED DELTA
+018E-0191,DISALLOWED,LATIN CAPITAL LETTER REVERSED E..LATIN CAPITAL LETTER F WITH HOOK
+0192,PVALID,LATIN SMALL LETTER F WITH HOOK
+0193-0194,DISALLOWED,LATIN CAPITAL LETTER G WITH HOOK..LATIN CAPITAL LETTER GAMMA
+0195,PVALID,LATIN SMALL LETTER HV
+0196-0198,DISALLOWED,LATIN CAPITAL LETTER IOTA..LATIN CAPITAL LETTER K WITH HOOK
+0199-019B,PVALID,LATIN SMALL LETTER K WITH HOOK..LATIN SMALL LETTER LAMBDA WITH STROKE
+019C-019D,DISALLOWED,LATIN CAPITAL LETTER TURNED M..LATIN CAPITAL LETTER N WITH LEFT HOOK
+019E,PVALID,LATIN SMALL LETTER N WITH LONG RIGHT LEG
+019F-01A0,DISALLOWED,LATIN CAPITAL LETTER O WITH MIDDLE TILDE..LATIN CAPITAL LETTER O WITH HORN
+01A1,PVALID,LATIN SMALL LETTER O WITH HORN
+01A2,DISALLOWED,LATIN CAPITAL LETTER OI
+01A3,PVALID,LATIN SMALL LETTER OI
+01A4,DISALLOWED,LATIN CAPITAL LETTER P WITH HOOK
+01A5,PVALID,LATIN SMALL LETTER P WITH HOOK
+01A6-01A7,DISALLOWED,LATIN LETTER YR..LATIN CAPITAL LETTER TONE TWO
+01A8,PVALID,LATIN SMALL LETTER TONE TWO
+01A9,DISALLOWED,LATIN CAPITAL LETTER ESH
+01AA-01AB,PVALID,LATIN LETTER REVERSED ESH LOOP..LATIN SMALL LETTER T WITH PALATAL HOOK
+01AC,DISALLOWED,LATIN CAPITAL LETTER T WITH HOOK
+01AD,PVALID,LATIN SMALL LETTER T WITH HOOK
+01AE-01AF,DISALLOWED,LATIN CAPITAL LETTER T WITH RETROFLEX HOOK..LATIN CAPITAL LETTER U WITH HORN
+01B0,PVALID,LATIN SMALL LETTER U WITH HORN
+01B1-01B3,DISALLOWED,LATIN CAPITAL LETTER UPSILON..LATIN CAPITAL LETTER Y WITH HOOK
+01B4,PVALID,LATIN SMALL LETTER Y WITH HOOK
+01B5,DISALLOWED,LATIN CAPITAL LETTER Z WITH STROKE
+01B6,PVALID,LATIN SMALL LETTER Z WITH STROKE
+01B7-01B8,DISALLOWED,LATIN CAPITAL LETTER EZH..LATIN CAPITAL LETTER EZH REVERSED
+01B9-01BB,PVALID,LATIN SMALL LETTER EZH REVERSED..LATIN LETTER TWO WITH STROKE
+01BC,DISALLOWED,LATIN CAPITAL LETTER TONE FIVE
+01BD-01C3,PVALID,LATIN SMALL LETTER TONE FIVE..LATIN LETTER RETROFLEX CLICK
+01C4-01CD,DISALLOWED,LATIN CAPITAL LETTER DZ WITH CARON..LATIN CAPITAL LETTER A WITH CARON
+01CE,PVALID,LATIN SMALL LETTER A WITH CARON
+01CF,DISALLOWED,LATIN CAPITAL LETTER I WITH CARON
+01D0,PVALID,LATIN SMALL LETTER I WITH CARON
+01D1,DISALLOWED,LATIN CAPITAL LETTER O WITH CARON
+01D2,PVALID,LATIN SMALL LETTER O WITH CARON
+01D3,DISALLOWED,LATIN CAPITAL LETTER U WITH CARON
+01D4,PVALID,LATIN SMALL LETTER U WITH CARON
+01D5,DISALLOWED,LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+01D6,PVALID,LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+01D7,DISALLOWED,LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+01D8,PVALID,LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+01D9,DISALLOWED,LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+01DA,PVALID,LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+01DB,DISALLOWED,LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+01DC-01DD,PVALID,LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE..LATIN SMALL LETTER TURNED E
+01DE,DISALLOWED,LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+01DF,PVALID,LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+01E0,DISALLOWED,LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+01E1,PVALID,LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+01E2,DISALLOWED,LATIN CAPITAL LETTER AE WITH MACRON
+01E3,PVALID,LATIN SMALL LETTER AE WITH MACRON
+01E4,DISALLOWED,LATIN CAPITAL LETTER G WITH STROKE
+01E5,PVALID,LATIN SMALL LETTER G WITH STROKE
+01E6,DISALLOWED,LATIN CAPITAL LETTER G WITH CARON
+01E7,PVALID,LATIN SMALL LETTER G WITH CARON
+01E8,DISALLOWED,LATIN CAPITAL LETTER K WITH CARON
+01E9,PVALID,LATIN SMALL LETTER K WITH CARON
+01EA,DISALLOWED,LATIN CAPITAL LETTER O WITH OGONEK
+01EB,PVALID,LATIN SMALL LETTER O WITH OGONEK
+01EC,DISALLOWED,LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+01ED,PVALID,LATIN SMALL LETTER O WITH OGONEK AND MACRON
+01EE,DISALLOWED,LATIN CAPITAL LETTER EZH WITH CARON
+01EF-01F0,PVALID,LATIN SMALL LETTER EZH WITH CARON..LATIN SMALL LETTER J WITH CARON
+01F1-01F4,DISALLOWED,LATIN CAPITAL LETTER DZ..LATIN CAPITAL LETTER G WITH ACUTE
+01F5,PVALID,LATIN SMALL LETTER G WITH ACUTE
+01F6-01F8,DISALLOWED,LATIN CAPITAL LETTER HWAIR..LATIN CAPITAL LETTER N WITH GRAVE
+01F9,PVALID,LATIN SMALL LETTER N WITH GRAVE
+01FA,DISALLOWED,LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+01FB,PVALID,LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+01FC,DISALLOWED,LATIN CAPITAL LETTER AE WITH ACUTE
+01FD,PVALID,LATIN SMALL LETTER AE WITH ACUTE
+01FE,DISALLOWED,LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+01FF,PVALID,LATIN SMALL LETTER O WITH STROKE AND ACUTE
+0200,DISALLOWED,LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+0201,PVALID,LATIN SMALL LETTER A WITH DOUBLE GRAVE
+0202,DISALLOWED,LATIN CAPITAL LETTER A WITH INVERTED BREVE
+0203,PVALID,LATIN SMALL LETTER A WITH INVERTED BREVE
+0204,DISALLOWED,LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+0205,PVALID,LATIN SMALL LETTER E WITH DOUBLE GRAVE
+0206,DISALLOWED,LATIN CAPITAL LETTER E WITH INVERTED BREVE
+0207,PVALID,LATIN SMALL LETTER E WITH INVERTED BREVE
+0208,DISALLOWED,LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+0209,PVALID,LATIN SMALL LETTER I WITH DOUBLE GRAVE
+020A,DISALLOWED,LATIN CAPITAL LETTER I WITH INVERTED BREVE
+020B,PVALID,LATIN SMALL LETTER I WITH INVERTED BREVE
+020C,DISALLOWED,LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+020D,PVALID,LATIN SMALL LETTER O WITH DOUBLE GRAVE
+020E,DISALLOWED,LATIN CAPITAL LETTER O WITH INVERTED BREVE
+020F,PVALID,LATIN SMALL LETTER O WITH INVERTED BREVE
+0210,DISALLOWED,LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+0211,PVALID,LATIN SMALL LETTER R WITH DOUBLE GRAVE
+0212,DISALLOWED,LATIN CAPITAL LETTER R WITH INVERTED BREVE
+0213,PVALID,LATIN SMALL LETTER R WITH INVERTED BREVE
+0214,DISALLOWED,LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+0215,PVALID,LATIN SMALL LETTER U WITH DOUBLE GRAVE
+0216,DISALLOWED,LATIN CAPITAL LETTER U WITH INVERTED BREVE
+0217,PVALID,LATIN SMALL LETTER U WITH INVERTED BREVE
+0218,DISALLOWED,LATIN CAPITAL LETTER S WITH COMMA BELOW
+0219,PVALID,LATIN SMALL LETTER S WITH COMMA BELOW
+021A,DISALLOWED,LATIN CAPITAL LETTER T WITH COMMA BELOW
+021B,PVALID,LATIN SMALL LETTER T WITH COMMA BELOW
+021C,DISALLOWED,LATIN CAPITAL LETTER YOGH
+021D,PVALID,LATIN SMALL LETTER YOGH
+021E,DISALLOWED,LATIN CAPITAL LETTER H WITH CARON
+021F,PVALID,LATIN SMALL LETTER H WITH CARON
+0220,DISALLOWED,LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+0221,PVALID,LATIN SMALL LETTER D WITH CURL
+0222,DISALLOWED,LATIN CAPITAL LETTER OU
+0223,PVALID,LATIN SMALL LETTER OU
+0224,DISALLOWED,LATIN CAPITAL LETTER Z WITH HOOK
+0225,PVALID,LATIN SMALL LETTER Z WITH HOOK
+0226,DISALLOWED,LATIN CAPITAL LETTER A WITH DOT ABOVE
+0227,PVALID,LATIN SMALL LETTER A WITH DOT ABOVE
+0228,DISALLOWED,LATIN CAPITAL LETTER E WITH CEDILLA
+0229,PVALID,LATIN SMALL LETTER E WITH CEDILLA
+022A,DISALLOWED,LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+022B,PVALID,LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+022C,DISALLOWED,LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+022D,PVALID,LATIN SMALL LETTER O WITH TILDE AND MACRON
+022E,DISALLOWED,LATIN CAPITAL LETTER O WITH DOT ABOVE
+022F,PVALID,LATIN SMALL LETTER O WITH DOT ABOVE
+0230,DISALLOWED,LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+0231,PVALID,LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+0232,DISALLOWED,LATIN CAPITAL LETTER Y WITH MACRON
+0233-0239,PVALID,LATIN SMALL LETTER Y WITH MACRON..LATIN SMALL LETTER QP DIGRAPH
+023A-023B,DISALLOWED,LATIN CAPITAL LETTER A WITH STROKE..LATIN CAPITAL LETTER C WITH STROKE
+023C,PVALID,LATIN SMALL LETTER C WITH STROKE
+023D-023E,DISALLOWED,LATIN CAPITAL LETTER L WITH BAR..LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
+023F-0240,PVALID,LATIN SMALL LETTER S WITH SWASH TAIL..LATIN SMALL LETTER Z WITH SWASH TAIL
+0241,DISALLOWED,LATIN CAPITAL LETTER GLOTTAL STOP
+0242,PVALID,LATIN SMALL LETTER GLOTTAL STOP
+0243-0246,DISALLOWED,LATIN CAPITAL LETTER B WITH STROKE..LATIN CAPITAL LETTER E WITH STROKE
+0247,PVALID,LATIN SMALL LETTER E WITH STROKE
+0248,DISALLOWED,LATIN CAPITAL LETTER J WITH STROKE
+0249,PVALID,LATIN SMALL LETTER J WITH STROKE
+024A,DISALLOWED,LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL
+024B,PVALID,LATIN SMALL LETTER Q WITH HOOK TAIL
+024C,DISALLOWED,LATIN CAPITAL LETTER R WITH STROKE
+024D,PVALID,LATIN SMALL LETTER R WITH STROKE
+024E,DISALLOWED,LATIN CAPITAL LETTER Y WITH STROKE
+024F-02AF,PVALID,LATIN SMALL LETTER Y WITH STROKE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+02B0-02B8,DISALLOWED,MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y
+02B9-02C1,PVALID,MODIFIER LETTER PRIME..MODIFIER LETTER REVERSED GLOTTAL STOP
+02C2-02C5,DISALLOWED,MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD
+02C6-02D1,PVALID,MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON
+02D2-02EB,DISALLOWED,MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER YANG DEPARTING TONE MARK
+02EC,PVALID,MODIFIER LETTER VOICING
+02ED,DISALLOWED,MODIFIER LETTER UNASPIRATED
+02EE,PVALID,MODIFIER LETTER DOUBLE APOSTROPHE
+02EF-02FF,DISALLOWED,MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW
+0300-033F,PVALID,COMBINING GRAVE ACCENT..COMBINING DOUBLE OVERLINE
+0340-0341,DISALLOWED,COMBINING GRAVE TONE MARK..COMBINING ACUTE TONE MARK
+0342,PVALID,COMBINING GREEK PERISPOMENI
+0343-0345,DISALLOWED,COMBINING GREEK KORONIS..COMBINING GREEK YPOGEGRAMMENI
+0346-034E,PVALID,COMBINING BRIDGE ABOVE..COMBINING UPWARDS ARROW BELOW
+034F,DISALLOWED,COMBINING GRAPHEME JOINER
+0350-036F,PVALID,COMBINING RIGHT ARROWHEAD ABOVE..COMBINING LATIN SMALL LETTER X
+0370,DISALLOWED,GREEK CAPITAL LETTER HETA
+0371,PVALID,GREEK SMALL LETTER HETA
+0372,DISALLOWED,GREEK CAPITAL LETTER ARCHAIC SAMPI
+0373,PVALID,GREEK SMALL LETTER ARCHAIC SAMPI
+0374,DISALLOWED,GREEK NUMERAL SIGN
+0375,CONTEXTO,GREEK LOWER NUMERAL SIGN
+0376,DISALLOWED,GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA
+0377,PVALID,GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+0378-0379,UNASSIGNED,<RESERVED>..<RESERVED>
+037A,DISALLOWED,GREEK YPOGEGRAMMENI
+037B-037D,PVALID,GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+037E,DISALLOWED,GREEK QUESTION MARK
+037F-0383,UNASSIGNED,<RESERVED>..<RESERVED>
+0384-038A,DISALLOWED,GREEK TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS
+038B,UNASSIGNED,<RESERVED>
+038C,DISALLOWED,GREEK CAPITAL LETTER OMICRON WITH TONOS
+038D,UNASSIGNED,<RESERVED>
+038E-038F,DISALLOWED,GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER OMEGA WITH TONOS
+0390,PVALID,GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0391-03A1,DISALLOWED,GREEK CAPITAL LETTER ALPHA..GREEK CAPITAL LETTER RHO
+03A2,UNASSIGNED,<RESERVED>
+03A3-03AB,DISALLOWED,GREEK CAPITAL LETTER SIGMA..GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+03AC-03CE,PVALID,GREEK SMALL LETTER ALPHA WITH TONOS..GREEK SMALL LETTER OMEGA WITH TONOS
+03CF-03D6,DISALLOWED,GREEK CAPITAL KAI SYMBOL..GREEK PI SYMBOL
+03D7,PVALID,GREEK KAI SYMBOL
+03D8,DISALLOWED,GREEK LETTER ARCHAIC KOPPA
+03D9,PVALID,GREEK SMALL LETTER ARCHAIC KOPPA
+03DA,DISALLOWED,GREEK LETTER STIGMA
+03DB,PVALID,GREEK SMALL LETTER STIGMA
+03DC,DISALLOWED,GREEK LETTER DIGAMMA
+03DD,PVALID,GREEK SMALL LETTER DIGAMMA
+03DE,DISALLOWED,GREEK LETTER KOPPA
+03DF,PVALID,GREEK SMALL LETTER KOPPA
+03E0,DISALLOWED,GREEK LETTER SAMPI
+03E1,PVALID,GREEK SMALL LETTER SAMPI
+03E2,DISALLOWED,COPTIC CAPITAL LETTER SHEI
+03E3,PVALID,COPTIC SMALL LETTER SHEI
+03E4,DISALLOWED,COPTIC CAPITAL LETTER FEI
+03E5,PVALID,COPTIC SMALL LETTER FEI
+03E6,DISALLOWED,COPTIC CAPITAL LETTER KHEI
+03E7,PVALID,COPTIC SMALL LETTER KHEI
+03E8,DISALLOWED,COPTIC CAPITAL LETTER HORI
+03E9,PVALID,COPTIC SMALL LETTER HORI
+03EA,DISALLOWED,COPTIC CAPITAL LETTER GANGIA
+03EB,PVALID,COPTIC SMALL LETTER GANGIA
+03EC,DISALLOWED,COPTIC CAPITAL LETTER SHIMA
+03ED,PVALID,COPTIC SMALL LETTER SHIMA
+03EE,DISALLOWED,COPTIC CAPITAL LETTER DEI
+03EF,PVALID,COPTIC SMALL LETTER DEI
+03F0-03F2,DISALLOWED,GREEK KAPPA SYMBOL..GREEK LUNATE SIGMA SYMBOL
+03F3,PVALID,GREEK LETTER YOT
+03F4-03F7,DISALLOWED,GREEK CAPITAL THETA SYMBOL..GREEK CAPITAL LETTER SHO
+03F8,PVALID,GREEK SMALL LETTER SHO
+03F9-03FA,DISALLOWED,GREEK CAPITAL LUNATE SIGMA SYMBOL..GREEK CAPITAL LETTER SAN
+03FB-03FC,PVALID,GREEK SMALL LETTER SAN..GREEK RHO WITH STROKE SYMBOL
+03FD-042F,DISALLOWED,GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL..CYRILLIC CAPITAL LETTER YA
+0430-045F,PVALID,CYRILLIC SMALL LETTER A..CYRILLIC SMALL LETTER DZHE
+0460,DISALLOWED,CYRILLIC CAPITAL LETTER OMEGA
+0461,PVALID,CYRILLIC SMALL LETTER OMEGA
+0462,DISALLOWED,CYRILLIC CAPITAL LETTER YAT
+0463,PVALID,CYRILLIC SMALL LETTER YAT
+0464,DISALLOWED,CYRILLIC CAPITAL LETTER IOTIFIED E
+0465,PVALID,CYRILLIC SMALL LETTER IOTIFIED E
+0466,DISALLOWED,CYRILLIC CAPITAL LETTER LITTLE YUS
+0467,PVALID,CYRILLIC SMALL LETTER LITTLE YUS
+0468,DISALLOWED,CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+0469,PVALID,CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+046A,DISALLOWED,CYRILLIC CAPITAL LETTER BIG YUS
+046B,PVALID,CYRILLIC SMALL LETTER BIG YUS
+046C,DISALLOWED,CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046D,PVALID,CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+046E,DISALLOWED,CYRILLIC CAPITAL LETTER KSI
+046F,PVALID,CYRILLIC SMALL LETTER KSI
+0470,DISALLOWED,CYRILLIC CAPITAL LETTER PSI
+0471,PVALID,CYRILLIC SMALL LETTER PSI
+0472,DISALLOWED,CYRILLIC CAPITAL LETTER FITA
+0473,PVALID,CYRILLIC SMALL LETTER FITA
+0474,DISALLOWED,CYRILLIC CAPITAL LETTER IZHITSA
+0475,PVALID,CYRILLIC SMALL LETTER IZHITSA
+0476,DISALLOWED,CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0477,PVALID,CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0478,DISALLOWED,CYRILLIC CAPITAL LETTER UK
+0479,PVALID,CYRILLIC SMALL LETTER UK
+047A,DISALLOWED,CYRILLIC CAPITAL LETTER ROUND OMEGA
+047B,PVALID,CYRILLIC SMALL LETTER ROUND OMEGA
+047C,DISALLOWED,CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047D,PVALID,CYRILLIC SMALL LETTER OMEGA WITH TITLO
+047E,DISALLOWED,CYRILLIC CAPITAL LETTER OT
+047F,PVALID,CYRILLIC SMALL LETTER OT
+0480,DISALLOWED,CYRILLIC CAPITAL LETTER KOPPA
+0481,PVALID,CYRILLIC SMALL LETTER KOPPA
+0482,DISALLOWED,CYRILLIC THOUSANDS SIGN
+0483-0487,PVALID,COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE
+0488-048A,DISALLOWED,COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+048B,PVALID,CYRILLIC SMALL LETTER SHORT I WITH TAIL
+048C,DISALLOWED,CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+048D,PVALID,CYRILLIC SMALL LETTER SEMISOFT SIGN
+048E,DISALLOWED,CYRILLIC CAPITAL LETTER ER WITH TICK
+048F,PVALID,CYRILLIC SMALL LETTER ER WITH TICK
+0490,DISALLOWED,CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0491,PVALID,CYRILLIC SMALL LETTER GHE WITH UPTURN
+0492,DISALLOWED,CYRILLIC CAPITAL LETTER GHE WITH STROKE
+0493,PVALID,CYRILLIC SMALL LETTER GHE WITH STROKE
+0494,DISALLOWED,CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+0495,PVALID,CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
+0496,DISALLOWED,CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0497,PVALID,CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+0498,DISALLOWED,CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+0499,PVALID,CYRILLIC SMALL LETTER ZE WITH DESCENDER
+049A,DISALLOWED,CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+049B,PVALID,CYRILLIC SMALL LETTER KA WITH DESCENDER
+049C,DISALLOWED,CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+049D,PVALID,CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+049E,DISALLOWED,CYRILLIC CAPITAL LETTER KA WITH STROKE
+049F,PVALID,CYRILLIC SMALL LETTER KA WITH STROKE
+04A0,DISALLOWED,CYRILLIC CAPITAL LETTER BASHKIR KA
+04A1,PVALID,CYRILLIC SMALL LETTER BASHKIR KA
+04A2,DISALLOWED,CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04A3,PVALID,CYRILLIC SMALL LETTER EN WITH DESCENDER
+04A4,DISALLOWED,CYRILLIC CAPITAL LIGATURE EN GHE
+04A5,PVALID,CYRILLIC SMALL LIGATURE EN GHE
+04A6,DISALLOWED,CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+04A7,PVALID,CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK
+04A8,DISALLOWED,CYRILLIC CAPITAL LETTER ABKHASIAN HA
+04A9,PVALID,CYRILLIC SMALL LETTER ABKHASIAN HA
+04AA,DISALLOWED,CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+04AB,PVALID,CYRILLIC SMALL LETTER ES WITH DESCENDER
+04AC,DISALLOWED,CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+04AD,PVALID,CYRILLIC SMALL LETTER TE WITH DESCENDER
+04AE,DISALLOWED,CYRILLIC CAPITAL LETTER STRAIGHT U
+04AF,PVALID,CYRILLIC SMALL LETTER STRAIGHT U
+04B0,DISALLOWED,CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+04B1,PVALID,CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+04B2,DISALLOWED,CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04B3,PVALID,CYRILLIC SMALL LETTER HA WITH DESCENDER
+04B4,DISALLOWED,CYRILLIC CAPITAL LIGATURE TE TSE
+04B5,PVALID,CYRILLIC SMALL LIGATURE TE TSE
+04B6,DISALLOWED,CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04B7,PVALID,CYRILLIC SMALL LETTER CHE WITH DESCENDER
+04B8,DISALLOWED,CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+04B9,PVALID,CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+04BA,DISALLOWED,CYRILLIC CAPITAL LETTER SHHA
+04BB,PVALID,CYRILLIC SMALL LETTER SHHA
+04BC,DISALLOWED,CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BD,PVALID,CYRILLIC SMALL LETTER ABKHASIAN CHE
+04BE,DISALLOWED,CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+04BF,PVALID,CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
+04C0-04C1,DISALLOWED,CYRILLIC LETTER PALOCHKA..CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+04C2,PVALID,CYRILLIC SMALL LETTER ZHE WITH BREVE
+04C3,DISALLOWED,CYRILLIC CAPITAL LETTER KA WITH HOOK
+04C4,PVALID,CYRILLIC SMALL LETTER KA WITH HOOK
+04C5,DISALLOWED,CYRILLIC CAPITAL LETTER EL WITH TAIL
+04C6,PVALID,CYRILLIC SMALL LETTER EL WITH TAIL
+04C7,DISALLOWED,CYRILLIC CAPITAL LETTER EN WITH HOOK
+04C8,PVALID,CYRILLIC SMALL LETTER EN WITH HOOK
+04C9,DISALLOWED,CYRILLIC CAPITAL LETTER EN WITH TAIL
+04CA,PVALID,CYRILLIC SMALL LETTER EN WITH TAIL
+04CB,DISALLOWED,CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04CC,PVALID,CYRILLIC SMALL LETTER KHAKASSIAN CHE
+04CD,DISALLOWED,CYRILLIC CAPITAL LETTER EM WITH TAIL
+04CE-04CF,PVALID,CYRILLIC SMALL LETTER EM WITH TAIL..CYRILLIC SMALL LETTER PALOCHKA
+04D0,DISALLOWED,CYRILLIC CAPITAL LETTER A WITH BREVE
+04D1,PVALID,CYRILLIC SMALL LETTER A WITH BREVE
+04D2,DISALLOWED,CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+04D3,PVALID,CYRILLIC SMALL LETTER A WITH DIAERESIS
+04D4,DISALLOWED,CYRILLIC CAPITAL LIGATURE A IE
+04D5,PVALID,CYRILLIC SMALL LIGATURE A IE
+04D6,DISALLOWED,CYRILLIC CAPITAL LETTER IE WITH BREVE
+04D7,PVALID,CYRILLIC SMALL LETTER IE WITH BREVE
+04D8,DISALLOWED,CYRILLIC CAPITAL LETTER SCHWA
+04D9,PVALID,CYRILLIC SMALL LETTER SCHWA
+04DA,DISALLOWED,CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04DB,PVALID,CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+04DC,DISALLOWED,CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+04DD,PVALID,CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+04DE,DISALLOWED,CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+04DF,PVALID,CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+04E0,DISALLOWED,CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+04E1,PVALID,CYRILLIC SMALL LETTER ABKHASIAN DZE
+04E2,DISALLOWED,CYRILLIC CAPITAL LETTER I WITH MACRON
+04E3,PVALID,CYRILLIC SMALL LETTER I WITH MACRON
+04E4,DISALLOWED,CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+04E5,PVALID,CYRILLIC SMALL LETTER I WITH DIAERESIS
+04E6,DISALLOWED,CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+04E7,PVALID,CYRILLIC SMALL LETTER O WITH DIAERESIS
+04E8,DISALLOWED,CYRILLIC CAPITAL LETTER BARRED O
+04E9,PVALID,CYRILLIC SMALL LETTER BARRED O
+04EA,DISALLOWED,CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+04EB,PVALID,CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+04EC,DISALLOWED,CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+04ED,PVALID,CYRILLIC SMALL LETTER E WITH DIAERESIS
+04EE,DISALLOWED,CYRILLIC CAPITAL LETTER U WITH MACRON
+04EF,PVALID,CYRILLIC SMALL LETTER U WITH MACRON
+04F0,DISALLOWED,CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+04F1,PVALID,CYRILLIC SMALL LETTER U WITH DIAERESIS
+04F2,DISALLOWED,CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+04F3,PVALID,CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+04F4,DISALLOWED,CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+04F5,PVALID,CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+04F6,DISALLOWED,CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+04F7,PVALID,CYRILLIC SMALL LETTER GHE WITH DESCENDER
+04F8,DISALLOWED,CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+04F9,PVALID,CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+04FA,DISALLOWED,CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK
+04FB,PVALID,CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK
+04FC,DISALLOWED,CYRILLIC CAPITAL LETTER HA WITH HOOK
+04FD,PVALID,CYRILLIC SMALL LETTER HA WITH HOOK
+04FE,DISALLOWED,CYRILLIC CAPITAL LETTER HA WITH STROKE
+04FF,PVALID,CYRILLIC SMALL LETTER HA WITH STROKE
+0500,DISALLOWED,CYRILLIC CAPITAL LETTER KOMI DE
+0501,PVALID,CYRILLIC SMALL LETTER KOMI DE
+0502,DISALLOWED,CYRILLIC CAPITAL LETTER KOMI DJE
+0503,PVALID,CYRILLIC SMALL LETTER KOMI DJE
+0504,DISALLOWED,CYRILLIC CAPITAL LETTER KOMI ZJE
+0505,PVALID,CYRILLIC SMALL LETTER KOMI ZJE
+0506,DISALLOWED,CYRILLIC CAPITAL LETTER KOMI DZJE
+0507,PVALID,CYRILLIC SMALL LETTER KOMI DZJE
+0508,DISALLOWED,CYRILLIC CAPITAL LETTER KOMI LJE
+0509,PVALID,CYRILLIC SMALL LETTER KOMI LJE
+050A,DISALLOWED,CYRILLIC CAPITAL LETTER KOMI NJE
+050B,PVALID,CYRILLIC SMALL LETTER KOMI NJE
+050C,DISALLOWED,CYRILLIC CAPITAL LETTER KOMI SJE
+050D,PVALID,CYRILLIC SMALL LETTER KOMI SJE
+050E,DISALLOWED,CYRILLIC CAPITAL LETTER KOMI TJE
+050F,PVALID,CYRILLIC SMALL LETTER KOMI TJE
+0510,DISALLOWED,CYRILLIC CAPITAL LETTER REVERSED ZE
+0511,PVALID,CYRILLIC SMALL LETTER REVERSED ZE
+0512,DISALLOWED,CYRILLIC CAPITAL LETTER EL WITH HOOK
+0513,PVALID,CYRILLIC SMALL LETTER EL WITH HOOK
+0514,DISALLOWED,CYRILLIC CAPITAL LETTER LHA
+0515,PVALID,CYRILLIC SMALL LETTER LHA
+0516,DISALLOWED,CYRILLIC CAPITAL LETTER RHA
+0517,PVALID,CYRILLIC SMALL LETTER RHA
+0518,DISALLOWED,CYRILLIC CAPITAL LETTER YAE
+0519,PVALID,CYRILLIC SMALL LETTER YAE
+051A,DISALLOWED,CYRILLIC CAPITAL LETTER QA
+051B,PVALID,CYRILLIC SMALL LETTER QA
+051C,DISALLOWED,CYRILLIC CAPITAL LETTER WE
+051D,PVALID,CYRILLIC SMALL LETTER WE
+051E,DISALLOWED,CYRILLIC CAPITAL LETTER ALEUT KA
+051F,PVALID,CYRILLIC SMALL LETTER ALEUT KA
+0520,DISALLOWED,CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK
+0521,PVALID,CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK
+0522,DISALLOWED,CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK
+0523,PVALID,CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK
+0524,DISALLOWED,CYRILLIC CAPITAL LETTER PE WITH DESCENDER
+0525,PVALID,CYRILLIC SMALL LETTER PE WITH DESCENDER
+0526-0530,UNASSIGNED,<RESERVED>..<RESERVED>
+0531-0556,DISALLOWED,ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
+0557-0558,UNASSIGNED,<RESERVED>..<RESERVED>
+0559,PVALID,ARMENIAN MODIFIER LETTER LEFT HALF RING
+055A-055F,DISALLOWED,ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK
+0560,UNASSIGNED,<RESERVED>
+0561-0586,PVALID,ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LETTER FEH
+0587,DISALLOWED,ARMENIAN SMALL LIGATURE ECH YIWN
+0588,UNASSIGNED,<RESERVED>
+0589-058A,DISALLOWED,ARMENIAN FULL STOP..ARMENIAN HYPHEN
+058B-0590,UNASSIGNED,<RESERVED>..<RESERVED>
+0591-05BD,PVALID,HEBREW ACCENT ETNAHTA..HEBREW POINT METEG
+05BE,DISALLOWED,HEBREW PUNCTUATION MAQAF
+05BF,PVALID,HEBREW POINT RAFE
+05C0,DISALLOWED,HEBREW PUNCTUATION PASEQ
+05C1-05C2,PVALID,HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+05C3,DISALLOWED,HEBREW PUNCTUATION SOF PASUQ
+05C4-05C5,PVALID,HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT
+05C6,DISALLOWED,HEBREW PUNCTUATION NUN HAFUKHA
+05C7,PVALID,HEBREW POINT QAMATS QATAN
+05C8-05CF,UNASSIGNED,<RESERVED>..<RESERVED>
+05D0-05EA,PVALID,HEBREW LETTER ALEF..HEBREW LETTER TAV
+05EB-05EF,UNASSIGNED,<RESERVED>..<RESERVED>
+05F0-05F2,PVALID,HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD
+05F3-05F4,CONTEXTO,HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM
+05F5-05FF,UNASSIGNED,<RESERVED>..<RESERVED>
+0600-0603,DISALLOWED,ARABIC NUMBER SIGN..ARABIC SIGN SAFHA
+0604-0605,UNASSIGNED,<RESERVED>..<RESERVED>
+0606-060F,DISALLOWED,ARABIC-INDIC CUBE ROOT..ARABIC SIGN MISRA
+0610-061A,PVALID,ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA
+061B,DISALLOWED,ARABIC SEMICOLON
+061C-061D,UNASSIGNED,<RESERVED>..<RESERVED>
+061E-061F,DISALLOWED,ARABIC TRIPLE DOT PUNCTUATION MARK..ARABIC QUESTION MARK
+0620,UNASSIGNED,<RESERVED>
+0621-063F,PVALID,ARABIC LETTER HAMZA..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE
+0640,DISALLOWED,ARABIC TATWEEL
+0641-065E,PVALID,ARABIC LETTER FEH..ARABIC FATHA WITH TWO DOTS
+065F,UNASSIGNED,<RESERVED>
+0660-0669,CONTEXTO,ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE
+066A-066D,DISALLOWED,ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR
+066E-0674,PVALID,ARABIC LETTER DOTLESS BEH..ARABIC LETTER HIGH HAMZA
+0675-0678,DISALLOWED,ARABIC LETTER HIGH HAMZA ALEF..ARABIC LETTER HIGH HAMZA YEH
+0679-06D3,PVALID,ARABIC LETTER TTEH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D4,DISALLOWED,ARABIC FULL STOP
+06D5-06DC,PVALID,ARABIC LETTER AE..ARABIC SMALL HIGH SEEN
+06DD-06DE,DISALLOWED,ARABIC END OF AYAH..ARABIC START OF RUB EL HIZB
+06DF-06E8,PVALID,ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH NOON
+06E9,DISALLOWED,ARABIC PLACE OF SAJDAH
+06EA-06EF,PVALID,ARABIC EMPTY CENTRE LOW STOP..ARABIC LETTER REH WITH INVERTED V
+06F0-06F9,CONTEXTO,EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE
+06FA-06FF,PVALID,ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER HEH WITH INVERTED V
+0700-070D,DISALLOWED,SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS
+070E,UNASSIGNED,<RESERVED>
+070F,DISALLOWED,SYRIAC ABBREVIATION MARK
+0710-074A,PVALID,SYRIAC LETTER ALAPH..SYRIAC BARREKH
+074B-074C,UNASSIGNED,<RESERVED>..<RESERVED>
+074D-07B1,PVALID,SYRIAC LETTER SOGDIAN ZHAIN..THAANA LETTER NAA
+07B2-07BF,UNASSIGNED,<RESERVED>..<RESERVED>
+07C0-07F5,PVALID,NKO DIGIT ZERO..NKO LOW TONE APOSTROPHE
+07F6-07FA,DISALLOWED,NKO SYMBOL OO DENNEN..NKO LAJANYALAN
+07FB-07FF,UNASSIGNED,<RESERVED>..<RESERVED>
+0800-082D,PVALID,SAMARITAN LETTER ALAF..SAMARITAN MARK NEQUDAA
+082E-082F,UNASSIGNED,<RESERVED>..<RESERVED>
+0830-083E,DISALLOWED,SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU
+083F-08FF,UNASSIGNED,<RESERVED>..<RESERVED>
+0900-0939,PVALID,DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI LETTER HA
+093A-093B,UNASSIGNED,<RESERVED>..<RESERVED>
+093C-094E,PVALID,DEVANAGARI SIGN NUKTA..DEVANAGARI VOWEL SIGN PRISHTHAMATRA E
+094F,UNASSIGNED,<RESERVED>
+0950-0955,PVALID,DEVANAGARI OM..DEVANAGARI VOWEL SIGN CANDRA LONG E
+0956-0957,UNASSIGNED,<RESERVED>..<RESERVED>
+0958-095F,DISALLOWED,DEVANAGARI LETTER QA..DEVANAGARI LETTER YYA
+0960-0963,PVALID,DEVANAGARI LETTER VOCALIC RR..DEVANAGARI VOWEL SIGN VOCALIC LL
+0964-0965,DISALLOWED,DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA
+0966-096F,PVALID,DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE
+0970,DISALLOWED,DEVANAGARI ABBREVIATION SIGN
+0971-0972,PVALID,DEVANAGARI SIGN HIGH SPACING DOT..DEVANAGARI LETTER CANDRA A
+0973-0978,UNASSIGNED,<RESERVED>..<RESERVED>
+0979-097F,PVALID,DEVANAGARI LETTER ZHA..DEVANAGARI LETTER BBA
+0980,UNASSIGNED,<RESERVED>
+0981-0983,PVALID,BENGALI SIGN CANDRABINDU..BENGALI SIGN VISARGA
+0984,UNASSIGNED,<RESERVED>
+0985-098C,PVALID,BENGALI LETTER A..BENGALI LETTER VOCALIC L
+098D-098E,UNASSIGNED,<RESERVED>..<RESERVED>
+098F-0990,PVALID,BENGALI LETTER E..BENGALI LETTER AI
+0991-0992,UNASSIGNED,<RESERVED>..<RESERVED>
+0993-09A8,PVALID,BENGALI LETTER O..BENGALI LETTER NA
+09A9,UNASSIGNED,<RESERVED>
+09AA-09B0,PVALID,BENGALI LETTER PA..BENGALI LETTER RA
+09B1,UNASSIGNED,<RESERVED>
+09B2,PVALID,BENGALI LETTER LA
+09B3-09B5,UNASSIGNED,<RESERVED>..<RESERVED>
+09B6-09B9,PVALID,BENGALI LETTER SHA..BENGALI LETTER HA
+09BA-09BB,UNASSIGNED,<RESERVED>..<RESERVED>
+09BC-09C4,PVALID,BENGALI SIGN NUKTA..BENGALI VOWEL SIGN VOCALIC RR
+09C5-09C6,UNASSIGNED,<RESERVED>..<RESERVED>
+09C7-09C8,PVALID,BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI
+09C9-09CA,UNASSIGNED,<RESERVED>..<RESERVED>
+09CB-09CE,PVALID,BENGALI VOWEL SIGN O..BENGALI LETTER KHANDA TA
+09CF-09D6,UNASSIGNED,<RESERVED>..<RESERVED>
+09D7,PVALID,BENGALI AU LENGTH MARK
+09D8-09DB,UNASSIGNED,<RESERVED>..<RESERVED>
+09DC-09DD,DISALLOWED,BENGALI LETTER RRA..BENGALI LETTER RHA
+09DE,UNASSIGNED,<RESERVED>
+09DF,DISALLOWED,BENGALI LETTER YYA
+09E0-09E3,PVALID,BENGALI LETTER VOCALIC RR..BENGALI VOWEL SIGN VOCALIC LL
+09E4-09E5,UNASSIGNED,<RESERVED>..<RESERVED>
+09E6-09F1,PVALID,BENGALI DIGIT ZERO..BENGALI LETTER RA WITH LOWER DIAGONAL
+09F2-09FB,DISALLOWED,BENGALI RUPEE MARK..BENGALI GANDA MARK
+09FC-0A00,UNASSIGNED,<RESERVED>..<RESERVED>
+0A01-0A03,PVALID,GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN VISARGA
+0A04,UNASSIGNED,<RESERVED>
+0A05-0A0A,PVALID,GURMUKHI LETTER A..GURMUKHI LETTER UU
+0A0B-0A0E,UNASSIGNED,<RESERVED>..<RESERVED>
+0A0F-0A10,PVALID,GURMUKHI LETTER EE..GURMUKHI LETTER AI
+0A11-0A12,UNASSIGNED,<RESERVED>..<RESERVED>
+0A13-0A28,PVALID,GURMUKHI LETTER OO..GURMUKHI LETTER NA
+0A29,UNASSIGNED,<RESERVED>
+0A2A-0A30,PVALID,GURMUKHI LETTER PA..GURMUKHI LETTER RA
+0A31,UNASSIGNED,<RESERVED>
+0A32,PVALID,GURMUKHI LETTER LA
+0A33,DISALLOWED,GURMUKHI LETTER LLA
+0A34,UNASSIGNED,<RESERVED>
+0A35,PVALID,GURMUKHI LETTER VA
+0A36,DISALLOWED,GURMUKHI LETTER SHA
+0A37,UNASSIGNED,<RESERVED>
+0A38-0A39,PVALID,GURMUKHI LETTER SA..GURMUKHI LETTER HA
+0A3A-0A3B,UNASSIGNED,<RESERVED>..<RESERVED>
+0A3C,PVALID,GURMUKHI SIGN NUKTA
+0A3D,UNASSIGNED,<RESERVED>
+0A3E-0A42,PVALID,GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN UU
+0A43-0A46,UNASSIGNED,<RESERVED>..<RESERVED>
+0A47-0A48,PVALID,GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
+0A49-0A4A,UNASSIGNED,<RESERVED>..<RESERVED>
+0A4B-0A4D,PVALID,GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA
+0A4E-0A50,UNASSIGNED,<RESERVED>..<RESERVED>
+0A51,PVALID,GURMUKHI SIGN UDAAT
+0A52-0A58,UNASSIGNED,<RESERVED>..<RESERVED>
+0A59-0A5B,DISALLOWED,GURMUKHI LETTER KHHA..GURMUKHI LETTER ZA
+0A5C,PVALID,GURMUKHI LETTER RRA
+0A5D,UNASSIGNED,<RESERVED>
+0A5E,DISALLOWED,GURMUKHI LETTER FA
+0A5F-0A65,UNASSIGNED,<RESERVED>..<RESERVED>
+0A66-0A75,PVALID,GURMUKHI DIGIT ZERO..GURMUKHI SIGN YAKASH
+0A76-0A80,UNASSIGNED,<RESERVED>..<RESERVED>
+0A81-0A83,PVALID,GUJARATI SIGN CANDRABINDU..GUJARATI SIGN VISARGA
+0A84,UNASSIGNED,<RESERVED>
+0A85-0A8D,PVALID,GUJARATI LETTER A..GUJARATI VOWEL CANDRA E
+0A8E,UNASSIGNED,<RESERVED>
+0A8F-0A91,PVALID,GUJARATI LETTER E..GUJARATI VOWEL CANDRA O
+0A92,UNASSIGNED,<RESERVED>
+0A93-0AA8,PVALID,GUJARATI LETTER O..GUJARATI LETTER NA
+0AA9,UNASSIGNED,<RESERVED>
+0AAA-0AB0,PVALID,GUJARATI LETTER PA..GUJARATI LETTER RA
+0AB1,UNASSIGNED,<RESERVED>
+0AB2-0AB3,PVALID,GUJARATI LETTER LA..GUJARATI LETTER LLA
+0AB4,UNASSIGNED,<RESERVED>
+0AB5-0AB9,PVALID,GUJARATI LETTER VA..GUJARATI LETTER HA
+0ABA-0ABB,UNASSIGNED,<RESERVED>..<RESERVED>
+0ABC-0AC5,PVALID,GUJARATI SIGN NUKTA..GUJARATI VOWEL SIGN CANDRA E
+0AC6,UNASSIGNED,<RESERVED>
+0AC7-0AC9,PVALID,GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN CANDRA O
+0ACA,UNASSIGNED,<RESERVED>
+0ACB-0ACD,PVALID,GUJARATI VOWEL SIGN O..GUJARATI SIGN VIRAMA
+0ACE-0ACF,UNASSIGNED,<RESERVED>..<RESERVED>
+0AD0,PVALID,GUJARATI OM
+0AD1-0ADF,UNASSIGNED,<RESERVED>..<RESERVED>
+0AE0-0AE3,PVALID,GUJARATI LETTER VOCALIC RR..GUJARATI VOWEL SIGN VOCALIC LL
+0AE4-0AE5,UNASSIGNED,<RESERVED>..<RESERVED>
+0AE6-0AEF,PVALID,GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE
+0AF0,UNASSIGNED,<RESERVED>
+0AF1,DISALLOWED,GUJARATI RUPEE SIGN
+0AF2-0B00,UNASSIGNED,<RESERVED>..<RESERVED>
+0B01-0B03,PVALID,ORIYA SIGN CANDRABINDU..ORIYA SIGN VISARGA
+0B04,UNASSIGNED,<RESERVED>
+0B05-0B0C,PVALID,ORIYA LETTER A..ORIYA LETTER VOCALIC L
+0B0D-0B0E,UNASSIGNED,<RESERVED>..<RESERVED>
+0B0F-0B10,PVALID,ORIYA LETTER E..ORIYA LETTER AI
+0B11-0B12,UNASSIGNED,<RESERVED>..<RESERVED>
+0B13-0B28,PVALID,ORIYA LETTER O..ORIYA LETTER NA
+0B29,UNASSIGNED,<RESERVED>
+0B2A-0B30,PVALID,ORIYA LETTER PA..ORIYA LETTER RA
+0B31,UNASSIGNED,<RESERVED>
+0B32-0B33,PVALID,ORIYA LETTER LA..ORIYA LETTER LLA
+0B34,UNASSIGNED,<RESERVED>
+0B35-0B39,PVALID,ORIYA LETTER VA..ORIYA LETTER HA
+0B3A-0B3B,UNASSIGNED,<RESERVED>..<RESERVED>
+0B3C-0B44,PVALID,ORIYA SIGN NUKTA..ORIYA VOWEL SIGN VOCALIC RR
+0B45-0B46,UNASSIGNED,<RESERVED>..<RESERVED>
+0B47-0B48,PVALID,ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI
+0B49-0B4A,UNASSIGNED,<RESERVED>..<RESERVED>
+0B4B-0B4D,PVALID,ORIYA VOWEL SIGN O..ORIYA SIGN VIRAMA
+0B4E-0B55,UNASSIGNED,<RESERVED>..<RESERVED>
+0B56-0B57,PVALID,ORIYA AI LENGTH MARK..ORIYA AU LENGTH MARK
+0B58-0B5B,UNASSIGNED,<RESERVED>..<RESERVED>
+0B5C-0B5D,DISALLOWED,ORIYA LETTER RRA..ORIYA LETTER RHA
+0B5E,UNASSIGNED,<RESERVED>
+0B5F-0B63,PVALID,ORIYA LETTER YYA..ORIYA VOWEL SIGN VOCALIC LL
+0B64-0B65,UNASSIGNED,<RESERVED>..<RESERVED>
+0B66-0B6F,PVALID,ORIYA DIGIT ZERO..ORIYA DIGIT NINE
+0B70,DISALLOWED,ORIYA ISSHAR
+0B71,PVALID,ORIYA LETTER WA
+0B72-0B81,UNASSIGNED,<RESERVED>..<RESERVED>
+0B82-0B83,PVALID,TAMIL SIGN ANUSVARA..TAMIL SIGN VISARGA
+0B84,UNASSIGNED,<RESERVED>
+0B85-0B8A,PVALID,TAMIL LETTER A..TAMIL LETTER UU
+0B8B-0B8D,UNASSIGNED,<RESERVED>..<RESERVED>
+0B8E-0B90,PVALID,TAMIL LETTER E..TAMIL LETTER AI
+0B91,UNASSIGNED,<RESERVED>
+0B92-0B95,PVALID,TAMIL LETTER O..TAMIL LETTER KA
+0B96-0B98,UNASSIGNED,<RESERVED>..<RESERVED>
+0B99-0B9A,PVALID,TAMIL LETTER NGA..TAMIL LETTER CA
+0B9B,UNASSIGNED,<RESERVED>
+0B9C,PVALID,TAMIL LETTER JA
+0B9D,UNASSIGNED,<RESERVED>
+0B9E-0B9F,PVALID,TAMIL LETTER NYA..TAMIL LETTER TTA
+0BA0-0BA2,UNASSIGNED,<RESERVED>..<RESERVED>
+0BA3-0BA4,PVALID,TAMIL LETTER NNA..TAMIL LETTER TA
+0BA5-0BA7,UNASSIGNED,<RESERVED>..<RESERVED>
+0BA8-0BAA,PVALID,TAMIL LETTER NA..TAMIL LETTER PA
+0BAB-0BAD,UNASSIGNED,<RESERVED>..<RESERVED>
+0BAE-0BB9,PVALID,TAMIL LETTER MA..TAMIL LETTER HA
+0BBA-0BBD,UNASSIGNED,<RESERVED>..<RESERVED>
+0BBE-0BC2,PVALID,TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN UU
+0BC3-0BC5,UNASSIGNED,<RESERVED>..<RESERVED>
+0BC6-0BC8,PVALID,TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI
+0BC9,UNASSIGNED,<RESERVED>
+0BCA-0BCD,PVALID,TAMIL VOWEL SIGN O..TAMIL SIGN VIRAMA
+0BCE-0BCF,UNASSIGNED,<RESERVED>..<RESERVED>
+0BD0,PVALID,TAMIL OM
+0BD1-0BD6,UNASSIGNED,<RESERVED>..<RESERVED>
+0BD7,PVALID,TAMIL AU LENGTH MARK
+0BD8-0BE5,UNASSIGNED,<RESERVED>..<RESERVED>
+0BE6-0BEF,PVALID,TAMIL DIGIT ZERO..TAMIL DIGIT NINE
+0BF0-0BFA,DISALLOWED,TAMIL NUMBER TEN..TAMIL NUMBER SIGN
+0BFB-0C00,UNASSIGNED,<RESERVED>..<RESERVED>
+0C01-0C03,PVALID,TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
+0C04,UNASSIGNED,<RESERVED>
+0C05-0C0C,PVALID,TELUGU LETTER A..TELUGU LETTER VOCALIC L
+0C0D,UNASSIGNED,<RESERVED>
+0C0E-0C10,PVALID,TELUGU LETTER E..TELUGU LETTER AI
+0C11,UNASSIGNED,<RESERVED>
+0C12-0C28,PVALID,TELUGU LETTER O..TELUGU LETTER NA
+0C29,UNASSIGNED,<RESERVED>
+0C2A-0C33,PVALID,TELUGU LETTER PA..TELUGU LETTER LLA
+0C34,UNASSIGNED,<RESERVED>
+0C35-0C39,PVALID,TELUGU LETTER VA..TELUGU LETTER HA
+0C3A-0C3C,UNASSIGNED,<RESERVED>..<RESERVED>
+0C3D-0C44,PVALID,TELUGU SIGN AVAGRAHA..TELUGU VOWEL SIGN VOCALIC RR
+0C45,UNASSIGNED,<RESERVED>
+0C46-0C48,PVALID,TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
+0C49,UNASSIGNED,<RESERVED>
+0C4A-0C4D,PVALID,TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA
+0C4E-0C54,UNASSIGNED,<RESERVED>..<RESERVED>
+0C55-0C56,PVALID,TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
+0C57,UNASSIGNED,<RESERVED>
+0C58-0C59,PVALID,TELUGU LETTER TSA..TELUGU LETTER DZA
+0C5A-0C5F,UNASSIGNED,<RESERVED>..<RESERVED>
+0C60-0C63,PVALID,TELUGU LETTER VOCALIC RR..TELUGU VOWEL SIGN VOCALIC LL
+0C64-0C65,UNASSIGNED,<RESERVED>..<RESERVED>
+0C66-0C6F,PVALID,TELUGU DIGIT ZERO..TELUGU DIGIT NINE
+0C70-0C77,UNASSIGNED,<RESERVED>..<RESERVED>
+0C78-0C7F,DISALLOWED,TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU SIGN TUUMU
+0C80-0C81,UNASSIGNED,<RESERVED>..<RESERVED>
+0C82-0C83,PVALID,KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
+0C84,UNASSIGNED,<RESERVED>
+0C85-0C8C,PVALID,KANNADA LETTER A..KANNADA LETTER VOCALIC L
+0C8D,UNASSIGNED,<RESERVED>
+0C8E-0C90,PVALID,KANNADA LETTER E..KANNADA LETTER AI
+0C91,UNASSIGNED,<RESERVED>
+0C92-0CA8,PVALID,KANNADA LETTER O..KANNADA LETTER NA
+0CA9,UNASSIGNED,<RESERVED>
+0CAA-0CB3,PVALID,KANNADA LETTER PA..KANNADA LETTER LLA
+0CB4,UNASSIGNED,<RESERVED>
+0CB5-0CB9,PVALID,KANNADA LETTER VA..KANNADA LETTER HA
+0CBA-0CBB,UNASSIGNED,<RESERVED>..<RESERVED>
+0CBC-0CC4,PVALID,KANNADA SIGN NUKTA..KANNADA VOWEL SIGN VOCALIC RR
+0CC5,UNASSIGNED,<RESERVED>
+0CC6-0CC8,PVALID,KANNADA VOWEL SIGN E..KANNADA VOWEL SIGN AI
+0CC9,UNASSIGNED,<RESERVED>
+0CCA-0CCD,PVALID,KANNADA VOWEL SIGN O..KANNADA SIGN VIRAMA
+0CCE-0CD4,UNASSIGNED,<RESERVED>..<RESERVED>
+0CD5-0CD6,PVALID,KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+0CD7-0CDD,UNASSIGNED,<RESERVED>..<RESERVED>
+0CDE,PVALID,KANNADA LETTER FA
+0CDF,UNASSIGNED,<RESERVED>
+0CE0-0CE3,PVALID,KANNADA LETTER VOCALIC RR..KANNADA VOWEL SIGN VOCALIC LL
+0CE4-0CE5,UNASSIGNED,<RESERVED>..<RESERVED>
+0CE6-0CEF,PVALID,KANNADA DIGIT ZERO..KANNADA DIGIT NINE
+0CF0,UNASSIGNED,<RESERVED>
+0CF1-0CF2,DISALLOWED,KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
+0CF3-0D01,UNASSIGNED,<RESERVED>..<RESERVED>
+0D02-0D03,PVALID,MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
+0D04,UNASSIGNED,<RESERVED>
+0D05-0D0C,PVALID,MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L
+0D0D,UNASSIGNED,<RESERVED>
+0D0E-0D10,PVALID,MALAYALAM LETTER E..MALAYALAM LETTER AI
+0D11,UNASSIGNED,<RESERVED>
+0D12-0D28,PVALID,MALAYALAM LETTER O..MALAYALAM LETTER NA
+0D29,UNASSIGNED,<RESERVED>
+0D2A-0D39,PVALID,MALAYALAM LETTER PA..MALAYALAM LETTER HA
+0D3A-0D3C,UNASSIGNED,<RESERVED>..<RESERVED>
+0D3D-0D44,PVALID,MALAYALAM SIGN AVAGRAHA..MALAYALAM VOWEL SIGN VOCALIC RR
+0D45,UNASSIGNED,<RESERVED>
+0D46-0D48,PVALID,MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
+0D49,UNASSIGNED,<RESERVED>
+0D4A-0D4D,PVALID,MALAYALAM VOWEL SIGN O..MALAYALAM SIGN VIRAMA
+0D4E-0D56,UNASSIGNED,<RESERVED>..<RESERVED>
+0D57,PVALID,MALAYALAM AU LENGTH MARK
+0D58-0D5F,UNASSIGNED,<RESERVED>..<RESERVED>
+0D60-0D63,PVALID,MALAYALAM LETTER VOCALIC RR..MALAYALAM VOWEL SIGN VOCALIC LL
+0D64-0D65,UNASSIGNED,<RESERVED>..<RESERVED>
+0D66-0D6F,PVALID,MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE
+0D70-0D75,DISALLOWED,MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE QUARTERS
+0D76-0D78,UNASSIGNED,<RESERVED>..<RESERVED>
+0D79,DISALLOWED,MALAYALAM DATE MARK
+0D7A-0D7F,PVALID,MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K
+0D80-0D81,UNASSIGNED,<RESERVED>..<RESERVED>
+0D82-0D83,PVALID,SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
+0D84,UNASSIGNED,<RESERVED>
+0D85-0D96,PVALID,SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA
+0D97-0D99,UNASSIGNED,<RESERVED>..<RESERVED>
+0D9A-0DB1,PVALID,SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA
+0DB2,UNASSIGNED,<RESERVED>
+0DB3-0DBB,PVALID,SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA
+0DBC,UNASSIGNED,<RESERVED>
+0DBD,PVALID,SINHALA LETTER DANTAJA LAYANNA
+0DBE-0DBF,UNASSIGNED,<RESERVED>..<RESERVED>
+0DC0-0DC6,PVALID,SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA
+0DC7-0DC9,UNASSIGNED,<RESERVED>..<RESERVED>
+0DCA,PVALID,SINHALA SIGN AL-LAKUNA
+0DCB-0DCE,UNASSIGNED,<RESERVED>..<RESERVED>
+0DCF-0DD4,PVALID,SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD5,UNASSIGNED,<RESERVED>
+0DD6,PVALID,SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD7,UNASSIGNED,<RESERVED>
+0DD8-0DDF,PVALID,SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA
+0DE0-0DF1,UNASSIGNED,<RESERVED>..<RESERVED>
+0DF2-0DF3,PVALID,SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0DF4,DISALLOWED,SINHALA PUNCTUATION KUNDDALIYA
+0DF5-0E00,UNASSIGNED,<RESERVED>..<RESERVED>
+0E01-0E32,PVALID,THAI CHARACTER KO KAI..THAI CHARACTER SARA AA
+0E33,DISALLOWED,THAI CHARACTER SARA AM
+0E34-0E3A,PVALID,THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
+0E3B-0E3E,UNASSIGNED,<RESERVED>..<RESERVED>
+0E3F,DISALLOWED,THAI CURRENCY SYMBOL BAHT
+0E40-0E4E,PVALID,THAI CHARACTER SARA E..THAI CHARACTER YAMAKKAN
+0E4F,DISALLOWED,THAI CHARACTER FONGMAN
+0E50-0E59,PVALID,THAI DIGIT ZERO..THAI DIGIT NINE
+0E5A-0E5B,DISALLOWED,THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT
+0E5C-0E80,UNASSIGNED,<RESERVED>..<RESERVED>
+0E81-0E82,PVALID,LAO LETTER KO..LAO LETTER KHO SUNG
+0E83,UNASSIGNED,<RESERVED>
+0E84,PVALID,LAO LETTER KHO TAM
+0E85-0E86,UNASSIGNED,<RESERVED>..<RESERVED>
+0E87-0E88,PVALID,LAO LETTER NGO..LAO LETTER CO
+0E89,UNASSIGNED,<RESERVED>
+0E8A,PVALID,LAO LETTER SO TAM
+0E8B-0E8C,UNASSIGNED,<RESERVED>..<RESERVED>
+0E8D,PVALID,LAO LETTER NYO
+0E8E-0E93,UNASSIGNED,<RESERVED>..<RESERVED>
+0E94-0E97,PVALID,LAO LETTER DO..LAO LETTER THO TAM
+0E98,UNASSIGNED,<RESERVED>
+0E99-0E9F,PVALID,LAO LETTER NO..LAO LETTER FO SUNG
+0EA0,UNASSIGNED,<RESERVED>
+0EA1-0EA3,PVALID,LAO LETTER MO..LAO LETTER LO LING
+0EA4,UNASSIGNED,<RESERVED>
+0EA5,PVALID,LAO LETTER LO LOOT
+0EA6,UNASSIGNED,<RESERVED>
+0EA7,PVALID,LAO LETTER WO
+0EA8-0EA9,UNASSIGNED,<RESERVED>..<RESERVED>
+0EAA-0EAB,PVALID,LAO LETTER SO SUNG..LAO LETTER HO SUNG
+0EAC,UNASSIGNED,<RESERVED>
+0EAD-0EB2,PVALID,LAO LETTER O..LAO VOWEL SIGN AA
+0EB3,DISALLOWED,LAO VOWEL SIGN AM
+0EB4-0EB9,PVALID,LAO VOWEL SIGN I..LAO VOWEL SIGN UU
+0EBA,UNASSIGNED,<RESERVED>
+0EBB-0EBD,PVALID,LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN NYO
+0EBE-0EBF,UNASSIGNED,<RESERVED>..<RESERVED>
+0EC0-0EC4,PVALID,LAO VOWEL SIGN E..LAO VOWEL SIGN AI
+0EC5,UNASSIGNED,<RESERVED>
+0EC6,PVALID,LAO KO LA
+0EC7,UNASSIGNED,<RESERVED>
+0EC8-0ECD,PVALID,LAO TONE MAI EK..LAO NIGGAHITA
+0ECE-0ECF,UNASSIGNED,<RESERVED>..<RESERVED>
+0ED0-0ED9,PVALID,LAO DIGIT ZERO..LAO DIGIT NINE
+0EDA-0EDB,UNASSIGNED,<RESERVED>..<RESERVED>
+0EDC-0EDD,DISALLOWED,LAO HO NO..LAO HO MO
+0EDE-0EFF,UNASSIGNED,<RESERVED>..<RESERVED>
+0F00,PVALID,TIBETAN SYLLABLE OM
+0F01-0F0A,DISALLOWED,TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK BKA- SHOG YIG MGO
+0F0B,PVALID,TIBETAN MARK INTERSYLLABIC TSHEG
+0F0C-0F17,DISALLOWED,TIBETAN MARK DELIMITER TSHEG BSTAR..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
+0F18-0F19,PVALID,TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F1A-0F1F,DISALLOWED,TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG
+0F20-0F29,PVALID,TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE
+0F2A-0F34,DISALLOWED,TIBETAN DIGIT HALF ONE..TIBETAN MARK BSDUS RTAGS
+0F35,PVALID,TIBETAN MARK NGAS BZUNG NYI ZLA
+0F36,DISALLOWED,TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
+0F37,PVALID,TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F38,DISALLOWED,TIBETAN MARK CHE MGO
+0F39,PVALID,TIBETAN MARK TSA -PHRU
+0F3A-0F3D,DISALLOWED,TIBETAN MARK GUG RTAGS GYON..TIBETAN MARK ANG KHANG GYAS
+0F3E-0F42,PVALID,TIBETAN SIGN YAR TSHES..TIBETAN LETTER GA
+0F43,DISALLOWED,TIBETAN LETTER GHA
+0F44-0F47,PVALID,TIBETAN LETTER NGA..TIBETAN LETTER JA
+0F48,UNASSIGNED,<RESERVED>
+0F49-0F4C,PVALID,TIBETAN LETTER NYA..TIBETAN LETTER DDA
+0F4D,DISALLOWED,TIBETAN LETTER DDHA
+0F4E-0F51,PVALID,TIBETAN LETTER NNA..TIBETAN LETTER DA
+0F52,DISALLOWED,TIBETAN LETTER DHA
+0F53-0F56,PVALID,TIBETAN LETTER NA..TIBETAN LETTER BA
+0F57,DISALLOWED,TIBETAN LETTER BHA
+0F58-0F5B,PVALID,TIBETAN LETTER MA..TIBETAN LETTER DZA
+0F5C,DISALLOWED,TIBETAN LETTER DZHA
+0F5D-0F68,PVALID,TIBETAN LETTER WA..TIBETAN LETTER A
+0F69,DISALLOWED,TIBETAN LETTER KSSA
+0F6A-0F6C,PVALID,TIBETAN LETTER FIXED-FORM RA..TIBETAN LETTER RRA
+0F6D-0F70,UNASSIGNED,<RESERVED>..<RESERVED>
+0F71-0F72,PVALID,TIBETAN VOWEL SIGN AA..TIBETAN VOWEL SIGN I
+0F73,DISALLOWED,TIBETAN VOWEL SIGN II
+0F74,PVALID,TIBETAN VOWEL SIGN U
+0F75-0F79,DISALLOWED,TIBETAN VOWEL SIGN UU..TIBETAN VOWEL SIGN VOCALIC LL
+0F7A-0F80,PVALID,TIBETAN VOWEL SIGN E..TIBETAN VOWEL SIGN REVERSED I
+0F81,DISALLOWED,TIBETAN VOWEL SIGN REVERSED II
+0F82-0F84,PVALID,TIBETAN SIGN NYI ZLA NAA DA..TIBETAN MARK HALANTA
+0F85,DISALLOWED,TIBETAN MARK PALUTA
+0F86-0F8B,PVALID,TIBETAN SIGN LCI RTAGS..TIBETAN SIGN GRU MED RGYINGS
+0F8C-0F8F,UNASSIGNED,<RESERVED>..<RESERVED>
+0F90-0F92,PVALID,TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER GA
+0F93,DISALLOWED,TIBETAN SUBJOINED LETTER GHA
+0F94-0F97,PVALID,TIBETAN SUBJOINED LETTER NGA..TIBETAN SUBJOINED LETTER JA
+0F98,UNASSIGNED,<RESERVED>
+0F99-0F9C,PVALID,TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER DDA
+0F9D,DISALLOWED,TIBETAN SUBJOINED LETTER DDHA
+0F9E-0FA1,PVALID,TIBETAN SUBJOINED LETTER NNA..TIBETAN SUBJOINED LETTER DA
+0FA2,DISALLOWED,TIBETAN SUBJOINED LETTER DHA
+0FA3-0FA6,PVALID,TIBETAN SUBJOINED LETTER NA..TIBETAN SUBJOINED LETTER BA
+0FA7,DISALLOWED,TIBETAN SUBJOINED LETTER BHA
+0FA8-0FAB,PVALID,TIBETAN SUBJOINED LETTER MA..TIBETAN SUBJOINED LETTER DZA
+0FAC,DISALLOWED,TIBETAN SUBJOINED LETTER DZHA
+0FAD-0FB8,PVALID,TIBETAN SUBJOINED LETTER WA..TIBETAN SUBJOINED LETTER A
+0FB9,DISALLOWED,TIBETAN SUBJOINED LETTER KSSA
+0FBA-0FBC,PVALID,TIBETAN SUBJOINED LETTER FIXED-FORM WA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FBD,UNASSIGNED,<RESERVED>
+0FBE-0FC5,DISALLOWED,TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE
+0FC6,PVALID,TIBETAN SYMBOL PADMA GDAN
+0FC7-0FCC,DISALLOWED,TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL
+0FCD,UNASSIGNED,<RESERVED>
+0FCE-0FD8,DISALLOWED,TIBETAN SIGN RDEL NAG RDEL DKAR..LEFT-FACING SVASTI SIGN WITH DOTS
+0FD9-0FFF,UNASSIGNED,<RESERVED>..<RESERVED>
+1000-1049,PVALID,MYANMAR LETTER KA..MYANMAR DIGIT NINE
+104A-104F,DISALLOWED,MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE
+1050-109D,PVALID,MYANMAR LETTER SHA..MYANMAR VOWEL SIGN AITON AI
+109E-10C5,DISALLOWED,MYANMAR SYMBOL SHAN ONE..GEORGIAN CAPITAL LETTER HOE
+10C6-10CF,UNASSIGNED,<RESERVED>..<RESERVED>
+10D0-10FA,PVALID,GEORGIAN LETTER AN..GEORGIAN LETTER AIN
+10FB-10FC,DISALLOWED,GEORGIAN PARAGRAPH SEPARATOR..MODIFIER LETTER GEORGIAN NAR
+10FD-10FF,UNASSIGNED,<RESERVED>..<RESERVED>
+1100-11FF,DISALLOWED,HANGUL CHOSEONG KIYEOK..HANGUL JONGSEONG SSANGNIEUN
+1200-1248,PVALID,ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA
+1249,UNASSIGNED,<RESERVED>
+124A-124D,PVALID,ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE
+124E-124F,UNASSIGNED,<RESERVED>..<RESERVED>
+1250-1256,PVALID,ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO
+1257,UNASSIGNED,<RESERVED>
+1258,PVALID,ETHIOPIC SYLLABLE QHWA
+1259,UNASSIGNED,<RESERVED>
+125A-125D,PVALID,ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE
+125E-125F,UNASSIGNED,<RESERVED>..<RESERVED>
+1260-1288,PVALID,ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA
+1289,UNASSIGNED,<RESERVED>
+128A-128D,PVALID,ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE
+128E-128F,UNASSIGNED,<RESERVED>..<RESERVED>
+1290-12B0,PVALID,ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA
+12B1,UNASSIGNED,<RESERVED>
+12B2-12B5,PVALID,ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE
+12B6-12B7,UNASSIGNED,<RESERVED>..<RESERVED>
+12B8-12BE,PVALID,ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO
+12BF,UNASSIGNED,<RESERVED>
+12C0,PVALID,ETHIOPIC SYLLABLE KXWA
+12C1,UNASSIGNED,<RESERVED>
+12C2-12C5,PVALID,ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE
+12C6-12C7,UNASSIGNED,<RESERVED>..<RESERVED>
+12C8-12D6,PVALID,ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O
+12D7,UNASSIGNED,<RESERVED>
+12D8-1310,PVALID,ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA
+1311,UNASSIGNED,<RESERVED>
+1312-1315,PVALID,ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE
+1316-1317,UNASSIGNED,<RESERVED>..<RESERVED>
+1318-135A,PVALID,ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA
+135B-135E,UNASSIGNED,<RESERVED>..<RESERVED>
+135F,PVALID,ETHIOPIC COMBINING GEMINATION MARK
+1360-137C,DISALLOWED,ETHIOPIC SECTION MARK..ETHIOPIC NUMBER TEN THOUSAND
+137D-137F,UNASSIGNED,<RESERVED>..<RESERVED>
+1380-138F,PVALID,ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE
+1390-1399,DISALLOWED,ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT
+139A-139F,UNASSIGNED,<RESERVED>..<RESERVED>
+13A0-13F4,PVALID,CHEROKEE LETTER A..CHEROKEE LETTER YV
+13F5-13FF,UNASSIGNED,<RESERVED>..<RESERVED>
+1400,DISALLOWED,CANADIAN SYLLABICS HYPHEN
+1401-166C,PVALID,CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA
+166D-166E,DISALLOWED,CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP
+166F-167F,PVALID,CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W
+1680,DISALLOWED,OGHAM SPACE MARK
+1681-169A,PVALID,OGHAM LETTER BEITH..OGHAM LETTER PEITH
+169B-169C,DISALLOWED,OGHAM FEATHER MARK..OGHAM REVERSED FEATHER MARK
+169D-169F,UNASSIGNED,<RESERVED>..<RESERVED>
+16A0-16EA,PVALID,RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X
+16EB-16F0,DISALLOWED,RUNIC SINGLE PUNCTUATION..RUNIC BELGTHOR SYMBOL
+16F1-16FF,UNASSIGNED,<RESERVED>..<RESERVED>
+1700-170C,PVALID,TAGALOG LETTER A..TAGALOG LETTER YA
+170D,UNASSIGNED,<RESERVED>
+170E-1714,PVALID,TAGALOG LETTER LA..TAGALOG SIGN VIRAMA
+1715-171F,UNASSIGNED,<RESERVED>..<RESERVED>
+1720-1734,PVALID,HANUNOO LETTER A..HANUNOO SIGN PAMUDPOD
+1735-1736,DISALLOWED,PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION
+1737-173F,UNASSIGNED,<RESERVED>..<RESERVED>
+1740-1753,PVALID,BUHID LETTER A..BUHID VOWEL SIGN U
+1754-175F,UNASSIGNED,<RESERVED>..<RESERVED>
+1760-176C,PVALID,TAGBANWA LETTER A..TAGBANWA LETTER YA
+176D,UNASSIGNED,<RESERVED>
+176E-1770,PVALID,TAGBANWA LETTER LA..TAGBANWA LETTER SA
+1771,UNASSIGNED,<RESERVED>
+1772-1773,PVALID,TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
+1774-177F,UNASSIGNED,<RESERVED>..<RESERVED>
+1780-17B3,PVALID,KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU
+17B4-17B5,DISALLOWED,KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
+17B6-17D3,PVALID,KHMER VOWEL SIGN AA..KHMER SIGN BATHAMASAT
+17D4-17D6,DISALLOWED,KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH
+17D7,PVALID,KHMER SIGN LEK TOO
+17D8-17DB,DISALLOWED,KHMER SIGN BEYYAL..KHMER CURRENCY SYMBOL RIEL
+17DC-17DD,PVALID,KHMER SIGN AVAKRAHASANYA..KHMER SIGN ATTHACAN
+17DE-17DF,UNASSIGNED,<RESERVED>..<RESERVED>
+17E0-17E9,PVALID,KHMER DIGIT ZERO..KHMER DIGIT NINE
+17EA-17EF,UNASSIGNED,<RESERVED>..<RESERVED>
+17F0-17F9,DISALLOWED,KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON
+17FA-17FF,UNASSIGNED,<RESERVED>..<RESERVED>
+1800-180E,DISALLOWED,MONGOLIAN BIRGA..MONGOLIAN VOWEL SEPARATOR
+180F,UNASSIGNED,<RESERVED>
+1810-1819,PVALID,MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE
+181A-181F,UNASSIGNED,<RESERVED>..<RESERVED>
+1820-1877,PVALID,MONGOLIAN LETTER A..MONGOLIAN LETTER MANCHU ZHA
+1878-187F,UNASSIGNED,<RESERVED>..<RESERVED>
+1880-18AA,PVALID,MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI LHA
+18AB-18AF,UNASSIGNED,<RESERVED>..<RESERVED>
+18B0-18F5,PVALID,CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S
+18F6-18FF,UNASSIGNED,<RESERVED>..<RESERVED>
+1900-191C,PVALID,LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA
+191D-191F,UNASSIGNED,<RESERVED>..<RESERVED>
+1920-192B,PVALID,LIMBU VOWEL SIGN A..LIMBU SUBJOINED LETTER WA
+192C-192F,UNASSIGNED,<RESERVED>..<RESERVED>
+1930-193B,PVALID,LIMBU SMALL LETTER KA..LIMBU SIGN SA-I
+193C-193F,UNASSIGNED,<RESERVED>..<RESERVED>
+1940,DISALLOWED,LIMBU SIGN LOO
+1941-1943,UNASSIGNED,<RESERVED>..<RESERVED>
+1944-1945,DISALLOWED,LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK
+1946-196D,PVALID,LIMBU DIGIT ZERO..TAI LE LETTER AI
+196E-196F,UNASSIGNED,<RESERVED>..<RESERVED>
+1970-1974,PVALID,TAI LE LETTER TONE-2..TAI LE LETTER TONE-6
+1975-197F,UNASSIGNED,<RESERVED>..<RESERVED>
+1980-19AB,PVALID,NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA
+19AC-19AF,UNASSIGNED,<RESERVED>..<RESERVED>
+19B0-19C9,PVALID,NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2
+19CA-19CF,UNASSIGNED,<RESERVED>..<RESERVED>
+19D0-19DA,PVALID,NEW TAI LUE DIGIT ZERO..NEW TAI LUE THAM DIGIT ONE
+19DB-19DD,UNASSIGNED,<RESERVED>..<RESERVED>
+19DE-19FF,DISALLOWED,NEW TAI LUE SIGN LAE..KHMER SYMBOL DAP-PRAM ROC
+1A00-1A1B,PVALID,BUGINESE LETTER KA..BUGINESE VOWEL SIGN AE
+1A1C-1A1D,UNASSIGNED,<RESERVED>..<RESERVED>
+1A1E-1A1F,DISALLOWED,BUGINESE PALLAWA..BUGINESE END OF SECTION
+1A20-1A5E,PVALID,TAI THAM LETTER HIGH KA..TAI THAM CONSONANT SIGN SA
+1A5F,UNASSIGNED,<RESERVED>
+1A60-1A7C,PVALID,TAI THAM SIGN SAKOT..TAI THAM SIGN KHUEN-LUE KARAN
+1A7D-1A7E,UNASSIGNED,<RESERVED>..<RESERVED>
+1A7F-1A89,PVALID,TAI THAM COMBINING CRYPTOGRAMMIC DOT..TAI THAM HORA DIGIT NINE
+1A8A-1A8F,UNASSIGNED,<RESERVED>..<RESERVED>
+1A90-1A99,PVALID,TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE
+1A9A-1A9F,UNASSIGNED,<RESERVED>..<RESERVED>
+1AA0-1AA6,DISALLOWED,TAI THAM SIGN WIANG..TAI THAM SIGN REVERSED ROTATED RANA
+1AA7,PVALID,TAI THAM SIGN MAI YAMOK
+1AA8-1AAD,DISALLOWED,TAI THAM SIGN KAAN..TAI THAM SIGN CAANG
+1AAE-1AFF,UNASSIGNED,<RESERVED>..<RESERVED>
+1B00-1B4B,PVALID,BALINESE SIGN ULU RICEM..BALINESE LETTER ASYURA SASAK
+1B4C-1B4F,UNASSIGNED,<RESERVED>..<RESERVED>
+1B50-1B59,PVALID,BALINESE DIGIT ZERO..BALINESE DIGIT NINE
+1B5A-1B6A,DISALLOWED,BALINESE PANTI..BALINESE MUSICAL SYMBOL DANG GEDE
+1B6B-1B73,PVALID,BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG
+1B74-1B7C,DISALLOWED,BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING
+1B7D-1B7F,UNASSIGNED,<RESERVED>..<RESERVED>
+1B80-1BAA,PVALID,SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PAMAAEH
+1BAB-1BAD,UNASSIGNED,<RESERVED>..<RESERVED>
+1BAE-1BB9,PVALID,SUNDANESE LETTER KHA..SUNDANESE DIGIT NINE
+1BBA-1BFF,UNASSIGNED,<RESERVED>..<RESERVED>
+1C00-1C37,PVALID,LEPCHA LETTER KA..LEPCHA SIGN NUKTA
+1C38-1C3A,UNASSIGNED,<RESERVED>..<RESERVED>
+1C3B-1C3F,DISALLOWED,LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK
+1C40-1C49,PVALID,LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE
+1C4A-1C4C,UNASSIGNED,<RESERVED>..<RESERVED>
+1C4D-1C7D,PVALID,LEPCHA LETTER TTA..OL CHIKI AHAD
+1C7E-1C7F,DISALLOWED,OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD
+1C80-1CCF,UNASSIGNED,<RESERVED>..<RESERVED>
+1CD0-1CD2,PVALID,VEDIC TONE KARSHANA..VEDIC TONE PRENKHA
+1CD3,DISALLOWED,VEDIC SIGN NIHSHVASA
+1CD4-1CF2,PVALID,VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC SIGN ARDHAVISARGA
+1CF3-1CFF,UNASSIGNED,<RESERVED>..<RESERVED>
+1D00-1D2B,PVALID,LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL
+1D2C-1D2E,DISALLOWED,MODIFIER LETTER CAPITAL A..MODIFIER LETTER CAPITAL B
+1D2F,PVALID,MODIFIER LETTER CAPITAL BARRED B
+1D30-1D3A,DISALLOWED,MODIFIER LETTER CAPITAL D..MODIFIER LETTER CAPITAL N
+1D3B,PVALID,MODIFIER LETTER CAPITAL REVERSED N
+1D3C-1D4D,DISALLOWED,MODIFIER LETTER CAPITAL O..MODIFIER LETTER SMALL G
+1D4E,PVALID,MODIFIER LETTER SMALL TURNED I
+1D4F-1D6A,DISALLOWED,MODIFIER LETTER SMALL K..GREEK SUBSCRIPT SMALL LETTER CHI
+1D6B-1D77,PVALID,LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G
+1D78,DISALLOWED,MODIFIER LETTER CYRILLIC EN
+1D79-1D9A,PVALID,LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+1D9B-1DBF,DISALLOWED,MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA
+1DC0-1DE6,PVALID,COMBINING DOTTED GRAVE ACCENT..COMBINING LATIN SMALL LETTER Z
+1DE7-1DFC,UNASSIGNED,<RESERVED>..<RESERVED>
+1DFD-1DFF,PVALID,COMBINING ALMOST EQUAL TO BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+1E00,DISALLOWED,LATIN CAPITAL LETTER A WITH RING BELOW
+1E01,PVALID,LATIN SMALL LETTER A WITH RING BELOW
+1E02,DISALLOWED,LATIN CAPITAL LETTER B WITH DOT ABOVE
+1E03,PVALID,LATIN SMALL LETTER B WITH DOT ABOVE
+1E04,DISALLOWED,LATIN CAPITAL LETTER B WITH DOT BELOW
+1E05,PVALID,LATIN SMALL LETTER B WITH DOT BELOW
+1E06,DISALLOWED,LATIN CAPITAL LETTER B WITH LINE BELOW
+1E07,PVALID,LATIN SMALL LETTER B WITH LINE BELOW
+1E08,DISALLOWED,LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+1E09,PVALID,LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+1E0A,DISALLOWED,LATIN CAPITAL LETTER D WITH DOT ABOVE
+1E0B,PVALID,LATIN SMALL LETTER D WITH DOT ABOVE
+1E0C,DISALLOWED,LATIN CAPITAL LETTER D WITH DOT BELOW
+1E0D,PVALID,LATIN SMALL LETTER D WITH DOT BELOW
+1E0E,DISALLOWED,LATIN CAPITAL LETTER D WITH LINE BELOW
+1E0F,PVALID,LATIN SMALL LETTER D WITH LINE BELOW
+1E10,DISALLOWED,LATIN CAPITAL LETTER D WITH CEDILLA
+1E11,PVALID,LATIN SMALL LETTER D WITH CEDILLA
+1E12,DISALLOWED,LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+1E13,PVALID,LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+1E14,DISALLOWED,LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+1E15,PVALID,LATIN SMALL LETTER E WITH MACRON AND GRAVE
+1E16,DISALLOWED,LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+1E17,PVALID,LATIN SMALL LETTER E WITH MACRON AND ACUTE
+1E18,DISALLOWED,LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+1E19,PVALID,LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+1E1A,DISALLOWED,LATIN CAPITAL LETTER E WITH TILDE BELOW
+1E1B,PVALID,LATIN SMALL LETTER E WITH TILDE BELOW
+1E1C,DISALLOWED,LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+1E1D,PVALID,LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+1E1E,DISALLOWED,LATIN CAPITAL LETTER F WITH DOT ABOVE
+1E1F,PVALID,LATIN SMALL LETTER F WITH DOT ABOVE
+1E20,DISALLOWED,LATIN CAPITAL LETTER G WITH MACRON
+1E21,PVALID,LATIN SMALL LETTER G WITH MACRON
+1E22,DISALLOWED,LATIN CAPITAL LETTER H WITH DOT ABOVE
+1E23,PVALID,LATIN SMALL LETTER H WITH DOT ABOVE
+1E24,DISALLOWED,LATIN CAPITAL LETTER H WITH DOT BELOW
+1E25,PVALID,LATIN SMALL LETTER H WITH DOT BELOW
+1E26,DISALLOWED,LATIN CAPITAL LETTER H WITH DIAERESIS
+1E27,PVALID,LATIN SMALL LETTER H WITH DIAERESIS
+1E28,DISALLOWED,LATIN CAPITAL LETTER H WITH CEDILLA
+1E29,PVALID,LATIN SMALL LETTER H WITH CEDILLA
+1E2A,DISALLOWED,LATIN CAPITAL LETTER H WITH BREVE BELOW
+1E2B,PVALID,LATIN SMALL LETTER H WITH BREVE BELOW
+1E2C,DISALLOWED,LATIN CAPITAL LETTER I WITH TILDE BELOW
+1E2D,PVALID,LATIN SMALL LETTER I WITH TILDE BELOW
+1E2E,DISALLOWED,LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+1E2F,PVALID,LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+1E30,DISALLOWED,LATIN CAPITAL LETTER K WITH ACUTE
+1E31,PVALID,LATIN SMALL LETTER K WITH ACUTE
+1E32,DISALLOWED,LATIN CAPITAL LETTER K WITH DOT BELOW
+1E33,PVALID,LATIN SMALL LETTER K WITH DOT BELOW
+1E34,DISALLOWED,LATIN CAPITAL LETTER K WITH LINE BELOW
+1E35,PVALID,LATIN SMALL LETTER K WITH LINE BELOW
+1E36,DISALLOWED,LATIN CAPITAL LETTER L WITH DOT BELOW
+1E37,PVALID,LATIN SMALL LETTER L WITH DOT BELOW
+1E38,DISALLOWED,LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+1E39,PVALID,LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+1E3A,DISALLOWED,LATIN CAPITAL LETTER L WITH LINE BELOW
+1E3B,PVALID,LATIN SMALL LETTER L WITH LINE BELOW
+1E3C,DISALLOWED,LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+1E3D,PVALID,LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+1E3E,DISALLOWED,LATIN CAPITAL LETTER M WITH ACUTE
+1E3F,PVALID,LATIN SMALL LETTER M WITH ACUTE
+1E40,DISALLOWED,LATIN CAPITAL LETTER M WITH DOT ABOVE
+1E41,PVALID,LATIN SMALL LETTER M WITH DOT ABOVE
+1E42,DISALLOWED,LATIN CAPITAL LETTER M WITH DOT BELOW
+1E43,PVALID,LATIN SMALL LETTER M WITH DOT BELOW
+1E44,DISALLOWED,LATIN CAPITAL LETTER N WITH DOT ABOVE
+1E45,PVALID,LATIN SMALL LETTER N WITH DOT ABOVE
+1E46,DISALLOWED,LATIN CAPITAL LETTER N WITH DOT BELOW
+1E47,PVALID,LATIN SMALL LETTER N WITH DOT BELOW
+1E48,DISALLOWED,LATIN CAPITAL LETTER N WITH LINE BELOW
+1E49,PVALID,LATIN SMALL LETTER N WITH LINE BELOW
+1E4A,DISALLOWED,LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+1E4B,PVALID,LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+1E4C,DISALLOWED,LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+1E4D,PVALID,LATIN SMALL LETTER O WITH TILDE AND ACUTE
+1E4E,DISALLOWED,LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+1E4F,PVALID,LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+1E50,DISALLOWED,LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+1E51,PVALID,LATIN SMALL LETTER O WITH MACRON AND GRAVE
+1E52,DISALLOWED,LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+1E53,PVALID,LATIN SMALL LETTER O WITH MACRON AND ACUTE
+1E54,DISALLOWED,LATIN CAPITAL LETTER P WITH ACUTE
+1E55,PVALID,LATIN SMALL LETTER P WITH ACUTE
+1E56,DISALLOWED,LATIN CAPITAL LETTER P WITH DOT ABOVE
+1E57,PVALID,LATIN SMALL LETTER P WITH DOT ABOVE
+1E58,DISALLOWED,LATIN CAPITAL LETTER R WITH DOT ABOVE
+1E59,PVALID,LATIN SMALL LETTER R WITH DOT ABOVE
+1E5A,DISALLOWED,LATIN CAPITAL LETTER R WITH DOT BELOW
+1E5B,PVALID,LATIN SMALL LETTER R WITH DOT BELOW
+1E5C,DISALLOWED,LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+1E5D,PVALID,LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+1E5E,DISALLOWED,LATIN CAPITAL LETTER R WITH LINE BELOW
+1E5F,PVALID,LATIN SMALL LETTER R WITH LINE BELOW
+1E60,DISALLOWED,LATIN CAPITAL LETTER S WITH DOT ABOVE
+1E61,PVALID,LATIN SMALL LETTER S WITH DOT ABOVE
+1E62,DISALLOWED,LATIN CAPITAL LETTER S WITH DOT BELOW
+1E63,PVALID,LATIN SMALL LETTER S WITH DOT BELOW
+1E64,DISALLOWED,LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+1E65,PVALID,LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+1E66,DISALLOWED,LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+1E67,PVALID,LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+1E68,DISALLOWED,LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E69,PVALID,LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E6A,DISALLOWED,LATIN CAPITAL LETTER T WITH DOT ABOVE
+1E6B,PVALID,LATIN SMALL LETTER T WITH DOT ABOVE
+1E6C,DISALLOWED,LATIN CAPITAL LETTER T WITH DOT BELOW
+1E6D,PVALID,LATIN SMALL LETTER T WITH DOT BELOW
+1E6E,DISALLOWED,LATIN CAPITAL LETTER T WITH LINE BELOW
+1E6F,PVALID,LATIN SMALL LETTER T WITH LINE BELOW
+1E70,DISALLOWED,LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+1E71,PVALID,LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+1E72,DISALLOWED,LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+1E73,PVALID,LATIN SMALL LETTER U WITH DIAERESIS BELOW
+1E74,DISALLOWED,LATIN CAPITAL LETTER U WITH TILDE BELOW
+1E75,PVALID,LATIN SMALL LETTER U WITH TILDE BELOW
+1E76,DISALLOWED,LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+1E77,PVALID,LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+1E78,DISALLOWED,LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+1E79,PVALID,LATIN SMALL LETTER U WITH TILDE AND ACUTE
+1E7A,DISALLOWED,LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+1E7B,PVALID,LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+1E7C,DISALLOWED,LATIN CAPITAL LETTER V WITH TILDE
+1E7D,PVALID,LATIN SMALL LETTER V WITH TILDE
+1E7E,DISALLOWED,LATIN CAPITAL LETTER V WITH DOT BELOW
+1E7F,PVALID,LATIN SMALL LETTER V WITH DOT BELOW
+1E80,DISALLOWED,LATIN CAPITAL LETTER W WITH GRAVE
+1E81,PVALID,LATIN SMALL LETTER W WITH GRAVE
+1E82,DISALLOWED,LATIN CAPITAL LETTER W WITH ACUTE
+1E83,PVALID,LATIN SMALL LETTER W WITH ACUTE
+1E84,DISALLOWED,LATIN CAPITAL LETTER W WITH DIAERESIS
+1E85,PVALID,LATIN SMALL LETTER W WITH DIAERESIS
+1E86,DISALLOWED,LATIN CAPITAL LETTER W WITH DOT ABOVE
+1E87,PVALID,LATIN SMALL LETTER W WITH DOT ABOVE
+1E88,DISALLOWED,LATIN CAPITAL LETTER W WITH DOT BELOW
+1E89,PVALID,LATIN SMALL LETTER W WITH DOT BELOW
+1E8A,DISALLOWED,LATIN CAPITAL LETTER X WITH DOT ABOVE
+1E8B,PVALID,LATIN SMALL LETTER X WITH DOT ABOVE
+1E8C,DISALLOWED,LATIN CAPITAL LETTER X WITH DIAERESIS
+1E8D,PVALID,LATIN SMALL LETTER X WITH DIAERESIS
+1E8E,DISALLOWED,LATIN CAPITAL LETTER Y WITH DOT ABOVE
+1E8F,PVALID,LATIN SMALL LETTER Y WITH DOT ABOVE
+1E90,DISALLOWED,LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+1E91,PVALID,LATIN SMALL LETTER Z WITH CIRCUMFLEX
+1E92,DISALLOWED,LATIN CAPITAL LETTER Z WITH DOT BELOW
+1E93,PVALID,LATIN SMALL LETTER Z WITH DOT BELOW
+1E94,DISALLOWED,LATIN CAPITAL LETTER Z WITH LINE BELOW
+1E95-1E99,PVALID,LATIN SMALL LETTER Z WITH LINE BELOW..LATIN SMALL LETTER Y WITH RING ABOVE
+1E9A-1E9B,DISALLOWED,LATIN SMALL LETTER A WITH RIGHT HALF RING..LATIN SMALL LETTER LONG S WITH DOT ABOVE
+1E9C-1E9D,PVALID,LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE..LATIN SMALL LETTER LONG S WITH HIGH STROKE
+1E9E,DISALLOWED,LATIN CAPITAL LETTER SHARP S
+1E9F,PVALID,LATIN SMALL LETTER DELTA
+1EA0,DISALLOWED,LATIN CAPITAL LETTER A WITH DOT BELOW
+1EA1,PVALID,LATIN SMALL LETTER A WITH DOT BELOW
+1EA2,DISALLOWED,LATIN CAPITAL LETTER A WITH HOOK ABOVE
+1EA3,PVALID,LATIN SMALL LETTER A WITH HOOK ABOVE
+1EA4,DISALLOWED,LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA5,PVALID,LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA6,DISALLOWED,LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA7,PVALID,LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA8,DISALLOWED,LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EA9,PVALID,LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EAA,DISALLOWED,LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAB,PVALID,LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAC,DISALLOWED,LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAD,PVALID,LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAE,DISALLOWED,LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+1EAF,PVALID,LATIN SMALL LETTER A WITH BREVE AND ACUTE
+1EB0,DISALLOWED,LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+1EB1,PVALID,LATIN SMALL LETTER A WITH BREVE AND GRAVE
+1EB2,DISALLOWED,LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+1EB3,PVALID,LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+1EB4,DISALLOWED,LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+1EB5,PVALID,LATIN SMALL LETTER A WITH BREVE AND TILDE
+1EB6,DISALLOWED,LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+1EB7,PVALID,LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+1EB8,DISALLOWED,LATIN CAPITAL LETTER E WITH DOT BELOW
+1EB9,PVALID,LATIN SMALL LETTER E WITH DOT BELOW
+1EBA,DISALLOWED,LATIN CAPITAL LETTER E WITH HOOK ABOVE
+1EBB,PVALID,LATIN SMALL LETTER E WITH HOOK ABOVE
+1EBC,DISALLOWED,LATIN CAPITAL LETTER E WITH TILDE
+1EBD,PVALID,LATIN SMALL LETTER E WITH TILDE
+1EBE,DISALLOWED,LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EBF,PVALID,LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EC0,DISALLOWED,LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC1,PVALID,LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC2,DISALLOWED,LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC3,PVALID,LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC4,DISALLOWED,LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC5,PVALID,LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC6,DISALLOWED,LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC7,PVALID,LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC8,DISALLOWED,LATIN CAPITAL LETTER I WITH HOOK ABOVE
+1EC9,PVALID,LATIN SMALL LETTER I WITH HOOK ABOVE
+1ECA,DISALLOWED,LATIN CAPITAL LETTER I WITH DOT BELOW
+1ECB,PVALID,LATIN SMALL LETTER I WITH DOT BELOW
+1ECC,DISALLOWED,LATIN CAPITAL LETTER O WITH DOT BELOW
+1ECD,PVALID,LATIN SMALL LETTER O WITH DOT BELOW
+1ECE,DISALLOWED,LATIN CAPITAL LETTER O WITH HOOK ABOVE
+1ECF,PVALID,LATIN SMALL LETTER O WITH HOOK ABOVE
+1ED0,DISALLOWED,LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED1,PVALID,LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED2,DISALLOWED,LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED3,PVALID,LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED4,DISALLOWED,LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED5,PVALID,LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED6,DISALLOWED,LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED7,PVALID,LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED8,DISALLOWED,LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1ED9,PVALID,LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1EDA,DISALLOWED,LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+1EDB,PVALID,LATIN SMALL LETTER O WITH HORN AND ACUTE
+1EDC,DISALLOWED,LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+1EDD,PVALID,LATIN SMALL LETTER O WITH HORN AND GRAVE
+1EDE,DISALLOWED,LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+1EDF,PVALID,LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+1EE0,DISALLOWED,LATIN CAPITAL LETTER O WITH HORN AND TILDE
+1EE1,PVALID,LATIN SMALL LETTER O WITH HORN AND TILDE
+1EE2,DISALLOWED,LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+1EE3,PVALID,LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+1EE4,DISALLOWED,LATIN CAPITAL LETTER U WITH DOT BELOW
+1EE5,PVALID,LATIN SMALL LETTER U WITH DOT BELOW
+1EE6,DISALLOWED,LATIN CAPITAL LETTER U WITH HOOK ABOVE
+1EE7,PVALID,LATIN SMALL LETTER U WITH HOOK ABOVE
+1EE8,DISALLOWED,LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+1EE9,PVALID,LATIN SMALL LETTER U WITH HORN AND ACUTE
+1EEA,DISALLOWED,LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+1EEB,PVALID,LATIN SMALL LETTER U WITH HORN AND GRAVE
+1EEC,DISALLOWED,LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+1EED,PVALID,LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+1EEE,DISALLOWED,LATIN CAPITAL LETTER U WITH HORN AND TILDE
+1EEF,PVALID,LATIN SMALL LETTER U WITH HORN AND TILDE
+1EF0,DISALLOWED,LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+1EF1,PVALID,LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+1EF2,DISALLOWED,LATIN CAPITAL LETTER Y WITH GRAVE
+1EF3,PVALID,LATIN SMALL LETTER Y WITH GRAVE
+1EF4,DISALLOWED,LATIN CAPITAL LETTER Y WITH DOT BELOW
+1EF5,PVALID,LATIN SMALL LETTER Y WITH DOT BELOW
+1EF6,DISALLOWED,LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+1EF7,PVALID,LATIN SMALL LETTER Y WITH HOOK ABOVE
+1EF8,DISALLOWED,LATIN CAPITAL LETTER Y WITH TILDE
+1EF9,PVALID,LATIN SMALL LETTER Y WITH TILDE
+1EFA,DISALLOWED,LATIN CAPITAL LETTER MIDDLE-WELSH LL
+1EFB,PVALID,LATIN SMALL LETTER MIDDLE-WELSH LL
+1EFC,DISALLOWED,LATIN CAPITAL LETTER MIDDLE-WELSH V
+1EFD,PVALID,LATIN SMALL LETTER MIDDLE-WELSH V
+1EFE,DISALLOWED,LATIN CAPITAL LETTER Y WITH LOOP
+1EFF-1F07,PVALID,LATIN SMALL LETTER Y WITH LOOP..GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F08-1F0F,DISALLOWED,GREEK CAPITAL LETTER ALPHA WITH PSILI..GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F10-1F15,PVALID,GREEK SMALL LETTER EPSILON WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F16-1F17,UNASSIGNED,<RESERVED>..<RESERVED>
+1F18-1F1D,DISALLOWED,GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F1E-1F1F,UNASSIGNED,<RESERVED>..<RESERVED>
+1F20-1F27,PVALID,GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+1F28-1F2F,DISALLOWED,GREEK CAPITAL LETTER ETA WITH PSILI..GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+1F30-1F37,PVALID,GREEK SMALL LETTER IOTA WITH PSILI..GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F38-1F3F,DISALLOWED,GREEK CAPITAL LETTER IOTA WITH PSILI..GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F40-1F45,PVALID,GREEK SMALL LETTER OMICRON WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F46-1F47,UNASSIGNED,<RESERVED>..<RESERVED>
+1F48-1F4D,DISALLOWED,GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F4E-1F4F,UNASSIGNED,<RESERVED>..<RESERVED>
+1F50-1F57,PVALID,GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F58,UNASSIGNED,<RESERVED>
+1F59,DISALLOWED,GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5A,UNASSIGNED,<RESERVED>
+1F5B,DISALLOWED,GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5C,UNASSIGNED,<RESERVED>
+1F5D,DISALLOWED,GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5E,UNASSIGNED,<RESERVED>
+1F5F,DISALLOWED,GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F60-1F67,PVALID,GREEK SMALL LETTER OMEGA WITH PSILI..GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F68-1F6F,DISALLOWED,GREEK CAPITAL LETTER OMEGA WITH PSILI..GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F70,PVALID,GREEK SMALL LETTER ALPHA WITH VARIA
+1F71,DISALLOWED,GREEK SMALL LETTER ALPHA WITH OXIA
+1F72,PVALID,GREEK SMALL LETTER EPSILON WITH VARIA
+1F73,DISALLOWED,GREEK SMALL LETTER EPSILON WITH OXIA
+1F74,PVALID,GREEK SMALL LETTER ETA WITH VARIA
+1F75,DISALLOWED,GREEK SMALL LETTER ETA WITH OXIA
+1F76,PVALID,GREEK SMALL LETTER IOTA WITH VARIA
+1F77,DISALLOWED,GREEK SMALL LETTER IOTA WITH OXIA
+1F78,PVALID,GREEK SMALL LETTER OMICRON WITH VARIA
+1F79,DISALLOWED,GREEK SMALL LETTER OMICRON WITH OXIA
+1F7A,PVALID,GREEK SMALL LETTER UPSILON WITH VARIA
+1F7B,DISALLOWED,GREEK SMALL LETTER UPSILON WITH OXIA
+1F7C,PVALID,GREEK SMALL LETTER OMEGA WITH VARIA
+1F7D,DISALLOWED,GREEK SMALL LETTER OMEGA WITH OXIA
+1F7E-1F7F,UNASSIGNED,<RESERVED>..<RESERVED>
+1F80-1FAF,DISALLOWED,GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FB0-1FB1,PVALID,GREEK SMALL LETTER ALPHA WITH VRACHY..GREEK SMALL LETTER ALPHA WITH MACRON
+1FB2-1FB4,DISALLOWED,GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB5,UNASSIGNED,<RESERVED>
+1FB6,PVALID,GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+1FB7-1FC4,DISALLOWED,GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC5,UNASSIGNED,<RESERVED>
+1FC6,PVALID,GREEK SMALL LETTER ETA WITH PERISPOMENI
+1FC7-1FCF,DISALLOWED,GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI..GREEK PSILI AND PERISPOMENI
+1FD0-1FD2,PVALID,GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+1FD3,DISALLOWED,GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD4-1FD5,UNASSIGNED,<RESERVED>..<RESERVED>
+1FD6-1FD7,PVALID,GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+1FD8-1FDB,DISALLOWED,GREEK CAPITAL LETTER IOTA WITH VRACHY..GREEK CAPITAL LETTER IOTA WITH OXIA
+1FDC,UNASSIGNED,<RESERVED>
+1FDD-1FDF,DISALLOWED,GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI
+1FE0-1FE2,PVALID,GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+1FE3,DISALLOWED,GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+1FE4-1FE7,PVALID,GREEK SMALL LETTER RHO WITH PSILI..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+1FE8-1FEF,DISALLOWED,GREEK CAPITAL LETTER UPSILON WITH VRACHY..GREEK VARIA
+1FF0-1FF1,UNASSIGNED,<RESERVED>..<RESERVED>
+1FF2-1FF4,DISALLOWED,GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF5,UNASSIGNED,<RESERVED>
+1FF6,PVALID,GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+1FF7-1FFE,DISALLOWED,GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI..GREEK DASIA
+1FFF,UNASSIGNED,<RESERVED>
+2000-200B,DISALLOWED,EN QUAD..ZERO WIDTH SPACE
+200C-200D,CONTEXTJ,ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER
+200E-2064,DISALLOWED,LEFT-TO-RIGHT MARK..INVISIBLE PLUS
+2065-2069,UNASSIGNED,<RESERVED>..<RESERVED>
+206A-2071,DISALLOWED,INHIBIT SYMMETRIC SWAPPING..SUPERSCRIPT LATIN SMALL LETTER I
+2072-2073,UNASSIGNED,<RESERVED>..<RESERVED>
+2074-208E,DISALLOWED,SUPERSCRIPT FOUR..SUBSCRIPT RIGHT PARENTHESIS
+208F,UNASSIGNED,<RESERVED>
+2090-2094,DISALLOWED,LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA
+2095-209F,UNASSIGNED,<RESERVED>..<RESERVED>
+20A0-20B8,DISALLOWED,EURO-CURRENCY SIGN..TENGE SIGN
+20B9-20CF,UNASSIGNED,<RESERVED>..<RESERVED>
+20D0-20F0,DISALLOWED,COMBINING LEFT HARPOON ABOVE..COMBINING ASTERISK ABOVE
+20F1-20FF,UNASSIGNED,<RESERVED>..<RESERVED>
+2100-214D,DISALLOWED,ACCOUNT OF..AKTIESELSKAB
+214E,PVALID,TURNED SMALL F
+214F-2183,DISALLOWED,SYMBOL FOR SAMARITAN SOURCE..ROMAN NUMERAL REVERSED ONE HUNDRED
+2184,PVALID,LATIN SMALL LETTER REVERSED C
+2185-2189,DISALLOWED,ROMAN NUMERAL SIX LATE FORM..VULGAR FRACTION ZERO THIRDS
+218A-218F,UNASSIGNED,<RESERVED>..<RESERVED>
+2190-23E8,DISALLOWED,LEFTWARDS ARROW..DECIMAL EXPONENT SYMBOL
+23E9-23FF,UNASSIGNED,<RESERVED>..<RESERVED>
+2400-2426,DISALLOWED,SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO
+2427-243F,UNASSIGNED,<RESERVED>..<RESERVED>
+2440-244A,DISALLOWED,OCR HOOK..OCR DOUBLE BACKSLASH
+244B-245F,UNASSIGNED,<RESERVED>..<RESERVED>
+2460-26CD,DISALLOWED,CIRCLED DIGIT ONE..DISABLED CAR
+26CE,UNASSIGNED,<RESERVED>
+26CF-26E1,DISALLOWED,PICK..RESTRICTED LEFT ENTRY-2
+26E2,UNASSIGNED,<RESERVED>
+26E3,DISALLOWED,HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE
+26E4-26E7,UNASSIGNED,<RESERVED>..<RESERVED>
+26E8-26FF,DISALLOWED,BLACK CROSS ON SHIELD..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE
+2700,UNASSIGNED,<RESERVED>
+2701-2704,DISALLOWED,UPPER BLADE SCISSORS..WHITE SCISSORS
+2705,UNASSIGNED,<RESERVED>
+2706-2709,DISALLOWED,TELEPHONE LOCATION SIGN..ENVELOPE
+270A-270B,UNASSIGNED,<RESERVED>..<RESERVED>
+270C-2727,DISALLOWED,VICTORY HAND..WHITE FOUR POINTED STAR
+2728,UNASSIGNED,<RESERVED>
+2729-274B,DISALLOWED,STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274C,UNASSIGNED,<RESERVED>
+274D,DISALLOWED,SHADOWED WHITE CIRCLE
+274E,UNASSIGNED,<RESERVED>
+274F-2752,DISALLOWED,LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE
+2753-2755,UNASSIGNED,<RESERVED>..<RESERVED>
+2756-275E,DISALLOWED,BLACK DIAMOND MINUS WHITE X..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+275F-2760,UNASSIGNED,<RESERVED>..<RESERVED>
+2761-2794,DISALLOWED,CURVED STEM PARAGRAPH SIGN ORNAMENT..HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2795-2797,UNASSIGNED,<RESERVED>..<RESERVED>
+2798-27AF,DISALLOWED,HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B0,UNASSIGNED,<RESERVED>
+27B1-27BE,DISALLOWED,NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW
+27BF,UNASSIGNED,<RESERVED>
+27C0-27CA,DISALLOWED,THREE DIMENSIONAL ANGLE..VERTICAL BAR WITH HORIZONTAL STROKE
+27CB,UNASSIGNED,<RESERVED>
+27CC,DISALLOWED,LONG DIVISION
+27CD-27CF,UNASSIGNED,<RESERVED>..<RESERVED>
+27D0-2B4C,DISALLOWED,WHITE DIAMOND WITH CENTRED DOT..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
+2B4D-2B4F,UNASSIGNED,<RESERVED>..<RESERVED>
+2B50-2B59,DISALLOWED,WHITE MEDIUM STAR..HEAVY CIRCLED SALTIRE
+2B5A-2BFF,UNASSIGNED,<RESERVED>..<RESERVED>
+2C00-2C2E,DISALLOWED,GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C2F,UNASSIGNED,<RESERVED>
+2C30-2C5E,PVALID,GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+2C5F,UNASSIGNED,<RESERVED>
+2C60,DISALLOWED,LATIN CAPITAL LETTER L WITH DOUBLE BAR
+2C61,PVALID,LATIN SMALL LETTER L WITH DOUBLE BAR
+2C62-2C64,DISALLOWED,LATIN CAPITAL LETTER L WITH MIDDLE TILDE..LATIN CAPITAL LETTER R WITH TAIL
+2C65-2C66,PVALID,LATIN SMALL LETTER A WITH STROKE..LATIN SMALL LETTER T WITH DIAGONAL STROKE
+2C67,DISALLOWED,LATIN CAPITAL LETTER H WITH DESCENDER
+2C68,PVALID,LATIN SMALL LETTER H WITH DESCENDER
+2C69,DISALLOWED,LATIN CAPITAL LETTER K WITH DESCENDER
+2C6A,PVALID,LATIN SMALL LETTER K WITH DESCENDER
+2C6B,DISALLOWED,LATIN CAPITAL LETTER Z WITH DESCENDER
+2C6C,PVALID,LATIN SMALL LETTER Z WITH DESCENDER
+2C6D-2C70,DISALLOWED,LATIN CAPITAL LETTER ALPHA..LATIN CAPITAL LETTER TURNED ALPHA
+2C71,PVALID,LATIN SMALL LETTER V WITH RIGHT HOOK
+2C72,DISALLOWED,LATIN CAPITAL LETTER W WITH HOOK
+2C73-2C74,PVALID,LATIN SMALL LETTER W WITH HOOK..LATIN SMALL LETTER V WITH CURL
+2C75,DISALLOWED,LATIN CAPITAL LETTER HALF H
+2C76-2C7B,PVALID,LATIN SMALL LETTER HALF H..LATIN LETTER SMALL CAPITAL TURNED E
+2C7C-2C80,DISALLOWED,LATIN SUBSCRIPT SMALL LETTER J..COPTIC CAPITAL LETTER ALFA
+2C81,PVALID,COPTIC SMALL LETTER ALFA
+2C82,DISALLOWED,COPTIC CAPITAL LETTER VIDA
+2C83,PVALID,COPTIC SMALL LETTER VIDA
+2C84,DISALLOWED,COPTIC CAPITAL LETTER GAMMA
+2C85,PVALID,COPTIC SMALL LETTER GAMMA
+2C86,DISALLOWED,COPTIC CAPITAL LETTER DALDA
+2C87,PVALID,COPTIC SMALL LETTER DALDA
+2C88,DISALLOWED,COPTIC CAPITAL LETTER EIE
+2C89,PVALID,COPTIC SMALL LETTER EIE
+2C8A,DISALLOWED,COPTIC CAPITAL LETTER SOU
+2C8B,PVALID,COPTIC SMALL LETTER SOU
+2C8C,DISALLOWED,COPTIC CAPITAL LETTER ZATA
+2C8D,PVALID,COPTIC SMALL LETTER ZATA
+2C8E,DISALLOWED,COPTIC CAPITAL LETTER HATE
+2C8F,PVALID,COPTIC SMALL LETTER HATE
+2C90,DISALLOWED,COPTIC CAPITAL LETTER THETHE
+2C91,PVALID,COPTIC SMALL LETTER THETHE
+2C92,DISALLOWED,COPTIC CAPITAL LETTER IAUDA
+2C93,PVALID,COPTIC SMALL LETTER IAUDA
+2C94,DISALLOWED,COPTIC CAPITAL LETTER KAPA
+2C95,PVALID,COPTIC SMALL LETTER KAPA
+2C96,DISALLOWED,COPTIC CAPITAL LETTER LAULA
+2C97,PVALID,COPTIC SMALL LETTER LAULA
+2C98,DISALLOWED,COPTIC CAPITAL LETTER MI
+2C99,PVALID,COPTIC SMALL LETTER MI
+2C9A,DISALLOWED,COPTIC CAPITAL LETTER NI
+2C9B,PVALID,COPTIC SMALL LETTER NI
+2C9C,DISALLOWED,COPTIC CAPITAL LETTER KSI
+2C9D,PVALID,COPTIC SMALL LETTER KSI
+2C9E,DISALLOWED,COPTIC CAPITAL LETTER O
+2C9F,PVALID,COPTIC SMALL LETTER O
+2CA0,DISALLOWED,COPTIC CAPITAL LETTER PI
+2CA1,PVALID,COPTIC SMALL LETTER PI
+2CA2,DISALLOWED,COPTIC CAPITAL LETTER RO
+2CA3,PVALID,COPTIC SMALL LETTER RO
+2CA4,DISALLOWED,COPTIC CAPITAL LETTER SIMA
+2CA5,PVALID,COPTIC SMALL LETTER SIMA
+2CA6,DISALLOWED,COPTIC CAPITAL LETTER TAU
+2CA7,PVALID,COPTIC SMALL LETTER TAU
+2CA8,DISALLOWED,COPTIC CAPITAL LETTER UA
+2CA9,PVALID,COPTIC SMALL LETTER UA
+2CAA,DISALLOWED,COPTIC CAPITAL LETTER FI
+2CAB,PVALID,COPTIC SMALL LETTER FI
+2CAC,DISALLOWED,COPTIC CAPITAL LETTER KHI
+2CAD,PVALID,COPTIC SMALL LETTER KHI
+2CAE,DISALLOWED,COPTIC CAPITAL LETTER PSI
+2CAF,PVALID,COPTIC SMALL LETTER PSI
+2CB0,DISALLOWED,COPTIC CAPITAL LETTER OOU
+2CB1,PVALID,COPTIC SMALL LETTER OOU
+2CB2,DISALLOWED,COPTIC CAPITAL LETTER DIALECT-P ALEF
+2CB3,PVALID,COPTIC SMALL LETTER DIALECT-P ALEF
+2CB4,DISALLOWED,COPTIC CAPITAL LETTER OLD COPTIC AIN
+2CB5,PVALID,COPTIC SMALL LETTER OLD COPTIC AIN
+2CB6,DISALLOWED,COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
+2CB7,PVALID,COPTIC SMALL LETTER CRYPTOGRAMMIC EIE
+2CB8,DISALLOWED,COPTIC CAPITAL LETTER DIALECT-P KAPA
+2CB9,PVALID,COPTIC SMALL LETTER DIALECT-P KAPA
+2CBA,DISALLOWED,COPTIC CAPITAL LETTER DIALECT-P NI
+2CBB,PVALID,COPTIC SMALL LETTER DIALECT-P NI
+2CBC,DISALLOWED,COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
+2CBD,PVALID,COPTIC SMALL LETTER CRYPTOGRAMMIC NI
+2CBE,DISALLOWED,COPTIC CAPITAL LETTER OLD COPTIC OOU
+2CBF,PVALID,COPTIC SMALL LETTER OLD COPTIC OOU
+2CC0,DISALLOWED,COPTIC CAPITAL LETTER SAMPI
+2CC1,PVALID,COPTIC SMALL LETTER SAMPI
+2CC2,DISALLOWED,COPTIC CAPITAL LETTER CROSSED SHEI
+2CC3,PVALID,COPTIC SMALL LETTER CROSSED SHEI
+2CC4,DISALLOWED,COPTIC CAPITAL LETTER OLD COPTIC SHEI
+2CC5,PVALID,COPTIC SMALL LETTER OLD COPTIC SHEI
+2CC6,DISALLOWED,COPTIC CAPITAL LETTER OLD COPTIC ESH
+2CC7,PVALID,COPTIC SMALL LETTER OLD COPTIC ESH
+2CC8,DISALLOWED,COPTIC CAPITAL LETTER AKHMIMIC KHEI
+2CC9,PVALID,COPTIC SMALL LETTER AKHMIMIC KHEI
+2CCA,DISALLOWED,COPTIC CAPITAL LETTER DIALECT-P HORI
+2CCB,PVALID,COPTIC SMALL LETTER DIALECT-P HORI
+2CCC,DISALLOWED,COPTIC CAPITAL LETTER OLD COPTIC HORI
+2CCD,PVALID,COPTIC SMALL LETTER OLD COPTIC HORI
+2CCE,DISALLOWED,COPTIC CAPITAL LETTER OLD COPTIC HA
+2CCF,PVALID,COPTIC SMALL LETTER OLD COPTIC HA
+2CD0,DISALLOWED,COPTIC CAPITAL LETTER L-SHAPED HA
+2CD1,PVALID,COPTIC SMALL LETTER L-SHAPED HA
+2CD2,DISALLOWED,COPTIC CAPITAL LETTER OLD COPTIC HEI
+2CD3,PVALID,COPTIC SMALL LETTER OLD COPTIC HEI
+2CD4,DISALLOWED,COPTIC CAPITAL LETTER OLD COPTIC HAT
+2CD5,PVALID,COPTIC SMALL LETTER OLD COPTIC HAT
+2CD6,DISALLOWED,COPTIC CAPITAL LETTER OLD COPTIC GANGIA
+2CD7,PVALID,COPTIC SMALL LETTER OLD COPTIC GANGIA
+2CD8,DISALLOWED,COPTIC CAPITAL LETTER OLD COPTIC DJA
+2CD9,PVALID,COPTIC SMALL LETTER OLD COPTIC DJA
+2CDA,DISALLOWED,COPTIC CAPITAL LETTER OLD COPTIC SHIMA
+2CDB,PVALID,COPTIC SMALL LETTER OLD COPTIC SHIMA
+2CDC,DISALLOWED,COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
+2CDD,PVALID,COPTIC SMALL LETTER OLD NUBIAN SHIMA
+2CDE,DISALLOWED,COPTIC CAPITAL LETTER OLD NUBIAN NGI
+2CDF,PVALID,COPTIC SMALL LETTER OLD NUBIAN NGI
+2CE0,DISALLOWED,COPTIC CAPITAL LETTER OLD NUBIAN NYI
+2CE1,PVALID,COPTIC SMALL LETTER OLD NUBIAN NYI
+2CE2,DISALLOWED,COPTIC CAPITAL LETTER OLD NUBIAN WAU
+2CE3-2CE4,PVALID,COPTIC SMALL LETTER OLD NUBIAN WAU..COPTIC SYMBOL KAI
+2CE5-2CEB,DISALLOWED,COPTIC SYMBOL MI RO..COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI
+2CEC,PVALID,COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI
+2CED,DISALLOWED,COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA
+2CEE-2CF1,PVALID,COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA..COPTIC COMBINING SPIRITUS LENIS
+2CF2-2CF8,UNASSIGNED,<RESERVED>..<RESERVED>
+2CF9-2CFF,DISALLOWED,COPTIC OLD NUBIAN FULL STOP..COPTIC MORPHOLOGICAL DIVIDER
+2D00-2D25,PVALID,GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE
+2D26-2D2F,UNASSIGNED,<RESERVED>..<RESERVED>
+2D30-2D65,PVALID,TIFINAGH LETTER YA..TIFINAGH LETTER YAZZ
+2D66-2D6E,UNASSIGNED,<RESERVED>..<RESERVED>
+2D6F,DISALLOWED,TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+2D70-2D7F,UNASSIGNED,<RESERVED>..<RESERVED>
+2D80-2D96,PVALID,ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE
+2D97-2D9F,UNASSIGNED,<RESERVED>..<RESERVED>
+2DA0-2DA6,PVALID,ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO
+2DA7,UNASSIGNED,<RESERVED>
+2DA8-2DAE,PVALID,ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO
+2DAF,UNASSIGNED,<RESERVED>
+2DB0-2DB6,PVALID,ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO
+2DB7,UNASSIGNED,<RESERVED>
+2DB8-2DBE,PVALID,ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO
+2DBF,UNASSIGNED,<RESERVED>
+2DC0-2DC6,PVALID,ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO
+2DC7,UNASSIGNED,<RESERVED>
+2DC8-2DCE,PVALID,ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO
+2DCF,UNASSIGNED,<RESERVED>
+2DD0-2DD6,PVALID,ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO
+2DD7,UNASSIGNED,<RESERVED>
+2DD8-2DDE,PVALID,ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO
+2DDF,UNASSIGNED,<RESERVED>
+2DE0-2DFF,PVALID,COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS
+2E00-2E2E,DISALLOWED,RIGHT ANGLE SUBSTITUTION MARKER..REVERSED QUESTION MARK
+2E2F,PVALID,VERTICAL TILDE
+2E30-2E31,DISALLOWED,RING POINT..WORD SEPARATOR MIDDLE DOT
+2E32-2E7F,UNASSIGNED,<RESERVED>..<RESERVED>
+2E80-2E99,DISALLOWED,CJK RADICAL REPEAT..CJK RADICAL RAP
+2E9A,UNASSIGNED,<RESERVED>
+2E9B-2EF3,DISALLOWED,CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE
+2EF4-2EFF,UNASSIGNED,<RESERVED>..<RESERVED>
+2F00-2FD5,DISALLOWED,KANGXI RADICAL ONE..KANGXI RADICAL FLUTE
+2FD6-2FEF,UNASSIGNED,<RESERVED>..<RESERVED>
+2FF0-2FFB,DISALLOWED,IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+2FFC-2FFF,UNASSIGNED,<RESERVED>..<RESERVED>
+3000-3004,DISALLOWED,IDEOGRAPHIC SPACE..JAPANESE INDUSTRIAL STANDARD SYMBOL
+3005-3007,PVALID,IDEOGRAPHIC ITERATION MARK..IDEOGRAPHIC NUMBER ZERO
+3008-3029,DISALLOWED,LEFT ANGLE BRACKET..HANGZHOU NUMERAL NINE
+302A-302D,PVALID,IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK
+302E-303B,DISALLOWED,HANGUL SINGLE DOT TONE MARK..VERTICAL IDEOGRAPHIC ITERATION MARK
+303C,PVALID,MASU MARK
+303D-303F,DISALLOWED,PART ALTERNATION MARK..IDEOGRAPHIC HALF FILL SPACE
+3040,UNASSIGNED,<RESERVED>
+3041-3096,PVALID,HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE
+3097-3098,UNASSIGNED,<RESERVED>..<RESERVED>
+3099-309A,PVALID,COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309B-309C,DISALLOWED,KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309D-309E,PVALID,HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK
+309F-30A0,DISALLOWED,HIRAGANA DIGRAPH YORI..KATAKANA-HIRAGANA DOUBLE HYPHEN
+30A1-30FA,PVALID,KATAKANA LETTER SMALL A..KATAKANA LETTER VO
+30FB,CONTEXTO,KATAKANA MIDDLE DOT
+30FC-30FE,PVALID,KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK
+30FF,DISALLOWED,KATAKANA DIGRAPH KOTO
+3100-3104,UNASSIGNED,<RESERVED>..<RESERVED>
+3105-312D,PVALID,BOPOMOFO LETTER B..BOPOMOFO LETTER IH
+312E-3130,UNASSIGNED,<RESERVED>..<RESERVED>
+3131-318E,DISALLOWED,HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE
+318F,UNASSIGNED,<RESERVED>
+3190-319F,DISALLOWED,IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION MAN MARK
+31A0-31B7,PVALID,BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H
+31B8-31BF,UNASSIGNED,<RESERVED>..<RESERVED>
+31C0-31E3,DISALLOWED,CJK STROKE T..CJK STROKE Q
+31E4-31EF,UNASSIGNED,<RESERVED>..<RESERVED>
+31F0-31FF,PVALID,KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO
+3200-321E,DISALLOWED,PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU
+321F,UNASSIGNED,<RESERVED>
+3220-32FE,DISALLOWED,PARENTHESIZED IDEOGRAPH ONE..CIRCLED KATAKANA WO
+32FF,UNASSIGNED,<RESERVED>
+3300-33FF,DISALLOWED,SQUARE APAATO..SQUARE GAL
+3400-4DB5,PVALID,"<CJK IDEOGRAPH EXTENSION A, FIRST>..<CJK IDEOGRAPH EXTENSION A, LAST>"
+4DB6-4DBF,UNASSIGNED,<RESERVED>..<RESERVED>
+4DC0-4DFF,DISALLOWED,HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION
+4E00-9FCB,PVALID,"<CJK IDEOGRAPH, FIRST>..<CJK IDEOGRAPH, LAST>"
+9FCC-9FFF,UNASSIGNED,<RESERVED>..<RESERVED>
+A000-A48C,PVALID,YI SYLLABLE IT..YI SYLLABLE YYR
+A48D-A48F,UNASSIGNED,<RESERVED>..<RESERVED>
+A490-A4C6,DISALLOWED,YI RADICAL QOT..YI RADICAL KE
+A4C7-A4CF,UNASSIGNED,<RESERVED>..<RESERVED>
+A4D0-A4FD,PVALID,LISU LETTER BA..LISU LETTER TONE MYA JEU
+A4FE-A4FF,DISALLOWED,LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP
+A500-A60C,PVALID,VAI SYLLABLE EE..VAI SYLLABLE LENGTHENER
+A60D-A60F,DISALLOWED,VAI COMMA..VAI QUESTION MARK
+A610-A62B,PVALID,VAI SYLLABLE NDOLE FA..VAI SYLLABLE NDOLE DO
+A62C-A63F,UNASSIGNED,<RESERVED>..<RESERVED>
+A640,DISALLOWED,CYRILLIC CAPITAL LETTER ZEMLYA
+A641,PVALID,CYRILLIC SMALL LETTER ZEMLYA
+A642,DISALLOWED,CYRILLIC CAPITAL LETTER DZELO
+A643,PVALID,CYRILLIC SMALL LETTER DZELO
+A644,DISALLOWED,CYRILLIC CAPITAL LETTER REVERSED DZE
+A645,PVALID,CYRILLIC SMALL LETTER REVERSED DZE
+A646,DISALLOWED,CYRILLIC CAPITAL LETTER IOTA
+A647,PVALID,CYRILLIC SMALL LETTER IOTA
+A648,DISALLOWED,CYRILLIC CAPITAL LETTER DJERV
+A649,PVALID,CYRILLIC SMALL LETTER DJERV
+A64A,DISALLOWED,CYRILLIC CAPITAL LETTER MONOGRAPH UK
+A64B,PVALID,CYRILLIC SMALL LETTER MONOGRAPH UK
+A64C,DISALLOWED,CYRILLIC CAPITAL LETTER BROAD OMEGA
+A64D,PVALID,CYRILLIC SMALL LETTER BROAD OMEGA
+A64E,DISALLOWED,CYRILLIC CAPITAL LETTER NEUTRAL YER
+A64F,PVALID,CYRILLIC SMALL LETTER NEUTRAL YER
+A650,DISALLOWED,CYRILLIC CAPITAL LETTER YERU WITH BACK YER
+A651,PVALID,CYRILLIC SMALL LETTER YERU WITH BACK YER
+A652,DISALLOWED,CYRILLIC CAPITAL LETTER IOTIFIED YAT
+A653,PVALID,CYRILLIC SMALL LETTER IOTIFIED YAT
+A654,DISALLOWED,CYRILLIC CAPITAL LETTER REVERSED YU
+A655,PVALID,CYRILLIC SMALL LETTER REVERSED YU
+A656,DISALLOWED,CYRILLIC CAPITAL LETTER IOTIFIED A
+A657,PVALID,CYRILLIC SMALL LETTER IOTIFIED A
+A658,DISALLOWED,CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS
+A659,PVALID,CYRILLIC SMALL LETTER CLOSED LITTLE YUS
+A65A,DISALLOWED,CYRILLIC CAPITAL LETTER BLENDED YUS
+A65B,PVALID,CYRILLIC SMALL LETTER BLENDED YUS
+A65C,DISALLOWED,CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS
+A65D,PVALID,CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS
+A65E,DISALLOWED,CYRILLIC CAPITAL LETTER YN
+A65F,PVALID,CYRILLIC SMALL LETTER YN
+A660-A661,UNASSIGNED,<RESERVED>..<RESERVED>
+A662,DISALLOWED,CYRILLIC CAPITAL LETTER SOFT DE
+A663,PVALID,CYRILLIC SMALL LETTER SOFT DE
+A664,DISALLOWED,CYRILLIC CAPITAL LETTER SOFT EL
+A665,PVALID,CYRILLIC SMALL LETTER SOFT EL
+A666,DISALLOWED,CYRILLIC CAPITAL LETTER SOFT EM
+A667,PVALID,CYRILLIC SMALL LETTER SOFT EM
+A668,DISALLOWED,CYRILLIC CAPITAL LETTER MONOCULAR O
+A669,PVALID,CYRILLIC SMALL LETTER MONOCULAR O
+A66A,DISALLOWED,CYRILLIC CAPITAL LETTER BINOCULAR O
+A66B,PVALID,CYRILLIC SMALL LETTER BINOCULAR O
+A66C,DISALLOWED,CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O
+A66D-A66F,PVALID,CYRILLIC SMALL LETTER DOUBLE MONOCULAR O..COMBINING CYRILLIC VZMET
+A670-A673,DISALLOWED,COMBINING CYRILLIC TEN MILLIONS SIGN..SLAVONIC ASTERISK
+A674-A67B,UNASSIGNED,<RESERVED>..<RESERVED>
+A67C-A67D,PVALID,COMBINING CYRILLIC KAVYKA..COMBINING CYRILLIC PAYEROK
+A67E,DISALLOWED,CYRILLIC KAVYKA
+A67F,PVALID,CYRILLIC PAYEROK
+A680,DISALLOWED,CYRILLIC CAPITAL LETTER DWE
+A681,PVALID,CYRILLIC SMALL LETTER DWE
+A682,DISALLOWED,CYRILLIC CAPITAL LETTER DZWE
+A683,PVALID,CYRILLIC SMALL LETTER DZWE
+A684,DISALLOWED,CYRILLIC CAPITAL LETTER ZHWE
+A685,PVALID,CYRILLIC SMALL LETTER ZHWE
+A686,DISALLOWED,CYRILLIC CAPITAL LETTER CCHE
+A687,PVALID,CYRILLIC SMALL LETTER CCHE
+A688,DISALLOWED,CYRILLIC CAPITAL LETTER DZZE
+A689,PVALID,CYRILLIC SMALL LETTER DZZE
+A68A,DISALLOWED,CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK
+A68B,PVALID,CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK
+A68C,DISALLOWED,CYRILLIC CAPITAL LETTER TWE
+A68D,PVALID,CYRILLIC SMALL LETTER TWE
+A68E,DISALLOWED,CYRILLIC CAPITAL LETTER TSWE
+A68F,PVALID,CYRILLIC SMALL LETTER TSWE
+A690,DISALLOWED,CYRILLIC CAPITAL LETTER TSSE
+A691,PVALID,CYRILLIC SMALL LETTER TSSE
+A692,DISALLOWED,CYRILLIC CAPITAL LETTER TCHE
+A693,PVALID,CYRILLIC SMALL LETTER TCHE
+A694,DISALLOWED,CYRILLIC CAPITAL LETTER HWE
+A695,PVALID,CYRILLIC SMALL LETTER HWE
+A696,DISALLOWED,CYRILLIC CAPITAL LETTER SHWE
+A697,PVALID,CYRILLIC SMALL LETTER SHWE
+A698-A69F,UNASSIGNED,<RESERVED>..<RESERVED>
+A6A0-A6E5,PVALID,BAMUM LETTER A..BAMUM LETTER KI
+A6E6-A6EF,DISALLOWED,BAMUM LETTER MO..BAMUM LETTER KOGHOM
+A6F0-A6F1,PVALID,BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS
+A6F2-A6F7,DISALLOWED,BAMUM NJAEMLI..BAMUM QUESTION MARK
+A6F8-A6FF,UNASSIGNED,<RESERVED>..<RESERVED>
+A700-A716,DISALLOWED,MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR
+A717-A71F,PVALID,MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK
+A720-A722,DISALLOWED,MODIFIER LETTER STRESS AND HIGH TONE..LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF
+A723,PVALID,LATIN SMALL LETTER EGYPTOLOGICAL ALEF
+A724,DISALLOWED,LATIN CAPITAL LETTER EGYPTOLOGICAL AIN
+A725,PVALID,LATIN SMALL LETTER EGYPTOLOGICAL AIN
+A726,DISALLOWED,LATIN CAPITAL LETTER HENG
+A727,PVALID,LATIN SMALL LETTER HENG
+A728,DISALLOWED,LATIN CAPITAL LETTER TZ
+A729,PVALID,LATIN SMALL LETTER TZ
+A72A,DISALLOWED,LATIN CAPITAL LETTER TRESILLO
+A72B,PVALID,LATIN SMALL LETTER TRESILLO
+A72C,DISALLOWED,LATIN CAPITAL LETTER CUATRILLO
+A72D,PVALID,LATIN SMALL LETTER CUATRILLO
+A72E,DISALLOWED,LATIN CAPITAL LETTER CUATRILLO WITH COMMA
+A72F-A731,PVALID,LATIN SMALL LETTER CUATRILLO WITH COMMA..LATIN LETTER SMALL CAPITAL S
+A732,DISALLOWED,LATIN CAPITAL LETTER AA
+A733,PVALID,LATIN SMALL LETTER AA
+A734,DISALLOWED,LATIN CAPITAL LETTER AO
+A735,PVALID,LATIN SMALL LETTER AO
+A736,DISALLOWED,LATIN CAPITAL LETTER AU
+A737,PVALID,LATIN SMALL LETTER AU
+A738,DISALLOWED,LATIN CAPITAL LETTER AV
+A739,PVALID,LATIN SMALL LETTER AV
+A73A,DISALLOWED,LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR
+A73B,PVALID,LATIN SMALL LETTER AV WITH HORIZONTAL BAR
+A73C,DISALLOWED,LATIN CAPITAL LETTER AY
+A73D,PVALID,LATIN SMALL LETTER AY
+A73E,DISALLOWED,LATIN CAPITAL LETTER REVERSED C WITH DOT
+A73F,PVALID,LATIN SMALL LETTER REVERSED C WITH DOT
+A740,DISALLOWED,LATIN CAPITAL LETTER K WITH STROKE
+A741,PVALID,LATIN SMALL LETTER K WITH STROKE
+A742,DISALLOWED,LATIN CAPITAL LETTER K WITH DIAGONAL STROKE
+A743,PVALID,LATIN SMALL LETTER K WITH DIAGONAL STROKE
+A744,DISALLOWED,LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE
+A745,PVALID,LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE
+A746,DISALLOWED,LATIN CAPITAL LETTER BROKEN L
+A747,PVALID,LATIN SMALL LETTER BROKEN L
+A748,DISALLOWED,LATIN CAPITAL LETTER L WITH HIGH STROKE
+A749,PVALID,LATIN SMALL LETTER L WITH HIGH STROKE
+A74A,DISALLOWED,LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY
+A74B,PVALID,LATIN SMALL LETTER O WITH LONG STROKE OVERLAY
+A74C,DISALLOWED,LATIN CAPITAL LETTER O WITH LOOP
+A74D,PVALID,LATIN SMALL LETTER O WITH LOOP
+A74E,DISALLOWED,LATIN CAPITAL LETTER OO
+A74F,PVALID,LATIN SMALL LETTER OO
+A750,DISALLOWED,LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER
+A751,PVALID,LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER
+A752,DISALLOWED,LATIN CAPITAL LETTER P WITH FLOURISH
+A753,PVALID,LATIN SMALL LETTER P WITH FLOURISH
+A754,DISALLOWED,LATIN CAPITAL LETTER P WITH SQUIRREL TAIL
+A755,PVALID,LATIN SMALL LETTER P WITH SQUIRREL TAIL
+A756,DISALLOWED,LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER
+A757,PVALID,LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER
+A758,DISALLOWED,LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE
+A759,PVALID,LATIN SMALL LETTER Q WITH DIAGONAL STROKE
+A75A,DISALLOWED,LATIN CAPITAL LETTER R ROTUNDA
+A75B,PVALID,LATIN SMALL LETTER R ROTUNDA
+A75C,DISALLOWED,LATIN CAPITAL LETTER RUM ROTUNDA
+A75D,PVALID,LATIN SMALL LETTER RUM ROTUNDA
+A75E,DISALLOWED,LATIN CAPITAL LETTER V WITH DIAGONAL STROKE
+A75F,PVALID,LATIN SMALL LETTER V WITH DIAGONAL STROKE
+A760,DISALLOWED,LATIN CAPITAL LETTER VY
+A761,PVALID,LATIN SMALL LETTER VY
+A762,DISALLOWED,LATIN CAPITAL LETTER VISIGOTHIC Z
+A763,PVALID,LATIN SMALL LETTER VISIGOTHIC Z
+A764,DISALLOWED,LATIN CAPITAL LETTER THORN WITH STROKE
+A765,PVALID,LATIN SMALL LETTER THORN WITH STROKE
+A766,DISALLOWED,LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER
+A767,PVALID,LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER
+A768,DISALLOWED,LATIN CAPITAL LETTER VEND
+A769,PVALID,LATIN SMALL LETTER VEND
+A76A,DISALLOWED,LATIN CAPITAL LETTER ET
+A76B,PVALID,LATIN SMALL LETTER ET
+A76C,DISALLOWED,LATIN CAPITAL LETTER IS
+A76D,PVALID,LATIN SMALL LETTER IS
+A76E,DISALLOWED,LATIN CAPITAL LETTER CON
+A76F,PVALID,LATIN SMALL LETTER CON
+A770,DISALLOWED,MODIFIER LETTER US
+A771-A778,PVALID,LATIN SMALL LETTER DUM..LATIN SMALL LETTER UM
+A779,DISALLOWED,LATIN CAPITAL LETTER INSULAR D
+A77A,PVALID,LATIN SMALL LETTER INSULAR D
+A77B,DISALLOWED,LATIN CAPITAL LETTER INSULAR F
+A77C,PVALID,LATIN SMALL LETTER INSULAR F
+A77D-A77E,DISALLOWED,LATIN CAPITAL LETTER INSULAR G..LATIN CAPITAL LETTER TURNED INSULAR G
+A77F,PVALID,LATIN SMALL LETTER TURNED INSULAR G
+A780,DISALLOWED,LATIN CAPITAL LETTER TURNED L
+A781,PVALID,LATIN SMALL LETTER TURNED L
+A782,DISALLOWED,LATIN CAPITAL LETTER INSULAR R
+A783,PVALID,LATIN SMALL LETTER INSULAR R
+A784,DISALLOWED,LATIN CAPITAL LETTER INSULAR S
+A785,PVALID,LATIN SMALL LETTER INSULAR S
+A786,DISALLOWED,LATIN CAPITAL LETTER INSULAR T
+A787-A788,PVALID,LATIN SMALL LETTER INSULAR T..MODIFIER LETTER LOW CIRCUMFLEX ACCENT
+A789-A78B,DISALLOWED,MODIFIER LETTER COLON..LATIN CAPITAL LETTER SALTILLO
+A78C,PVALID,LATIN SMALL LETTER SALTILLO
+A78D-A7FA,UNASSIGNED,<RESERVED>..<RESERVED>
+A7FB-A827,PVALID,LATIN EPIGRAPHIC LETTER REVERSED F..SYLOTI NAGRI VOWEL SIGN OO
+A828-A82B,DISALLOWED,SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4
+A82C-A82F,UNASSIGNED,<RESERVED>..<RESERVED>
+A830-A839,DISALLOWED,NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC QUANTITY MARK
+A83A-A83F,UNASSIGNED,<RESERVED>..<RESERVED>
+A840-A873,PVALID,PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU
+A874-A877,DISALLOWED,PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD
+A878-A87F,UNASSIGNED,<RESERVED>..<RESERVED>
+A880-A8C4,PVALID,SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VIRAMA
+A8C5-A8CD,UNASSIGNED,<RESERVED>..<RESERVED>
+A8CE-A8CF,DISALLOWED,SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA
+A8D0-A8D9,PVALID,SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE
+A8DA-A8DF,UNASSIGNED,<RESERVED>..<RESERVED>
+A8E0-A8F7,PVALID,COMBINING DEVANAGARI DIGIT ZERO..DEVANAGARI SIGN CANDRABINDU AVAGRAHA
+A8F8-A8FA,DISALLOWED,DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET
+A8FB,PVALID,DEVANAGARI HEADSTROKE
+A8FC-A8FF,UNASSIGNED,<RESERVED>..<RESERVED>
+A900-A92D,PVALID,KAYAH LI DIGIT ZERO..KAYAH LI TONE CALYA PLOPHU
+A92E-A92F,DISALLOWED,KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA
+A930-A953,PVALID,REJANG LETTER KA..REJANG VIRAMA
+A954-A95E,UNASSIGNED,<RESERVED>..<RESERVED>
+A95F-A97C,DISALLOWED,REJANG SECTION MARK..HANGUL CHOSEONG SSANGYEORINHIEUH
+A97D-A97F,UNASSIGNED,<RESERVED>..<RESERVED>
+A980-A9C0,PVALID,JAVANESE SIGN PANYANGGA..JAVANESE PANGKON
+A9C1-A9CD,DISALLOWED,JAVANESE LEFT RERENGGAN..JAVANESE TURNED PADA PISELEH
+A9CE,UNASSIGNED,<RESERVED>
+A9CF-A9D9,PVALID,JAVANESE PANGRANGKEP..JAVANESE DIGIT NINE
+A9DA-A9DD,UNASSIGNED,<RESERVED>..<RESERVED>
+A9DE-A9DF,DISALLOWED,JAVANESE PADA TIRTA TUMETES..JAVANESE PADA ISEN-ISEN
+A9E0-A9FF,UNASSIGNED,<RESERVED>..<RESERVED>
+AA00-AA36,PVALID,CHAM LETTER A..CHAM CONSONANT SIGN WA
+AA37-AA3F,UNASSIGNED,<RESERVED>..<RESERVED>
+AA40-AA4D,PVALID,CHAM LETTER FINAL K..CHAM CONSONANT SIGN FINAL H
+AA4E-AA4F,UNASSIGNED,<RESERVED>..<RESERVED>
+AA50-AA59,PVALID,CHAM DIGIT ZERO..CHAM DIGIT NINE
+AA5A-AA5B,UNASSIGNED,<RESERVED>..<RESERVED>
+AA5C-AA5F,DISALLOWED,CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA
+AA60-AA76,PVALID,MYANMAR LETTER KHAMTI GA..MYANMAR LOGOGRAM KHAMTI HM
+AA77-AA79,DISALLOWED,MYANMAR SYMBOL AITON EXCLAMATION..MYANMAR SYMBOL AITON TWO
+AA7A-AA7B,PVALID,MYANMAR LETTER AITON RA..MYANMAR SIGN PAO KAREN TONE
+AA7C-AA7F,UNASSIGNED,<RESERVED>..<RESERVED>
+AA80-AAC2,PVALID,TAI VIET LETTER LOW KO..TAI VIET TONE MAI SONG
+AAC3-AADA,UNASSIGNED,<RESERVED>..<RESERVED>
+AADB-AADD,PVALID,TAI VIET SYMBOL KON..TAI VIET SYMBOL SAM
+AADE-AADF,DISALLOWED,TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI KOI
+AAE0-ABBF,UNASSIGNED,<RESERVED>..<RESERVED>
+ABC0-ABEA,PVALID,MEETEI MAYEK LETTER KOK..MEETEI MAYEK VOWEL SIGN NUNG
+ABEB,DISALLOWED,MEETEI MAYEK CHEIKHEI
+ABEC-ABED,PVALID,MEETEI MAYEK LUM IYEK..MEETEI MAYEK APUN IYEK
+ABEE-ABEF,UNASSIGNED,<RESERVED>..<RESERVED>
+ABF0-ABF9,PVALID,MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE
+ABFA-ABFF,UNASSIGNED,<RESERVED>..<RESERVED>
+AC00-D7A3,PVALID,"<HANGUL SYLLABLE, FIRST>..<HANGUL SYLLABLE, LAST>"
+D7A4-D7AF,UNASSIGNED,<RESERVED>..<RESERVED>
+D7B0-D7C6,DISALLOWED,HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E
+D7C7-D7CA,UNASSIGNED,<RESERVED>..<RESERVED>
+D7CB-D7FB,DISALLOWED,HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH
+D7FC-D7FF,UNASSIGNED,<RESERVED>..<RESERVED>
+D800-FA0D,DISALLOWED,"<NON PRIVATE USE HIGH SURROGATE, FIRST>..CJK COMPATIBILITY IDEOGRAPH-FA0D"
+FA0E-FA0F,PVALID,CJK COMPATIBILITY IDEOGRAPH-FA0E..CJK COMPATIBILITY IDEOGRAPH-FA0F
+FA10,DISALLOWED,CJK COMPATIBILITY IDEOGRAPH-FA10
+FA11,PVALID,CJK COMPATIBILITY IDEOGRAPH-FA11
+FA12,DISALLOWED,CJK COMPATIBILITY IDEOGRAPH-FA12
+FA13-FA14,PVALID,CJK COMPATIBILITY IDEOGRAPH-FA13..CJK COMPATIBILITY IDEOGRAPH-FA14
+FA15-FA1E,DISALLOWED,CJK COMPATIBILITY IDEOGRAPH-FA15..CJK COMPATIBILITY IDEOGRAPH-FA1E
+FA1F,PVALID,CJK COMPATIBILITY IDEOGRAPH-FA1F
+FA20,DISALLOWED,CJK COMPATIBILITY IDEOGRAPH-FA20
+FA21,PVALID,CJK COMPATIBILITY IDEOGRAPH-FA21
+FA22,DISALLOWED,CJK COMPATIBILITY IDEOGRAPH-FA22
+FA23-FA24,PVALID,CJK COMPATIBILITY IDEOGRAPH-FA23..CJK COMPATIBILITY IDEOGRAPH-FA24
+FA25-FA26,DISALLOWED,CJK COMPATIBILITY IDEOGRAPH-FA25..CJK COMPATIBILITY IDEOGRAPH-FA26
+FA27-FA29,PVALID,CJK COMPATIBILITY IDEOGRAPH-FA27..CJK COMPATIBILITY IDEOGRAPH-FA29
+FA2A-FA2D,DISALLOWED,CJK COMPATIBILITY IDEOGRAPH-FA2A..CJK COMPATIBILITY IDEOGRAPH-FA2D
+FA2E-FA2F,UNASSIGNED,<RESERVED>..<RESERVED>
+FA30-FA6D,DISALLOWED,CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6D
+FA6E-FA6F,UNASSIGNED,<RESERVED>..<RESERVED>
+FA70-FAD9,DISALLOWED,CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
+FADA-FAFF,UNASSIGNED,<RESERVED>..<RESERVED>
+FB00-FB06,DISALLOWED,LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
+FB07-FB12,UNASSIGNED,<RESERVED>..<RESERVED>
+FB13-FB17,DISALLOWED,ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
+FB18-FB1C,UNASSIGNED,<RESERVED>..<RESERVED>
+FB1D,DISALLOWED,HEBREW LETTER YOD WITH HIRIQ
+FB1E,PVALID,HEBREW POINT JUDEO-SPANISH VARIKA
+FB1F-FB36,DISALLOWED,HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER ZAYIN WITH DAGESH
+FB37,UNASSIGNED,<RESERVED>
+FB38-FB3C,DISALLOWED,HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH
+FB3D,UNASSIGNED,<RESERVED>
+FB3E,DISALLOWED,HEBREW LETTER MEM WITH DAGESH
+FB3F,UNASSIGNED,<RESERVED>
+FB40-FB41,DISALLOWED,HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH
+FB42,UNASSIGNED,<RESERVED>
+FB43-FB44,DISALLOWED,HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH
+FB45,UNASSIGNED,<RESERVED>
+FB46-FBB1,DISALLOWED,HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+FBB2-FBD2,UNASSIGNED,<RESERVED>..<RESERVED>
+FBD3-FD3F,DISALLOWED,ARABIC LETTER NG ISOLATED FORM..ORNATE RIGHT PARENTHESIS
+FD40-FD4F,UNASSIGNED,<RESERVED>..<RESERVED>
+FD50-FD8F,DISALLOWED,ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+FD90-FD91,UNASSIGNED,<RESERVED>..<RESERVED>
+FD92-FDC7,DISALLOWED,ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+FDC8-FDCF,UNASSIGNED,<RESERVED>..<RESERVED>
+FDD0-FDFD,DISALLOWED,<NOT A CHARACTER>..ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
+FDFE-FDFF,UNASSIGNED,<RESERVED>..<RESERVED>
+FE00-FE19,DISALLOWED,VARIATION SELECTOR-1..PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
+FE1A-FE1F,UNASSIGNED,<RESERVED>..<RESERVED>
+FE20-FE26,PVALID,COMBINING LIGATURE LEFT HALF..COMBINING CONJOINING MACRON
+FE27-FE2F,UNASSIGNED,<RESERVED>..<RESERVED>
+FE30-FE52,DISALLOWED,PRESENTATION FORM FOR VERTICAL TWO DOT LEADER..SMALL FULL STOP
+FE53,UNASSIGNED,<RESERVED>
+FE54-FE66,DISALLOWED,SMALL SEMICOLON..SMALL EQUALS SIGN
+FE67,UNASSIGNED,<RESERVED>
+FE68-FE6B,DISALLOWED,SMALL REVERSE SOLIDUS..SMALL COMMERCIAL AT
+FE6C-FE6F,UNASSIGNED,<RESERVED>..<RESERVED>
+FE70-FE72,DISALLOWED,ARABIC FATHATAN ISOLATED FORM..ARABIC DAMMATAN ISOLATED FORM
+FE73,PVALID,ARABIC TAIL FRAGMENT
+FE74,DISALLOWED,ARABIC KASRATAN ISOLATED FORM
+FE75,UNASSIGNED,<RESERVED>
+FE76-FEFC,DISALLOWED,ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+FEFD-FEFE,UNASSIGNED,<RESERVED>..<RESERVED>
+FEFF,DISALLOWED,ZERO WIDTH NO-BREAK SPACE
+FF00,UNASSIGNED,<RESERVED>
+FF01-FFBE,DISALLOWED,FULLWIDTH EXCLAMATION MARK..HALFWIDTH HANGUL LETTER HIEUH
+FFBF-FFC1,UNASSIGNED,<RESERVED>..<RESERVED>
+FFC2-FFC7,DISALLOWED,HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E
+FFC8-FFC9,UNASSIGNED,<RESERVED>..<RESERVED>
+FFCA-FFCF,DISALLOWED,HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE
+FFD0-FFD1,UNASSIGNED,<RESERVED>..<RESERVED>
+FFD2-FFD7,DISALLOWED,HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU
+FFD8-FFD9,UNASSIGNED,<RESERVED>..<RESERVED>
+FFDA-FFDC,DISALLOWED,HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I
+FFDD-FFDF,UNASSIGNED,<RESERVED>..<RESERVED>
+FFE0-FFE6,DISALLOWED,FULLWIDTH CENT SIGN..FULLWIDTH WON SIGN
+FFE7,UNASSIGNED,<RESERVED>
+FFE8-FFEE,DISALLOWED,HALFWIDTH FORMS LIGHT VERTICAL..HALFWIDTH WHITE CIRCLE
+FFEF-FFF8,UNASSIGNED,<RESERVED>..<RESERVED>
+FFF9-FFFF,DISALLOWED,INTERLINEAR ANNOTATION ANCHOR..<NOT A CHARACTER>
+10000-1000B,PVALID,LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE
+1000C,UNASSIGNED,<RESERVED>
+1000D-10026,PVALID,LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO
+10027,UNASSIGNED,<RESERVED>
+10028-1003A,PVALID,LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO
+1003B,UNASSIGNED,<RESERVED>
+1003C-1003D,PVALID,LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE
+1003E,UNASSIGNED,<RESERVED>
+1003F-1004D,PVALID,LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO
+1004E-1004F,UNASSIGNED,<RESERVED>..<RESERVED>
+10050-1005D,PVALID,LINEAR B SYMBOL B018..LINEAR B SYMBOL B089
+1005E-1007F,UNASSIGNED,<RESERVED>..<RESERVED>
+10080-100FA,PVALID,LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305
+100FB-100FF,UNASSIGNED,<RESERVED>..<RESERVED>
+10100-10102,DISALLOWED,AEGEAN WORD SEPARATOR LINE..AEGEAN CHECK MARK
+10103-10106,UNASSIGNED,<RESERVED>..<RESERVED>
+10107-10133,DISALLOWED,AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND
+10134-10136,UNASSIGNED,<RESERVED>..<RESERVED>
+10137-1018A,DISALLOWED,AEGEAN WEIGHT BASE UNIT..GREEK ZERO SIGN
+1018B-1018F,UNASSIGNED,<RESERVED>..<RESERVED>
+10190-1019B,DISALLOWED,ROMAN SEXTANS SIGN..ROMAN CENTURIAL SIGN
+1019C-101CF,UNASSIGNED,<RESERVED>..<RESERVED>
+101D0-101FC,DISALLOWED,PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND
+101FD,PVALID,PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
+101FE-1027F,UNASSIGNED,<RESERVED>..<RESERVED>
+10280-1029C,PVALID,LYCIAN LETTER A..LYCIAN LETTER X
+1029D-1029F,UNASSIGNED,<RESERVED>..<RESERVED>
+102A0-102D0,PVALID,CARIAN LETTER A..CARIAN LETTER UUU3
+102D1-102FF,UNASSIGNED,<RESERVED>..<RESERVED>
+10300-1031E,PVALID,OLD ITALIC LETTER A..OLD ITALIC LETTER UU
+1031F,UNASSIGNED,<RESERVED>
+10320-10323,DISALLOWED,OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY
+10324-1032F,UNASSIGNED,<RESERVED>..<RESERVED>
+10330-10340,PVALID,GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA
+10341,DISALLOWED,GOTHIC LETTER NINETY
+10342-10349,PVALID,GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL
+1034A,DISALLOWED,GOTHIC LETTER NINE HUNDRED
+1034B-1037F,UNASSIGNED,<RESERVED>..<RESERVED>
+10380-1039D,PVALID,UGARITIC LETTER ALPA..UGARITIC LETTER SSU
+1039E,UNASSIGNED,<RESERVED>
+1039F,DISALLOWED,UGARITIC WORD DIVIDER
+103A0-103C3,PVALID,OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA
+103C4-103C7,UNASSIGNED,<RESERVED>..<RESERVED>
+103C8-103CF,PVALID,OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH
+103D0-103D5,DISALLOWED,OLD PERSIAN WORD DIVIDER..OLD PERSIAN NUMBER HUNDRED
+103D6-103FF,UNASSIGNED,<RESERVED>..<RESERVED>
+10400-10427,DISALLOWED,DESERET CAPITAL LETTER LONG I..DESERET CAPITAL LETTER EW
+10428-1049D,PVALID,DESERET SMALL LETTER LONG I..OSMANYA LETTER OO
+1049E-1049F,UNASSIGNED,<RESERVED>..<RESERVED>
+104A0-104A9,PVALID,OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE
+104AA-107FF,UNASSIGNED,<RESERVED>..<RESERVED>
+10800-10805,PVALID,CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA
+10806-10807,UNASSIGNED,<RESERVED>..<RESERVED>
+10808,PVALID,CYPRIOT SYLLABLE JO
+10809,UNASSIGNED,<RESERVED>
+1080A-10835,PVALID,CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO
+10836,UNASSIGNED,<RESERVED>
+10837-10838,PVALID,CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE
+10839-1083B,UNASSIGNED,<RESERVED>..<RESERVED>
+1083C,PVALID,CYPRIOT SYLLABLE ZA
+1083D-1083E,UNASSIGNED,<RESERVED>..<RESERVED>
+1083F-10855,PVALID,CYPRIOT SYLLABLE ZO..IMPERIAL ARAMAIC LETTER TAW
+10856,UNASSIGNED,<RESERVED>
+10857-1085F,DISALLOWED,IMPERIAL ARAMAIC SECTION SIGN..IMPERIAL ARAMAIC NUMBER TEN THOUSAND
+10860-108FF,UNASSIGNED,<RESERVED>..<RESERVED>
+10900-10915,PVALID,PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU
+10916-1091B,DISALLOWED,PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER THREE
+1091C-1091E,UNASSIGNED,<RESERVED>..<RESERVED>
+1091F,DISALLOWED,PHOENICIAN WORD SEPARATOR
+10920-10939,PVALID,LYDIAN LETTER A..LYDIAN LETTER C
+1093A-1093E,UNASSIGNED,<RESERVED>..<RESERVED>
+1093F,DISALLOWED,LYDIAN TRIANGULAR MARK
+10940-109FF,UNASSIGNED,<RESERVED>..<RESERVED>
+10A00-10A03,PVALID,KHAROSHTHI LETTER A..KHAROSHTHI VOWEL SIGN VOCALIC R
+10A04,UNASSIGNED,<RESERVED>
+10A05-10A06,PVALID,KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
+10A07-10A0B,UNASSIGNED,<RESERVED>..<RESERVED>
+10A0C-10A13,PVALID,KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI LETTER GHA
+10A14,UNASSIGNED,<RESERVED>
+10A15-10A17,PVALID,KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA
+10A18,UNASSIGNED,<RESERVED>
+10A19-10A33,PVALID,KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA
+10A34-10A37,UNASSIGNED,<RESERVED>..<RESERVED>
+10A38-10A3A,PVALID,KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW
+10A3B-10A3E,UNASSIGNED,<RESERVED>..<RESERVED>
+10A3F,PVALID,KHAROSHTHI VIRAMA
+10A40-10A47,DISALLOWED,KHAROSHTHI DIGIT ONE..KHAROSHTHI NUMBER ONE THOUSAND
+10A48-10A4F,UNASSIGNED,<RESERVED>..<RESERVED>
+10A50-10A58,DISALLOWED,KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES
+10A59-10A5F,UNASSIGNED,<RESERVED>..<RESERVED>
+10A60-10A7C,PVALID,OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH
+10A7D-10A7F,DISALLOWED,OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMERIC INDICATOR
+10A80-10AFF,UNASSIGNED,<RESERVED>..<RESERVED>
+10B00-10B35,PVALID,AVESTAN LETTER A..AVESTAN LETTER HE
+10B36-10B38,UNASSIGNED,<RESERVED>..<RESERVED>
+10B39-10B3F,DISALLOWED,AVESTAN ABBREVIATION MARK..LARGE ONE RING OVER TWO RINGS PUNCTUATION
+10B40-10B55,PVALID,INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW
+10B56-10B57,UNASSIGNED,<RESERVED>..<RESERVED>
+10B58-10B5F,DISALLOWED,INSCRIPTIONAL PARTHIAN NUMBER ONE..INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND
+10B60-10B72,PVALID,INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW
+10B73-10B77,UNASSIGNED,<RESERVED>..<RESERVED>
+10B78-10B7F,DISALLOWED,INSCRIPTIONAL PAHLAVI NUMBER ONE..INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND
+10B80-10BFF,UNASSIGNED,<RESERVED>..<RESERVED>
+10C00-10C48,PVALID,OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH
+10C49-10E5F,UNASSIGNED,<RESERVED>..<RESERVED>
+10E60-10E7E,DISALLOWED,RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS
+10E7F-1107F,UNASSIGNED,<RESERVED>..<RESERVED>
+11080-110BA,PVALID,KAITHI SIGN CANDRABINDU..KAITHI SIGN NUKTA
+110BB-110C1,DISALLOWED,KAITHI ABBREVIATION SIGN..KAITHI DOUBLE DANDA
+110C2-11FFF,UNASSIGNED,<RESERVED>..<RESERVED>
+12000-1236E,PVALID,CUNEIFORM SIGN A..CUNEIFORM SIGN ZUM
+1236F-123FF,UNASSIGNED,<RESERVED>..<RESERVED>
+12400-12462,DISALLOWED,CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER
+12463-1246F,UNASSIGNED,<RESERVED>..<RESERVED>
+12470-12473,DISALLOWED,CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON
+12474-12FFF,UNASSIGNED,<RESERVED>..<RESERVED>
+13000-1342E,PVALID,EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032
+1342F-1CFFF,UNASSIGNED,<RESERVED>..<RESERVED>
+1D000-1D0F5,DISALLOWED,BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
+1D0F6-1D0FF,UNASSIGNED,<RESERVED>..<RESERVED>
+1D100-1D126,DISALLOWED,MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2
+1D127-1D128,UNASSIGNED,<RESERVED>..<RESERVED>
+1D129-1D1DD,DISALLOWED,MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL PES SUBPUNCTIS
+1D1DE-1D1FF,UNASSIGNED,<RESERVED>..<RESERVED>
+1D200-1D245,DISALLOWED,GREEK VOCAL NOTATION SYMBOL-1..GREEK MUSICAL LEIMMA
+1D246-1D2FF,UNASSIGNED,<RESERVED>..<RESERVED>
+1D300-1D356,DISALLOWED,MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING
+1D357-1D35F,UNASSIGNED,<RESERVED>..<RESERVED>
+1D360-1D371,DISALLOWED,COUNTING ROD UNIT DIGIT ONE..COUNTING ROD TENS DIGIT NINE
+1D372-1D3FF,UNASSIGNED,<RESERVED>..<RESERVED>
+1D400-1D454,DISALLOWED,MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
+1D455,UNASSIGNED,<RESERVED>
+1D456-1D49C,DISALLOWED,MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
+1D49D,UNASSIGNED,<RESERVED>
+1D49E-1D49F,DISALLOWED,MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
+1D4A0-1D4A1,UNASSIGNED,<RESERVED>..<RESERVED>
+1D4A2,DISALLOWED,MATHEMATICAL SCRIPT CAPITAL G
+1D4A3-1D4A4,UNASSIGNED,<RESERVED>..<RESERVED>
+1D4A5-1D4A6,DISALLOWED,MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K
+1D4A7-1D4A8,UNASSIGNED,<RESERVED>..<RESERVED>
+1D4A9-1D4AC,DISALLOWED,MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q
+1D4AD,UNASSIGNED,<RESERVED>
+1D4AE-1D4B9,DISALLOWED,MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D
+1D4BA,UNASSIGNED,<RESERVED>
+1D4BB,DISALLOWED,MATHEMATICAL SCRIPT SMALL F
+1D4BC,UNASSIGNED,<RESERVED>
+1D4BD-1D4C3,DISALLOWED,MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N
+1D4C4,UNASSIGNED,<RESERVED>
+1D4C5-1D505,DISALLOWED,MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B
+1D506,UNASSIGNED,<RESERVED>
+1D507-1D50A,DISALLOWED,MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G
+1D50B-1D50C,UNASSIGNED,<RESERVED>..<RESERVED>
+1D50D-1D514,DISALLOWED,MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q
+1D515,UNASSIGNED,<RESERVED>
+1D516-1D51C,DISALLOWED,MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y
+1D51D,UNASSIGNED,<RESERVED>
+1D51E-1D539,DISALLOWED,MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53A,UNASSIGNED,<RESERVED>
+1D53B-1D53E,DISALLOWED,MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D53F,UNASSIGNED,<RESERVED>
+1D540-1D544,DISALLOWED,MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D545,UNASSIGNED,<RESERVED>
+1D546,DISALLOWED,MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D547-1D549,UNASSIGNED,<RESERVED>..<RESERVED>
+1D54A-1D550,DISALLOWED,MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D551,UNASSIGNED,<RESERVED>
+1D552-1D6A5,DISALLOWED,MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6A6-1D6A7,UNASSIGNED,<RESERVED>..<RESERVED>
+1D6A8-1D7CB,DISALLOWED,MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD SMALL DIGAMMA
+1D7CC-1D7CD,UNASSIGNED,<RESERVED>..<RESERVED>
+1D7CE-1D7FF,DISALLOWED,MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
+1D800-1EFFF,UNASSIGNED,<RESERVED>..<RESERVED>
+1F000-1F02B,DISALLOWED,MAHJONG TILE EAST WIND..MAHJONG TILE BACK
+1F02C-1F02F,UNASSIGNED,<RESERVED>..<RESERVED>
+1F030-1F093,DISALLOWED,DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06
+1F094-1F0FF,UNASSIGNED,<RESERVED>..<RESERVED>
+1F100-1F10A,DISALLOWED,DIGIT ZERO FULL STOP..DIGIT NINE COMMA
+1F10B-1F10F,UNASSIGNED,<RESERVED>..<RESERVED>
+1F110-1F12E,DISALLOWED,PARENTHESIZED LATIN CAPITAL LETTER A..CIRCLED WZ
+1F12F-1F130,UNASSIGNED,<RESERVED>..<RESERVED>
+1F131,DISALLOWED,SQUARED LATIN CAPITAL LETTER B
+1F132-1F13C,UNASSIGNED,<RESERVED>..<RESERVED>
+1F13D,DISALLOWED,SQUARED LATIN CAPITAL LETTER N
+1F13E,UNASSIGNED,<RESERVED>
+1F13F,DISALLOWED,SQUARED LATIN CAPITAL LETTER P
+1F140-1F141,UNASSIGNED,<RESERVED>..<RESERVED>
+1F142,DISALLOWED,SQUARED LATIN CAPITAL LETTER S
+1F143-1F145,UNASSIGNED,<RESERVED>..<RESERVED>
+1F146,DISALLOWED,SQUARED LATIN CAPITAL LETTER W
+1F147-1F149,UNASSIGNED,<RESERVED>..<RESERVED>
+1F14A-1F14E,DISALLOWED,SQUARED HV..SQUARED PPV
+1F14F-1F156,UNASSIGNED,<RESERVED>..<RESERVED>
+1F157,DISALLOWED,NEGATIVE CIRCLED LATIN CAPITAL LETTER H
+1F158-1F15E,UNASSIGNED,<RESERVED>..<RESERVED>
+1F15F,DISALLOWED,NEGATIVE CIRCLED LATIN CAPITAL LETTER P
+1F160-1F178,UNASSIGNED,<RESERVED>..<RESERVED>
+1F179,DISALLOWED,NEGATIVE SQUARED LATIN CAPITAL LETTER J
+1F17A,UNASSIGNED,<RESERVED>
+1F17B-1F17C,DISALLOWED,NEGATIVE SQUARED LATIN CAPITAL LETTER L..NEGATIVE SQUARED LATIN CAPITAL LETTER M
+1F17D-1F17E,UNASSIGNED,<RESERVED>..<RESERVED>
+1F17F,DISALLOWED,NEGATIVE SQUARED LATIN CAPITAL LETTER P
+1F180-1F189,UNASSIGNED,<RESERVED>..<RESERVED>
+1F18A-1F18D,DISALLOWED,CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P..NEGATIVE SQUARED SA
+1F18E-1F18F,UNASSIGNED,<RESERVED>..<RESERVED>
+1F190,DISALLOWED,SQUARE DJ
+1F191-1F1FF,UNASSIGNED,<RESERVED>..<RESERVED>
+1F200,DISALLOWED,SQUARE HIRAGANA HOKA
+1F201-1F20F,UNASSIGNED,<RESERVED>..<RESERVED>
+1F210-1F231,DISALLOWED,SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-6253
+1F232-1F23F,UNASSIGNED,<RESERVED>..<RESERVED>
+1F240-1F248,DISALLOWED,TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557
+1F249-1FFFD,UNASSIGNED,<RESERVED>..<RESERVED>
+1FFFE-1FFFF,DISALLOWED,<NOT A CHARACTER>..<NOT A CHARACTER>
+20000-2A6D6,PVALID,"<CJK IDEOGRAPH EXTENSION B, FIRST>..<CJK IDEOGRAPH EXTENSION B, LAST>"
+2A6D7-2A6FF,UNASSIGNED,<RESERVED>..<RESERVED>
+2A700-2B734,PVALID,"<CJK IDEOGRAPH EXTENSION C, FIRST>..<CJK IDEOGRAPH EXTENSION C, LAST>"
+2B735-2F7FF,UNASSIGNED,<RESERVED>..<RESERVED>
+2F800-2FA1D,DISALLOWED,CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
+2FA1E-2FFFD,UNASSIGNED,<RESERVED>..<RESERVED>
+2FFFE-2FFFF,DISALLOWED,<NOT A CHARACTER>..<NOT A CHARACTER>
+30000-3FFFD,UNASSIGNED,<RESERVED>..<RESERVED>
+3FFFE-3FFFF,DISALLOWED,<NOT A CHARACTER>..<NOT A CHARACTER>
+40000-4FFFD,UNASSIGNED,<RESERVED>..<RESERVED>
+4FFFE-4FFFF,DISALLOWED,<NOT A CHARACTER>..<NOT A CHARACTER>
+50000-5FFFD,UNASSIGNED,<RESERVED>..<RESERVED>
+5FFFE-5FFFF,DISALLOWED,<NOT A CHARACTER>..<NOT A CHARACTER>
+60000-6FFFD,UNASSIGNED,<RESERVED>..<RESERVED>
+6FFFE-6FFFF,DISALLOWED,<NOT A CHARACTER>..<NOT A CHARACTER>
+70000-7FFFD,UNASSIGNED,<RESERVED>..<RESERVED>
+7FFFE-7FFFF,DISALLOWED,<NOT A CHARACTER>..<NOT A CHARACTER>
+80000-8FFFD,UNASSIGNED,<RESERVED>..<RESERVED>
+8FFFE-8FFFF,DISALLOWED,<NOT A CHARACTER>..<NOT A CHARACTER>
+90000-9FFFD,UNASSIGNED,<RESERVED>..<RESERVED>
+9FFFE-9FFFF,DISALLOWED,<NOT A CHARACTER>..<NOT A CHARACTER>
+A0000-AFFFD,UNASSIGNED,<RESERVED>..<RESERVED>
+AFFFE-AFFFF,DISALLOWED,<NOT A CHARACTER>..<NOT A CHARACTER>
+B0000-BFFFD,UNASSIGNED,<RESERVED>..<RESERVED>
+BFFFE-BFFFF,DISALLOWED,<NOT A CHARACTER>..<NOT A CHARACTER>
+C0000-CFFFD,UNASSIGNED,<RESERVED>..<RESERVED>
+CFFFE-CFFFF,DISALLOWED,<NOT A CHARACTER>..<NOT A CHARACTER>
+D0000-DFFFD,UNASSIGNED,<RESERVED>..<RESERVED>
+DFFFE-DFFFF,DISALLOWED,<NOT A CHARACTER>..<NOT A CHARACTER>
+E0000,UNASSIGNED,<RESERVED>
+E0001,DISALLOWED,LANGUAGE TAG
+E0002-E001F,UNASSIGNED,<RESERVED>..<RESERVED>
+E0020-E007F,DISALLOWED,TAG SPACE..CANCEL TAG
+E0080-E00FF,UNASSIGNED,<RESERVED>..<RESERVED>
+E0100-E01EF,DISALLOWED,VARIATION SELECTOR-17..VARIATION SELECTOR-256
+E01F0-EFFFD,UNASSIGNED,<RESERVED>..<RESERVED>
+EFFFE-10FFFF,DISALLOWED,<NOT A CHARACTER>..<NOT A CHARACTER>
diff --git a/utils/idna.c b/utils/idna.c
new file mode 100644
index 000000000..b979e4ecf
--- /dev/null
+++ b/utils/idna.c
@@ -0,0 +1,735 @@
+/*
+ * Copyright 2014 Chris Young <chris@unsatisfactorysoftware.co.uk>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * NetSurf international domain name handling (implementation).
+ */
+
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "utils/errors.h"
+#include "utils/idna.h"
+#include "utils/idna_props.h"
+#include "utils/log.h"
+#include "utils/punycode.h"
+#include "utils/utf8.h"
+#include "utils/utf8proc.h"
+#include "utils/utils.h"
+
+
+int32_t idna_contexto[] = {
+ /* CONTEXTO codepoints which have a rule defined */
+ 0x00b7, 0x0375, 0x05f3, 0x05f4, 0x30fb, 0x0660, 0x0661,
+ 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, 0x0668,
+ 0x0669, 0x06f0, 0x06f1, 0x06f2, 0x06f3, 0x06f4, 0x06f5,
+ 0x06f6, 0x06f7, 0x06f8, 0x06f9, 0
+};
+
+/**
+ * Convert punycode status into nserror.
+ *
+ * \param status The punycode status to convert.
+ * \return The corresponding nserror code for the status.
+ */
+static nserror punycode_status_to_nserror(enum punycode_status status)
+{
+ nserror ret = NSERROR_NOMEM;
+
+ switch (status) {
+ case punycode_success:
+ ret = NSERROR_OK;
+ break;
+
+ case punycode_bad_input:
+ LOG(("Bad input"));
+ ret = NSERROR_BAD_ENCODING;
+ break;
+
+ case punycode_big_output:
+ LOG(("Output too big"));
+ ret = NSERROR_BAD_SIZE;
+ break;
+
+ case punycode_overflow:
+ LOG(("Overflow"));
+ ret = NSERROR_NOSPACE;
+ break;
+
+ default:
+ break;
+ }
+ return ret;
+}
+
+/**
+ * Find the IDNA property of a UCS-4 codepoint
+ *
+ * \param cp Unicode codepoint
+ * \return IDNA property
+ */
+static idna_property idna__cp_property(int32_t cp)
+{
+ const idna_table *t;
+
+ t = idna_derived;
+ while (t->p.property) {
+ if ((cp >= t->start) && (cp <= t->end)) {
+ return t->p.property;
+ }
+ t++;
+ };
+
+ return IDNA_P_DISALLOWED;
+}
+
+
+/**
+ * Find the Joining_Type property of a UCS-4 codepoint
+ *
+ * \param cp Unicode codepoint
+ * \return JT property
+ */
+static idna_unicode_jt idna__jt_property(int32_t cp)
+{
+ const idna_table *t;
+
+ t = idna_joiningtype;
+ while (t->p.jt) {
+ if ((cp >= t->start) && (cp <= t->end)) {
+ return t->p.jt;
+ }
+ t++;
+ };
+
+ return IDNA_UNICODE_JT_U;
+}
+
+
+/**
+ * Check if a CONTEXTO codepoint has a rule defined
+ *
+ * \param cp Unicode codepoint
+ * \return true if a rule is defined
+ */
+static bool idna__contexto_rule(int32_t cp)
+{
+ int32_t *t;
+ for (t = idna_contexto; *t != 0; t++) {
+ if (*t == cp) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+/**
+ * Check if a CONTEXTJ codepoint has a rule defined,
+ * and conforms to that rule.
+ *
+ * \param string UCS-4 string
+ * \param index character in the string which is CONTEXTJ
+ * \return true if conforming
+ */
+static bool idna__contextj_rule(int32_t *label, int index, size_t len)
+{
+ const utf8proc_property_t *unicode_props;
+ idna_unicode_jt joining_type;
+ int i;
+ bool match;
+
+ /* These CONTEXTJ rules are defined at
+ * http://www.iana.org/assignments/idna-tables-5.2.0/idna-tables-5.2.0.xml
+ */
+
+ if (label[index] == 0x200c) {
+ if (index == 0) {
+ return false; /* No previous character */
+ }
+ unicode_props = utf8proc_get_property(label[index - 1]);
+ if (unicode_props->combining_class == UTF8PROC_CCC_VIRAMA) {
+ return true;
+ }
+
+ match = false;
+ for (i = 0; i < (index - 1); i++) {
+ joining_type = idna__jt_property(label[i]);
+ if (((joining_type == IDNA_UNICODE_JT_L) ||
+ (joining_type == IDNA_UNICODE_JT_D)) &&
+ (idna__jt_property(label[i+1]) == IDNA_UNICODE_JT_T)) {
+ match = true;
+ break;
+ }
+ }
+
+ if (match == false) {
+ return false;
+ }
+
+ if (idna__jt_property(label[index+1]) != IDNA_UNICODE_JT_T) {
+ return false;
+ }
+
+ for (i = (index + 1); i < (int)len; i++) {
+ joining_type = idna__jt_property(label[i]);
+
+ if ((joining_type == IDNA_UNICODE_JT_R) ||
+ (joining_type == IDNA_UNICODE_JT_D)) {
+ return true;
+ }
+ }
+
+ return false;
+
+ } else if (label[index] == 0x200d) {
+ if (index == 0) {
+ return false; /* No previous character */
+ }
+ unicode_props = utf8proc_get_property(label[index - 1]);
+ if (unicode_props->combining_class == UTF8PROC_CCC_VIRAMA) {
+ return true;
+ }
+ return false;
+ }
+
+ /* No rule defined */
+ return false;
+}
+
+
+/**
+ * Convert a UTF-8 string to UCS-4
+ *
+ * \param utf8_label UTF-8 string containing host label
+ * \param len Length of host label (in bytes)
+ * \param ucs4_label Pointer to update with the output
+ * \param ucs4_len Pointer to update with the length
+ * \return NSERROR_OK on success, appropriate error otherwise
+ *
+ * If return value != NSERROR_OK, output will be left untouched.
+ */
+static nserror
+idna__utf8_to_ucs4(const char *utf8_label,
+ size_t len,
+ int32_t **ucs4_label,
+ size_t *ucs4_len)
+{
+ int32_t *nfc_label;
+ ssize_t nfc_size;
+
+ nfc_label = malloc(len * 4);
+ if (nfc_label == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ nfc_size = utf8proc_decompose((const uint8_t *)utf8_label, len,
+ nfc_label, len * 4, UTF8PROC_STABLE | UTF8PROC_COMPOSE);
+ if (nfc_size < 0) {
+ return NSERROR_NOMEM;
+ }
+
+ nfc_size = utf8proc_normalise(nfc_label, nfc_size,
+ UTF8PROC_STABLE | UTF8PROC_COMPOSE);
+ if (nfc_size < 0) {
+ return NSERROR_NOMEM;
+ }
+
+ *ucs4_label = nfc_label;
+ *ucs4_len = nfc_size;
+
+ return NSERROR_OK;
+}
+
+
+/**
+ * Convert a UCS-4 string to UTF-8
+ *
+ * \param ucs4_label UCS-4 string containing host label
+ * \param ucs4_len Length of host label (in bytes)
+ * \param utf8_label Pointer to update with the output
+ * \param utf8_len Pointer to update with the length
+ * \return NSERROR_OK on success, appropriate error otherwise
+ *
+ * If return value != NSERROR_OK, output will be left untouched.
+ */
+static nserror
+idna__ucs4_to_utf8(const int32_t *ucs4_label,
+ size_t ucs4_len,
+ char **utf8_label,
+ size_t *utf8_len)
+{
+ int32_t *nfc_label;
+ ssize_t nfc_size = ucs4_len;
+
+ nfc_label = malloc(1 + ucs4_len * 4);
+ if (nfc_label == NULL) {
+ return NSERROR_NOMEM;
+ }
+ memcpy(nfc_label, ucs4_label, ucs4_len * 4);
+
+ nfc_size = utf8proc_reencode(nfc_label, ucs4_len,
+ UTF8PROC_STABLE | UTF8PROC_COMPOSE);
+ if (nfc_size < 0) {
+ return NSERROR_NOMEM;
+ }
+
+ *utf8_label = (char *)nfc_label;
+ *utf8_len = nfc_size;
+
+ return NSERROR_OK;
+}
+
+
+/**
+ * Convert a host label in UCS-4 to an ACE version
+ *
+ * \param ucs4_label UCS-4 NFC string containing host label
+ * \param len Length of host label (in characters/codepoints)
+ * \param ace_label ASCII-compatible encoded version
+ * \param out_len Length of ace_label
+ * \return NSERROR_OK on success, appropriate error otherwise
+ *
+ * If return value != NSERROR_OK, output will be left untouched.
+ */
+static nserror
+idna__ucs4_to_ace(int32_t *ucs4_label,
+ size_t len,
+ char **ace_label,
+ size_t *out_len)
+{
+ char punycode[65]; /* max length of host label + NULL */
+ size_t output_length = 60; /* punycode length - 4 - 1 */
+ nserror ret;
+
+ punycode[0] = 'x';
+ punycode[1] = 'n';
+ punycode[2] = '-';
+ punycode[3] = '-';
+
+ ret = punycode_status_to_nserror(punycode_encode(len,
+ (const punycode_uint *)ucs4_label, NULL,
+ &output_length, punycode + 4));
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+
+ output_length += SLEN("xn--");
+ punycode[output_length] = '\0';
+
+ *ace_label = strdup(punycode);
+ *out_len = output_length;
+
+ return NSERROR_OK;
+}
+
+
+/**
+ * Convert a host label in ACE format to UCS-4
+ *
+ * \param ace_label ASCII string containing host label
+ * \param ace_len Length of host label
+ * \param ucs4_label Pointer to hold UCS4 decoded version
+ * \param ucs4_len Pointer to hold length of ucs4_label
+ * \return NSERROR_OK on success, appropriate error otherwise
+ *
+ * If return value != NSERROR_OK, output will be left untouched.
+ */
+static nserror
+idna__ace_to_ucs4(const char *ace_label,
+ size_t ace_len,
+ int32_t **ucs4_label,
+ size_t *ucs4_len)
+{
+ int32_t *ucs4;
+ nserror ret;
+ size_t output_length = ace_len; /* never exceeds input length */
+
+ /* The header should always have been checked before calling */
+ assert((ace_label[0] == 'x') && (ace_label[1] == 'n') &&
+ (ace_label[2] == '-') && (ace_label[3] == '-'));
+
+ ucs4 = malloc(output_length * 4);
+ if (ucs4 == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ ret = punycode_status_to_nserror(punycode_decode(ace_len - 4,
+ ace_label + 4, &output_length, (punycode_uint *)ucs4, NULL));
+ if (ret != NSERROR_OK) {
+ free(ucs4);
+ return ret;
+ }
+
+ ucs4[output_length] = '\0';
+
+ *ucs4_label = ucs4;
+ *ucs4_len = output_length;
+
+ return NSERROR_OK;
+}
+
+
+/**
+ * Find the length of a host label
+ *
+ * \param host String containing a host or FQDN
+ * \param max_length Length of host string to search (in bytes)
+ * \return Distance to next separator character or end of string
+ */
+static size_t idna__host_label_length(const char *host, size_t max_length)
+{
+ const char *p = host;
+ size_t length = 0;
+
+ while (length < max_length) {
+ if ((*p == '.') || (*p == ':') || (*p == '\0')) {
+ break;
+ }
+ length++;
+ p++;
+ }
+
+ return length;
+}
+
+
+/**
+ * Check if a host label is valid for IDNA2008
+ *
+ * \param label Host label to check (UCS-4)
+ * \param len Length of host label (in characters/codepoints)
+ * \return true if compliant, false otherwise
+ */
+static bool idna__is_valid(int32_t *label, size_t len)
+{
+ const utf8proc_property_t *unicode_props;
+ idna_property idna_prop;
+ size_t i = 0;
+
+ /* 1. Check that the string is NFC.
+ * This check is skipped as the conversion to Unicode
+ * does normalisation as part of the conversion.
+ */
+
+ /* 2. Check characters 3 and 4 are not '--'. */
+ if ((label[2] == 0x002d) && (label[3] == 0x002d)) {
+ LOG(("Check failed: characters 2 and 3 are '--'"));
+ return false;
+ }
+
+ /* 3. Check the first character is not a combining mark */
+ unicode_props = utf8proc_get_property(label[0]);
+
+ if ((unicode_props->category == UTF8PROC_CATEGORY_MN) ||
+ (unicode_props->category == UTF8PROC_CATEGORY_MC) ||
+ (unicode_props->category == UTF8PROC_CATEGORY_ME)) {
+ LOG(("Check failed: character 0 is a combining mark"));
+ return false;
+ }
+
+ for (i = 0; i < len; i++) {
+ idna_prop = idna__cp_property(label[i]);
+
+ /* 4. Check characters not DISALLOWED by RFC5892 */
+ if (idna_prop == IDNA_P_DISALLOWED) {
+ LOG(("Check failed: character %d (%x) is DISALLOWED", i, label[i]));
+ return false;
+ }
+
+ /* 5. Check CONTEXTJ characters conform to defined rules */
+ if (idna_prop == IDNA_P_CONTEXTJ) {
+ if (idna__contextj_rule(label, i, len) == false) {
+ LOG(("Check failed: character %d (%x) does not conform to CONTEXTJ rule", i, label[i]));
+ return false;
+ }
+ }
+
+ /* 6. Check CONTEXTO characters have a rule defined */
+ /** \todo optionally we can check conformance to this rule */
+ if (idna_prop == IDNA_P_CONTEXTO) {
+ if (idna__contexto_rule(label[i]) == false) {
+ LOG(("Check failed: character %d (%x) has no CONTEXTO rule defined", i, label[i]));
+ return false;
+ }
+ }
+
+ /* 7. Check characters are not UNASSIGNED */
+ if (idna_prop == IDNA_P_UNASSIGNED) {
+ LOG(("Check failed: character %d (%x) is UNASSIGNED", i, label[i]));
+ return false;
+ }
+
+ /** \todo 8. (optionally) check Bidi compliance */
+ }
+
+ return true;
+}
+
+
+/**
+ * Check if a host label is LDH
+ *
+ * \param label Host label to check
+ * \param len Length of host label
+ * \return true if LDH compliant, false otherwise
+ */
+static bool idna__is_ldh(const char *label, size_t len)
+{
+ const char *p = label;
+ size_t i = 0;
+
+ /* Check for leading or trailing hyphens */
+ if ((p[0] == '-') || (p[len - 1] == '-'))
+ return false;
+
+ /* Check for non-alphanumeric, non-hyphen characters */
+ for (i = 0; i < len; p++) {
+ i++;
+ if (*p == '-') continue;
+ if ((*p >= '0') && (*p <= '9')) continue;
+ if ((*p >= 'a') && (*p <= 'z')) continue;
+ if ((*p >= 'A') && (*p <= 'Z')) continue;
+
+ return false;
+ }
+
+ return true;
+}
+
+
+/**
+ * Check if a host label appears to be ACE
+ *
+ * \param label Host label to check
+ * \param len Length of host label
+ * \return true if ACE compliant, false otherwise
+ */
+static bool idna__is_ace(const char *label, size_t len)
+{
+ /* Check it is a valid DNS string */
+ if (idna__is_ldh(label, len) == false) {
+ return false;
+ }
+
+ /* Check the ACE prefix is present */
+ if ((label[0] == 'x') && (label[1] == 'n') &&
+ (label[2] == '-') && (label[3] == '-')) {
+ return true;
+ }
+
+ return false;
+}
+
+
+/**
+ * Verify an ACE label is valid
+ *
+ * \param label Host label to check
+ * \param len Length of label
+ * \return true if valid, false otherwise
+ */
+static bool idna__verify(const char *label, size_t len)
+{
+ nserror error;
+ int32_t *ucs4;
+ char *ace;
+ ssize_t ucs4_len;
+ size_t u_ucs4_len, ace_len;
+
+ /* Convert our ACE label back to UCS-4 */
+ error = idna__ace_to_ucs4(label, len, &ucs4, &u_ucs4_len);
+ if (error != NSERROR_OK) {
+ return false;
+ }
+
+ /* Perform NFC normalisation */
+ ucs4_len = utf8proc_normalise(ucs4, u_ucs4_len,
+ UTF8PROC_STABLE | UTF8PROC_COMPOSE);
+ if (ucs4_len < 0) {
+ free(ucs4);
+ return false;
+ }
+
+ /* Convert the UCS-4 label back to ACE */
+ error = idna__ucs4_to_ace(ucs4, (size_t)ucs4_len,
+ &ace, &ace_len);
+ free(ucs4);
+ if (error != NSERROR_OK) {
+ return false;
+ }
+
+ /* Check if it matches the input */
+ if ((len == ace_len) && (strncmp(label, ace, len) == 0)) {
+ free(ace);
+ return true;
+ }
+
+ LOG(("Re-encoded ACE label %s does not match input", ace));
+ free(ace);
+
+ return false;
+}
+
+
+/* exported interface documented in idna.h */
+nserror
+idna_encode(const char *host, size_t len, char **ace_host, size_t *ace_len)
+{
+ nserror error;
+ int32_t *ucs4_host;
+ size_t label_len, output_len, ucs4_len, fqdn_len = 0;
+ char fqdn[256];
+ char *output, *fqdn_p = fqdn;
+
+ label_len = idna__host_label_length(host, len);
+ if (label_len == 0) {
+ return NSERROR_BAD_URL;
+ }
+
+ while (label_len != 0) {
+ if (idna__is_ldh(host, label_len) == false) {
+ /* This string is IDN or invalid */
+
+ /* Convert to Unicode */
+ if ((error = idna__utf8_to_ucs4(host, label_len,
+ &ucs4_host, &ucs4_len)) != NSERROR_OK) {
+ return error;
+ }
+
+ /* Check this is valid for conversion */
+ if (idna__is_valid(ucs4_host, ucs4_len) == false) {
+ free(ucs4_host);
+ return NSERROR_BAD_URL;
+ }
+
+ /* Convert to ACE */
+ error = idna__ucs4_to_ace(ucs4_host, ucs4_len,
+ &output, &output_len);
+ free(ucs4_host);
+ if (error != NSERROR_OK) {
+ return error;
+ }
+ strncpy(fqdn_p, output, output_len);
+ free(output);
+ fqdn_p += output_len;
+ fqdn_len += output_len;
+ } else {
+ /* This is already a DNS-valid ASCII string */
+ if ((idna__is_ace(host, label_len) == true) &&
+ (idna__verify(host, label_len) == false)) {
+ LOG(("Cannot verify ACE label %s", host));
+ return NSERROR_BAD_URL;
+ }
+ strncpy(fqdn_p, host, label_len);
+ fqdn_p += label_len;
+ fqdn_len += label_len;
+ }
+
+ *fqdn_p = '.';
+ fqdn_p++;
+ fqdn_len++;
+
+ host += label_len;
+ if ((*host == '\0') || (*host == ':')) {
+ break;
+ }
+ host++;
+ len = len - label_len - 1;
+
+ label_len = idna__host_label_length(host, len);
+ }
+
+ fqdn_p--;
+ *fqdn_p = '\0';
+ *ace_host = strdup(fqdn);
+ *ace_len = fqdn_len - 1; /* last character is NULL */
+
+ return NSERROR_OK;
+}
+
+
+/* exported interface documented in idna.h */
+nserror
+idna_decode(const char *ace_host, size_t ace_len, char **host, size_t *host_len)
+{
+ nserror error;
+ int32_t *ucs4_host;
+ size_t label_len, output_len, ucs4_len, fqdn_len = 0;
+ char fqdn[256];
+ char *output, *fqdn_p = fqdn;
+
+ label_len = idna__host_label_length(ace_host, ace_len);
+ if (label_len == 0) {
+ return NSERROR_BAD_URL;
+ }
+
+ while (label_len != 0) {
+ if (idna__is_ace(ace_host, label_len) == true) {
+ /* This string is DNS-valid and (probably) encoded */
+
+ /* Decode to Unicode */
+ error = idna__ace_to_ucs4(ace_host, label_len,
+ &ucs4_host, &ucs4_len);
+ if (error != NSERROR_OK) {
+ return error;
+ }
+
+ /* Convert to UTF-8 */
+ error = idna__ucs4_to_utf8(ucs4_host, ucs4_len,
+ &output, &output_len);
+ free(ucs4_host);
+ if (error != NSERROR_OK) {
+ return error;
+ }
+
+ memcpy(fqdn_p, output, output_len * 4);
+ free(output);
+ fqdn_p += output_len;
+ fqdn_len += output_len;
+ } else {
+ /* Not ACE */
+ memcpy(fqdn_p, ace_host, label_len);
+ fqdn_p += label_len;
+ fqdn_len += label_len;
+ }
+
+ *fqdn_p = '.';
+ fqdn_p++;
+ fqdn_len++;
+
+ ace_host += label_len;
+ if ((*ace_host == '\0') || (*ace_host == ':')) {
+ break;
+ }
+ ace_host++;
+ ace_len = ace_len - label_len - 1;
+
+ label_len = idna__host_label_length(ace_host, ace_len);
+ }
+
+ fqdn_p--;
+ *fqdn_p = '\0';
+ *host = strdup(fqdn);
+ *host_len = fqdn_len - 1; /* last character is NULL */
+
+ return NSERROR_OK;
+}
diff --git a/utils/idna.h b/utils/idna.h
new file mode 100644
index 000000000..c59a22763
--- /dev/null
+++ b/utils/idna.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2014 Chris Young <chris@unsatisfactorysoftware.co.uk>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * NetSurf international domain name handling (interface).
+ */
+
+#ifndef _NETSURF_UTILS_IDNA_H_
+#define _NETSURF_UTILS_IDNA_H_
+
+/**
+ * Convert a hostname to an ACE version suitable for DNS lookup
+ *
+ * \param host String containing host
+ * \param len Length of host string
+ * \param ace_host Pointer to update with the output
+ * \param ace_len Pointer to update with length of ace_host
+ * \return NSERROR_OK on success, appropriate error otherwise
+ *
+ * If return value != NSERROR_OK, output will be left untouched.
+ */
+nserror idna_encode(const char *host, size_t len, char **ace_host, size_t *ace_len);
+
+
+/**
+ * Convert a hostname from ACE to UTF-8 suitable for display
+ *
+ * \param ace_host String containing host
+ * \param ace_len Length of host string
+ * \param host Pointer to update with the output
+ * \param host_len Pointer to update with length of host
+ * \return NSERROR_OK on success, appropriate error otherwise
+ *
+ * If return value != NSERROR_OK, output will be left untouched.
+ */
+nserror idna_decode(const char *ace_host, size_t ace_len, char **host, size_t *host_len);
+
+#endif
+
diff --git a/utils/idna_props.h b/utils/idna_props.h
new file mode 100644
index 000000000..b5ca966c0
--- /dev/null
+++ b/utils/idna_props.h
@@ -0,0 +1,2634 @@
+/* This file is generated by idna-derived-props-gen.pl
+ * DO NOT EDIT BY HAND
+ */
+#ifndef _NETSURF_UTILS_IDNA_PROPS_H_
+#define _NETSURF_UTILS_IDNA_PROPS_H_
+
+typedef enum idna_property {
+ IDNA_P_PVALID = 1,
+ IDNA_P_CONTEXTJ = 2,
+ IDNA_P_CONTEXTO = 3,
+ IDNA_P_DISALLOWED = 4,
+ IDNA_P_UNASSIGNED = 5
+} idna_property;
+
+typedef enum idna_unicode_jt {
+ IDNA_UNICODE_JT_U = 0,
+ IDNA_UNICODE_JT_C = 1,
+ IDNA_UNICODE_JT_D = 2,
+ IDNA_UNICODE_JT_R = 3,
+ IDNA_UNICODE_JT_T = 4,
+ IDNA_UNICODE_JT_L = 5
+} idna_unicode_jt;
+
+
+typedef struct idna_table {
+ int32_t start;
+ int32_t end;
+ union p {
+ idna_property property;
+ idna_unicode_jt jt;
+ } p;
+} idna_table;
+
+idna_table idna_derived[] = {
+ { 0x0000, 0x002C, .p.property = IDNA_P_DISALLOWED },
+ { 0x002D, 0x002D, .p.property = IDNA_P_PVALID },
+ { 0x002E, 0x002F, .p.property = IDNA_P_DISALLOWED },
+ { 0x0030, 0x0039, .p.property = IDNA_P_PVALID },
+ { 0x003A, 0x0060, .p.property = IDNA_P_DISALLOWED },
+ { 0x0061, 0x007A, .p.property = IDNA_P_PVALID },
+ { 0x007B, 0x00B6, .p.property = IDNA_P_DISALLOWED },
+ { 0x00B7, 0x00B7, .p.property = IDNA_P_CONTEXTO },
+ { 0x00B8, 0x00DE, .p.property = IDNA_P_DISALLOWED },
+ { 0x00DF, 0x00F6, .p.property = IDNA_P_PVALID },
+ { 0x00F7, 0x00F7, .p.property = IDNA_P_DISALLOWED },
+ { 0x00F8, 0x00FF, .p.property = IDNA_P_PVALID },
+ { 0x0100, 0x0100, .p.property = IDNA_P_DISALLOWED },
+ { 0x0101, 0x0101, .p.property = IDNA_P_PVALID },
+ { 0x0102, 0x0102, .p.property = IDNA_P_DISALLOWED },
+ { 0x0103, 0x0103, .p.property = IDNA_P_PVALID },
+ { 0x0104, 0x0104, .p.property = IDNA_P_DISALLOWED },
+ { 0x0105, 0x0105, .p.property = IDNA_P_PVALID },
+ { 0x0106, 0x0106, .p.property = IDNA_P_DISALLOWED },
+ { 0x0107, 0x0107, .p.property = IDNA_P_PVALID },
+ { 0x0108, 0x0108, .p.property = IDNA_P_DISALLOWED },
+ { 0x0109, 0x0109, .p.property = IDNA_P_PVALID },
+ { 0x010A, 0x010A, .p.property = IDNA_P_DISALLOWED },
+ { 0x010B, 0x010B, .p.property = IDNA_P_PVALID },
+ { 0x010C, 0x010C, .p.property = IDNA_P_DISALLOWED },
+ { 0x010D, 0x010D, .p.property = IDNA_P_PVALID },
+ { 0x010E, 0x010E, .p.property = IDNA_P_DISALLOWED },
+ { 0x010F, 0x010F, .p.property = IDNA_P_PVALID },
+ { 0x0110, 0x0110, .p.property = IDNA_P_DISALLOWED },
+ { 0x0111, 0x0111, .p.property = IDNA_P_PVALID },
+ { 0x0112, 0x0112, .p.property = IDNA_P_DISALLOWED },
+ { 0x0113, 0x0113, .p.property = IDNA_P_PVALID },
+ { 0x0114, 0x0114, .p.property = IDNA_P_DISALLOWED },
+ { 0x0115, 0x0115, .p.property = IDNA_P_PVALID },
+ { 0x0116, 0x0116, .p.property = IDNA_P_DISALLOWED },
+ { 0x0117, 0x0117, .p.property = IDNA_P_PVALID },
+ { 0x0118, 0x0118, .p.property = IDNA_P_DISALLOWED },
+ { 0x0119, 0x0119, .p.property = IDNA_P_PVALID },
+ { 0x011A, 0x011A, .p.property = IDNA_P_DISALLOWED },
+ { 0x011B, 0x011B, .p.property = IDNA_P_PVALID },
+ { 0x011C, 0x011C, .p.property = IDNA_P_DISALLOWED },
+ { 0x011D, 0x011D, .p.property = IDNA_P_PVALID },
+ { 0x011E, 0x011E, .p.property = IDNA_P_DISALLOWED },
+ { 0x011F, 0x011F, .p.property = IDNA_P_PVALID },
+ { 0x0120, 0x0120, .p.property = IDNA_P_DISALLOWED },
+ { 0x0121, 0x0121, .p.property = IDNA_P_PVALID },
+ { 0x0122, 0x0122, .p.property = IDNA_P_DISALLOWED },
+ { 0x0123, 0x0123, .p.property = IDNA_P_PVALID },
+ { 0x0124, 0x0124, .p.property = IDNA_P_DISALLOWED },
+ { 0x0125, 0x0125, .p.property = IDNA_P_PVALID },
+ { 0x0126, 0x0126, .p.property = IDNA_P_DISALLOWED },
+ { 0x0127, 0x0127, .p.property = IDNA_P_PVALID },
+ { 0x0128, 0x0128, .p.property = IDNA_P_DISALLOWED },
+ { 0x0129, 0x0129, .p.property = IDNA_P_PVALID },
+ { 0x012A, 0x012A, .p.property = IDNA_P_DISALLOWED },
+ { 0x012B, 0x012B, .p.property = IDNA_P_PVALID },
+ { 0x012C, 0x012C, .p.property = IDNA_P_DISALLOWED },
+ { 0x012D, 0x012D, .p.property = IDNA_P_PVALID },
+ { 0x012E, 0x012E, .p.property = IDNA_P_DISALLOWED },
+ { 0x012F, 0x012F, .p.property = IDNA_P_PVALID },
+ { 0x0130, 0x0130, .p.property = IDNA_P_DISALLOWED },
+ { 0x0131, 0x0131, .p.property = IDNA_P_PVALID },
+ { 0x0132, 0x0134, .p.property = IDNA_P_DISALLOWED },
+ { 0x0135, 0x0135, .p.property = IDNA_P_PVALID },
+ { 0x0136, 0x0136, .p.property = IDNA_P_DISALLOWED },
+ { 0x0137, 0x0138, .p.property = IDNA_P_PVALID },
+ { 0x0139, 0x0139, .p.property = IDNA_P_DISALLOWED },
+ { 0x013A, 0x013A, .p.property = IDNA_P_PVALID },
+ { 0x013B, 0x013B, .p.property = IDNA_P_DISALLOWED },
+ { 0x013C, 0x013C, .p.property = IDNA_P_PVALID },
+ { 0x013D, 0x013D, .p.property = IDNA_P_DISALLOWED },
+ { 0x013E, 0x013E, .p.property = IDNA_P_PVALID },
+ { 0x013F, 0x0141, .p.property = IDNA_P_DISALLOWED },
+ { 0x0142, 0x0142, .p.property = IDNA_P_PVALID },
+ { 0x0143, 0x0143, .p.property = IDNA_P_DISALLOWED },
+ { 0x0144, 0x0144, .p.property = IDNA_P_PVALID },
+ { 0x0145, 0x0145, .p.property = IDNA_P_DISALLOWED },
+ { 0x0146, 0x0146, .p.property = IDNA_P_PVALID },
+ { 0x0147, 0x0147, .p.property = IDNA_P_DISALLOWED },
+ { 0x0148, 0x0148, .p.property = IDNA_P_PVALID },
+ { 0x0149, 0x014A, .p.property = IDNA_P_DISALLOWED },
+ { 0x014B, 0x014B, .p.property = IDNA_P_PVALID },
+ { 0x014C, 0x014C, .p.property = IDNA_P_DISALLOWED },
+ { 0x014D, 0x014D, .p.property = IDNA_P_PVALID },
+ { 0x014E, 0x014E, .p.property = IDNA_P_DISALLOWED },
+ { 0x014F, 0x014F, .p.property = IDNA_P_PVALID },
+ { 0x0150, 0x0150, .p.property = IDNA_P_DISALLOWED },
+ { 0x0151, 0x0151, .p.property = IDNA_P_PVALID },
+ { 0x0152, 0x0152, .p.property = IDNA_P_DISALLOWED },
+ { 0x0153, 0x0153, .p.property = IDNA_P_PVALID },
+ { 0x0154, 0x0154, .p.property = IDNA_P_DISALLOWED },
+ { 0x0155, 0x0155, .p.property = IDNA_P_PVALID },
+ { 0x0156, 0x0156, .p.property = IDNA_P_DISALLOWED },
+ { 0x0157, 0x0157, .p.property = IDNA_P_PVALID },
+ { 0x0158, 0x0158, .p.property = IDNA_P_DISALLOWED },
+ { 0x0159, 0x0159, .p.property = IDNA_P_PVALID },
+ { 0x015A, 0x015A, .p.property = IDNA_P_DISALLOWED },
+ { 0x015B, 0x015B, .p.property = IDNA_P_PVALID },
+ { 0x015C, 0x015C, .p.property = IDNA_P_DISALLOWED },
+ { 0x015D, 0x015D, .p.property = IDNA_P_PVALID },
+ { 0x015E, 0x015E, .p.property = IDNA_P_DISALLOWED },
+ { 0x015F, 0x015F, .p.property = IDNA_P_PVALID },
+ { 0x0160, 0x0160, .p.property = IDNA_P_DISALLOWED },
+ { 0x0161, 0x0161, .p.property = IDNA_P_PVALID },
+ { 0x0162, 0x0162, .p.property = IDNA_P_DISALLOWED },
+ { 0x0163, 0x0163, .p.property = IDNA_P_PVALID },
+ { 0x0164, 0x0164, .p.property = IDNA_P_DISALLOWED },
+ { 0x0165, 0x0165, .p.property = IDNA_P_PVALID },
+ { 0x0166, 0x0166, .p.property = IDNA_P_DISALLOWED },
+ { 0x0167, 0x0167, .p.property = IDNA_P_PVALID },
+ { 0x0168, 0x0168, .p.property = IDNA_P_DISALLOWED },
+ { 0x0169, 0x0169, .p.property = IDNA_P_PVALID },
+ { 0x016A, 0x016A, .p.property = IDNA_P_DISALLOWED },
+ { 0x016B, 0x016B, .p.property = IDNA_P_PVALID },
+ { 0x016C, 0x016C, .p.property = IDNA_P_DISALLOWED },
+ { 0x016D, 0x016D, .p.property = IDNA_P_PVALID },
+ { 0x016E, 0x016E, .p.property = IDNA_P_DISALLOWED },
+ { 0x016F, 0x016F, .p.property = IDNA_P_PVALID },
+ { 0x0170, 0x0170, .p.property = IDNA_P_DISALLOWED },
+ { 0x0171, 0x0171, .p.property = IDNA_P_PVALID },
+ { 0x0172, 0x0172, .p.property = IDNA_P_DISALLOWED },
+ { 0x0173, 0x0173, .p.property = IDNA_P_PVALID },
+ { 0x0174, 0x0174, .p.property = IDNA_P_DISALLOWED },
+ { 0x0175, 0x0175, .p.property = IDNA_P_PVALID },
+ { 0x0176, 0x0176, .p.property = IDNA_P_DISALLOWED },
+ { 0x0177, 0x0177, .p.property = IDNA_P_PVALID },
+ { 0x0178, 0x0179, .p.property = IDNA_P_DISALLOWED },
+ { 0x017A, 0x017A, .p.property = IDNA_P_PVALID },
+ { 0x017B, 0x017B, .p.property = IDNA_P_DISALLOWED },
+ { 0x017C, 0x017C, .p.property = IDNA_P_PVALID },
+ { 0x017D, 0x017D, .p.property = IDNA_P_DISALLOWED },
+ { 0x017E, 0x017E, .p.property = IDNA_P_PVALID },
+ { 0x017F, 0x017F, .p.property = IDNA_P_DISALLOWED },
+ { 0x0180, 0x0180, .p.property = IDNA_P_PVALID },
+ { 0x0181, 0x0182, .p.property = IDNA_P_DISALLOWED },
+ { 0x0183, 0x0183, .p.property = IDNA_P_PVALID },
+ { 0x0184, 0x0184, .p.property = IDNA_P_DISALLOWED },
+ { 0x0185, 0x0185, .p.property = IDNA_P_PVALID },
+ { 0x0186, 0x0187, .p.property = IDNA_P_DISALLOWED },
+ { 0x0188, 0x0188, .p.property = IDNA_P_PVALID },
+ { 0x0189, 0x018B, .p.property = IDNA_P_DISALLOWED },
+ { 0x018C, 0x018D, .p.property = IDNA_P_PVALID },
+ { 0x018E, 0x0191, .p.property = IDNA_P_DISALLOWED },
+ { 0x0192, 0x0192, .p.property = IDNA_P_PVALID },
+ { 0x0193, 0x0194, .p.property = IDNA_P_DISALLOWED },
+ { 0x0195, 0x0195, .p.property = IDNA_P_PVALID },
+ { 0x0196, 0x0198, .p.property = IDNA_P_DISALLOWED },
+ { 0x0199, 0x019B, .p.property = IDNA_P_PVALID },
+ { 0x019C, 0x019D, .p.property = IDNA_P_DISALLOWED },
+ { 0x019E, 0x019E, .p.property = IDNA_P_PVALID },
+ { 0x019F, 0x01A0, .p.property = IDNA_P_DISALLOWED },
+ { 0x01A1, 0x01A1, .p.property = IDNA_P_PVALID },
+ { 0x01A2, 0x01A2, .p.property = IDNA_P_DISALLOWED },
+ { 0x01A3, 0x01A3, .p.property = IDNA_P_PVALID },
+ { 0x01A4, 0x01A4, .p.property = IDNA_P_DISALLOWED },
+ { 0x01A5, 0x01A5, .p.property = IDNA_P_PVALID },
+ { 0x01A6, 0x01A7, .p.property = IDNA_P_DISALLOWED },
+ { 0x01A8, 0x01A8, .p.property = IDNA_P_PVALID },
+ { 0x01A9, 0x01A9, .p.property = IDNA_P_DISALLOWED },
+ { 0x01AA, 0x01AB, .p.property = IDNA_P_PVALID },
+ { 0x01AC, 0x01AC, .p.property = IDNA_P_DISALLOWED },
+ { 0x01AD, 0x01AD, .p.property = IDNA_P_PVALID },
+ { 0x01AE, 0x01AF, .p.property = IDNA_P_DISALLOWED },
+ { 0x01B0, 0x01B0, .p.property = IDNA_P_PVALID },
+ { 0x01B1, 0x01B3, .p.property = IDNA_P_DISALLOWED },
+ { 0x01B4, 0x01B4, .p.property = IDNA_P_PVALID },
+ { 0x01B5, 0x01B5, .p.property = IDNA_P_DISALLOWED },
+ { 0x01B6, 0x01B6, .p.property = IDNA_P_PVALID },
+ { 0x01B7, 0x01B8, .p.property = IDNA_P_DISALLOWED },
+ { 0x01B9, 0x01BB, .p.property = IDNA_P_PVALID },
+ { 0x01BC, 0x01BC, .p.property = IDNA_P_DISALLOWED },
+ { 0x01BD, 0x01C3, .p.property = IDNA_P_PVALID },
+ { 0x01C4, 0x01CD, .p.property = IDNA_P_DISALLOWED },
+ { 0x01CE, 0x01CE, .p.property = IDNA_P_PVALID },
+ { 0x01CF, 0x01CF, .p.property = IDNA_P_DISALLOWED },
+ { 0x01D0, 0x01D0, .p.property = IDNA_P_PVALID },
+ { 0x01D1, 0x01D1, .p.property = IDNA_P_DISALLOWED },
+ { 0x01D2, 0x01D2, .p.property = IDNA_P_PVALID },
+ { 0x01D3, 0x01D3, .p.property = IDNA_P_DISALLOWED },
+ { 0x01D4, 0x01D4, .p.property = IDNA_P_PVALID },
+ { 0x01D5, 0x01D5, .p.property = IDNA_P_DISALLOWED },
+ { 0x01D6, 0x01D6, .p.property = IDNA_P_PVALID },
+ { 0x01D7, 0x01D7, .p.property = IDNA_P_DISALLOWED },
+ { 0x01D8, 0x01D8, .p.property = IDNA_P_PVALID },
+ { 0x01D9, 0x01D9, .p.property = IDNA_P_DISALLOWED },
+ { 0x01DA, 0x01DA, .p.property = IDNA_P_PVALID },
+ { 0x01DB, 0x01DB, .p.property = IDNA_P_DISALLOWED },
+ { 0x01DC, 0x01DD, .p.property = IDNA_P_PVALID },
+ { 0x01DE, 0x01DE, .p.property = IDNA_P_DISALLOWED },
+ { 0x01DF, 0x01DF, .p.property = IDNA_P_PVALID },
+ { 0x01E0, 0x01E0, .p.property = IDNA_P_DISALLOWED },
+ { 0x01E1, 0x01E1, .p.property = IDNA_P_PVALID },
+ { 0x01E2, 0x01E2, .p.property = IDNA_P_DISALLOWED },
+ { 0x01E3, 0x01E3, .p.property = IDNA_P_PVALID },
+ { 0x01E4, 0x01E4, .p.property = IDNA_P_DISALLOWED },
+ { 0x01E5, 0x01E5, .p.property = IDNA_P_PVALID },
+ { 0x01E6, 0x01E6, .p.property = IDNA_P_DISALLOWED },
+ { 0x01E7, 0x01E7, .p.property = IDNA_P_PVALID },
+ { 0x01E8, 0x01E8, .p.property = IDNA_P_DISALLOWED },
+ { 0x01E9, 0x01E9, .p.property = IDNA_P_PVALID },
+ { 0x01EA, 0x01EA, .p.property = IDNA_P_DISALLOWED },
+ { 0x01EB, 0x01EB, .p.property = IDNA_P_PVALID },
+ { 0x01EC, 0x01EC, .p.property = IDNA_P_DISALLOWED },
+ { 0x01ED, 0x01ED, .p.property = IDNA_P_PVALID },
+ { 0x01EE, 0x01EE, .p.property = IDNA_P_DISALLOWED },
+ { 0x01EF, 0x01F0, .p.property = IDNA_P_PVALID },
+ { 0x01F1, 0x01F4, .p.property = IDNA_P_DISALLOWED },
+ { 0x01F5, 0x01F5, .p.property = IDNA_P_PVALID },
+ { 0x01F6, 0x01F8, .p.property = IDNA_P_DISALLOWED },
+ { 0x01F9, 0x01F9, .p.property = IDNA_P_PVALID },
+ { 0x01FA, 0x01FA, .p.property = IDNA_P_DISALLOWED },
+ { 0x01FB, 0x01FB, .p.property = IDNA_P_PVALID },
+ { 0x01FC, 0x01FC, .p.property = IDNA_P_DISALLOWED },
+ { 0x01FD, 0x01FD, .p.property = IDNA_P_PVALID },
+ { 0x01FE, 0x01FE, .p.property = IDNA_P_DISALLOWED },
+ { 0x01FF, 0x01FF, .p.property = IDNA_P_PVALID },
+ { 0x0200, 0x0200, .p.property = IDNA_P_DISALLOWED },
+ { 0x0201, 0x0201, .p.property = IDNA_P_PVALID },
+ { 0x0202, 0x0202, .p.property = IDNA_P_DISALLOWED },
+ { 0x0203, 0x0203, .p.property = IDNA_P_PVALID },
+ { 0x0204, 0x0204, .p.property = IDNA_P_DISALLOWED },
+ { 0x0205, 0x0205, .p.property = IDNA_P_PVALID },
+ { 0x0206, 0x0206, .p.property = IDNA_P_DISALLOWED },
+ { 0x0207, 0x0207, .p.property = IDNA_P_PVALID },
+ { 0x0208, 0x0208, .p.property = IDNA_P_DISALLOWED },
+ { 0x0209, 0x0209, .p.property = IDNA_P_PVALID },
+ { 0x020A, 0x020A, .p.property = IDNA_P_DISALLOWED },
+ { 0x020B, 0x020B, .p.property = IDNA_P_PVALID },
+ { 0x020C, 0x020C, .p.property = IDNA_P_DISALLOWED },
+ { 0x020D, 0x020D, .p.property = IDNA_P_PVALID },
+ { 0x020E, 0x020E, .p.property = IDNA_P_DISALLOWED },
+ { 0x020F, 0x020F, .p.property = IDNA_P_PVALID },
+ { 0x0210, 0x0210, .p.property = IDNA_P_DISALLOWED },
+ { 0x0211, 0x0211, .p.property = IDNA_P_PVALID },
+ { 0x0212, 0x0212, .p.property = IDNA_P_DISALLOWED },
+ { 0x0213, 0x0213, .p.property = IDNA_P_PVALID },
+ { 0x0214, 0x0214, .p.property = IDNA_P_DISALLOWED },
+ { 0x0215, 0x0215, .p.property = IDNA_P_PVALID },
+ { 0x0216, 0x0216, .p.property = IDNA_P_DISALLOWED },
+ { 0x0217, 0x0217, .p.property = IDNA_P_PVALID },
+ { 0x0218, 0x0218, .p.property = IDNA_P_DISALLOWED },
+ { 0x0219, 0x0219, .p.property = IDNA_P_PVALID },
+ { 0x021A, 0x021A, .p.property = IDNA_P_DISALLOWED },
+ { 0x021B, 0x021B, .p.property = IDNA_P_PVALID },
+ { 0x021C, 0x021C, .p.property = IDNA_P_DISALLOWED },
+ { 0x021D, 0x021D, .p.property = IDNA_P_PVALID },
+ { 0x021E, 0x021E, .p.property = IDNA_P_DISALLOWED },
+ { 0x021F, 0x021F, .p.property = IDNA_P_PVALID },
+ { 0x0220, 0x0220, .p.property = IDNA_P_DISALLOWED },
+ { 0x0221, 0x0221, .p.property = IDNA_P_PVALID },
+ { 0x0222, 0x0222, .p.property = IDNA_P_DISALLOWED },
+ { 0x0223, 0x0223, .p.property = IDNA_P_PVALID },
+ { 0x0224, 0x0224, .p.property = IDNA_P_DISALLOWED },
+ { 0x0225, 0x0225, .p.property = IDNA_P_PVALID },
+ { 0x0226, 0x0226, .p.property = IDNA_P_DISALLOWED },
+ { 0x0227, 0x0227, .p.property = IDNA_P_PVALID },
+ { 0x0228, 0x0228, .p.property = IDNA_P_DISALLOWED },
+ { 0x0229, 0x0229, .p.property = IDNA_P_PVALID },
+ { 0x022A, 0x022A, .p.property = IDNA_P_DISALLOWED },
+ { 0x022B, 0x022B, .p.property = IDNA_P_PVALID },
+ { 0x022C, 0x022C, .p.property = IDNA_P_DISALLOWED },
+ { 0x022D, 0x022D, .p.property = IDNA_P_PVALID },
+ { 0x022E, 0x022E, .p.property = IDNA_P_DISALLOWED },
+ { 0x022F, 0x022F, .p.property = IDNA_P_PVALID },
+ { 0x0230, 0x0230, .p.property = IDNA_P_DISALLOWED },
+ { 0x0231, 0x0231, .p.property = IDNA_P_PVALID },
+ { 0x0232, 0x0232, .p.property = IDNA_P_DISALLOWED },
+ { 0x0233, 0x0239, .p.property = IDNA_P_PVALID },
+ { 0x023A, 0x023B, .p.property = IDNA_P_DISALLOWED },
+ { 0x023C, 0x023C, .p.property = IDNA_P_PVALID },
+ { 0x023D, 0x023E, .p.property = IDNA_P_DISALLOWED },
+ { 0x023F, 0x0240, .p.property = IDNA_P_PVALID },
+ { 0x0241, 0x0241, .p.property = IDNA_P_DISALLOWED },
+ { 0x0242, 0x0242, .p.property = IDNA_P_PVALID },
+ { 0x0243, 0x0246, .p.property = IDNA_P_DISALLOWED },
+ { 0x0247, 0x0247, .p.property = IDNA_P_PVALID },
+ { 0x0248, 0x0248, .p.property = IDNA_P_DISALLOWED },
+ { 0x0249, 0x0249, .p.property = IDNA_P_PVALID },
+ { 0x024A, 0x024A, .p.property = IDNA_P_DISALLOWED },
+ { 0x024B, 0x024B, .p.property = IDNA_P_PVALID },
+ { 0x024C, 0x024C, .p.property = IDNA_P_DISALLOWED },
+ { 0x024D, 0x024D, .p.property = IDNA_P_PVALID },
+ { 0x024E, 0x024E, .p.property = IDNA_P_DISALLOWED },
+ { 0x024F, 0x02AF, .p.property = IDNA_P_PVALID },
+ { 0x02B0, 0x02B8, .p.property = IDNA_P_DISALLOWED },
+ { 0x02B9, 0x02C1, .p.property = IDNA_P_PVALID },
+ { 0x02C2, 0x02C5, .p.property = IDNA_P_DISALLOWED },
+ { 0x02C6, 0x02D1, .p.property = IDNA_P_PVALID },
+ { 0x02D2, 0x02EB, .p.property = IDNA_P_DISALLOWED },
+ { 0x02EC, 0x02EC, .p.property = IDNA_P_PVALID },
+ { 0x02ED, 0x02ED, .p.property = IDNA_P_DISALLOWED },
+ { 0x02EE, 0x02EE, .p.property = IDNA_P_PVALID },
+ { 0x02EF, 0x02FF, .p.property = IDNA_P_DISALLOWED },
+ { 0x0300, 0x033F, .p.property = IDNA_P_PVALID },
+ { 0x0340, 0x0341, .p.property = IDNA_P_DISALLOWED },
+ { 0x0342, 0x0342, .p.property = IDNA_P_PVALID },
+ { 0x0343, 0x0345, .p.property = IDNA_P_DISALLOWED },
+ { 0x0346, 0x034E, .p.property = IDNA_P_PVALID },
+ { 0x034F, 0x034F, .p.property = IDNA_P_DISALLOWED },
+ { 0x0350, 0x036F, .p.property = IDNA_P_PVALID },
+ { 0x0370, 0x0370, .p.property = IDNA_P_DISALLOWED },
+ { 0x0371, 0x0371, .p.property = IDNA_P_PVALID },
+ { 0x0372, 0x0372, .p.property = IDNA_P_DISALLOWED },
+ { 0x0373, 0x0373, .p.property = IDNA_P_PVALID },
+ { 0x0374, 0x0374, .p.property = IDNA_P_DISALLOWED },
+ { 0x0375, 0x0375, .p.property = IDNA_P_CONTEXTO },
+ { 0x0376, 0x0376, .p.property = IDNA_P_DISALLOWED },
+ { 0x0377, 0x0377, .p.property = IDNA_P_PVALID },
+ { 0x0378, 0x0379, .p.property = IDNA_P_UNASSIGNED },
+ { 0x037A, 0x037A, .p.property = IDNA_P_DISALLOWED },
+ { 0x037B, 0x037D, .p.property = IDNA_P_PVALID },
+ { 0x037E, 0x037E, .p.property = IDNA_P_DISALLOWED },
+ { 0x037F, 0x0383, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0384, 0x038A, .p.property = IDNA_P_DISALLOWED },
+ { 0x038B, 0x038B, .p.property = IDNA_P_UNASSIGNED },
+ { 0x038C, 0x038C, .p.property = IDNA_P_DISALLOWED },
+ { 0x038D, 0x038D, .p.property = IDNA_P_UNASSIGNED },
+ { 0x038E, 0x038F, .p.property = IDNA_P_DISALLOWED },
+ { 0x0390, 0x0390, .p.property = IDNA_P_PVALID },
+ { 0x0391, 0x03A1, .p.property = IDNA_P_DISALLOWED },
+ { 0x03A2, 0x03A2, .p.property = IDNA_P_UNASSIGNED },
+ { 0x03A3, 0x03AB, .p.property = IDNA_P_DISALLOWED },
+ { 0x03AC, 0x03CE, .p.property = IDNA_P_PVALID },
+ { 0x03CF, 0x03D6, .p.property = IDNA_P_DISALLOWED },
+ { 0x03D7, 0x03D7, .p.property = IDNA_P_PVALID },
+ { 0x03D8, 0x03D8, .p.property = IDNA_P_DISALLOWED },
+ { 0x03D9, 0x03D9, .p.property = IDNA_P_PVALID },
+ { 0x03DA, 0x03DA, .p.property = IDNA_P_DISALLOWED },
+ { 0x03DB, 0x03DB, .p.property = IDNA_P_PVALID },
+ { 0x03DC, 0x03DC, .p.property = IDNA_P_DISALLOWED },
+ { 0x03DD, 0x03DD, .p.property = IDNA_P_PVALID },
+ { 0x03DE, 0x03DE, .p.property = IDNA_P_DISALLOWED },
+ { 0x03DF, 0x03DF, .p.property = IDNA_P_PVALID },
+ { 0x03E0, 0x03E0, .p.property = IDNA_P_DISALLOWED },
+ { 0x03E1, 0x03E1, .p.property = IDNA_P_PVALID },
+ { 0x03E2, 0x03E2, .p.property = IDNA_P_DISALLOWED },
+ { 0x03E3, 0x03E3, .p.property = IDNA_P_PVALID },
+ { 0x03E4, 0x03E4, .p.property = IDNA_P_DISALLOWED },
+ { 0x03E5, 0x03E5, .p.property = IDNA_P_PVALID },
+ { 0x03E6, 0x03E6, .p.property = IDNA_P_DISALLOWED },
+ { 0x03E7, 0x03E7, .p.property = IDNA_P_PVALID },
+ { 0x03E8, 0x03E8, .p.property = IDNA_P_DISALLOWED },
+ { 0x03E9, 0x03E9, .p.property = IDNA_P_PVALID },
+ { 0x03EA, 0x03EA, .p.property = IDNA_P_DISALLOWED },
+ { 0x03EB, 0x03EB, .p.property = IDNA_P_PVALID },
+ { 0x03EC, 0x03EC, .p.property = IDNA_P_DISALLOWED },
+ { 0x03ED, 0x03ED, .p.property = IDNA_P_PVALID },
+ { 0x03EE, 0x03EE, .p.property = IDNA_P_DISALLOWED },
+ { 0x03EF, 0x03EF, .p.property = IDNA_P_PVALID },
+ { 0x03F0, 0x03F2, .p.property = IDNA_P_DISALLOWED },
+ { 0x03F3, 0x03F3, .p.property = IDNA_P_PVALID },
+ { 0x03F4, 0x03F7, .p.property = IDNA_P_DISALLOWED },
+ { 0x03F8, 0x03F8, .p.property = IDNA_P_PVALID },
+ { 0x03F9, 0x03FA, .p.property = IDNA_P_DISALLOWED },
+ { 0x03FB, 0x03FC, .p.property = IDNA_P_PVALID },
+ { 0x03FD, 0x042F, .p.property = IDNA_P_DISALLOWED },
+ { 0x0430, 0x045F, .p.property = IDNA_P_PVALID },
+ { 0x0460, 0x0460, .p.property = IDNA_P_DISALLOWED },
+ { 0x0461, 0x0461, .p.property = IDNA_P_PVALID },
+ { 0x0462, 0x0462, .p.property = IDNA_P_DISALLOWED },
+ { 0x0463, 0x0463, .p.property = IDNA_P_PVALID },
+ { 0x0464, 0x0464, .p.property = IDNA_P_DISALLOWED },
+ { 0x0465, 0x0465, .p.property = IDNA_P_PVALID },
+ { 0x0466, 0x0466, .p.property = IDNA_P_DISALLOWED },
+ { 0x0467, 0x0467, .p.property = IDNA_P_PVALID },
+ { 0x0468, 0x0468, .p.property = IDNA_P_DISALLOWED },
+ { 0x0469, 0x0469, .p.property = IDNA_P_PVALID },
+ { 0x046A, 0x046A, .p.property = IDNA_P_DISALLOWED },
+ { 0x046B, 0x046B, .p.property = IDNA_P_PVALID },
+ { 0x046C, 0x046C, .p.property = IDNA_P_DISALLOWED },
+ { 0x046D, 0x046D, .p.property = IDNA_P_PVALID },
+ { 0x046E, 0x046E, .p.property = IDNA_P_DISALLOWED },
+ { 0x046F, 0x046F, .p.property = IDNA_P_PVALID },
+ { 0x0470, 0x0470, .p.property = IDNA_P_DISALLOWED },
+ { 0x0471, 0x0471, .p.property = IDNA_P_PVALID },
+ { 0x0472, 0x0472, .p.property = IDNA_P_DISALLOWED },
+ { 0x0473, 0x0473, .p.property = IDNA_P_PVALID },
+ { 0x0474, 0x0474, .p.property = IDNA_P_DISALLOWED },
+ { 0x0475, 0x0475, .p.property = IDNA_P_PVALID },
+ { 0x0476, 0x0476, .p.property = IDNA_P_DISALLOWED },
+ { 0x0477, 0x0477, .p.property = IDNA_P_PVALID },
+ { 0x0478, 0x0478, .p.property = IDNA_P_DISALLOWED },
+ { 0x0479, 0x0479, .p.property = IDNA_P_PVALID },
+ { 0x047A, 0x047A, .p.property = IDNA_P_DISALLOWED },
+ { 0x047B, 0x047B, .p.property = IDNA_P_PVALID },
+ { 0x047C, 0x047C, .p.property = IDNA_P_DISALLOWED },
+ { 0x047D, 0x047D, .p.property = IDNA_P_PVALID },
+ { 0x047E, 0x047E, .p.property = IDNA_P_DISALLOWED },
+ { 0x047F, 0x047F, .p.property = IDNA_P_PVALID },
+ { 0x0480, 0x0480, .p.property = IDNA_P_DISALLOWED },
+ { 0x0481, 0x0481, .p.property = IDNA_P_PVALID },
+ { 0x0482, 0x0482, .p.property = IDNA_P_DISALLOWED },
+ { 0x0483, 0x0487, .p.property = IDNA_P_PVALID },
+ { 0x0488, 0x048A, .p.property = IDNA_P_DISALLOWED },
+ { 0x048B, 0x048B, .p.property = IDNA_P_PVALID },
+ { 0x048C, 0x048C, .p.property = IDNA_P_DISALLOWED },
+ { 0x048D, 0x048D, .p.property = IDNA_P_PVALID },
+ { 0x048E, 0x048E, .p.property = IDNA_P_DISALLOWED },
+ { 0x048F, 0x048F, .p.property = IDNA_P_PVALID },
+ { 0x0490, 0x0490, .p.property = IDNA_P_DISALLOWED },
+ { 0x0491, 0x0491, .p.property = IDNA_P_PVALID },
+ { 0x0492, 0x0492, .p.property = IDNA_P_DISALLOWED },
+ { 0x0493, 0x0493, .p.property = IDNA_P_PVALID },
+ { 0x0494, 0x0494, .p.property = IDNA_P_DISALLOWED },
+ { 0x0495, 0x0495, .p.property = IDNA_P_PVALID },
+ { 0x0496, 0x0496, .p.property = IDNA_P_DISALLOWED },
+ { 0x0497, 0x0497, .p.property = IDNA_P_PVALID },
+ { 0x0498, 0x0498, .p.property = IDNA_P_DISALLOWED },
+ { 0x0499, 0x0499, .p.property = IDNA_P_PVALID },
+ { 0x049A, 0x049A, .p.property = IDNA_P_DISALLOWED },
+ { 0x049B, 0x049B, .p.property = IDNA_P_PVALID },
+ { 0x049C, 0x049C, .p.property = IDNA_P_DISALLOWED },
+ { 0x049D, 0x049D, .p.property = IDNA_P_PVALID },
+ { 0x049E, 0x049E, .p.property = IDNA_P_DISALLOWED },
+ { 0x049F, 0x049F, .p.property = IDNA_P_PVALID },
+ { 0x04A0, 0x04A0, .p.property = IDNA_P_DISALLOWED },
+ { 0x04A1, 0x04A1, .p.property = IDNA_P_PVALID },
+ { 0x04A2, 0x04A2, .p.property = IDNA_P_DISALLOWED },
+ { 0x04A3, 0x04A3, .p.property = IDNA_P_PVALID },
+ { 0x04A4, 0x04A4, .p.property = IDNA_P_DISALLOWED },
+ { 0x04A5, 0x04A5, .p.property = IDNA_P_PVALID },
+ { 0x04A6, 0x04A6, .p.property = IDNA_P_DISALLOWED },
+ { 0x04A7, 0x04A7, .p.property = IDNA_P_PVALID },
+ { 0x04A8, 0x04A8, .p.property = IDNA_P_DISALLOWED },
+ { 0x04A9, 0x04A9, .p.property = IDNA_P_PVALID },
+ { 0x04AA, 0x04AA, .p.property = IDNA_P_DISALLOWED },
+ { 0x04AB, 0x04AB, .p.property = IDNA_P_PVALID },
+ { 0x04AC, 0x04AC, .p.property = IDNA_P_DISALLOWED },
+ { 0x04AD, 0x04AD, .p.property = IDNA_P_PVALID },
+ { 0x04AE, 0x04AE, .p.property = IDNA_P_DISALLOWED },
+ { 0x04AF, 0x04AF, .p.property = IDNA_P_PVALID },
+ { 0x04B0, 0x04B0, .p.property = IDNA_P_DISALLOWED },
+ { 0x04B1, 0x04B1, .p.property = IDNA_P_PVALID },
+ { 0x04B2, 0x04B2, .p.property = IDNA_P_DISALLOWED },
+ { 0x04B3, 0x04B3, .p.property = IDNA_P_PVALID },
+ { 0x04B4, 0x04B4, .p.property = IDNA_P_DISALLOWED },
+ { 0x04B5, 0x04B5, .p.property = IDNA_P_PVALID },
+ { 0x04B6, 0x04B6, .p.property = IDNA_P_DISALLOWED },
+ { 0x04B7, 0x04B7, .p.property = IDNA_P_PVALID },
+ { 0x04B8, 0x04B8, .p.property = IDNA_P_DISALLOWED },
+ { 0x04B9, 0x04B9, .p.property = IDNA_P_PVALID },
+ { 0x04BA, 0x04BA, .p.property = IDNA_P_DISALLOWED },
+ { 0x04BB, 0x04BB, .p.property = IDNA_P_PVALID },
+ { 0x04BC, 0x04BC, .p.property = IDNA_P_DISALLOWED },
+ { 0x04BD, 0x04BD, .p.property = IDNA_P_PVALID },
+ { 0x04BE, 0x04BE, .p.property = IDNA_P_DISALLOWED },
+ { 0x04BF, 0x04BF, .p.property = IDNA_P_PVALID },
+ { 0x04C0, 0x04C1, .p.property = IDNA_P_DISALLOWED },
+ { 0x04C2, 0x04C2, .p.property = IDNA_P_PVALID },
+ { 0x04C3, 0x04C3, .p.property = IDNA_P_DISALLOWED },
+ { 0x04C4, 0x04C4, .p.property = IDNA_P_PVALID },
+ { 0x04C5, 0x04C5, .p.property = IDNA_P_DISALLOWED },
+ { 0x04C6, 0x04C6, .p.property = IDNA_P_PVALID },
+ { 0x04C7, 0x04C7, .p.property = IDNA_P_DISALLOWED },
+ { 0x04C8, 0x04C8, .p.property = IDNA_P_PVALID },
+ { 0x04C9, 0x04C9, .p.property = IDNA_P_DISALLOWED },
+ { 0x04CA, 0x04CA, .p.property = IDNA_P_PVALID },
+ { 0x04CB, 0x04CB, .p.property = IDNA_P_DISALLOWED },
+ { 0x04CC, 0x04CC, .p.property = IDNA_P_PVALID },
+ { 0x04CD, 0x04CD, .p.property = IDNA_P_DISALLOWED },
+ { 0x04CE, 0x04CF, .p.property = IDNA_P_PVALID },
+ { 0x04D0, 0x04D0, .p.property = IDNA_P_DISALLOWED },
+ { 0x04D1, 0x04D1, .p.property = IDNA_P_PVALID },
+ { 0x04D2, 0x04D2, .p.property = IDNA_P_DISALLOWED },
+ { 0x04D3, 0x04D3, .p.property = IDNA_P_PVALID },
+ { 0x04D4, 0x04D4, .p.property = IDNA_P_DISALLOWED },
+ { 0x04D5, 0x04D5, .p.property = IDNA_P_PVALID },
+ { 0x04D6, 0x04D6, .p.property = IDNA_P_DISALLOWED },
+ { 0x04D7, 0x04D7, .p.property = IDNA_P_PVALID },
+ { 0x04D8, 0x04D8, .p.property = IDNA_P_DISALLOWED },
+ { 0x04D9, 0x04D9, .p.property = IDNA_P_PVALID },
+ { 0x04DA, 0x04DA, .p.property = IDNA_P_DISALLOWED },
+ { 0x04DB, 0x04DB, .p.property = IDNA_P_PVALID },
+ { 0x04DC, 0x04DC, .p.property = IDNA_P_DISALLOWED },
+ { 0x04DD, 0x04DD, .p.property = IDNA_P_PVALID },
+ { 0x04DE, 0x04DE, .p.property = IDNA_P_DISALLOWED },
+ { 0x04DF, 0x04DF, .p.property = IDNA_P_PVALID },
+ { 0x04E0, 0x04E0, .p.property = IDNA_P_DISALLOWED },
+ { 0x04E1, 0x04E1, .p.property = IDNA_P_PVALID },
+ { 0x04E2, 0x04E2, .p.property = IDNA_P_DISALLOWED },
+ { 0x04E3, 0x04E3, .p.property = IDNA_P_PVALID },
+ { 0x04E4, 0x04E4, .p.property = IDNA_P_DISALLOWED },
+ { 0x04E5, 0x04E5, .p.property = IDNA_P_PVALID },
+ { 0x04E6, 0x04E6, .p.property = IDNA_P_DISALLOWED },
+ { 0x04E7, 0x04E7, .p.property = IDNA_P_PVALID },
+ { 0x04E8, 0x04E8, .p.property = IDNA_P_DISALLOWED },
+ { 0x04E9, 0x04E9, .p.property = IDNA_P_PVALID },
+ { 0x04EA, 0x04EA, .p.property = IDNA_P_DISALLOWED },
+ { 0x04EB, 0x04EB, .p.property = IDNA_P_PVALID },
+ { 0x04EC, 0x04EC, .p.property = IDNA_P_DISALLOWED },
+ { 0x04ED, 0x04ED, .p.property = IDNA_P_PVALID },
+ { 0x04EE, 0x04EE, .p.property = IDNA_P_DISALLOWED },
+ { 0x04EF, 0x04EF, .p.property = IDNA_P_PVALID },
+ { 0x04F0, 0x04F0, .p.property = IDNA_P_DISALLOWED },
+ { 0x04F1, 0x04F1, .p.property = IDNA_P_PVALID },
+ { 0x04F2, 0x04F2, .p.property = IDNA_P_DISALLOWED },
+ { 0x04F3, 0x04F3, .p.property = IDNA_P_PVALID },
+ { 0x04F4, 0x04F4, .p.property = IDNA_P_DISALLOWED },
+ { 0x04F5, 0x04F5, .p.property = IDNA_P_PVALID },
+ { 0x04F6, 0x04F6, .p.property = IDNA_P_DISALLOWED },
+ { 0x04F7, 0x04F7, .p.property = IDNA_P_PVALID },
+ { 0x04F8, 0x04F8, .p.property = IDNA_P_DISALLOWED },
+ { 0x04F9, 0x04F9, .p.property = IDNA_P_PVALID },
+ { 0x04FA, 0x04FA, .p.property = IDNA_P_DISALLOWED },
+ { 0x04FB, 0x04FB, .p.property = IDNA_P_PVALID },
+ { 0x04FC, 0x04FC, .p.property = IDNA_P_DISALLOWED },
+ { 0x04FD, 0x04FD, .p.property = IDNA_P_PVALID },
+ { 0x04FE, 0x04FE, .p.property = IDNA_P_DISALLOWED },
+ { 0x04FF, 0x04FF, .p.property = IDNA_P_PVALID },
+ { 0x0500, 0x0500, .p.property = IDNA_P_DISALLOWED },
+ { 0x0501, 0x0501, .p.property = IDNA_P_PVALID },
+ { 0x0502, 0x0502, .p.property = IDNA_P_DISALLOWED },
+ { 0x0503, 0x0503, .p.property = IDNA_P_PVALID },
+ { 0x0504, 0x0504, .p.property = IDNA_P_DISALLOWED },
+ { 0x0505, 0x0505, .p.property = IDNA_P_PVALID },
+ { 0x0506, 0x0506, .p.property = IDNA_P_DISALLOWED },
+ { 0x0507, 0x0507, .p.property = IDNA_P_PVALID },
+ { 0x0508, 0x0508, .p.property = IDNA_P_DISALLOWED },
+ { 0x0509, 0x0509, .p.property = IDNA_P_PVALID },
+ { 0x050A, 0x050A, .p.property = IDNA_P_DISALLOWED },
+ { 0x050B, 0x050B, .p.property = IDNA_P_PVALID },
+ { 0x050C, 0x050C, .p.property = IDNA_P_DISALLOWED },
+ { 0x050D, 0x050D, .p.property = IDNA_P_PVALID },
+ { 0x050E, 0x050E, .p.property = IDNA_P_DISALLOWED },
+ { 0x050F, 0x050F, .p.property = IDNA_P_PVALID },
+ { 0x0510, 0x0510, .p.property = IDNA_P_DISALLOWED },
+ { 0x0511, 0x0511, .p.property = IDNA_P_PVALID },
+ { 0x0512, 0x0512, .p.property = IDNA_P_DISALLOWED },
+ { 0x0513, 0x0513, .p.property = IDNA_P_PVALID },
+ { 0x0514, 0x0514, .p.property = IDNA_P_DISALLOWED },
+ { 0x0515, 0x0515, .p.property = IDNA_P_PVALID },
+ { 0x0516, 0x0516, .p.property = IDNA_P_DISALLOWED },
+ { 0x0517, 0x0517, .p.property = IDNA_P_PVALID },
+ { 0x0518, 0x0518, .p.property = IDNA_P_DISALLOWED },
+ { 0x0519, 0x0519, .p.property = IDNA_P_PVALID },
+ { 0x051A, 0x051A, .p.property = IDNA_P_DISALLOWED },
+ { 0x051B, 0x051B, .p.property = IDNA_P_PVALID },
+ { 0x051C, 0x051C, .p.property = IDNA_P_DISALLOWED },
+ { 0x051D, 0x051D, .p.property = IDNA_P_PVALID },
+ { 0x051E, 0x051E, .p.property = IDNA_P_DISALLOWED },
+ { 0x051F, 0x051F, .p.property = IDNA_P_PVALID },
+ { 0x0520, 0x0520, .p.property = IDNA_P_DISALLOWED },
+ { 0x0521, 0x0521, .p.property = IDNA_P_PVALID },
+ { 0x0522, 0x0522, .p.property = IDNA_P_DISALLOWED },
+ { 0x0523, 0x0523, .p.property = IDNA_P_PVALID },
+ { 0x0524, 0x0524, .p.property = IDNA_P_DISALLOWED },
+ { 0x0525, 0x0525, .p.property = IDNA_P_PVALID },
+ { 0x0526, 0x0530, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0531, 0x0556, .p.property = IDNA_P_DISALLOWED },
+ { 0x0557, 0x0558, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0559, 0x0559, .p.property = IDNA_P_PVALID },
+ { 0x055A, 0x055F, .p.property = IDNA_P_DISALLOWED },
+ { 0x0560, 0x0560, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0561, 0x0586, .p.property = IDNA_P_PVALID },
+ { 0x0587, 0x0587, .p.property = IDNA_P_DISALLOWED },
+ { 0x0588, 0x0588, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0589, 0x058A, .p.property = IDNA_P_DISALLOWED },
+ { 0x058B, 0x0590, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0591, 0x05BD, .p.property = IDNA_P_PVALID },
+ { 0x05BE, 0x05BE, .p.property = IDNA_P_DISALLOWED },
+ { 0x05BF, 0x05BF, .p.property = IDNA_P_PVALID },
+ { 0x05C0, 0x05C0, .p.property = IDNA_P_DISALLOWED },
+ { 0x05C1, 0x05C2, .p.property = IDNA_P_PVALID },
+ { 0x05C3, 0x05C3, .p.property = IDNA_P_DISALLOWED },
+ { 0x05C4, 0x05C5, .p.property = IDNA_P_PVALID },
+ { 0x05C6, 0x05C6, .p.property = IDNA_P_DISALLOWED },
+ { 0x05C7, 0x05C7, .p.property = IDNA_P_PVALID },
+ { 0x05C8, 0x05CF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x05D0, 0x05EA, .p.property = IDNA_P_PVALID },
+ { 0x05EB, 0x05EF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x05F0, 0x05F2, .p.property = IDNA_P_PVALID },
+ { 0x05F3, 0x05F4, .p.property = IDNA_P_CONTEXTO },
+ { 0x05F5, 0x05FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0600, 0x0603, .p.property = IDNA_P_DISALLOWED },
+ { 0x0604, 0x0605, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0606, 0x060F, .p.property = IDNA_P_DISALLOWED },
+ { 0x0610, 0x061A, .p.property = IDNA_P_PVALID },
+ { 0x061B, 0x061B, .p.property = IDNA_P_DISALLOWED },
+ { 0x061C, 0x061D, .p.property = IDNA_P_UNASSIGNED },
+ { 0x061E, 0x061F, .p.property = IDNA_P_DISALLOWED },
+ { 0x0620, 0x0620, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0621, 0x063F, .p.property = IDNA_P_PVALID },
+ { 0x0640, 0x0640, .p.property = IDNA_P_DISALLOWED },
+ { 0x0641, 0x065E, .p.property = IDNA_P_PVALID },
+ { 0x065F, 0x065F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0660, 0x0669, .p.property = IDNA_P_CONTEXTO },
+ { 0x066A, 0x066D, .p.property = IDNA_P_DISALLOWED },
+ { 0x066E, 0x0674, .p.property = IDNA_P_PVALID },
+ { 0x0675, 0x0678, .p.property = IDNA_P_DISALLOWED },
+ { 0x0679, 0x06D3, .p.property = IDNA_P_PVALID },
+ { 0x06D4, 0x06D4, .p.property = IDNA_P_DISALLOWED },
+ { 0x06D5, 0x06DC, .p.property = IDNA_P_PVALID },
+ { 0x06DD, 0x06DE, .p.property = IDNA_P_DISALLOWED },
+ { 0x06DF, 0x06E8, .p.property = IDNA_P_PVALID },
+ { 0x06E9, 0x06E9, .p.property = IDNA_P_DISALLOWED },
+ { 0x06EA, 0x06EF, .p.property = IDNA_P_PVALID },
+ { 0x06F0, 0x06F9, .p.property = IDNA_P_CONTEXTO },
+ { 0x06FA, 0x06FF, .p.property = IDNA_P_PVALID },
+ { 0x0700, 0x070D, .p.property = IDNA_P_DISALLOWED },
+ { 0x070E, 0x070E, .p.property = IDNA_P_UNASSIGNED },
+ { 0x070F, 0x070F, .p.property = IDNA_P_DISALLOWED },
+ { 0x0710, 0x074A, .p.property = IDNA_P_PVALID },
+ { 0x074B, 0x074C, .p.property = IDNA_P_UNASSIGNED },
+ { 0x074D, 0x07B1, .p.property = IDNA_P_PVALID },
+ { 0x07B2, 0x07BF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x07C0, 0x07F5, .p.property = IDNA_P_PVALID },
+ { 0x07F6, 0x07FA, .p.property = IDNA_P_DISALLOWED },
+ { 0x07FB, 0x07FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0800, 0x082D, .p.property = IDNA_P_PVALID },
+ { 0x082E, 0x082F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0830, 0x083E, .p.property = IDNA_P_DISALLOWED },
+ { 0x083F, 0x08FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0900, 0x0939, .p.property = IDNA_P_PVALID },
+ { 0x093A, 0x093B, .p.property = IDNA_P_UNASSIGNED },
+ { 0x093C, 0x094E, .p.property = IDNA_P_PVALID },
+ { 0x094F, 0x094F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0950, 0x0955, .p.property = IDNA_P_PVALID },
+ { 0x0956, 0x0957, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0958, 0x095F, .p.property = IDNA_P_DISALLOWED },
+ { 0x0960, 0x0963, .p.property = IDNA_P_PVALID },
+ { 0x0964, 0x0965, .p.property = IDNA_P_DISALLOWED },
+ { 0x0966, 0x096F, .p.property = IDNA_P_PVALID },
+ { 0x0970, 0x0970, .p.property = IDNA_P_DISALLOWED },
+ { 0x0971, 0x0972, .p.property = IDNA_P_PVALID },
+ { 0x0973, 0x0978, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0979, 0x097F, .p.property = IDNA_P_PVALID },
+ { 0x0980, 0x0980, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0981, 0x0983, .p.property = IDNA_P_PVALID },
+ { 0x0984, 0x0984, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0985, 0x098C, .p.property = IDNA_P_PVALID },
+ { 0x098D, 0x098E, .p.property = IDNA_P_UNASSIGNED },
+ { 0x098F, 0x0990, .p.property = IDNA_P_PVALID },
+ { 0x0991, 0x0992, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0993, 0x09A8, .p.property = IDNA_P_PVALID },
+ { 0x09A9, 0x09A9, .p.property = IDNA_P_UNASSIGNED },
+ { 0x09AA, 0x09B0, .p.property = IDNA_P_PVALID },
+ { 0x09B1, 0x09B1, .p.property = IDNA_P_UNASSIGNED },
+ { 0x09B2, 0x09B2, .p.property = IDNA_P_PVALID },
+ { 0x09B3, 0x09B5, .p.property = IDNA_P_UNASSIGNED },
+ { 0x09B6, 0x09B9, .p.property = IDNA_P_PVALID },
+ { 0x09BA, 0x09BB, .p.property = IDNA_P_UNASSIGNED },
+ { 0x09BC, 0x09C4, .p.property = IDNA_P_PVALID },
+ { 0x09C5, 0x09C6, .p.property = IDNA_P_UNASSIGNED },
+ { 0x09C7, 0x09C8, .p.property = IDNA_P_PVALID },
+ { 0x09C9, 0x09CA, .p.property = IDNA_P_UNASSIGNED },
+ { 0x09CB, 0x09CE, .p.property = IDNA_P_PVALID },
+ { 0x09CF, 0x09D6, .p.property = IDNA_P_UNASSIGNED },
+ { 0x09D7, 0x09D7, .p.property = IDNA_P_PVALID },
+ { 0x09D8, 0x09DB, .p.property = IDNA_P_UNASSIGNED },
+ { 0x09DC, 0x09DD, .p.property = IDNA_P_DISALLOWED },
+ { 0x09DE, 0x09DE, .p.property = IDNA_P_UNASSIGNED },
+ { 0x09DF, 0x09DF, .p.property = IDNA_P_DISALLOWED },
+ { 0x09E0, 0x09E3, .p.property = IDNA_P_PVALID },
+ { 0x09E4, 0x09E5, .p.property = IDNA_P_UNASSIGNED },
+ { 0x09E6, 0x09F1, .p.property = IDNA_P_PVALID },
+ { 0x09F2, 0x09FB, .p.property = IDNA_P_DISALLOWED },
+ { 0x09FC, 0x0A00, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0A01, 0x0A03, .p.property = IDNA_P_PVALID },
+ { 0x0A04, 0x0A04, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0A05, 0x0A0A, .p.property = IDNA_P_PVALID },
+ { 0x0A0B, 0x0A0E, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0A0F, 0x0A10, .p.property = IDNA_P_PVALID },
+ { 0x0A11, 0x0A12, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0A13, 0x0A28, .p.property = IDNA_P_PVALID },
+ { 0x0A29, 0x0A29, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0A2A, 0x0A30, .p.property = IDNA_P_PVALID },
+ { 0x0A31, 0x0A31, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0A32, 0x0A32, .p.property = IDNA_P_PVALID },
+ { 0x0A33, 0x0A33, .p.property = IDNA_P_DISALLOWED },
+ { 0x0A34, 0x0A34, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0A35, 0x0A35, .p.property = IDNA_P_PVALID },
+ { 0x0A36, 0x0A36, .p.property = IDNA_P_DISALLOWED },
+ { 0x0A37, 0x0A37, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0A38, 0x0A39, .p.property = IDNA_P_PVALID },
+ { 0x0A3A, 0x0A3B, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0A3C, 0x0A3C, .p.property = IDNA_P_PVALID },
+ { 0x0A3D, 0x0A3D, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0A3E, 0x0A42, .p.property = IDNA_P_PVALID },
+ { 0x0A43, 0x0A46, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0A47, 0x0A48, .p.property = IDNA_P_PVALID },
+ { 0x0A49, 0x0A4A, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0A4B, 0x0A4D, .p.property = IDNA_P_PVALID },
+ { 0x0A4E, 0x0A50, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0A51, 0x0A51, .p.property = IDNA_P_PVALID },
+ { 0x0A52, 0x0A58, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0A59, 0x0A5B, .p.property = IDNA_P_DISALLOWED },
+ { 0x0A5C, 0x0A5C, .p.property = IDNA_P_PVALID },
+ { 0x0A5D, 0x0A5D, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0A5E, 0x0A5E, .p.property = IDNA_P_DISALLOWED },
+ { 0x0A5F, 0x0A65, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0A66, 0x0A75, .p.property = IDNA_P_PVALID },
+ { 0x0A76, 0x0A80, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0A81, 0x0A83, .p.property = IDNA_P_PVALID },
+ { 0x0A84, 0x0A84, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0A85, 0x0A8D, .p.property = IDNA_P_PVALID },
+ { 0x0A8E, 0x0A8E, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0A8F, 0x0A91, .p.property = IDNA_P_PVALID },
+ { 0x0A92, 0x0A92, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0A93, 0x0AA8, .p.property = IDNA_P_PVALID },
+ { 0x0AA9, 0x0AA9, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0AAA, 0x0AB0, .p.property = IDNA_P_PVALID },
+ { 0x0AB1, 0x0AB1, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0AB2, 0x0AB3, .p.property = IDNA_P_PVALID },
+ { 0x0AB4, 0x0AB4, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0AB5, 0x0AB9, .p.property = IDNA_P_PVALID },
+ { 0x0ABA, 0x0ABB, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0ABC, 0x0AC5, .p.property = IDNA_P_PVALID },
+ { 0x0AC6, 0x0AC6, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0AC7, 0x0AC9, .p.property = IDNA_P_PVALID },
+ { 0x0ACA, 0x0ACA, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0ACB, 0x0ACD, .p.property = IDNA_P_PVALID },
+ { 0x0ACE, 0x0ACF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0AD0, 0x0AD0, .p.property = IDNA_P_PVALID },
+ { 0x0AD1, 0x0ADF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0AE0, 0x0AE3, .p.property = IDNA_P_PVALID },
+ { 0x0AE4, 0x0AE5, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0AE6, 0x0AEF, .p.property = IDNA_P_PVALID },
+ { 0x0AF0, 0x0AF0, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0AF1, 0x0AF1, .p.property = IDNA_P_DISALLOWED },
+ { 0x0AF2, 0x0B00, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0B01, 0x0B03, .p.property = IDNA_P_PVALID },
+ { 0x0B04, 0x0B04, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0B05, 0x0B0C, .p.property = IDNA_P_PVALID },
+ { 0x0B0D, 0x0B0E, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0B0F, 0x0B10, .p.property = IDNA_P_PVALID },
+ { 0x0B11, 0x0B12, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0B13, 0x0B28, .p.property = IDNA_P_PVALID },
+ { 0x0B29, 0x0B29, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0B2A, 0x0B30, .p.property = IDNA_P_PVALID },
+ { 0x0B31, 0x0B31, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0B32, 0x0B33, .p.property = IDNA_P_PVALID },
+ { 0x0B34, 0x0B34, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0B35, 0x0B39, .p.property = IDNA_P_PVALID },
+ { 0x0B3A, 0x0B3B, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0B3C, 0x0B44, .p.property = IDNA_P_PVALID },
+ { 0x0B45, 0x0B46, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0B47, 0x0B48, .p.property = IDNA_P_PVALID },
+ { 0x0B49, 0x0B4A, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0B4B, 0x0B4D, .p.property = IDNA_P_PVALID },
+ { 0x0B4E, 0x0B55, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0B56, 0x0B57, .p.property = IDNA_P_PVALID },
+ { 0x0B58, 0x0B5B, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0B5C, 0x0B5D, .p.property = IDNA_P_DISALLOWED },
+ { 0x0B5E, 0x0B5E, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0B5F, 0x0B63, .p.property = IDNA_P_PVALID },
+ { 0x0B64, 0x0B65, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0B66, 0x0B6F, .p.property = IDNA_P_PVALID },
+ { 0x0B70, 0x0B70, .p.property = IDNA_P_DISALLOWED },
+ { 0x0B71, 0x0B71, .p.property = IDNA_P_PVALID },
+ { 0x0B72, 0x0B81, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0B82, 0x0B83, .p.property = IDNA_P_PVALID },
+ { 0x0B84, 0x0B84, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0B85, 0x0B8A, .p.property = IDNA_P_PVALID },
+ { 0x0B8B, 0x0B8D, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0B8E, 0x0B90, .p.property = IDNA_P_PVALID },
+ { 0x0B91, 0x0B91, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0B92, 0x0B95, .p.property = IDNA_P_PVALID },
+ { 0x0B96, 0x0B98, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0B99, 0x0B9A, .p.property = IDNA_P_PVALID },
+ { 0x0B9B, 0x0B9B, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0B9C, 0x0B9C, .p.property = IDNA_P_PVALID },
+ { 0x0B9D, 0x0B9D, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0B9E, 0x0B9F, .p.property = IDNA_P_PVALID },
+ { 0x0BA0, 0x0BA2, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0BA3, 0x0BA4, .p.property = IDNA_P_PVALID },
+ { 0x0BA5, 0x0BA7, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0BA8, 0x0BAA, .p.property = IDNA_P_PVALID },
+ { 0x0BAB, 0x0BAD, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0BAE, 0x0BB9, .p.property = IDNA_P_PVALID },
+ { 0x0BBA, 0x0BBD, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0BBE, 0x0BC2, .p.property = IDNA_P_PVALID },
+ { 0x0BC3, 0x0BC5, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0BC6, 0x0BC8, .p.property = IDNA_P_PVALID },
+ { 0x0BC9, 0x0BC9, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0BCA, 0x0BCD, .p.property = IDNA_P_PVALID },
+ { 0x0BCE, 0x0BCF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0BD0, 0x0BD0, .p.property = IDNA_P_PVALID },
+ { 0x0BD1, 0x0BD6, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0BD7, 0x0BD7, .p.property = IDNA_P_PVALID },
+ { 0x0BD8, 0x0BE5, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0BE6, 0x0BEF, .p.property = IDNA_P_PVALID },
+ { 0x0BF0, 0x0BFA, .p.property = IDNA_P_DISALLOWED },
+ { 0x0BFB, 0x0C00, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0C01, 0x0C03, .p.property = IDNA_P_PVALID },
+ { 0x0C04, 0x0C04, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0C05, 0x0C0C, .p.property = IDNA_P_PVALID },
+ { 0x0C0D, 0x0C0D, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0C0E, 0x0C10, .p.property = IDNA_P_PVALID },
+ { 0x0C11, 0x0C11, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0C12, 0x0C28, .p.property = IDNA_P_PVALID },
+ { 0x0C29, 0x0C29, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0C2A, 0x0C33, .p.property = IDNA_P_PVALID },
+ { 0x0C34, 0x0C34, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0C35, 0x0C39, .p.property = IDNA_P_PVALID },
+ { 0x0C3A, 0x0C3C, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0C3D, 0x0C44, .p.property = IDNA_P_PVALID },
+ { 0x0C45, 0x0C45, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0C46, 0x0C48, .p.property = IDNA_P_PVALID },
+ { 0x0C49, 0x0C49, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0C4A, 0x0C4D, .p.property = IDNA_P_PVALID },
+ { 0x0C4E, 0x0C54, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0C55, 0x0C56, .p.property = IDNA_P_PVALID },
+ { 0x0C57, 0x0C57, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0C58, 0x0C59, .p.property = IDNA_P_PVALID },
+ { 0x0C5A, 0x0C5F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0C60, 0x0C63, .p.property = IDNA_P_PVALID },
+ { 0x0C64, 0x0C65, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0C66, 0x0C6F, .p.property = IDNA_P_PVALID },
+ { 0x0C70, 0x0C77, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0C78, 0x0C7F, .p.property = IDNA_P_DISALLOWED },
+ { 0x0C80, 0x0C81, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0C82, 0x0C83, .p.property = IDNA_P_PVALID },
+ { 0x0C84, 0x0C84, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0C85, 0x0C8C, .p.property = IDNA_P_PVALID },
+ { 0x0C8D, 0x0C8D, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0C8E, 0x0C90, .p.property = IDNA_P_PVALID },
+ { 0x0C91, 0x0C91, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0C92, 0x0CA8, .p.property = IDNA_P_PVALID },
+ { 0x0CA9, 0x0CA9, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0CAA, 0x0CB3, .p.property = IDNA_P_PVALID },
+ { 0x0CB4, 0x0CB4, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0CB5, 0x0CB9, .p.property = IDNA_P_PVALID },
+ { 0x0CBA, 0x0CBB, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0CBC, 0x0CC4, .p.property = IDNA_P_PVALID },
+ { 0x0CC5, 0x0CC5, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0CC6, 0x0CC8, .p.property = IDNA_P_PVALID },
+ { 0x0CC9, 0x0CC9, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0CCA, 0x0CCD, .p.property = IDNA_P_PVALID },
+ { 0x0CCE, 0x0CD4, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0CD5, 0x0CD6, .p.property = IDNA_P_PVALID },
+ { 0x0CD7, 0x0CDD, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0CDE, 0x0CDE, .p.property = IDNA_P_PVALID },
+ { 0x0CDF, 0x0CDF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0CE0, 0x0CE3, .p.property = IDNA_P_PVALID },
+ { 0x0CE4, 0x0CE5, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0CE6, 0x0CEF, .p.property = IDNA_P_PVALID },
+ { 0x0CF0, 0x0CF0, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0CF1, 0x0CF2, .p.property = IDNA_P_DISALLOWED },
+ { 0x0CF3, 0x0D01, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0D02, 0x0D03, .p.property = IDNA_P_PVALID },
+ { 0x0D04, 0x0D04, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0D05, 0x0D0C, .p.property = IDNA_P_PVALID },
+ { 0x0D0D, 0x0D0D, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0D0E, 0x0D10, .p.property = IDNA_P_PVALID },
+ { 0x0D11, 0x0D11, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0D12, 0x0D28, .p.property = IDNA_P_PVALID },
+ { 0x0D29, 0x0D29, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0D2A, 0x0D39, .p.property = IDNA_P_PVALID },
+ { 0x0D3A, 0x0D3C, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0D3D, 0x0D44, .p.property = IDNA_P_PVALID },
+ { 0x0D45, 0x0D45, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0D46, 0x0D48, .p.property = IDNA_P_PVALID },
+ { 0x0D49, 0x0D49, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0D4A, 0x0D4D, .p.property = IDNA_P_PVALID },
+ { 0x0D4E, 0x0D56, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0D57, 0x0D57, .p.property = IDNA_P_PVALID },
+ { 0x0D58, 0x0D5F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0D60, 0x0D63, .p.property = IDNA_P_PVALID },
+ { 0x0D64, 0x0D65, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0D66, 0x0D6F, .p.property = IDNA_P_PVALID },
+ { 0x0D70, 0x0D75, .p.property = IDNA_P_DISALLOWED },
+ { 0x0D76, 0x0D78, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0D79, 0x0D79, .p.property = IDNA_P_DISALLOWED },
+ { 0x0D7A, 0x0D7F, .p.property = IDNA_P_PVALID },
+ { 0x0D80, 0x0D81, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0D82, 0x0D83, .p.property = IDNA_P_PVALID },
+ { 0x0D84, 0x0D84, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0D85, 0x0D96, .p.property = IDNA_P_PVALID },
+ { 0x0D97, 0x0D99, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0D9A, 0x0DB1, .p.property = IDNA_P_PVALID },
+ { 0x0DB2, 0x0DB2, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0DB3, 0x0DBB, .p.property = IDNA_P_PVALID },
+ { 0x0DBC, 0x0DBC, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0DBD, 0x0DBD, .p.property = IDNA_P_PVALID },
+ { 0x0DBE, 0x0DBF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0DC0, 0x0DC6, .p.property = IDNA_P_PVALID },
+ { 0x0DC7, 0x0DC9, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0DCA, 0x0DCA, .p.property = IDNA_P_PVALID },
+ { 0x0DCB, 0x0DCE, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0DCF, 0x0DD4, .p.property = IDNA_P_PVALID },
+ { 0x0DD5, 0x0DD5, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0DD6, 0x0DD6, .p.property = IDNA_P_PVALID },
+ { 0x0DD7, 0x0DD7, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0DD8, 0x0DDF, .p.property = IDNA_P_PVALID },
+ { 0x0DE0, 0x0DF1, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0DF2, 0x0DF3, .p.property = IDNA_P_PVALID },
+ { 0x0DF4, 0x0DF4, .p.property = IDNA_P_DISALLOWED },
+ { 0x0DF5, 0x0E00, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0E01, 0x0E32, .p.property = IDNA_P_PVALID },
+ { 0x0E33, 0x0E33, .p.property = IDNA_P_DISALLOWED },
+ { 0x0E34, 0x0E3A, .p.property = IDNA_P_PVALID },
+ { 0x0E3B, 0x0E3E, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0E3F, 0x0E3F, .p.property = IDNA_P_DISALLOWED },
+ { 0x0E40, 0x0E4E, .p.property = IDNA_P_PVALID },
+ { 0x0E4F, 0x0E4F, .p.property = IDNA_P_DISALLOWED },
+ { 0x0E50, 0x0E59, .p.property = IDNA_P_PVALID },
+ { 0x0E5A, 0x0E5B, .p.property = IDNA_P_DISALLOWED },
+ { 0x0E5C, 0x0E80, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0E81, 0x0E82, .p.property = IDNA_P_PVALID },
+ { 0x0E83, 0x0E83, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0E84, 0x0E84, .p.property = IDNA_P_PVALID },
+ { 0x0E85, 0x0E86, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0E87, 0x0E88, .p.property = IDNA_P_PVALID },
+ { 0x0E89, 0x0E89, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0E8A, 0x0E8A, .p.property = IDNA_P_PVALID },
+ { 0x0E8B, 0x0E8C, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0E8D, 0x0E8D, .p.property = IDNA_P_PVALID },
+ { 0x0E8E, 0x0E93, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0E94, 0x0E97, .p.property = IDNA_P_PVALID },
+ { 0x0E98, 0x0E98, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0E99, 0x0E9F, .p.property = IDNA_P_PVALID },
+ { 0x0EA0, 0x0EA0, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0EA1, 0x0EA3, .p.property = IDNA_P_PVALID },
+ { 0x0EA4, 0x0EA4, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0EA5, 0x0EA5, .p.property = IDNA_P_PVALID },
+ { 0x0EA6, 0x0EA6, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0EA7, 0x0EA7, .p.property = IDNA_P_PVALID },
+ { 0x0EA8, 0x0EA9, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0EAA, 0x0EAB, .p.property = IDNA_P_PVALID },
+ { 0x0EAC, 0x0EAC, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0EAD, 0x0EB2, .p.property = IDNA_P_PVALID },
+ { 0x0EB3, 0x0EB3, .p.property = IDNA_P_DISALLOWED },
+ { 0x0EB4, 0x0EB9, .p.property = IDNA_P_PVALID },
+ { 0x0EBA, 0x0EBA, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0EBB, 0x0EBD, .p.property = IDNA_P_PVALID },
+ { 0x0EBE, 0x0EBF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0EC0, 0x0EC4, .p.property = IDNA_P_PVALID },
+ { 0x0EC5, 0x0EC5, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0EC6, 0x0EC6, .p.property = IDNA_P_PVALID },
+ { 0x0EC7, 0x0EC7, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0EC8, 0x0ECD, .p.property = IDNA_P_PVALID },
+ { 0x0ECE, 0x0ECF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0ED0, 0x0ED9, .p.property = IDNA_P_PVALID },
+ { 0x0EDA, 0x0EDB, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0EDC, 0x0EDD, .p.property = IDNA_P_DISALLOWED },
+ { 0x0EDE, 0x0EFF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0F00, 0x0F00, .p.property = IDNA_P_PVALID },
+ { 0x0F01, 0x0F0A, .p.property = IDNA_P_DISALLOWED },
+ { 0x0F0B, 0x0F0B, .p.property = IDNA_P_PVALID },
+ { 0x0F0C, 0x0F17, .p.property = IDNA_P_DISALLOWED },
+ { 0x0F18, 0x0F19, .p.property = IDNA_P_PVALID },
+ { 0x0F1A, 0x0F1F, .p.property = IDNA_P_DISALLOWED },
+ { 0x0F20, 0x0F29, .p.property = IDNA_P_PVALID },
+ { 0x0F2A, 0x0F34, .p.property = IDNA_P_DISALLOWED },
+ { 0x0F35, 0x0F35, .p.property = IDNA_P_PVALID },
+ { 0x0F36, 0x0F36, .p.property = IDNA_P_DISALLOWED },
+ { 0x0F37, 0x0F37, .p.property = IDNA_P_PVALID },
+ { 0x0F38, 0x0F38, .p.property = IDNA_P_DISALLOWED },
+ { 0x0F39, 0x0F39, .p.property = IDNA_P_PVALID },
+ { 0x0F3A, 0x0F3D, .p.property = IDNA_P_DISALLOWED },
+ { 0x0F3E, 0x0F42, .p.property = IDNA_P_PVALID },
+ { 0x0F43, 0x0F43, .p.property = IDNA_P_DISALLOWED },
+ { 0x0F44, 0x0F47, .p.property = IDNA_P_PVALID },
+ { 0x0F48, 0x0F48, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0F49, 0x0F4C, .p.property = IDNA_P_PVALID },
+ { 0x0F4D, 0x0F4D, .p.property = IDNA_P_DISALLOWED },
+ { 0x0F4E, 0x0F51, .p.property = IDNA_P_PVALID },
+ { 0x0F52, 0x0F52, .p.property = IDNA_P_DISALLOWED },
+ { 0x0F53, 0x0F56, .p.property = IDNA_P_PVALID },
+ { 0x0F57, 0x0F57, .p.property = IDNA_P_DISALLOWED },
+ { 0x0F58, 0x0F5B, .p.property = IDNA_P_PVALID },
+ { 0x0F5C, 0x0F5C, .p.property = IDNA_P_DISALLOWED },
+ { 0x0F5D, 0x0F68, .p.property = IDNA_P_PVALID },
+ { 0x0F69, 0x0F69, .p.property = IDNA_P_DISALLOWED },
+ { 0x0F6A, 0x0F6C, .p.property = IDNA_P_PVALID },
+ { 0x0F6D, 0x0F70, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0F71, 0x0F72, .p.property = IDNA_P_PVALID },
+ { 0x0F73, 0x0F73, .p.property = IDNA_P_DISALLOWED },
+ { 0x0F74, 0x0F74, .p.property = IDNA_P_PVALID },
+ { 0x0F75, 0x0F79, .p.property = IDNA_P_DISALLOWED },
+ { 0x0F7A, 0x0F80, .p.property = IDNA_P_PVALID },
+ { 0x0F81, 0x0F81, .p.property = IDNA_P_DISALLOWED },
+ { 0x0F82, 0x0F84, .p.property = IDNA_P_PVALID },
+ { 0x0F85, 0x0F85, .p.property = IDNA_P_DISALLOWED },
+ { 0x0F86, 0x0F8B, .p.property = IDNA_P_PVALID },
+ { 0x0F8C, 0x0F8F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0F90, 0x0F92, .p.property = IDNA_P_PVALID },
+ { 0x0F93, 0x0F93, .p.property = IDNA_P_DISALLOWED },
+ { 0x0F94, 0x0F97, .p.property = IDNA_P_PVALID },
+ { 0x0F98, 0x0F98, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0F99, 0x0F9C, .p.property = IDNA_P_PVALID },
+ { 0x0F9D, 0x0F9D, .p.property = IDNA_P_DISALLOWED },
+ { 0x0F9E, 0x0FA1, .p.property = IDNA_P_PVALID },
+ { 0x0FA2, 0x0FA2, .p.property = IDNA_P_DISALLOWED },
+ { 0x0FA3, 0x0FA6, .p.property = IDNA_P_PVALID },
+ { 0x0FA7, 0x0FA7, .p.property = IDNA_P_DISALLOWED },
+ { 0x0FA8, 0x0FAB, .p.property = IDNA_P_PVALID },
+ { 0x0FAC, 0x0FAC, .p.property = IDNA_P_DISALLOWED },
+ { 0x0FAD, 0x0FB8, .p.property = IDNA_P_PVALID },
+ { 0x0FB9, 0x0FB9, .p.property = IDNA_P_DISALLOWED },
+ { 0x0FBA, 0x0FBC, .p.property = IDNA_P_PVALID },
+ { 0x0FBD, 0x0FBD, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0FBE, 0x0FC5, .p.property = IDNA_P_DISALLOWED },
+ { 0x0FC6, 0x0FC6, .p.property = IDNA_P_PVALID },
+ { 0x0FC7, 0x0FCC, .p.property = IDNA_P_DISALLOWED },
+ { 0x0FCD, 0x0FCD, .p.property = IDNA_P_UNASSIGNED },
+ { 0x0FCE, 0x0FD8, .p.property = IDNA_P_DISALLOWED },
+ { 0x0FD9, 0x0FFF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1000, 0x1049, .p.property = IDNA_P_PVALID },
+ { 0x104A, 0x104F, .p.property = IDNA_P_DISALLOWED },
+ { 0x1050, 0x109D, .p.property = IDNA_P_PVALID },
+ { 0x109E, 0x10C5, .p.property = IDNA_P_DISALLOWED },
+ { 0x10C6, 0x10CF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10D0, 0x10FA, .p.property = IDNA_P_PVALID },
+ { 0x10FB, 0x10FC, .p.property = IDNA_P_DISALLOWED },
+ { 0x10FD, 0x10FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1100, 0x11FF, .p.property = IDNA_P_DISALLOWED },
+ { 0x1200, 0x1248, .p.property = IDNA_P_PVALID },
+ { 0x1249, 0x1249, .p.property = IDNA_P_UNASSIGNED },
+ { 0x124A, 0x124D, .p.property = IDNA_P_PVALID },
+ { 0x124E, 0x124F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1250, 0x1256, .p.property = IDNA_P_PVALID },
+ { 0x1257, 0x1257, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1258, 0x1258, .p.property = IDNA_P_PVALID },
+ { 0x1259, 0x1259, .p.property = IDNA_P_UNASSIGNED },
+ { 0x125A, 0x125D, .p.property = IDNA_P_PVALID },
+ { 0x125E, 0x125F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1260, 0x1288, .p.property = IDNA_P_PVALID },
+ { 0x1289, 0x1289, .p.property = IDNA_P_UNASSIGNED },
+ { 0x128A, 0x128D, .p.property = IDNA_P_PVALID },
+ { 0x128E, 0x128F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1290, 0x12B0, .p.property = IDNA_P_PVALID },
+ { 0x12B1, 0x12B1, .p.property = IDNA_P_UNASSIGNED },
+ { 0x12B2, 0x12B5, .p.property = IDNA_P_PVALID },
+ { 0x12B6, 0x12B7, .p.property = IDNA_P_UNASSIGNED },
+ { 0x12B8, 0x12BE, .p.property = IDNA_P_PVALID },
+ { 0x12BF, 0x12BF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x12C0, 0x12C0, .p.property = IDNA_P_PVALID },
+ { 0x12C1, 0x12C1, .p.property = IDNA_P_UNASSIGNED },
+ { 0x12C2, 0x12C5, .p.property = IDNA_P_PVALID },
+ { 0x12C6, 0x12C7, .p.property = IDNA_P_UNASSIGNED },
+ { 0x12C8, 0x12D6, .p.property = IDNA_P_PVALID },
+ { 0x12D7, 0x12D7, .p.property = IDNA_P_UNASSIGNED },
+ { 0x12D8, 0x1310, .p.property = IDNA_P_PVALID },
+ { 0x1311, 0x1311, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1312, 0x1315, .p.property = IDNA_P_PVALID },
+ { 0x1316, 0x1317, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1318, 0x135A, .p.property = IDNA_P_PVALID },
+ { 0x135B, 0x135E, .p.property = IDNA_P_UNASSIGNED },
+ { 0x135F, 0x135F, .p.property = IDNA_P_PVALID },
+ { 0x1360, 0x137C, .p.property = IDNA_P_DISALLOWED },
+ { 0x137D, 0x137F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1380, 0x138F, .p.property = IDNA_P_PVALID },
+ { 0x1390, 0x1399, .p.property = IDNA_P_DISALLOWED },
+ { 0x139A, 0x139F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x13A0, 0x13F4, .p.property = IDNA_P_PVALID },
+ { 0x13F5, 0x13FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1400, 0x1400, .p.property = IDNA_P_DISALLOWED },
+ { 0x1401, 0x166C, .p.property = IDNA_P_PVALID },
+ { 0x166D, 0x166E, .p.property = IDNA_P_DISALLOWED },
+ { 0x166F, 0x167F, .p.property = IDNA_P_PVALID },
+ { 0x1680, 0x1680, .p.property = IDNA_P_DISALLOWED },
+ { 0x1681, 0x169A, .p.property = IDNA_P_PVALID },
+ { 0x169B, 0x169C, .p.property = IDNA_P_DISALLOWED },
+ { 0x169D, 0x169F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x16A0, 0x16EA, .p.property = IDNA_P_PVALID },
+ { 0x16EB, 0x16F0, .p.property = IDNA_P_DISALLOWED },
+ { 0x16F1, 0x16FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1700, 0x170C, .p.property = IDNA_P_PVALID },
+ { 0x170D, 0x170D, .p.property = IDNA_P_UNASSIGNED },
+ { 0x170E, 0x1714, .p.property = IDNA_P_PVALID },
+ { 0x1715, 0x171F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1720, 0x1734, .p.property = IDNA_P_PVALID },
+ { 0x1735, 0x1736, .p.property = IDNA_P_DISALLOWED },
+ { 0x1737, 0x173F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1740, 0x1753, .p.property = IDNA_P_PVALID },
+ { 0x1754, 0x175F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1760, 0x176C, .p.property = IDNA_P_PVALID },
+ { 0x176D, 0x176D, .p.property = IDNA_P_UNASSIGNED },
+ { 0x176E, 0x1770, .p.property = IDNA_P_PVALID },
+ { 0x1771, 0x1771, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1772, 0x1773, .p.property = IDNA_P_PVALID },
+ { 0x1774, 0x177F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1780, 0x17B3, .p.property = IDNA_P_PVALID },
+ { 0x17B4, 0x17B5, .p.property = IDNA_P_DISALLOWED },
+ { 0x17B6, 0x17D3, .p.property = IDNA_P_PVALID },
+ { 0x17D4, 0x17D6, .p.property = IDNA_P_DISALLOWED },
+ { 0x17D7, 0x17D7, .p.property = IDNA_P_PVALID },
+ { 0x17D8, 0x17DB, .p.property = IDNA_P_DISALLOWED },
+ { 0x17DC, 0x17DD, .p.property = IDNA_P_PVALID },
+ { 0x17DE, 0x17DF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x17E0, 0x17E9, .p.property = IDNA_P_PVALID },
+ { 0x17EA, 0x17EF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x17F0, 0x17F9, .p.property = IDNA_P_DISALLOWED },
+ { 0x17FA, 0x17FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1800, 0x180E, .p.property = IDNA_P_DISALLOWED },
+ { 0x180F, 0x180F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1810, 0x1819, .p.property = IDNA_P_PVALID },
+ { 0x181A, 0x181F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1820, 0x1877, .p.property = IDNA_P_PVALID },
+ { 0x1878, 0x187F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1880, 0x18AA, .p.property = IDNA_P_PVALID },
+ { 0x18AB, 0x18AF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x18B0, 0x18F5, .p.property = IDNA_P_PVALID },
+ { 0x18F6, 0x18FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1900, 0x191C, .p.property = IDNA_P_PVALID },
+ { 0x191D, 0x191F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1920, 0x192B, .p.property = IDNA_P_PVALID },
+ { 0x192C, 0x192F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1930, 0x193B, .p.property = IDNA_P_PVALID },
+ { 0x193C, 0x193F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1940, 0x1940, .p.property = IDNA_P_DISALLOWED },
+ { 0x1941, 0x1943, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1944, 0x1945, .p.property = IDNA_P_DISALLOWED },
+ { 0x1946, 0x196D, .p.property = IDNA_P_PVALID },
+ { 0x196E, 0x196F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1970, 0x1974, .p.property = IDNA_P_PVALID },
+ { 0x1975, 0x197F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1980, 0x19AB, .p.property = IDNA_P_PVALID },
+ { 0x19AC, 0x19AF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x19B0, 0x19C9, .p.property = IDNA_P_PVALID },
+ { 0x19CA, 0x19CF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x19D0, 0x19DA, .p.property = IDNA_P_PVALID },
+ { 0x19DB, 0x19DD, .p.property = IDNA_P_UNASSIGNED },
+ { 0x19DE, 0x19FF, .p.property = IDNA_P_DISALLOWED },
+ { 0x1A00, 0x1A1B, .p.property = IDNA_P_PVALID },
+ { 0x1A1C, 0x1A1D, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1A1E, 0x1A1F, .p.property = IDNA_P_DISALLOWED },
+ { 0x1A20, 0x1A5E, .p.property = IDNA_P_PVALID },
+ { 0x1A5F, 0x1A5F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1A60, 0x1A7C, .p.property = IDNA_P_PVALID },
+ { 0x1A7D, 0x1A7E, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1A7F, 0x1A89, .p.property = IDNA_P_PVALID },
+ { 0x1A8A, 0x1A8F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1A90, 0x1A99, .p.property = IDNA_P_PVALID },
+ { 0x1A9A, 0x1A9F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1AA0, 0x1AA6, .p.property = IDNA_P_DISALLOWED },
+ { 0x1AA7, 0x1AA7, .p.property = IDNA_P_PVALID },
+ { 0x1AA8, 0x1AAD, .p.property = IDNA_P_DISALLOWED },
+ { 0x1AAE, 0x1AFF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1B00, 0x1B4B, .p.property = IDNA_P_PVALID },
+ { 0x1B4C, 0x1B4F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1B50, 0x1B59, .p.property = IDNA_P_PVALID },
+ { 0x1B5A, 0x1B6A, .p.property = IDNA_P_DISALLOWED },
+ { 0x1B6B, 0x1B73, .p.property = IDNA_P_PVALID },
+ { 0x1B74, 0x1B7C, .p.property = IDNA_P_DISALLOWED },
+ { 0x1B7D, 0x1B7F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1B80, 0x1BAA, .p.property = IDNA_P_PVALID },
+ { 0x1BAB, 0x1BAD, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1BAE, 0x1BB9, .p.property = IDNA_P_PVALID },
+ { 0x1BBA, 0x1BFF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1C00, 0x1C37, .p.property = IDNA_P_PVALID },
+ { 0x1C38, 0x1C3A, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1C3B, 0x1C3F, .p.property = IDNA_P_DISALLOWED },
+ { 0x1C40, 0x1C49, .p.property = IDNA_P_PVALID },
+ { 0x1C4A, 0x1C4C, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1C4D, 0x1C7D, .p.property = IDNA_P_PVALID },
+ { 0x1C7E, 0x1C7F, .p.property = IDNA_P_DISALLOWED },
+ { 0x1C80, 0x1CCF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1CD0, 0x1CD2, .p.property = IDNA_P_PVALID },
+ { 0x1CD3, 0x1CD3, .p.property = IDNA_P_DISALLOWED },
+ { 0x1CD4, 0x1CF2, .p.property = IDNA_P_PVALID },
+ { 0x1CF3, 0x1CFF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D00, 0x1D2B, .p.property = IDNA_P_PVALID },
+ { 0x1D2C, 0x1D2E, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D2F, 0x1D2F, .p.property = IDNA_P_PVALID },
+ { 0x1D30, 0x1D3A, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D3B, 0x1D3B, .p.property = IDNA_P_PVALID },
+ { 0x1D3C, 0x1D4D, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D4E, 0x1D4E, .p.property = IDNA_P_PVALID },
+ { 0x1D4F, 0x1D6A, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D6B, 0x1D77, .p.property = IDNA_P_PVALID },
+ { 0x1D78, 0x1D78, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D79, 0x1D9A, .p.property = IDNA_P_PVALID },
+ { 0x1D9B, 0x1DBF, .p.property = IDNA_P_DISALLOWED },
+ { 0x1DC0, 0x1DE6, .p.property = IDNA_P_PVALID },
+ { 0x1DE7, 0x1DFC, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1DFD, 0x1DFF, .p.property = IDNA_P_PVALID },
+ { 0x1E00, 0x1E00, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E01, 0x1E01, .p.property = IDNA_P_PVALID },
+ { 0x1E02, 0x1E02, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E03, 0x1E03, .p.property = IDNA_P_PVALID },
+ { 0x1E04, 0x1E04, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E05, 0x1E05, .p.property = IDNA_P_PVALID },
+ { 0x1E06, 0x1E06, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E07, 0x1E07, .p.property = IDNA_P_PVALID },
+ { 0x1E08, 0x1E08, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E09, 0x1E09, .p.property = IDNA_P_PVALID },
+ { 0x1E0A, 0x1E0A, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E0B, 0x1E0B, .p.property = IDNA_P_PVALID },
+ { 0x1E0C, 0x1E0C, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E0D, 0x1E0D, .p.property = IDNA_P_PVALID },
+ { 0x1E0E, 0x1E0E, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E0F, 0x1E0F, .p.property = IDNA_P_PVALID },
+ { 0x1E10, 0x1E10, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E11, 0x1E11, .p.property = IDNA_P_PVALID },
+ { 0x1E12, 0x1E12, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E13, 0x1E13, .p.property = IDNA_P_PVALID },
+ { 0x1E14, 0x1E14, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E15, 0x1E15, .p.property = IDNA_P_PVALID },
+ { 0x1E16, 0x1E16, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E17, 0x1E17, .p.property = IDNA_P_PVALID },
+ { 0x1E18, 0x1E18, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E19, 0x1E19, .p.property = IDNA_P_PVALID },
+ { 0x1E1A, 0x1E1A, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E1B, 0x1E1B, .p.property = IDNA_P_PVALID },
+ { 0x1E1C, 0x1E1C, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E1D, 0x1E1D, .p.property = IDNA_P_PVALID },
+ { 0x1E1E, 0x1E1E, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E1F, 0x1E1F, .p.property = IDNA_P_PVALID },
+ { 0x1E20, 0x1E20, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E21, 0x1E21, .p.property = IDNA_P_PVALID },
+ { 0x1E22, 0x1E22, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E23, 0x1E23, .p.property = IDNA_P_PVALID },
+ { 0x1E24, 0x1E24, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E25, 0x1E25, .p.property = IDNA_P_PVALID },
+ { 0x1E26, 0x1E26, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E27, 0x1E27, .p.property = IDNA_P_PVALID },
+ { 0x1E28, 0x1E28, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E29, 0x1E29, .p.property = IDNA_P_PVALID },
+ { 0x1E2A, 0x1E2A, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E2B, 0x1E2B, .p.property = IDNA_P_PVALID },
+ { 0x1E2C, 0x1E2C, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E2D, 0x1E2D, .p.property = IDNA_P_PVALID },
+ { 0x1E2E, 0x1E2E, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E2F, 0x1E2F, .p.property = IDNA_P_PVALID },
+ { 0x1E30, 0x1E30, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E31, 0x1E31, .p.property = IDNA_P_PVALID },
+ { 0x1E32, 0x1E32, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E33, 0x1E33, .p.property = IDNA_P_PVALID },
+ { 0x1E34, 0x1E34, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E35, 0x1E35, .p.property = IDNA_P_PVALID },
+ { 0x1E36, 0x1E36, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E37, 0x1E37, .p.property = IDNA_P_PVALID },
+ { 0x1E38, 0x1E38, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E39, 0x1E39, .p.property = IDNA_P_PVALID },
+ { 0x1E3A, 0x1E3A, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E3B, 0x1E3B, .p.property = IDNA_P_PVALID },
+ { 0x1E3C, 0x1E3C, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E3D, 0x1E3D, .p.property = IDNA_P_PVALID },
+ { 0x1E3E, 0x1E3E, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E3F, 0x1E3F, .p.property = IDNA_P_PVALID },
+ { 0x1E40, 0x1E40, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E41, 0x1E41, .p.property = IDNA_P_PVALID },
+ { 0x1E42, 0x1E42, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E43, 0x1E43, .p.property = IDNA_P_PVALID },
+ { 0x1E44, 0x1E44, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E45, 0x1E45, .p.property = IDNA_P_PVALID },
+ { 0x1E46, 0x1E46, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E47, 0x1E47, .p.property = IDNA_P_PVALID },
+ { 0x1E48, 0x1E48, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E49, 0x1E49, .p.property = IDNA_P_PVALID },
+ { 0x1E4A, 0x1E4A, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E4B, 0x1E4B, .p.property = IDNA_P_PVALID },
+ { 0x1E4C, 0x1E4C, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E4D, 0x1E4D, .p.property = IDNA_P_PVALID },
+ { 0x1E4E, 0x1E4E, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E4F, 0x1E4F, .p.property = IDNA_P_PVALID },
+ { 0x1E50, 0x1E50, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E51, 0x1E51, .p.property = IDNA_P_PVALID },
+ { 0x1E52, 0x1E52, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E53, 0x1E53, .p.property = IDNA_P_PVALID },
+ { 0x1E54, 0x1E54, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E55, 0x1E55, .p.property = IDNA_P_PVALID },
+ { 0x1E56, 0x1E56, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E57, 0x1E57, .p.property = IDNA_P_PVALID },
+ { 0x1E58, 0x1E58, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E59, 0x1E59, .p.property = IDNA_P_PVALID },
+ { 0x1E5A, 0x1E5A, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E5B, 0x1E5B, .p.property = IDNA_P_PVALID },
+ { 0x1E5C, 0x1E5C, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E5D, 0x1E5D, .p.property = IDNA_P_PVALID },
+ { 0x1E5E, 0x1E5E, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E5F, 0x1E5F, .p.property = IDNA_P_PVALID },
+ { 0x1E60, 0x1E60, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E61, 0x1E61, .p.property = IDNA_P_PVALID },
+ { 0x1E62, 0x1E62, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E63, 0x1E63, .p.property = IDNA_P_PVALID },
+ { 0x1E64, 0x1E64, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E65, 0x1E65, .p.property = IDNA_P_PVALID },
+ { 0x1E66, 0x1E66, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E67, 0x1E67, .p.property = IDNA_P_PVALID },
+ { 0x1E68, 0x1E68, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E69, 0x1E69, .p.property = IDNA_P_PVALID },
+ { 0x1E6A, 0x1E6A, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E6B, 0x1E6B, .p.property = IDNA_P_PVALID },
+ { 0x1E6C, 0x1E6C, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E6D, 0x1E6D, .p.property = IDNA_P_PVALID },
+ { 0x1E6E, 0x1E6E, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E6F, 0x1E6F, .p.property = IDNA_P_PVALID },
+ { 0x1E70, 0x1E70, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E71, 0x1E71, .p.property = IDNA_P_PVALID },
+ { 0x1E72, 0x1E72, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E73, 0x1E73, .p.property = IDNA_P_PVALID },
+ { 0x1E74, 0x1E74, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E75, 0x1E75, .p.property = IDNA_P_PVALID },
+ { 0x1E76, 0x1E76, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E77, 0x1E77, .p.property = IDNA_P_PVALID },
+ { 0x1E78, 0x1E78, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E79, 0x1E79, .p.property = IDNA_P_PVALID },
+ { 0x1E7A, 0x1E7A, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E7B, 0x1E7B, .p.property = IDNA_P_PVALID },
+ { 0x1E7C, 0x1E7C, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E7D, 0x1E7D, .p.property = IDNA_P_PVALID },
+ { 0x1E7E, 0x1E7E, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E7F, 0x1E7F, .p.property = IDNA_P_PVALID },
+ { 0x1E80, 0x1E80, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E81, 0x1E81, .p.property = IDNA_P_PVALID },
+ { 0x1E82, 0x1E82, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E83, 0x1E83, .p.property = IDNA_P_PVALID },
+ { 0x1E84, 0x1E84, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E85, 0x1E85, .p.property = IDNA_P_PVALID },
+ { 0x1E86, 0x1E86, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E87, 0x1E87, .p.property = IDNA_P_PVALID },
+ { 0x1E88, 0x1E88, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E89, 0x1E89, .p.property = IDNA_P_PVALID },
+ { 0x1E8A, 0x1E8A, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E8B, 0x1E8B, .p.property = IDNA_P_PVALID },
+ { 0x1E8C, 0x1E8C, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E8D, 0x1E8D, .p.property = IDNA_P_PVALID },
+ { 0x1E8E, 0x1E8E, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E8F, 0x1E8F, .p.property = IDNA_P_PVALID },
+ { 0x1E90, 0x1E90, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E91, 0x1E91, .p.property = IDNA_P_PVALID },
+ { 0x1E92, 0x1E92, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E93, 0x1E93, .p.property = IDNA_P_PVALID },
+ { 0x1E94, 0x1E94, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E95, 0x1E99, .p.property = IDNA_P_PVALID },
+ { 0x1E9A, 0x1E9B, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E9C, 0x1E9D, .p.property = IDNA_P_PVALID },
+ { 0x1E9E, 0x1E9E, .p.property = IDNA_P_DISALLOWED },
+ { 0x1E9F, 0x1E9F, .p.property = IDNA_P_PVALID },
+ { 0x1EA0, 0x1EA0, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EA1, 0x1EA1, .p.property = IDNA_P_PVALID },
+ { 0x1EA2, 0x1EA2, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EA3, 0x1EA3, .p.property = IDNA_P_PVALID },
+ { 0x1EA4, 0x1EA4, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EA5, 0x1EA5, .p.property = IDNA_P_PVALID },
+ { 0x1EA6, 0x1EA6, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EA7, 0x1EA7, .p.property = IDNA_P_PVALID },
+ { 0x1EA8, 0x1EA8, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EA9, 0x1EA9, .p.property = IDNA_P_PVALID },
+ { 0x1EAA, 0x1EAA, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EAB, 0x1EAB, .p.property = IDNA_P_PVALID },
+ { 0x1EAC, 0x1EAC, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EAD, 0x1EAD, .p.property = IDNA_P_PVALID },
+ { 0x1EAE, 0x1EAE, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EAF, 0x1EAF, .p.property = IDNA_P_PVALID },
+ { 0x1EB0, 0x1EB0, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EB1, 0x1EB1, .p.property = IDNA_P_PVALID },
+ { 0x1EB2, 0x1EB2, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EB3, 0x1EB3, .p.property = IDNA_P_PVALID },
+ { 0x1EB4, 0x1EB4, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EB5, 0x1EB5, .p.property = IDNA_P_PVALID },
+ { 0x1EB6, 0x1EB6, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EB7, 0x1EB7, .p.property = IDNA_P_PVALID },
+ { 0x1EB8, 0x1EB8, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EB9, 0x1EB9, .p.property = IDNA_P_PVALID },
+ { 0x1EBA, 0x1EBA, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EBB, 0x1EBB, .p.property = IDNA_P_PVALID },
+ { 0x1EBC, 0x1EBC, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EBD, 0x1EBD, .p.property = IDNA_P_PVALID },
+ { 0x1EBE, 0x1EBE, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EBF, 0x1EBF, .p.property = IDNA_P_PVALID },
+ { 0x1EC0, 0x1EC0, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EC1, 0x1EC1, .p.property = IDNA_P_PVALID },
+ { 0x1EC2, 0x1EC2, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EC3, 0x1EC3, .p.property = IDNA_P_PVALID },
+ { 0x1EC4, 0x1EC4, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EC5, 0x1EC5, .p.property = IDNA_P_PVALID },
+ { 0x1EC6, 0x1EC6, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EC7, 0x1EC7, .p.property = IDNA_P_PVALID },
+ { 0x1EC8, 0x1EC8, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EC9, 0x1EC9, .p.property = IDNA_P_PVALID },
+ { 0x1ECA, 0x1ECA, .p.property = IDNA_P_DISALLOWED },
+ { 0x1ECB, 0x1ECB, .p.property = IDNA_P_PVALID },
+ { 0x1ECC, 0x1ECC, .p.property = IDNA_P_DISALLOWED },
+ { 0x1ECD, 0x1ECD, .p.property = IDNA_P_PVALID },
+ { 0x1ECE, 0x1ECE, .p.property = IDNA_P_DISALLOWED },
+ { 0x1ECF, 0x1ECF, .p.property = IDNA_P_PVALID },
+ { 0x1ED0, 0x1ED0, .p.property = IDNA_P_DISALLOWED },
+ { 0x1ED1, 0x1ED1, .p.property = IDNA_P_PVALID },
+ { 0x1ED2, 0x1ED2, .p.property = IDNA_P_DISALLOWED },
+ { 0x1ED3, 0x1ED3, .p.property = IDNA_P_PVALID },
+ { 0x1ED4, 0x1ED4, .p.property = IDNA_P_DISALLOWED },
+ { 0x1ED5, 0x1ED5, .p.property = IDNA_P_PVALID },
+ { 0x1ED6, 0x1ED6, .p.property = IDNA_P_DISALLOWED },
+ { 0x1ED7, 0x1ED7, .p.property = IDNA_P_PVALID },
+ { 0x1ED8, 0x1ED8, .p.property = IDNA_P_DISALLOWED },
+ { 0x1ED9, 0x1ED9, .p.property = IDNA_P_PVALID },
+ { 0x1EDA, 0x1EDA, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EDB, 0x1EDB, .p.property = IDNA_P_PVALID },
+ { 0x1EDC, 0x1EDC, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EDD, 0x1EDD, .p.property = IDNA_P_PVALID },
+ { 0x1EDE, 0x1EDE, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EDF, 0x1EDF, .p.property = IDNA_P_PVALID },
+ { 0x1EE0, 0x1EE0, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EE1, 0x1EE1, .p.property = IDNA_P_PVALID },
+ { 0x1EE2, 0x1EE2, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EE3, 0x1EE3, .p.property = IDNA_P_PVALID },
+ { 0x1EE4, 0x1EE4, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EE5, 0x1EE5, .p.property = IDNA_P_PVALID },
+ { 0x1EE6, 0x1EE6, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EE7, 0x1EE7, .p.property = IDNA_P_PVALID },
+ { 0x1EE8, 0x1EE8, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EE9, 0x1EE9, .p.property = IDNA_P_PVALID },
+ { 0x1EEA, 0x1EEA, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EEB, 0x1EEB, .p.property = IDNA_P_PVALID },
+ { 0x1EEC, 0x1EEC, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EED, 0x1EED, .p.property = IDNA_P_PVALID },
+ { 0x1EEE, 0x1EEE, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EEF, 0x1EEF, .p.property = IDNA_P_PVALID },
+ { 0x1EF0, 0x1EF0, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EF1, 0x1EF1, .p.property = IDNA_P_PVALID },
+ { 0x1EF2, 0x1EF2, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EF3, 0x1EF3, .p.property = IDNA_P_PVALID },
+ { 0x1EF4, 0x1EF4, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EF5, 0x1EF5, .p.property = IDNA_P_PVALID },
+ { 0x1EF6, 0x1EF6, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EF7, 0x1EF7, .p.property = IDNA_P_PVALID },
+ { 0x1EF8, 0x1EF8, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EF9, 0x1EF9, .p.property = IDNA_P_PVALID },
+ { 0x1EFA, 0x1EFA, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EFB, 0x1EFB, .p.property = IDNA_P_PVALID },
+ { 0x1EFC, 0x1EFC, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EFD, 0x1EFD, .p.property = IDNA_P_PVALID },
+ { 0x1EFE, 0x1EFE, .p.property = IDNA_P_DISALLOWED },
+ { 0x1EFF, 0x1F07, .p.property = IDNA_P_PVALID },
+ { 0x1F08, 0x1F0F, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F10, 0x1F15, .p.property = IDNA_P_PVALID },
+ { 0x1F16, 0x1F17, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F18, 0x1F1D, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F1E, 0x1F1F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F20, 0x1F27, .p.property = IDNA_P_PVALID },
+ { 0x1F28, 0x1F2F, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F30, 0x1F37, .p.property = IDNA_P_PVALID },
+ { 0x1F38, 0x1F3F, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F40, 0x1F45, .p.property = IDNA_P_PVALID },
+ { 0x1F46, 0x1F47, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F48, 0x1F4D, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F4E, 0x1F4F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F50, 0x1F57, .p.property = IDNA_P_PVALID },
+ { 0x1F58, 0x1F58, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F59, 0x1F59, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F5A, 0x1F5A, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F5B, 0x1F5B, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F5C, 0x1F5C, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F5D, 0x1F5D, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F5E, 0x1F5E, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F5F, 0x1F5F, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F60, 0x1F67, .p.property = IDNA_P_PVALID },
+ { 0x1F68, 0x1F6F, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F70, 0x1F70, .p.property = IDNA_P_PVALID },
+ { 0x1F71, 0x1F71, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F72, 0x1F72, .p.property = IDNA_P_PVALID },
+ { 0x1F73, 0x1F73, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F74, 0x1F74, .p.property = IDNA_P_PVALID },
+ { 0x1F75, 0x1F75, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F76, 0x1F76, .p.property = IDNA_P_PVALID },
+ { 0x1F77, 0x1F77, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F78, 0x1F78, .p.property = IDNA_P_PVALID },
+ { 0x1F79, 0x1F79, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F7A, 0x1F7A, .p.property = IDNA_P_PVALID },
+ { 0x1F7B, 0x1F7B, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F7C, 0x1F7C, .p.property = IDNA_P_PVALID },
+ { 0x1F7D, 0x1F7D, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F7E, 0x1F7F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F80, 0x1FAF, .p.property = IDNA_P_DISALLOWED },
+ { 0x1FB0, 0x1FB1, .p.property = IDNA_P_PVALID },
+ { 0x1FB2, 0x1FB4, .p.property = IDNA_P_DISALLOWED },
+ { 0x1FB5, 0x1FB5, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1FB6, 0x1FB6, .p.property = IDNA_P_PVALID },
+ { 0x1FB7, 0x1FC4, .p.property = IDNA_P_DISALLOWED },
+ { 0x1FC5, 0x1FC5, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1FC6, 0x1FC6, .p.property = IDNA_P_PVALID },
+ { 0x1FC7, 0x1FCF, .p.property = IDNA_P_DISALLOWED },
+ { 0x1FD0, 0x1FD2, .p.property = IDNA_P_PVALID },
+ { 0x1FD3, 0x1FD3, .p.property = IDNA_P_DISALLOWED },
+ { 0x1FD4, 0x1FD5, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1FD6, 0x1FD7, .p.property = IDNA_P_PVALID },
+ { 0x1FD8, 0x1FDB, .p.property = IDNA_P_DISALLOWED },
+ { 0x1FDC, 0x1FDC, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1FDD, 0x1FDF, .p.property = IDNA_P_DISALLOWED },
+ { 0x1FE0, 0x1FE2, .p.property = IDNA_P_PVALID },
+ { 0x1FE3, 0x1FE3, .p.property = IDNA_P_DISALLOWED },
+ { 0x1FE4, 0x1FE7, .p.property = IDNA_P_PVALID },
+ { 0x1FE8, 0x1FEF, .p.property = IDNA_P_DISALLOWED },
+ { 0x1FF0, 0x1FF1, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1FF2, 0x1FF4, .p.property = IDNA_P_DISALLOWED },
+ { 0x1FF5, 0x1FF5, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1FF6, 0x1FF6, .p.property = IDNA_P_PVALID },
+ { 0x1FF7, 0x1FFE, .p.property = IDNA_P_DISALLOWED },
+ { 0x1FFF, 0x1FFF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2000, 0x200B, .p.property = IDNA_P_DISALLOWED },
+ { 0x200C, 0x200D, .p.property = IDNA_P_CONTEXTJ },
+ { 0x200E, 0x2064, .p.property = IDNA_P_DISALLOWED },
+ { 0x2065, 0x2069, .p.property = IDNA_P_UNASSIGNED },
+ { 0x206A, 0x2071, .p.property = IDNA_P_DISALLOWED },
+ { 0x2072, 0x2073, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2074, 0x208E, .p.property = IDNA_P_DISALLOWED },
+ { 0x208F, 0x208F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2090, 0x2094, .p.property = IDNA_P_DISALLOWED },
+ { 0x2095, 0x209F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x20A0, 0x20B8, .p.property = IDNA_P_DISALLOWED },
+ { 0x20B9, 0x20CF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x20D0, 0x20F0, .p.property = IDNA_P_DISALLOWED },
+ { 0x20F1, 0x20FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2100, 0x214D, .p.property = IDNA_P_DISALLOWED },
+ { 0x214E, 0x214E, .p.property = IDNA_P_PVALID },
+ { 0x214F, 0x2183, .p.property = IDNA_P_DISALLOWED },
+ { 0x2184, 0x2184, .p.property = IDNA_P_PVALID },
+ { 0x2185, 0x2189, .p.property = IDNA_P_DISALLOWED },
+ { 0x218A, 0x218F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2190, 0x23E8, .p.property = IDNA_P_DISALLOWED },
+ { 0x23E9, 0x23FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2400, 0x2426, .p.property = IDNA_P_DISALLOWED },
+ { 0x2427, 0x243F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2440, 0x244A, .p.property = IDNA_P_DISALLOWED },
+ { 0x244B, 0x245F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2460, 0x26CD, .p.property = IDNA_P_DISALLOWED },
+ { 0x26CE, 0x26CE, .p.property = IDNA_P_UNASSIGNED },
+ { 0x26CF, 0x26E1, .p.property = IDNA_P_DISALLOWED },
+ { 0x26E2, 0x26E2, .p.property = IDNA_P_UNASSIGNED },
+ { 0x26E3, 0x26E3, .p.property = IDNA_P_DISALLOWED },
+ { 0x26E4, 0x26E7, .p.property = IDNA_P_UNASSIGNED },
+ { 0x26E8, 0x26FF, .p.property = IDNA_P_DISALLOWED },
+ { 0x2700, 0x2700, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2701, 0x2704, .p.property = IDNA_P_DISALLOWED },
+ { 0x2705, 0x2705, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2706, 0x2709, .p.property = IDNA_P_DISALLOWED },
+ { 0x270A, 0x270B, .p.property = IDNA_P_UNASSIGNED },
+ { 0x270C, 0x2727, .p.property = IDNA_P_DISALLOWED },
+ { 0x2728, 0x2728, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2729, 0x274B, .p.property = IDNA_P_DISALLOWED },
+ { 0x274C, 0x274C, .p.property = IDNA_P_UNASSIGNED },
+ { 0x274D, 0x274D, .p.property = IDNA_P_DISALLOWED },
+ { 0x274E, 0x274E, .p.property = IDNA_P_UNASSIGNED },
+ { 0x274F, 0x2752, .p.property = IDNA_P_DISALLOWED },
+ { 0x2753, 0x2755, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2756, 0x275E, .p.property = IDNA_P_DISALLOWED },
+ { 0x275F, 0x2760, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2761, 0x2794, .p.property = IDNA_P_DISALLOWED },
+ { 0x2795, 0x2797, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2798, 0x27AF, .p.property = IDNA_P_DISALLOWED },
+ { 0x27B0, 0x27B0, .p.property = IDNA_P_UNASSIGNED },
+ { 0x27B1, 0x27BE, .p.property = IDNA_P_DISALLOWED },
+ { 0x27BF, 0x27BF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x27C0, 0x27CA, .p.property = IDNA_P_DISALLOWED },
+ { 0x27CB, 0x27CB, .p.property = IDNA_P_UNASSIGNED },
+ { 0x27CC, 0x27CC, .p.property = IDNA_P_DISALLOWED },
+ { 0x27CD, 0x27CF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x27D0, 0x2B4C, .p.property = IDNA_P_DISALLOWED },
+ { 0x2B4D, 0x2B4F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2B50, 0x2B59, .p.property = IDNA_P_DISALLOWED },
+ { 0x2B5A, 0x2BFF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2C00, 0x2C2E, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C2F, 0x2C2F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2C30, 0x2C5E, .p.property = IDNA_P_PVALID },
+ { 0x2C5F, 0x2C5F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2C60, 0x2C60, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C61, 0x2C61, .p.property = IDNA_P_PVALID },
+ { 0x2C62, 0x2C64, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C65, 0x2C66, .p.property = IDNA_P_PVALID },
+ { 0x2C67, 0x2C67, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C68, 0x2C68, .p.property = IDNA_P_PVALID },
+ { 0x2C69, 0x2C69, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C6A, 0x2C6A, .p.property = IDNA_P_PVALID },
+ { 0x2C6B, 0x2C6B, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C6C, 0x2C6C, .p.property = IDNA_P_PVALID },
+ { 0x2C6D, 0x2C70, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C71, 0x2C71, .p.property = IDNA_P_PVALID },
+ { 0x2C72, 0x2C72, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C73, 0x2C74, .p.property = IDNA_P_PVALID },
+ { 0x2C75, 0x2C75, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C76, 0x2C7B, .p.property = IDNA_P_PVALID },
+ { 0x2C7C, 0x2C80, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C81, 0x2C81, .p.property = IDNA_P_PVALID },
+ { 0x2C82, 0x2C82, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C83, 0x2C83, .p.property = IDNA_P_PVALID },
+ { 0x2C84, 0x2C84, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C85, 0x2C85, .p.property = IDNA_P_PVALID },
+ { 0x2C86, 0x2C86, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C87, 0x2C87, .p.property = IDNA_P_PVALID },
+ { 0x2C88, 0x2C88, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C89, 0x2C89, .p.property = IDNA_P_PVALID },
+ { 0x2C8A, 0x2C8A, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C8B, 0x2C8B, .p.property = IDNA_P_PVALID },
+ { 0x2C8C, 0x2C8C, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C8D, 0x2C8D, .p.property = IDNA_P_PVALID },
+ { 0x2C8E, 0x2C8E, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C8F, 0x2C8F, .p.property = IDNA_P_PVALID },
+ { 0x2C90, 0x2C90, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C91, 0x2C91, .p.property = IDNA_P_PVALID },
+ { 0x2C92, 0x2C92, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C93, 0x2C93, .p.property = IDNA_P_PVALID },
+ { 0x2C94, 0x2C94, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C95, 0x2C95, .p.property = IDNA_P_PVALID },
+ { 0x2C96, 0x2C96, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C97, 0x2C97, .p.property = IDNA_P_PVALID },
+ { 0x2C98, 0x2C98, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C99, 0x2C99, .p.property = IDNA_P_PVALID },
+ { 0x2C9A, 0x2C9A, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C9B, 0x2C9B, .p.property = IDNA_P_PVALID },
+ { 0x2C9C, 0x2C9C, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C9D, 0x2C9D, .p.property = IDNA_P_PVALID },
+ { 0x2C9E, 0x2C9E, .p.property = IDNA_P_DISALLOWED },
+ { 0x2C9F, 0x2C9F, .p.property = IDNA_P_PVALID },
+ { 0x2CA0, 0x2CA0, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CA1, 0x2CA1, .p.property = IDNA_P_PVALID },
+ { 0x2CA2, 0x2CA2, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CA3, 0x2CA3, .p.property = IDNA_P_PVALID },
+ { 0x2CA4, 0x2CA4, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CA5, 0x2CA5, .p.property = IDNA_P_PVALID },
+ { 0x2CA6, 0x2CA6, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CA7, 0x2CA7, .p.property = IDNA_P_PVALID },
+ { 0x2CA8, 0x2CA8, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CA9, 0x2CA9, .p.property = IDNA_P_PVALID },
+ { 0x2CAA, 0x2CAA, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CAB, 0x2CAB, .p.property = IDNA_P_PVALID },
+ { 0x2CAC, 0x2CAC, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CAD, 0x2CAD, .p.property = IDNA_P_PVALID },
+ { 0x2CAE, 0x2CAE, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CAF, 0x2CAF, .p.property = IDNA_P_PVALID },
+ { 0x2CB0, 0x2CB0, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CB1, 0x2CB1, .p.property = IDNA_P_PVALID },
+ { 0x2CB2, 0x2CB2, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CB3, 0x2CB3, .p.property = IDNA_P_PVALID },
+ { 0x2CB4, 0x2CB4, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CB5, 0x2CB5, .p.property = IDNA_P_PVALID },
+ { 0x2CB6, 0x2CB6, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CB7, 0x2CB7, .p.property = IDNA_P_PVALID },
+ { 0x2CB8, 0x2CB8, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CB9, 0x2CB9, .p.property = IDNA_P_PVALID },
+ { 0x2CBA, 0x2CBA, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CBB, 0x2CBB, .p.property = IDNA_P_PVALID },
+ { 0x2CBC, 0x2CBC, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CBD, 0x2CBD, .p.property = IDNA_P_PVALID },
+ { 0x2CBE, 0x2CBE, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CBF, 0x2CBF, .p.property = IDNA_P_PVALID },
+ { 0x2CC0, 0x2CC0, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CC1, 0x2CC1, .p.property = IDNA_P_PVALID },
+ { 0x2CC2, 0x2CC2, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CC3, 0x2CC3, .p.property = IDNA_P_PVALID },
+ { 0x2CC4, 0x2CC4, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CC5, 0x2CC5, .p.property = IDNA_P_PVALID },
+ { 0x2CC6, 0x2CC6, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CC7, 0x2CC7, .p.property = IDNA_P_PVALID },
+ { 0x2CC8, 0x2CC8, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CC9, 0x2CC9, .p.property = IDNA_P_PVALID },
+ { 0x2CCA, 0x2CCA, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CCB, 0x2CCB, .p.property = IDNA_P_PVALID },
+ { 0x2CCC, 0x2CCC, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CCD, 0x2CCD, .p.property = IDNA_P_PVALID },
+ { 0x2CCE, 0x2CCE, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CCF, 0x2CCF, .p.property = IDNA_P_PVALID },
+ { 0x2CD0, 0x2CD0, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CD1, 0x2CD1, .p.property = IDNA_P_PVALID },
+ { 0x2CD2, 0x2CD2, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CD3, 0x2CD3, .p.property = IDNA_P_PVALID },
+ { 0x2CD4, 0x2CD4, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CD5, 0x2CD5, .p.property = IDNA_P_PVALID },
+ { 0x2CD6, 0x2CD6, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CD7, 0x2CD7, .p.property = IDNA_P_PVALID },
+ { 0x2CD8, 0x2CD8, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CD9, 0x2CD9, .p.property = IDNA_P_PVALID },
+ { 0x2CDA, 0x2CDA, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CDB, 0x2CDB, .p.property = IDNA_P_PVALID },
+ { 0x2CDC, 0x2CDC, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CDD, 0x2CDD, .p.property = IDNA_P_PVALID },
+ { 0x2CDE, 0x2CDE, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CDF, 0x2CDF, .p.property = IDNA_P_PVALID },
+ { 0x2CE0, 0x2CE0, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CE1, 0x2CE1, .p.property = IDNA_P_PVALID },
+ { 0x2CE2, 0x2CE2, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CE3, 0x2CE4, .p.property = IDNA_P_PVALID },
+ { 0x2CE5, 0x2CEB, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CEC, 0x2CEC, .p.property = IDNA_P_PVALID },
+ { 0x2CED, 0x2CED, .p.property = IDNA_P_DISALLOWED },
+ { 0x2CEE, 0x2CF1, .p.property = IDNA_P_PVALID },
+ { 0x2CF2, 0x2CF8, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2CF9, 0x2CFF, .p.property = IDNA_P_DISALLOWED },
+ { 0x2D00, 0x2D25, .p.property = IDNA_P_PVALID },
+ { 0x2D26, 0x2D2F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2D30, 0x2D65, .p.property = IDNA_P_PVALID },
+ { 0x2D66, 0x2D6E, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2D6F, 0x2D6F, .p.property = IDNA_P_DISALLOWED },
+ { 0x2D70, 0x2D7F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2D80, 0x2D96, .p.property = IDNA_P_PVALID },
+ { 0x2D97, 0x2D9F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2DA0, 0x2DA6, .p.property = IDNA_P_PVALID },
+ { 0x2DA7, 0x2DA7, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2DA8, 0x2DAE, .p.property = IDNA_P_PVALID },
+ { 0x2DAF, 0x2DAF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2DB0, 0x2DB6, .p.property = IDNA_P_PVALID },
+ { 0x2DB7, 0x2DB7, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2DB8, 0x2DBE, .p.property = IDNA_P_PVALID },
+ { 0x2DBF, 0x2DBF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2DC0, 0x2DC6, .p.property = IDNA_P_PVALID },
+ { 0x2DC7, 0x2DC7, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2DC8, 0x2DCE, .p.property = IDNA_P_PVALID },
+ { 0x2DCF, 0x2DCF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2DD0, 0x2DD6, .p.property = IDNA_P_PVALID },
+ { 0x2DD7, 0x2DD7, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2DD8, 0x2DDE, .p.property = IDNA_P_PVALID },
+ { 0x2DDF, 0x2DDF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2DE0, 0x2DFF, .p.property = IDNA_P_PVALID },
+ { 0x2E00, 0x2E2E, .p.property = IDNA_P_DISALLOWED },
+ { 0x2E2F, 0x2E2F, .p.property = IDNA_P_PVALID },
+ { 0x2E30, 0x2E31, .p.property = IDNA_P_DISALLOWED },
+ { 0x2E32, 0x2E7F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2E80, 0x2E99, .p.property = IDNA_P_DISALLOWED },
+ { 0x2E9A, 0x2E9A, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2E9B, 0x2EF3, .p.property = IDNA_P_DISALLOWED },
+ { 0x2EF4, 0x2EFF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2F00, 0x2FD5, .p.property = IDNA_P_DISALLOWED },
+ { 0x2FD6, 0x2FEF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2FF0, 0x2FFB, .p.property = IDNA_P_DISALLOWED },
+ { 0x2FFC, 0x2FFF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x3000, 0x3004, .p.property = IDNA_P_DISALLOWED },
+ { 0x3005, 0x3007, .p.property = IDNA_P_PVALID },
+ { 0x3008, 0x3029, .p.property = IDNA_P_DISALLOWED },
+ { 0x302A, 0x302D, .p.property = IDNA_P_PVALID },
+ { 0x302E, 0x303B, .p.property = IDNA_P_DISALLOWED },
+ { 0x303C, 0x303C, .p.property = IDNA_P_PVALID },
+ { 0x303D, 0x303F, .p.property = IDNA_P_DISALLOWED },
+ { 0x3040, 0x3040, .p.property = IDNA_P_UNASSIGNED },
+ { 0x3041, 0x3096, .p.property = IDNA_P_PVALID },
+ { 0x3097, 0x3098, .p.property = IDNA_P_UNASSIGNED },
+ { 0x3099, 0x309A, .p.property = IDNA_P_PVALID },
+ { 0x309B, 0x309C, .p.property = IDNA_P_DISALLOWED },
+ { 0x309D, 0x309E, .p.property = IDNA_P_PVALID },
+ { 0x309F, 0x30A0, .p.property = IDNA_P_DISALLOWED },
+ { 0x30A1, 0x30FA, .p.property = IDNA_P_PVALID },
+ { 0x30FB, 0x30FB, .p.property = IDNA_P_CONTEXTO },
+ { 0x30FC, 0x30FE, .p.property = IDNA_P_PVALID },
+ { 0x30FF, 0x30FF, .p.property = IDNA_P_DISALLOWED },
+ { 0x3100, 0x3104, .p.property = IDNA_P_UNASSIGNED },
+ { 0x3105, 0x312D, .p.property = IDNA_P_PVALID },
+ { 0x312E, 0x3130, .p.property = IDNA_P_UNASSIGNED },
+ { 0x3131, 0x318E, .p.property = IDNA_P_DISALLOWED },
+ { 0x318F, 0x318F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x3190, 0x319F, .p.property = IDNA_P_DISALLOWED },
+ { 0x31A0, 0x31B7, .p.property = IDNA_P_PVALID },
+ { 0x31B8, 0x31BF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x31C0, 0x31E3, .p.property = IDNA_P_DISALLOWED },
+ { 0x31E4, 0x31EF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x31F0, 0x31FF, .p.property = IDNA_P_PVALID },
+ { 0x3200, 0x321E, .p.property = IDNA_P_DISALLOWED },
+ { 0x321F, 0x321F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x3220, 0x32FE, .p.property = IDNA_P_DISALLOWED },
+ { 0x32FF, 0x32FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x3300, 0x33FF, .p.property = IDNA_P_DISALLOWED },
+ { 0x3400, 0x4DB5, .p.property = IDNA_P_PVALID },
+ { 0x4DB6, 0x4DBF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x4DC0, 0x4DFF, .p.property = IDNA_P_DISALLOWED },
+ { 0x4E00, 0x9FCB, .p.property = IDNA_P_PVALID },
+ { 0x9FCC, 0x9FFF, .p.property = IDNA_P_UNASSIGNED },
+ { 0xA000, 0xA48C, .p.property = IDNA_P_PVALID },
+ { 0xA48D, 0xA48F, .p.property = IDNA_P_UNASSIGNED },
+ { 0xA490, 0xA4C6, .p.property = IDNA_P_DISALLOWED },
+ { 0xA4C7, 0xA4CF, .p.property = IDNA_P_UNASSIGNED },
+ { 0xA4D0, 0xA4FD, .p.property = IDNA_P_PVALID },
+ { 0xA4FE, 0xA4FF, .p.property = IDNA_P_DISALLOWED },
+ { 0xA500, 0xA60C, .p.property = IDNA_P_PVALID },
+ { 0xA60D, 0xA60F, .p.property = IDNA_P_DISALLOWED },
+ { 0xA610, 0xA62B, .p.property = IDNA_P_PVALID },
+ { 0xA62C, 0xA63F, .p.property = IDNA_P_UNASSIGNED },
+ { 0xA640, 0xA640, .p.property = IDNA_P_DISALLOWED },
+ { 0xA641, 0xA641, .p.property = IDNA_P_PVALID },
+ { 0xA642, 0xA642, .p.property = IDNA_P_DISALLOWED },
+ { 0xA643, 0xA643, .p.property = IDNA_P_PVALID },
+ { 0xA644, 0xA644, .p.property = IDNA_P_DISALLOWED },
+ { 0xA645, 0xA645, .p.property = IDNA_P_PVALID },
+ { 0xA646, 0xA646, .p.property = IDNA_P_DISALLOWED },
+ { 0xA647, 0xA647, .p.property = IDNA_P_PVALID },
+ { 0xA648, 0xA648, .p.property = IDNA_P_DISALLOWED },
+ { 0xA649, 0xA649, .p.property = IDNA_P_PVALID },
+ { 0xA64A, 0xA64A, .p.property = IDNA_P_DISALLOWED },
+ { 0xA64B, 0xA64B, .p.property = IDNA_P_PVALID },
+ { 0xA64C, 0xA64C, .p.property = IDNA_P_DISALLOWED },
+ { 0xA64D, 0xA64D, .p.property = IDNA_P_PVALID },
+ { 0xA64E, 0xA64E, .p.property = IDNA_P_DISALLOWED },
+ { 0xA64F, 0xA64F, .p.property = IDNA_P_PVALID },
+ { 0xA650, 0xA650, .p.property = IDNA_P_DISALLOWED },
+ { 0xA651, 0xA651, .p.property = IDNA_P_PVALID },
+ { 0xA652, 0xA652, .p.property = IDNA_P_DISALLOWED },
+ { 0xA653, 0xA653, .p.property = IDNA_P_PVALID },
+ { 0xA654, 0xA654, .p.property = IDNA_P_DISALLOWED },
+ { 0xA655, 0xA655, .p.property = IDNA_P_PVALID },
+ { 0xA656, 0xA656, .p.property = IDNA_P_DISALLOWED },
+ { 0xA657, 0xA657, .p.property = IDNA_P_PVALID },
+ { 0xA658, 0xA658, .p.property = IDNA_P_DISALLOWED },
+ { 0xA659, 0xA659, .p.property = IDNA_P_PVALID },
+ { 0xA65A, 0xA65A, .p.property = IDNA_P_DISALLOWED },
+ { 0xA65B, 0xA65B, .p.property = IDNA_P_PVALID },
+ { 0xA65C, 0xA65C, .p.property = IDNA_P_DISALLOWED },
+ { 0xA65D, 0xA65D, .p.property = IDNA_P_PVALID },
+ { 0xA65E, 0xA65E, .p.property = IDNA_P_DISALLOWED },
+ { 0xA65F, 0xA65F, .p.property = IDNA_P_PVALID },
+ { 0xA660, 0xA661, .p.property = IDNA_P_UNASSIGNED },
+ { 0xA662, 0xA662, .p.property = IDNA_P_DISALLOWED },
+ { 0xA663, 0xA663, .p.property = IDNA_P_PVALID },
+ { 0xA664, 0xA664, .p.property = IDNA_P_DISALLOWED },
+ { 0xA665, 0xA665, .p.property = IDNA_P_PVALID },
+ { 0xA666, 0xA666, .p.property = IDNA_P_DISALLOWED },
+ { 0xA667, 0xA667, .p.property = IDNA_P_PVALID },
+ { 0xA668, 0xA668, .p.property = IDNA_P_DISALLOWED },
+ { 0xA669, 0xA669, .p.property = IDNA_P_PVALID },
+ { 0xA66A, 0xA66A, .p.property = IDNA_P_DISALLOWED },
+ { 0xA66B, 0xA66B, .p.property = IDNA_P_PVALID },
+ { 0xA66C, 0xA66C, .p.property = IDNA_P_DISALLOWED },
+ { 0xA66D, 0xA66F, .p.property = IDNA_P_PVALID },
+ { 0xA670, 0xA673, .p.property = IDNA_P_DISALLOWED },
+ { 0xA674, 0xA67B, .p.property = IDNA_P_UNASSIGNED },
+ { 0xA67C, 0xA67D, .p.property = IDNA_P_PVALID },
+ { 0xA67E, 0xA67E, .p.property = IDNA_P_DISALLOWED },
+ { 0xA67F, 0xA67F, .p.property = IDNA_P_PVALID },
+ { 0xA680, 0xA680, .p.property = IDNA_P_DISALLOWED },
+ { 0xA681, 0xA681, .p.property = IDNA_P_PVALID },
+ { 0xA682, 0xA682, .p.property = IDNA_P_DISALLOWED },
+ { 0xA683, 0xA683, .p.property = IDNA_P_PVALID },
+ { 0xA684, 0xA684, .p.property = IDNA_P_DISALLOWED },
+ { 0xA685, 0xA685, .p.property = IDNA_P_PVALID },
+ { 0xA686, 0xA686, .p.property = IDNA_P_DISALLOWED },
+ { 0xA687, 0xA687, .p.property = IDNA_P_PVALID },
+ { 0xA688, 0xA688, .p.property = IDNA_P_DISALLOWED },
+ { 0xA689, 0xA689, .p.property = IDNA_P_PVALID },
+ { 0xA68A, 0xA68A, .p.property = IDNA_P_DISALLOWED },
+ { 0xA68B, 0xA68B, .p.property = IDNA_P_PVALID },
+ { 0xA68C, 0xA68C, .p.property = IDNA_P_DISALLOWED },
+ { 0xA68D, 0xA68D, .p.property = IDNA_P_PVALID },
+ { 0xA68E, 0xA68E, .p.property = IDNA_P_DISALLOWED },
+ { 0xA68F, 0xA68F, .p.property = IDNA_P_PVALID },
+ { 0xA690, 0xA690, .p.property = IDNA_P_DISALLOWED },
+ { 0xA691, 0xA691, .p.property = IDNA_P_PVALID },
+ { 0xA692, 0xA692, .p.property = IDNA_P_DISALLOWED },
+ { 0xA693, 0xA693, .p.property = IDNA_P_PVALID },
+ { 0xA694, 0xA694, .p.property = IDNA_P_DISALLOWED },
+ { 0xA695, 0xA695, .p.property = IDNA_P_PVALID },
+ { 0xA696, 0xA696, .p.property = IDNA_P_DISALLOWED },
+ { 0xA697, 0xA697, .p.property = IDNA_P_PVALID },
+ { 0xA698, 0xA69F, .p.property = IDNA_P_UNASSIGNED },
+ { 0xA6A0, 0xA6E5, .p.property = IDNA_P_PVALID },
+ { 0xA6E6, 0xA6EF, .p.property = IDNA_P_DISALLOWED },
+ { 0xA6F0, 0xA6F1, .p.property = IDNA_P_PVALID },
+ { 0xA6F2, 0xA6F7, .p.property = IDNA_P_DISALLOWED },
+ { 0xA6F8, 0xA6FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0xA700, 0xA716, .p.property = IDNA_P_DISALLOWED },
+ { 0xA717, 0xA71F, .p.property = IDNA_P_PVALID },
+ { 0xA720, 0xA722, .p.property = IDNA_P_DISALLOWED },
+ { 0xA723, 0xA723, .p.property = IDNA_P_PVALID },
+ { 0xA724, 0xA724, .p.property = IDNA_P_DISALLOWED },
+ { 0xA725, 0xA725, .p.property = IDNA_P_PVALID },
+ { 0xA726, 0xA726, .p.property = IDNA_P_DISALLOWED },
+ { 0xA727, 0xA727, .p.property = IDNA_P_PVALID },
+ { 0xA728, 0xA728, .p.property = IDNA_P_DISALLOWED },
+ { 0xA729, 0xA729, .p.property = IDNA_P_PVALID },
+ { 0xA72A, 0xA72A, .p.property = IDNA_P_DISALLOWED },
+ { 0xA72B, 0xA72B, .p.property = IDNA_P_PVALID },
+ { 0xA72C, 0xA72C, .p.property = IDNA_P_DISALLOWED },
+ { 0xA72D, 0xA72D, .p.property = IDNA_P_PVALID },
+ { 0xA72E, 0xA72E, .p.property = IDNA_P_DISALLOWED },
+ { 0xA72F, 0xA731, .p.property = IDNA_P_PVALID },
+ { 0xA732, 0xA732, .p.property = IDNA_P_DISALLOWED },
+ { 0xA733, 0xA733, .p.property = IDNA_P_PVALID },
+ { 0xA734, 0xA734, .p.property = IDNA_P_DISALLOWED },
+ { 0xA735, 0xA735, .p.property = IDNA_P_PVALID },
+ { 0xA736, 0xA736, .p.property = IDNA_P_DISALLOWED },
+ { 0xA737, 0xA737, .p.property = IDNA_P_PVALID },
+ { 0xA738, 0xA738, .p.property = IDNA_P_DISALLOWED },
+ { 0xA739, 0xA739, .p.property = IDNA_P_PVALID },
+ { 0xA73A, 0xA73A, .p.property = IDNA_P_DISALLOWED },
+ { 0xA73B, 0xA73B, .p.property = IDNA_P_PVALID },
+ { 0xA73C, 0xA73C, .p.property = IDNA_P_DISALLOWED },
+ { 0xA73D, 0xA73D, .p.property = IDNA_P_PVALID },
+ { 0xA73E, 0xA73E, .p.property = IDNA_P_DISALLOWED },
+ { 0xA73F, 0xA73F, .p.property = IDNA_P_PVALID },
+ { 0xA740, 0xA740, .p.property = IDNA_P_DISALLOWED },
+ { 0xA741, 0xA741, .p.property = IDNA_P_PVALID },
+ { 0xA742, 0xA742, .p.property = IDNA_P_DISALLOWED },
+ { 0xA743, 0xA743, .p.property = IDNA_P_PVALID },
+ { 0xA744, 0xA744, .p.property = IDNA_P_DISALLOWED },
+ { 0xA745, 0xA745, .p.property = IDNA_P_PVALID },
+ { 0xA746, 0xA746, .p.property = IDNA_P_DISALLOWED },
+ { 0xA747, 0xA747, .p.property = IDNA_P_PVALID },
+ { 0xA748, 0xA748, .p.property = IDNA_P_DISALLOWED },
+ { 0xA749, 0xA749, .p.property = IDNA_P_PVALID },
+ { 0xA74A, 0xA74A, .p.property = IDNA_P_DISALLOWED },
+ { 0xA74B, 0xA74B, .p.property = IDNA_P_PVALID },
+ { 0xA74C, 0xA74C, .p.property = IDNA_P_DISALLOWED },
+ { 0xA74D, 0xA74D, .p.property = IDNA_P_PVALID },
+ { 0xA74E, 0xA74E, .p.property = IDNA_P_DISALLOWED },
+ { 0xA74F, 0xA74F, .p.property = IDNA_P_PVALID },
+ { 0xA750, 0xA750, .p.property = IDNA_P_DISALLOWED },
+ { 0xA751, 0xA751, .p.property = IDNA_P_PVALID },
+ { 0xA752, 0xA752, .p.property = IDNA_P_DISALLOWED },
+ { 0xA753, 0xA753, .p.property = IDNA_P_PVALID },
+ { 0xA754, 0xA754, .p.property = IDNA_P_DISALLOWED },
+ { 0xA755, 0xA755, .p.property = IDNA_P_PVALID },
+ { 0xA756, 0xA756, .p.property = IDNA_P_DISALLOWED },
+ { 0xA757, 0xA757, .p.property = IDNA_P_PVALID },
+ { 0xA758, 0xA758, .p.property = IDNA_P_DISALLOWED },
+ { 0xA759, 0xA759, .p.property = IDNA_P_PVALID },
+ { 0xA75A, 0xA75A, .p.property = IDNA_P_DISALLOWED },
+ { 0xA75B, 0xA75B, .p.property = IDNA_P_PVALID },
+ { 0xA75C, 0xA75C, .p.property = IDNA_P_DISALLOWED },
+ { 0xA75D, 0xA75D, .p.property = IDNA_P_PVALID },
+ { 0xA75E, 0xA75E, .p.property = IDNA_P_DISALLOWED },
+ { 0xA75F, 0xA75F, .p.property = IDNA_P_PVALID },
+ { 0xA760, 0xA760, .p.property = IDNA_P_DISALLOWED },
+ { 0xA761, 0xA761, .p.property = IDNA_P_PVALID },
+ { 0xA762, 0xA762, .p.property = IDNA_P_DISALLOWED },
+ { 0xA763, 0xA763, .p.property = IDNA_P_PVALID },
+ { 0xA764, 0xA764, .p.property = IDNA_P_DISALLOWED },
+ { 0xA765, 0xA765, .p.property = IDNA_P_PVALID },
+ { 0xA766, 0xA766, .p.property = IDNA_P_DISALLOWED },
+ { 0xA767, 0xA767, .p.property = IDNA_P_PVALID },
+ { 0xA768, 0xA768, .p.property = IDNA_P_DISALLOWED },
+ { 0xA769, 0xA769, .p.property = IDNA_P_PVALID },
+ { 0xA76A, 0xA76A, .p.property = IDNA_P_DISALLOWED },
+ { 0xA76B, 0xA76B, .p.property = IDNA_P_PVALID },
+ { 0xA76C, 0xA76C, .p.property = IDNA_P_DISALLOWED },
+ { 0xA76D, 0xA76D, .p.property = IDNA_P_PVALID },
+ { 0xA76E, 0xA76E, .p.property = IDNA_P_DISALLOWED },
+ { 0xA76F, 0xA76F, .p.property = IDNA_P_PVALID },
+ { 0xA770, 0xA770, .p.property = IDNA_P_DISALLOWED },
+ { 0xA771, 0xA778, .p.property = IDNA_P_PVALID },
+ { 0xA779, 0xA779, .p.property = IDNA_P_DISALLOWED },
+ { 0xA77A, 0xA77A, .p.property = IDNA_P_PVALID },
+ { 0xA77B, 0xA77B, .p.property = IDNA_P_DISALLOWED },
+ { 0xA77C, 0xA77C, .p.property = IDNA_P_PVALID },
+ { 0xA77D, 0xA77E, .p.property = IDNA_P_DISALLOWED },
+ { 0xA77F, 0xA77F, .p.property = IDNA_P_PVALID },
+ { 0xA780, 0xA780, .p.property = IDNA_P_DISALLOWED },
+ { 0xA781, 0xA781, .p.property = IDNA_P_PVALID },
+ { 0xA782, 0xA782, .p.property = IDNA_P_DISALLOWED },
+ { 0xA783, 0xA783, .p.property = IDNA_P_PVALID },
+ { 0xA784, 0xA784, .p.property = IDNA_P_DISALLOWED },
+ { 0xA785, 0xA785, .p.property = IDNA_P_PVALID },
+ { 0xA786, 0xA786, .p.property = IDNA_P_DISALLOWED },
+ { 0xA787, 0xA788, .p.property = IDNA_P_PVALID },
+ { 0xA789, 0xA78B, .p.property = IDNA_P_DISALLOWED },
+ { 0xA78C, 0xA78C, .p.property = IDNA_P_PVALID },
+ { 0xA78D, 0xA7FA, .p.property = IDNA_P_UNASSIGNED },
+ { 0xA7FB, 0xA827, .p.property = IDNA_P_PVALID },
+ { 0xA828, 0xA82B, .p.property = IDNA_P_DISALLOWED },
+ { 0xA82C, 0xA82F, .p.property = IDNA_P_UNASSIGNED },
+ { 0xA830, 0xA839, .p.property = IDNA_P_DISALLOWED },
+ { 0xA83A, 0xA83F, .p.property = IDNA_P_UNASSIGNED },
+ { 0xA840, 0xA873, .p.property = IDNA_P_PVALID },
+ { 0xA874, 0xA877, .p.property = IDNA_P_DISALLOWED },
+ { 0xA878, 0xA87F, .p.property = IDNA_P_UNASSIGNED },
+ { 0xA880, 0xA8C4, .p.property = IDNA_P_PVALID },
+ { 0xA8C5, 0xA8CD, .p.property = IDNA_P_UNASSIGNED },
+ { 0xA8CE, 0xA8CF, .p.property = IDNA_P_DISALLOWED },
+ { 0xA8D0, 0xA8D9, .p.property = IDNA_P_PVALID },
+ { 0xA8DA, 0xA8DF, .p.property = IDNA_P_UNASSIGNED },
+ { 0xA8E0, 0xA8F7, .p.property = IDNA_P_PVALID },
+ { 0xA8F8, 0xA8FA, .p.property = IDNA_P_DISALLOWED },
+ { 0xA8FB, 0xA8FB, .p.property = IDNA_P_PVALID },
+ { 0xA8FC, 0xA8FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0xA900, 0xA92D, .p.property = IDNA_P_PVALID },
+ { 0xA92E, 0xA92F, .p.property = IDNA_P_DISALLOWED },
+ { 0xA930, 0xA953, .p.property = IDNA_P_PVALID },
+ { 0xA954, 0xA95E, .p.property = IDNA_P_UNASSIGNED },
+ { 0xA95F, 0xA97C, .p.property = IDNA_P_DISALLOWED },
+ { 0xA97D, 0xA97F, .p.property = IDNA_P_UNASSIGNED },
+ { 0xA980, 0xA9C0, .p.property = IDNA_P_PVALID },
+ { 0xA9C1, 0xA9CD, .p.property = IDNA_P_DISALLOWED },
+ { 0xA9CE, 0xA9CE, .p.property = IDNA_P_UNASSIGNED },
+ { 0xA9CF, 0xA9D9, .p.property = IDNA_P_PVALID },
+ { 0xA9DA, 0xA9DD, .p.property = IDNA_P_UNASSIGNED },
+ { 0xA9DE, 0xA9DF, .p.property = IDNA_P_DISALLOWED },
+ { 0xA9E0, 0xA9FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0xAA00, 0xAA36, .p.property = IDNA_P_PVALID },
+ { 0xAA37, 0xAA3F, .p.property = IDNA_P_UNASSIGNED },
+ { 0xAA40, 0xAA4D, .p.property = IDNA_P_PVALID },
+ { 0xAA4E, 0xAA4F, .p.property = IDNA_P_UNASSIGNED },
+ { 0xAA50, 0xAA59, .p.property = IDNA_P_PVALID },
+ { 0xAA5A, 0xAA5B, .p.property = IDNA_P_UNASSIGNED },
+ { 0xAA5C, 0xAA5F, .p.property = IDNA_P_DISALLOWED },
+ { 0xAA60, 0xAA76, .p.property = IDNA_P_PVALID },
+ { 0xAA77, 0xAA79, .p.property = IDNA_P_DISALLOWED },
+ { 0xAA7A, 0xAA7B, .p.property = IDNA_P_PVALID },
+ { 0xAA7C, 0xAA7F, .p.property = IDNA_P_UNASSIGNED },
+ { 0xAA80, 0xAAC2, .p.property = IDNA_P_PVALID },
+ { 0xAAC3, 0xAADA, .p.property = IDNA_P_UNASSIGNED },
+ { 0xAADB, 0xAADD, .p.property = IDNA_P_PVALID },
+ { 0xAADE, 0xAADF, .p.property = IDNA_P_DISALLOWED },
+ { 0xAAE0, 0xABBF, .p.property = IDNA_P_UNASSIGNED },
+ { 0xABC0, 0xABEA, .p.property = IDNA_P_PVALID },
+ { 0xABEB, 0xABEB, .p.property = IDNA_P_DISALLOWED },
+ { 0xABEC, 0xABED, .p.property = IDNA_P_PVALID },
+ { 0xABEE, 0xABEF, .p.property = IDNA_P_UNASSIGNED },
+ { 0xABF0, 0xABF9, .p.property = IDNA_P_PVALID },
+ { 0xABFA, 0xABFF, .p.property = IDNA_P_UNASSIGNED },
+ { 0xAC00, 0xD7A3, .p.property = IDNA_P_PVALID },
+ { 0xD7A4, 0xD7AF, .p.property = IDNA_P_UNASSIGNED },
+ { 0xD7B0, 0xD7C6, .p.property = IDNA_P_DISALLOWED },
+ { 0xD7C7, 0xD7CA, .p.property = IDNA_P_UNASSIGNED },
+ { 0xD7CB, 0xD7FB, .p.property = IDNA_P_DISALLOWED },
+ { 0xD7FC, 0xD7FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0xD800, 0xFA0D, .p.property = IDNA_P_DISALLOWED },
+ { 0xFA0E, 0xFA0F, .p.property = IDNA_P_PVALID },
+ { 0xFA10, 0xFA10, .p.property = IDNA_P_DISALLOWED },
+ { 0xFA11, 0xFA11, .p.property = IDNA_P_PVALID },
+ { 0xFA12, 0xFA12, .p.property = IDNA_P_DISALLOWED },
+ { 0xFA13, 0xFA14, .p.property = IDNA_P_PVALID },
+ { 0xFA15, 0xFA1E, .p.property = IDNA_P_DISALLOWED },
+ { 0xFA1F, 0xFA1F, .p.property = IDNA_P_PVALID },
+ { 0xFA20, 0xFA20, .p.property = IDNA_P_DISALLOWED },
+ { 0xFA21, 0xFA21, .p.property = IDNA_P_PVALID },
+ { 0xFA22, 0xFA22, .p.property = IDNA_P_DISALLOWED },
+ { 0xFA23, 0xFA24, .p.property = IDNA_P_PVALID },
+ { 0xFA25, 0xFA26, .p.property = IDNA_P_DISALLOWED },
+ { 0xFA27, 0xFA29, .p.property = IDNA_P_PVALID },
+ { 0xFA2A, 0xFA2D, .p.property = IDNA_P_DISALLOWED },
+ { 0xFA2E, 0xFA2F, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFA30, 0xFA6D, .p.property = IDNA_P_DISALLOWED },
+ { 0xFA6E, 0xFA6F, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFA70, 0xFAD9, .p.property = IDNA_P_DISALLOWED },
+ { 0xFADA, 0xFAFF, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFB00, 0xFB06, .p.property = IDNA_P_DISALLOWED },
+ { 0xFB07, 0xFB12, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFB13, 0xFB17, .p.property = IDNA_P_DISALLOWED },
+ { 0xFB18, 0xFB1C, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFB1D, 0xFB1D, .p.property = IDNA_P_DISALLOWED },
+ { 0xFB1E, 0xFB1E, .p.property = IDNA_P_PVALID },
+ { 0xFB1F, 0xFB36, .p.property = IDNA_P_DISALLOWED },
+ { 0xFB37, 0xFB37, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFB38, 0xFB3C, .p.property = IDNA_P_DISALLOWED },
+ { 0xFB3D, 0xFB3D, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFB3E, 0xFB3E, .p.property = IDNA_P_DISALLOWED },
+ { 0xFB3F, 0xFB3F, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFB40, 0xFB41, .p.property = IDNA_P_DISALLOWED },
+ { 0xFB42, 0xFB42, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFB43, 0xFB44, .p.property = IDNA_P_DISALLOWED },
+ { 0xFB45, 0xFB45, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFB46, 0xFBB1, .p.property = IDNA_P_DISALLOWED },
+ { 0xFBB2, 0xFBD2, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFBD3, 0xFD3F, .p.property = IDNA_P_DISALLOWED },
+ { 0xFD40, 0xFD4F, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFD50, 0xFD8F, .p.property = IDNA_P_DISALLOWED },
+ { 0xFD90, 0xFD91, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFD92, 0xFDC7, .p.property = IDNA_P_DISALLOWED },
+ { 0xFDC8, 0xFDCF, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFDD0, 0xFDFD, .p.property = IDNA_P_DISALLOWED },
+ { 0xFDFE, 0xFDFF, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFE00, 0xFE19, .p.property = IDNA_P_DISALLOWED },
+ { 0xFE1A, 0xFE1F, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFE20, 0xFE26, .p.property = IDNA_P_PVALID },
+ { 0xFE27, 0xFE2F, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFE30, 0xFE52, .p.property = IDNA_P_DISALLOWED },
+ { 0xFE53, 0xFE53, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFE54, 0xFE66, .p.property = IDNA_P_DISALLOWED },
+ { 0xFE67, 0xFE67, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFE68, 0xFE6B, .p.property = IDNA_P_DISALLOWED },
+ { 0xFE6C, 0xFE6F, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFE70, 0xFE72, .p.property = IDNA_P_DISALLOWED },
+ { 0xFE73, 0xFE73, .p.property = IDNA_P_PVALID },
+ { 0xFE74, 0xFE74, .p.property = IDNA_P_DISALLOWED },
+ { 0xFE75, 0xFE75, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFE76, 0xFEFC, .p.property = IDNA_P_DISALLOWED },
+ { 0xFEFD, 0xFEFE, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFEFF, 0xFEFF, .p.property = IDNA_P_DISALLOWED },
+ { 0xFF00, 0xFF00, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFF01, 0xFFBE, .p.property = IDNA_P_DISALLOWED },
+ { 0xFFBF, 0xFFC1, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFFC2, 0xFFC7, .p.property = IDNA_P_DISALLOWED },
+ { 0xFFC8, 0xFFC9, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFFCA, 0xFFCF, .p.property = IDNA_P_DISALLOWED },
+ { 0xFFD0, 0xFFD1, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFFD2, 0xFFD7, .p.property = IDNA_P_DISALLOWED },
+ { 0xFFD8, 0xFFD9, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFFDA, 0xFFDC, .p.property = IDNA_P_DISALLOWED },
+ { 0xFFDD, 0xFFDF, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFFE0, 0xFFE6, .p.property = IDNA_P_DISALLOWED },
+ { 0xFFE7, 0xFFE7, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFFE8, 0xFFEE, .p.property = IDNA_P_DISALLOWED },
+ { 0xFFEF, 0xFFF8, .p.property = IDNA_P_UNASSIGNED },
+ { 0xFFF9, 0xFFFF, .p.property = IDNA_P_DISALLOWED },
+ { 0x10000, 0x1000B, .p.property = IDNA_P_PVALID },
+ { 0x1000C, 0x1000C, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1000D, 0x10026, .p.property = IDNA_P_PVALID },
+ { 0x10027, 0x10027, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10028, 0x1003A, .p.property = IDNA_P_PVALID },
+ { 0x1003B, 0x1003B, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1003C, 0x1003D, .p.property = IDNA_P_PVALID },
+ { 0x1003E, 0x1003E, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1003F, 0x1004D, .p.property = IDNA_P_PVALID },
+ { 0x1004E, 0x1004F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10050, 0x1005D, .p.property = IDNA_P_PVALID },
+ { 0x1005E, 0x1007F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10080, 0x100FA, .p.property = IDNA_P_PVALID },
+ { 0x100FB, 0x100FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10100, 0x10102, .p.property = IDNA_P_DISALLOWED },
+ { 0x10103, 0x10106, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10107, 0x10133, .p.property = IDNA_P_DISALLOWED },
+ { 0x10134, 0x10136, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10137, 0x1018A, .p.property = IDNA_P_DISALLOWED },
+ { 0x1018B, 0x1018F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10190, 0x1019B, .p.property = IDNA_P_DISALLOWED },
+ { 0x1019C, 0x101CF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x101D0, 0x101FC, .p.property = IDNA_P_DISALLOWED },
+ { 0x101FD, 0x101FD, .p.property = IDNA_P_PVALID },
+ { 0x101FE, 0x1027F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10280, 0x1029C, .p.property = IDNA_P_PVALID },
+ { 0x1029D, 0x1029F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x102A0, 0x102D0, .p.property = IDNA_P_PVALID },
+ { 0x102D1, 0x102FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10300, 0x1031E, .p.property = IDNA_P_PVALID },
+ { 0x1031F, 0x1031F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10320, 0x10323, .p.property = IDNA_P_DISALLOWED },
+ { 0x10324, 0x1032F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10330, 0x10340, .p.property = IDNA_P_PVALID },
+ { 0x10341, 0x10341, .p.property = IDNA_P_DISALLOWED },
+ { 0x10342, 0x10349, .p.property = IDNA_P_PVALID },
+ { 0x1034A, 0x1034A, .p.property = IDNA_P_DISALLOWED },
+ { 0x1034B, 0x1037F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10380, 0x1039D, .p.property = IDNA_P_PVALID },
+ { 0x1039E, 0x1039E, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1039F, 0x1039F, .p.property = IDNA_P_DISALLOWED },
+ { 0x103A0, 0x103C3, .p.property = IDNA_P_PVALID },
+ { 0x103C4, 0x103C7, .p.property = IDNA_P_UNASSIGNED },
+ { 0x103C8, 0x103CF, .p.property = IDNA_P_PVALID },
+ { 0x103D0, 0x103D5, .p.property = IDNA_P_DISALLOWED },
+ { 0x103D6, 0x103FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10400, 0x10427, .p.property = IDNA_P_DISALLOWED },
+ { 0x10428, 0x1049D, .p.property = IDNA_P_PVALID },
+ { 0x1049E, 0x1049F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x104A0, 0x104A9, .p.property = IDNA_P_PVALID },
+ { 0x104AA, 0x107FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10800, 0x10805, .p.property = IDNA_P_PVALID },
+ { 0x10806, 0x10807, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10808, 0x10808, .p.property = IDNA_P_PVALID },
+ { 0x10809, 0x10809, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1080A, 0x10835, .p.property = IDNA_P_PVALID },
+ { 0x10836, 0x10836, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10837, 0x10838, .p.property = IDNA_P_PVALID },
+ { 0x10839, 0x1083B, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1083C, 0x1083C, .p.property = IDNA_P_PVALID },
+ { 0x1083D, 0x1083E, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1083F, 0x10855, .p.property = IDNA_P_PVALID },
+ { 0x10856, 0x10856, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10857, 0x1085F, .p.property = IDNA_P_DISALLOWED },
+ { 0x10860, 0x108FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10900, 0x10915, .p.property = IDNA_P_PVALID },
+ { 0x10916, 0x1091B, .p.property = IDNA_P_DISALLOWED },
+ { 0x1091C, 0x1091E, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1091F, 0x1091F, .p.property = IDNA_P_DISALLOWED },
+ { 0x10920, 0x10939, .p.property = IDNA_P_PVALID },
+ { 0x1093A, 0x1093E, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1093F, 0x1093F, .p.property = IDNA_P_DISALLOWED },
+ { 0x10940, 0x109FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10A00, 0x10A03, .p.property = IDNA_P_PVALID },
+ { 0x10A04, 0x10A04, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10A05, 0x10A06, .p.property = IDNA_P_PVALID },
+ { 0x10A07, 0x10A0B, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10A0C, 0x10A13, .p.property = IDNA_P_PVALID },
+ { 0x10A14, 0x10A14, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10A15, 0x10A17, .p.property = IDNA_P_PVALID },
+ { 0x10A18, 0x10A18, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10A19, 0x10A33, .p.property = IDNA_P_PVALID },
+ { 0x10A34, 0x10A37, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10A38, 0x10A3A, .p.property = IDNA_P_PVALID },
+ { 0x10A3B, 0x10A3E, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10A3F, 0x10A3F, .p.property = IDNA_P_PVALID },
+ { 0x10A40, 0x10A47, .p.property = IDNA_P_DISALLOWED },
+ { 0x10A48, 0x10A4F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10A50, 0x10A58, .p.property = IDNA_P_DISALLOWED },
+ { 0x10A59, 0x10A5F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10A60, 0x10A7C, .p.property = IDNA_P_PVALID },
+ { 0x10A7D, 0x10A7F, .p.property = IDNA_P_DISALLOWED },
+ { 0x10A80, 0x10AFF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10B00, 0x10B35, .p.property = IDNA_P_PVALID },
+ { 0x10B36, 0x10B38, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10B39, 0x10B3F, .p.property = IDNA_P_DISALLOWED },
+ { 0x10B40, 0x10B55, .p.property = IDNA_P_PVALID },
+ { 0x10B56, 0x10B57, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10B58, 0x10B5F, .p.property = IDNA_P_DISALLOWED },
+ { 0x10B60, 0x10B72, .p.property = IDNA_P_PVALID },
+ { 0x10B73, 0x10B77, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10B78, 0x10B7F, .p.property = IDNA_P_DISALLOWED },
+ { 0x10B80, 0x10BFF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10C00, 0x10C48, .p.property = IDNA_P_PVALID },
+ { 0x10C49, 0x10E5F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x10E60, 0x10E7E, .p.property = IDNA_P_DISALLOWED },
+ { 0x10E7F, 0x1107F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x11080, 0x110BA, .p.property = IDNA_P_PVALID },
+ { 0x110BB, 0x110C1, .p.property = IDNA_P_DISALLOWED },
+ { 0x110C2, 0x11FFF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x12000, 0x1236E, .p.property = IDNA_P_PVALID },
+ { 0x1236F, 0x123FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x12400, 0x12462, .p.property = IDNA_P_DISALLOWED },
+ { 0x12463, 0x1246F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x12470, 0x12473, .p.property = IDNA_P_DISALLOWED },
+ { 0x12474, 0x12FFF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x13000, 0x1342E, .p.property = IDNA_P_PVALID },
+ { 0x1342F, 0x1CFFF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D000, 0x1D0F5, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D0F6, 0x1D0FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D100, 0x1D126, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D127, 0x1D128, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D129, 0x1D1DD, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D1DE, 0x1D1FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D200, 0x1D245, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D246, 0x1D2FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D300, 0x1D356, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D357, 0x1D35F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D360, 0x1D371, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D372, 0x1D3FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D400, 0x1D454, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D455, 0x1D455, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D456, 0x1D49C, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D49D, 0x1D49D, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D49E, 0x1D49F, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D4A0, 0x1D4A1, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D4A2, 0x1D4A2, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D4A3, 0x1D4A4, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D4A5, 0x1D4A6, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D4A7, 0x1D4A8, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D4A9, 0x1D4AC, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D4AD, 0x1D4AD, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D4AE, 0x1D4B9, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D4BA, 0x1D4BA, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D4BB, 0x1D4BB, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D4BC, 0x1D4BC, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D4BD, 0x1D4C3, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D4C4, 0x1D4C4, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D4C5, 0x1D505, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D506, 0x1D506, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D507, 0x1D50A, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D50B, 0x1D50C, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D50D, 0x1D514, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D515, 0x1D515, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D516, 0x1D51C, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D51D, 0x1D51D, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D51E, 0x1D539, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D53A, 0x1D53A, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D53B, 0x1D53E, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D53F, 0x1D53F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D540, 0x1D544, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D545, 0x1D545, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D546, 0x1D546, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D547, 0x1D549, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D54A, 0x1D550, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D551, 0x1D551, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D552, 0x1D6A5, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D6A6, 0x1D6A7, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D6A8, 0x1D7CB, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D7CC, 0x1D7CD, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1D7CE, 0x1D7FF, .p.property = IDNA_P_DISALLOWED },
+ { 0x1D800, 0x1EFFF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F000, 0x1F02B, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F02C, 0x1F02F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F030, 0x1F093, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F094, 0x1F0FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F100, 0x1F10A, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F10B, 0x1F10F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F110, 0x1F12E, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F12F, 0x1F130, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F131, 0x1F131, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F132, 0x1F13C, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F13D, 0x1F13D, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F13E, 0x1F13E, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F13F, 0x1F13F, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F140, 0x1F141, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F142, 0x1F142, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F143, 0x1F145, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F146, 0x1F146, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F147, 0x1F149, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F14A, 0x1F14E, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F14F, 0x1F156, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F157, 0x1F157, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F158, 0x1F15E, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F15F, 0x1F15F, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F160, 0x1F178, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F179, 0x1F179, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F17A, 0x1F17A, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F17B, 0x1F17C, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F17D, 0x1F17E, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F17F, 0x1F17F, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F180, 0x1F189, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F18A, 0x1F18D, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F18E, 0x1F18F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F190, 0x1F190, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F191, 0x1F1FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F200, 0x1F200, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F201, 0x1F20F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F210, 0x1F231, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F232, 0x1F23F, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1F240, 0x1F248, .p.property = IDNA_P_DISALLOWED },
+ { 0x1F249, 0x1FFFD, .p.property = IDNA_P_UNASSIGNED },
+ { 0x1FFFE, 0x1FFFF, .p.property = IDNA_P_DISALLOWED },
+ { 0x20000, 0x2A6D6, .p.property = IDNA_P_PVALID },
+ { 0x2A6D7, 0x2A6FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2A700, 0x2B734, .p.property = IDNA_P_PVALID },
+ { 0x2B735, 0x2F7FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2F800, 0x2FA1D, .p.property = IDNA_P_DISALLOWED },
+ { 0x2FA1E, 0x2FFFD, .p.property = IDNA_P_UNASSIGNED },
+ { 0x2FFFE, 0x2FFFF, .p.property = IDNA_P_DISALLOWED },
+ { 0x30000, 0x3FFFD, .p.property = IDNA_P_UNASSIGNED },
+ { 0x3FFFE, 0x3FFFF, .p.property = IDNA_P_DISALLOWED },
+ { 0x40000, 0x4FFFD, .p.property = IDNA_P_UNASSIGNED },
+ { 0x4FFFE, 0x4FFFF, .p.property = IDNA_P_DISALLOWED },
+ { 0x50000, 0x5FFFD, .p.property = IDNA_P_UNASSIGNED },
+ { 0x5FFFE, 0x5FFFF, .p.property = IDNA_P_DISALLOWED },
+ { 0x60000, 0x6FFFD, .p.property = IDNA_P_UNASSIGNED },
+ { 0x6FFFE, 0x6FFFF, .p.property = IDNA_P_DISALLOWED },
+ { 0x70000, 0x7FFFD, .p.property = IDNA_P_UNASSIGNED },
+ { 0x7FFFE, 0x7FFFF, .p.property = IDNA_P_DISALLOWED },
+ { 0x80000, 0x8FFFD, .p.property = IDNA_P_UNASSIGNED },
+ { 0x8FFFE, 0x8FFFF, .p.property = IDNA_P_DISALLOWED },
+ { 0x90000, 0x9FFFD, .p.property = IDNA_P_UNASSIGNED },
+ { 0x9FFFE, 0x9FFFF, .p.property = IDNA_P_DISALLOWED },
+ { 0xA0000, 0xAFFFD, .p.property = IDNA_P_UNASSIGNED },
+ { 0xAFFFE, 0xAFFFF, .p.property = IDNA_P_DISALLOWED },
+ { 0xB0000, 0xBFFFD, .p.property = IDNA_P_UNASSIGNED },
+ { 0xBFFFE, 0xBFFFF, .p.property = IDNA_P_DISALLOWED },
+ { 0xC0000, 0xCFFFD, .p.property = IDNA_P_UNASSIGNED },
+ { 0xCFFFE, 0xCFFFF, .p.property = IDNA_P_DISALLOWED },
+ { 0xD0000, 0xDFFFD, .p.property = IDNA_P_UNASSIGNED },
+ { 0xDFFFE, 0xDFFFF, .p.property = IDNA_P_DISALLOWED },
+ { 0xE0000, 0xE0000, .p.property = IDNA_P_UNASSIGNED },
+ { 0xE0001, 0xE0001, .p.property = IDNA_P_DISALLOWED },
+ { 0xE0002, 0xE001F, .p.property = IDNA_P_UNASSIGNED },
+ { 0xE0020, 0xE007F, .p.property = IDNA_P_DISALLOWED },
+ { 0xE0080, 0xE00FF, .p.property = IDNA_P_UNASSIGNED },
+ { 0xE0100, 0xE01EF, .p.property = IDNA_P_DISALLOWED },
+ { 0xE01F0, 0xEFFFD, .p.property = IDNA_P_UNASSIGNED },
+ { 0xEFFFE, 0x10FFFF, .p.property = IDNA_P_DISALLOWED },
+ { 0, 0, .p.property = 0}
+};
+
+idna_table idna_joiningtype[] = {
+ { 0x0640 , 0x0640 , .p.jt = IDNA_UNICODE_JT_C },
+ { 0x07FA , 0x07FA , .p.jt = IDNA_UNICODE_JT_C },
+ { 0x200D , 0x200D , .p.jt = IDNA_UNICODE_JT_C },
+ { 0x0626 , 0x0626 , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x0628 , 0x0628 , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x062A, 0x062E , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x0633, 0x063F , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x0641, 0x0647 , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x0649, 0x064A , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x066E, 0x066F , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x0678, 0x0687 , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x069A, 0x06BF , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x06C1, 0x06C2 , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x06CC , 0x06CC , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x06CE , 0x06CE , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x06D0, 0x06D1 , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x06FA, 0x06FC , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x06FF , 0x06FF , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x0712, 0x0714 , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x071A, 0x071D , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x071F, 0x0727 , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x0729 , 0x0729 , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x072B , 0x072B , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x072D, 0x072E , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x074E, 0x0758 , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x075C, 0x076A , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x076D, 0x0770 , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x0772 , 0x0772 , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x0775, 0x0777 , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x077A, 0x077F , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x07CA, 0x07EA , .p.jt = IDNA_UNICODE_JT_D },
+ { 0x0622, 0x0625 , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x0627 , 0x0627 , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x0629 , 0x0629 , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x062F, 0x0632 , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x0648 , 0x0648 , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x0671, 0x0673 , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x0675, 0x0677 , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x0688, 0x0699 , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x06C0 , 0x06C0 , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x06C3, 0x06CB , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x06CD , 0x06CD , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x06CF , 0x06CF , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x06D2, 0x06D3 , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x06D5 , 0x06D5 , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x06EE, 0x06EF , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x0710 , 0x0710 , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x0715, 0x0719 , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x071E , 0x071E , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x0728 , 0x0728 , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x072A , 0x072A , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x072C , 0x072C , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x072F , 0x072F , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x074D , 0x074D , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x0759, 0x075B , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x076B, 0x076C , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x0771 , 0x0771 , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x0773, 0x0774 , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x0778, 0x0779 , .p.jt = IDNA_UNICODE_JT_R },
+ { 0x00AD , 0x00AD , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0300, 0x036F , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0483, 0x0487 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0488, 0x0489 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0591, 0x05BD , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x05BF , 0x05BF , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x05C1, 0x05C2 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x05C4, 0x05C5 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x05C7 , 0x05C7 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0610, 0x061A , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x064B, 0x065E , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0670 , 0x0670 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x06D6, 0x06DC , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x06DE , 0x06DE , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x06DF, 0x06E4 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x06E7, 0x06E8 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x06EA, 0x06ED , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x070F , 0x070F , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0711 , 0x0711 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0730, 0x074A , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x07A6, 0x07B0 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x07EB, 0x07F3 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0816, 0x0819 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x081B, 0x0823 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0825, 0x0827 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0829, 0x082D , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0900, 0x0902 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x093C , 0x093C , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0941, 0x0948 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x094D , 0x094D , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0951, 0x0955 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0962, 0x0963 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0981 , 0x0981 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x09BC , 0x09BC , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x09C1, 0x09C4 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x09CD , 0x09CD , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x09E2, 0x09E3 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0A01, 0x0A02 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0A3C , 0x0A3C , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0A41, 0x0A42 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0A47, 0x0A48 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0A4B, 0x0A4D , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0A51 , 0x0A51 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0A70, 0x0A71 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0A75 , 0x0A75 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0A81, 0x0A82 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0ABC , 0x0ABC , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0AC1, 0x0AC5 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0AC7, 0x0AC8 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0ACD , 0x0ACD , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0AE2, 0x0AE3 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0B01 , 0x0B01 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0B3C , 0x0B3C , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0B3F , 0x0B3F , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0B41, 0x0B44 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0B4D , 0x0B4D , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0B56 , 0x0B56 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0B62, 0x0B63 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0B82 , 0x0B82 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0BC0 , 0x0BC0 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0BCD , 0x0BCD , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0C3E, 0x0C40 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0C46, 0x0C48 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0C4A, 0x0C4D , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0C55, 0x0C56 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0C62, 0x0C63 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0CBC , 0x0CBC , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0CBF , 0x0CBF , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0CC6 , 0x0CC6 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0CCC, 0x0CCD , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0CE2, 0x0CE3 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0D41, 0x0D44 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0D4D , 0x0D4D , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0D62, 0x0D63 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0DCA , 0x0DCA , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0DD2, 0x0DD4 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0DD6 , 0x0DD6 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0E31 , 0x0E31 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0E34, 0x0E3A , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0E47, 0x0E4E , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0EB1 , 0x0EB1 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0EB4, 0x0EB9 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0EBB, 0x0EBC , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0EC8, 0x0ECD , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0F18, 0x0F19 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0F35 , 0x0F35 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0F37 , 0x0F37 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0F39 , 0x0F39 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0F71, 0x0F7E , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0F80, 0x0F84 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0F86, 0x0F87 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0F90, 0x0F97 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0F99, 0x0FBC , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x0FC6 , 0x0FC6 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x102D, 0x1030 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1032, 0x1037 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1039, 0x103A , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x103D, 0x103E , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1058, 0x1059 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x105E, 0x1060 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1071, 0x1074 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1082 , 0x1082 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1085, 0x1086 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x108D , 0x108D , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x109D , 0x109D , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x135F , 0x135F , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1712, 0x1714 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1732, 0x1734 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1752, 0x1753 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1772, 0x1773 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x17B4, 0x17B5 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x17B7, 0x17BD , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x17C6 , 0x17C6 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x17C9, 0x17D3 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x17DD , 0x17DD , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x180B, 0x180D , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x18A9 , 0x18A9 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1920, 0x1922 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1927, 0x1928 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1932 , 0x1932 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1939, 0x193B , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1A17, 0x1A18 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1A56 , 0x1A56 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1A58, 0x1A5E , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1A60 , 0x1A60 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1A62 , 0x1A62 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1A65, 0x1A6C , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1A73, 0x1A7C , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1A7F , 0x1A7F , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1B00, 0x1B03 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1B34 , 0x1B34 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1B36, 0x1B3A , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1B3C , 0x1B3C , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1B42 , 0x1B42 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1B6B, 0x1B73 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1B80, 0x1B81 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1BA2, 0x1BA5 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1BA8, 0x1BA9 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1C2C, 0x1C33 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1C36, 0x1C37 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1CD0, 0x1CD2 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1CD4, 0x1CE0 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1CE2, 0x1CE8 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1CED , 0x1CED , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1DC0, 0x1DE6 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1DFD, 0x1DFF , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x200B , 0x200B , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x200E, 0x200F , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x202A, 0x202E , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x2060, 0x2064 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x206A, 0x206F , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x20D0, 0x20DC , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x20DD, 0x20E0 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x20E1 , 0x20E1 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x20E2, 0x20E4 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x20E5, 0x20F0 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x2CEF, 0x2CF1 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x2DE0, 0x2DFF , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x302A, 0x302F , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x3099, 0x309A , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xA66F , 0xA66F , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xA670, 0xA672 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xA67C, 0xA67D , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xA6F0, 0xA6F1 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xA802 , 0xA802 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xA806 , 0xA806 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xA80B , 0xA80B , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xA825, 0xA826 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xA8C4 , 0xA8C4 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xA8E0, 0xA8F1 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xA926, 0xA92D , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xA947, 0xA951 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xA980, 0xA982 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xA9B3 , 0xA9B3 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xA9B6, 0xA9B9 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xA9BC , 0xA9BC , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xAA29, 0xAA2E , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xAA31, 0xAA32 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xAA35, 0xAA36 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xAA43 , 0xAA43 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xAA4C , 0xAA4C , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xAAB0 , 0xAAB0 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xAAB2, 0xAAB4 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xAAB7, 0xAAB8 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xAABE, 0xAABF , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xAAC1 , 0xAAC1 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xABE5 , 0xABE5 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xABE8 , 0xABE8 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xABED , 0xABED , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xFB1E , 0xFB1E , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xFE00, 0xFE0F , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xFE20, 0xFE26 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xFEFF , 0xFEFF , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xFFF9, 0xFFFB , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x101FD , 0x101FD , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x10A01, 0x10A03 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x10A05, 0x10A06 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x10A0C, 0x10A0F , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x10A38, 0x10A3A , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x10A3F , 0x10A3F , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x11080, 0x11081 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x110B3, 0x110B6 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x110B9, 0x110BA , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x110BD , 0x110BD , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1D167, 0x1D169 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1D173, 0x1D17A , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1D17B, 0x1D182 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1D185, 0x1D18B , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1D1AA, 0x1D1AD , .p.jt = IDNA_UNICODE_JT_T },
+ { 0x1D242, 0x1D244 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xE0001 , 0xE0001 , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xE0020, 0xE007F , .p.jt = IDNA_UNICODE_JT_T },
+ { 0xE0100, 0xE01EF , .p.jt = IDNA_UNICODE_JT_T },
+ { 0, 0, .p.jt = 0}
+};
+#endif
diff --git a/utils/jenkins-build.sh b/utils/jenkins-build.sh
index 9e6f0d273..b92e9cb73 100755
--- a/utils/jenkins-build.sh
+++ b/utils/jenkins-build.sh
@@ -49,6 +49,9 @@ OLD_IDENTIFIER="$CC-${BUILD_JS}-$((BUILD_NUMBER - ${OLD_ARTIFACT_COUNT}))"
# default atari architecture - bletch
ATARIARCH=68020-60
+# make tool
+MAKE=make
+
# Ensure the combination of target and toolchain works and set build
# specific parameters too
case ${TARGET} in
@@ -69,6 +72,23 @@ case ${TARGET} in
PKG_SFX=.zip
;;
+ "haiku")
+ case ${label} in
+ "i586-pc-haiku")
+ ARTIFACT_TARGET=Haiku
+ ;;
+
+ *)
+ echo "Target \"${TARGET}\" cannot be built on \"${label})\""
+ exit 1
+ ;;
+
+ esac
+
+ PKG_SRC=NetSurf
+ PKG_SFX=
+ ;;
+
"windows")
case ${label} in
@@ -167,8 +187,13 @@ case ${TARGET} in
ARTIFACT_TARGET=Linux
;;
+ "amd64-unknown-openbsd5.4")
+ ARTIFACT_TARGET=OpenBSD
+ MAKE=gmake
+ ;;
+
*)
- echo "Target \"${TARGET}\" cannot be built on \"${label})\""
+ echo "Target \"${TARGET}\" cannot be built on \"${label}\""
exit 1
;;
@@ -317,11 +342,17 @@ fi
# convert javascript parameters
if [ "${BUILD_JS}" = "json" ];then
- case ${TARGET} in
- "riscos")
+ case ${label} in
+ "arm-unknown-riscos")
BUILD_MOZJS=NO
BUILD_JS=YES
;;
+
+ "amd64-unknown-openbsd5.4")
+ BUILD_MOZJS=NO
+ BUILD_JS=YES
+ ;;
+
*)
BUILD_MOZJS=YES
BUILD_JS=NO
@@ -340,11 +371,10 @@ fi
########### Build from source ##################
# Clean first
-make NETSURF_USE_JS=${BUILD_JS} NETSURF_USE_MOZJS=${BUILD_MOZJS} clean
+${MAKE} NETSURF_USE_JS=${BUILD_JS} NETSURF_USE_MOZJS=${BUILD_MOZJS} clean
# Do the Build
-make -k NETSURF_USE_JS=${BUILD_JS} NETSURF_USE_MOZJS=${BUILD_MOZJS} CI_BUILD=${BUILD_NUMBER} ATARIARCH=${ATARIARCH} Q=
-
+${MAKE} -k NETSURF_USE_JS=${BUILD_JS} NETSURF_USE_MOZJS=${BUILD_MOZJS} CI_BUILD=${BUILD_NUMBER} ATARIARCH=${ATARIARCH} Q=
@@ -352,7 +382,7 @@ make -k NETSURF_USE_JS=${BUILD_JS} NETSURF_USE_MOZJS=${BUILD_MOZJS} CI_BUILD=${B
############ Package artifact construction ################
# build the package file
-make -k NETSURF_USE_JS=${BUILD_JS} NETSURF_USE_MOZJS=${BUILD_MOZJS} CI_BUILD=${BUILD_NUMBER} ATARIARCH=${ATARIARCH} package Q=
+${MAKE} -k NETSURF_USE_JS=${BUILD_JS} NETSURF_USE_MOZJS=${BUILD_MOZJS} CI_BUILD=${BUILD_NUMBER} ATARIARCH=${ATARIARCH} package Q=
if [ ! -f "${PKG_SRC}${PKG_SFX}" ]; then
# unable to find package file
diff --git a/utils/libdom.c b/utils/libdom.c
index a1465af19..d6b26b46b 100644
--- a/utils/libdom.c
+++ b/utils/libdom.c
@@ -21,11 +21,11 @@
*/
#include <assert.h>
+#include <string.h>
#include <dom/dom.h>
#include "utils/config.h"
#include "utils/log.h"
-
#include "utils/libdom.h"
/* exported interface documented in libdom.h */
@@ -50,58 +50,42 @@ bool libdom_treewalk(dom_node *root,
break;
}
- if (next != NULL) { /* 1. children */
+ if (next != NULL) {
+ /* 1. Got children */
dom_node_unref(node);
node = next;
} else {
- exc = dom_node_get_next_sibling(node, &next);
- if (exc != DOM_NO_ERR) {
- dom_node_unref(node);
- break;
- }
-
- if (next != NULL) { /* 2. siblings */
- dom_node_unref(node);
- node = next;
- } else { /* 3. ancestor siblings */
- while (node != NULL) {
- exc = dom_node_get_next_sibling(node,
- &next);
- if (exc != DOM_NO_ERR) {
- dom_node_unref(node);
- node = NULL;
- break;
- }
-
- if (next != NULL) {
- dom_node_unref(next);
- break;
- }
-
- exc = dom_node_get_parent_node(node,
- &next);
- if (exc != DOM_NO_ERR) {
- dom_node_unref(node);
- node = NULL;
- break;
- }
-
+ /* No children; siblings & ancestor's siblings */
+ while (node != NULL) {
+ exc = dom_node_get_next_sibling(node, &next);
+ if (exc != DOM_NO_ERR) {
dom_node_unref(node);
- node = next;
+ node = NULL;
+ break;
}
- if (node == NULL)
+ if (next != NULL) {
+ /* 2. Got sibling */
break;
+ }
- exc = dom_node_get_next_sibling(node, &next);
+ exc = dom_node_get_parent_node(node, &next);
if (exc != DOM_NO_ERR) {
dom_node_unref(node);
+ node = NULL;
break;
}
+ /* 3. Try parent */
dom_node_unref(node);
node = next;
}
+
+ if (node == NULL)
+ break;
+
+ dom_node_unref(node);
+ node = next;
}
assert(node != NULL);
@@ -212,7 +196,7 @@ dom_node *libdom_find_first_element(dom_node *parent, lwc_string *element_name)
/* exported interface documented in libdom.h */
/* TODO: return appropriate errors */
-nserror libdom_iterate_child_elements(dom_node *parent,
+nserror libdom_iterate_child_elements(dom_node *parent,
libdom_iterate_cb cb, void *ctx)
{
dom_nodelist *children;
@@ -325,6 +309,195 @@ static void ignore_dom_msg(uint32_t severity, void *ctx, const char *msg, ...)
{
}
+
+
+/**
+ * Dump attribute/value for an element node
+ *
+ * \param node The element node to dump attribute details for
+ * \param attribute The attribute to dump
+ * \return true on success, or false on error
+ */
+static bool dump_dom_element_attribute(dom_node *node, FILE *f, const char *attribute)
+{
+ dom_exception exc;
+ dom_string *attr = NULL;
+ dom_string *attr_value = NULL;
+ dom_node_type type;
+ const char *string;
+ size_t length;
+
+ /* Should only have element nodes here */
+ exc = dom_node_get_node_type(node, &type);
+ if (exc != DOM_NO_ERR) {
+ fprintf(f, " Exception raised for node_get_node_type\n");
+ return false;
+ }
+ assert(type == DOM_ELEMENT_NODE);
+
+ /* Create a dom_string containing required attribute name. */
+ exc = dom_string_create_interned((uint8_t *)attribute,
+ strlen(attribute), &attr);
+ if (exc != DOM_NO_ERR) {
+ fprintf(f, " Exception raised for dom_string_create\n");
+ return false;
+ }
+
+ /* Get class attribute's value */
+ exc = dom_element_get_attribute(node, attr, &attr_value);
+ if (exc != DOM_NO_ERR) {
+ fprintf(f, " Exception raised for element_get_attribute\n");
+ dom_string_unref(attr);
+ return false;
+ } else if (attr_value == NULL) {
+ /* Element lacks required attribute */
+ dom_string_unref(attr);
+ return true;
+ }
+
+ /* Finished with the attr dom_string */
+ dom_string_unref(attr);
+
+ /* Get attribute value's string data */
+ string = dom_string_data(attr_value);
+ length = dom_string_byte_length(attr_value);
+
+ /* Print attribute info */
+ fprintf(f, " %s=\"%.*s\"", attribute, (int)length, string);
+
+ /* Finished with the attr_value dom_string */
+ dom_string_unref(attr_value);
+
+ return true;
+}
+
+
+/**
+ * Print a line in a DOM structure dump for an element
+ *
+ * \param node The node to dump
+ * \param depth The node's depth
+ * \return true on success, or false on error
+ */
+static bool dump_dom_element(dom_node *node, FILE *f, int depth)
+{
+ dom_exception exc;
+ dom_string *node_name = NULL;
+ dom_node_type type;
+ int i;
+ const char *string;
+ size_t length;
+
+ /* Only interested in element nodes */
+ exc = dom_node_get_node_type(node, &type);
+ if (exc != DOM_NO_ERR) {
+ fprintf(f, "Exception raised for node_get_node_type\n");
+ return false;
+ } else if (type != DOM_ELEMENT_NODE) {
+ /* Nothing to print */
+ return true;
+ }
+
+ /* Get element name */
+ exc = dom_node_get_node_name(node, &node_name);
+ if (exc != DOM_NO_ERR) {
+ fprintf(f, "Exception raised for get_node_name\n");
+ return false;
+ } else if (node_name == NULL) {
+ fprintf(f, "Broken: root_name == NULL\n");
+ return false;
+ }
+
+ /* Print ASCII tree structure for current node */
+ if (depth > 0) {
+ for (i = 0; i < depth; i++) {
+ fprintf(f, "| ");
+ }
+ fprintf(f, "+-");
+ }
+
+ /* Get string data and print element name */
+ string = dom_string_data(node_name);
+ length = dom_string_byte_length(node_name);
+ fprintf(f, "[%.*s]", (int)length, string);
+
+ if (length == 5 && strncmp(string, "title", 5) == 0) {
+ /* Title tag, gather the title */
+ dom_string *str;
+ exc = dom_node_get_text_content(node, &str);
+ if (exc == DOM_NO_ERR && str != NULL) {
+ fprintf(f, " $%.*s$", (int)dom_string_byte_length(str),
+ dom_string_data(str));
+ dom_string_unref(str);
+ }
+ }
+
+ /* Finished with the node_name dom_string */
+ dom_string_unref(node_name);
+
+ /* Print the element's id & class, if it has them */
+ if (dump_dom_element_attribute(node, f, "id") == false ||
+ dump_dom_element_attribute(node, f, "class") == false) {
+ /* Error occured */
+ fprintf(f, "\n");
+ return false;
+ }
+
+ fprintf(f, "\n");
+ return true;
+}
+
+
+/* exported interface documented in libdom.h */
+nserror libdom_dump_structure(dom_node *node, FILE *f, int depth)
+{
+ dom_exception exc;
+ dom_node *child;
+ nserror ret;
+ dom_node *next_child;
+
+ /* Print this node's entry */
+ if (dump_dom_element(node, f, depth) == false) {
+ /* There was an error; return */
+ return NSERROR_DOM;
+ }
+
+ /* Get the node's first child */
+ exc = dom_node_get_first_child(node, &child);
+ if (exc != DOM_NO_ERR) {
+ fprintf(f, "Exception raised for node_get_first_child\n");
+ return NSERROR_DOM;
+ } else if (child != NULL) {
+ /* node has children; decend to children's depth */
+ depth++;
+
+ /* Loop though all node's children */
+ do {
+ /* Visit node's descendents */
+ ret = libdom_dump_structure(child, f, depth);
+ if (ret !=NSERROR_OK) {
+ /* There was an error; return */
+ dom_node_unref(child);
+ return NSERROR_DOM;
+ }
+
+ /* Go to next sibling */
+ exc = dom_node_get_next_sibling(child, &next_child);
+ if (exc != DOM_NO_ERR) {
+ fprintf(f, "Exception raised for node_get_next_sibling\n");
+ dom_node_unref(child);
+ return NSERROR_DOM;
+ }
+
+ dom_node_unref(child);
+ child = next_child;
+ } while (child != NULL); /* No more children */
+ }
+
+ return NSERROR_OK;
+}
+
+
/* exported interface documented in libdom.h */
nserror libdom_parse_file(const char *filename, const char *encoding, dom_document **doc)
{
diff --git a/utils/libdom.h b/utils/libdom.h
index dc8eacd12..4f78cd2e9 100644
--- a/utils/libdom.h
+++ b/utils/libdom.h
@@ -25,6 +25,7 @@
#define NETSURF_UTILS_LIBDOM_H_
#include <stdbool.h>
+#include <stdio.h>
#include <dom/dom.h>
@@ -77,4 +78,13 @@ nserror libdom_parse_file(const char *filename, const char *encoding,
*/
nserror libdom_hubbub_error_to_nserror(dom_hubbub_error error);
+/**
+ * Walk though a DOM (sub)tree, in depth first order, printing DOM structure.
+ *
+ * \param node The root node to start from.
+ * \param f The file to write output into.
+ * \param depth The depth of 'node' in the (sub)tree.
+ */
+nserror libdom_dump_structure(dom_node *node, FILE *f, int depth);
+
#endif
diff --git a/utils/log.c b/utils/log.c
index 2aa39ee41..8ec42c1f7 100644
--- a/utils/log.c
+++ b/utils/log.c
@@ -23,10 +23,11 @@
#include <stdarg.h>
#include <stdio.h>
#include <sys/time.h>
-#include "desktop/netsurf.h"
#include "utils/log.h"
+bool verbose_log = false;
+
nserror nslog_init(nslog_ensure_t *ensure, int *pargc, char **argv)
{
nserror ret = NSERROR_OK;
diff --git a/utils/log.h b/utils/log.h
index ed953f37e..673419b66 100644
--- a/utils/log.h
+++ b/utils/log.h
@@ -21,9 +21,12 @@
#define _NETSURF_LOG_H_
#include <stdio.h>
-#include "desktop/netsurf.h"
+#include <stdbool.h>
+
#include "utils/errors.h"
+extern bool verbose_log;
+
/**
* Ensures the FILE handle is available to write logging to.
*
diff --git a/utils/nsoption.h b/utils/nsoption.h
index d111729aa..134223aa5 100644
--- a/utils/nsoption.h
+++ b/utils/nsoption.h
@@ -308,6 +308,9 @@ int nsoption_snoptionf(char *string, size_t size, enum nsoption_e option, const
/** set an integer option in the default table */
#define nsoption_set_int(OPTION, VALUE) nsoptions[NSOPTION_##OPTION].value.i = VALUE
+/** set an unsigned integer option in the default table */
+#define nsoption_set_uint(OPTION, VALUE) nsoptions[NSOPTION_##OPTION].value.u = VALUE
+
/** set a colour option in the default table */
#define nsoption_set_colour(OPTION, VALUE) nsoptions[NSOPTION_##OPTION].value.c = VALUE
diff --git a/utils/nsurl.c b/utils/nsurl.c
index 61f849e5f..a85b447ec 100644
--- a/utils/nsurl.c
+++ b/utils/nsurl.c
@@ -26,7 +26,9 @@
#include <stdlib.h>
#include <string.h>
+#include "utils/corestrings.h"
#include "utils/errors.h"
+#include "utils/idna.h"
#include "utils/log.h"
#include "utils/nsurl.h"
#include "utils/utils.h"
@@ -35,6 +37,17 @@
/* Define to enable NSURL debugging */
#undef NSURL_DEBUG
+/**
+ * Return a hex digit for the given numerical value.
+ *
+ * \param digit the value to get the hex digit for.
+ * \return character in range 0-9A-F
+ */
+inline static char digit2uppercase_hex(unsigned char digit) {
+ assert(digit < 16);
+ return "0123456789ABCDEF"[digit];
+}
+
static bool nsurl__is_unreserved(unsigned char c)
{
/* From RFC3986 section 2.3 (unreserved characters)
@@ -398,13 +411,15 @@ static void nsurl__get_string_markers(const char * const url_s,
/* End of the authority */
break;
- } else if (*pos == ':' && marker.colon_first ==
+ } else if (marker.scheme_type != NSURL_SCHEME_MAILTO &&
+ *pos == ':' && marker.colon_first ==
marker.authority) {
/* could be username:password or host:port
* separator */
marker.colon_first = pos - url_s;
- } else if (*pos == ':' && marker.colon_first !=
+ } else if (marker.scheme_type != NSURL_SCHEME_MAILTO &&
+ *pos == ':' && marker.colon_first !=
marker.authority) {
/* could be host:port separator */
marker.colon_last = pos - url_s;
@@ -488,6 +503,22 @@ static void nsurl__get_string_markers(const char * const url_s,
marker.fragment = marker.end;
}
+#ifdef NSURL_DEBUG
+ LOG(("marker.start: %i", marker.start));
+ LOG(("marker.scheme_end: %i", marker.scheme_end));
+ LOG(("marker.authority: %i", marker.authority));
+
+ LOG(("marker.colon_first: %i", marker.colon_first));
+ LOG(("marker.at: %i", marker.at));
+ LOG(("marker.colon_last: %i", marker.colon_last));
+
+ LOG(("marker.path: %i", marker.path));
+ LOG(("marker.query: %i", marker.query));
+ LOG(("marker.fragment: %i", marker.fragment));
+
+ LOG(("marker.end: %i", marker.end));
+#endif
+
/* Got all the URL components pegged out now */
*markers = marker;
}
@@ -672,14 +703,17 @@ static nserror nsurl__create_from_section(const char * const url_s,
char *pos_norm,
struct nsurl_components *url)
{
+ nserror ret;
int ascii_offset;
int start = 0;
int end = 0;
const char *pos;
const char *pos_url_s;
char *norm_start = pos_norm;
+ char *host;
size_t copy_len;
size_t length;
+ size_t host_len;
enum {
NSURL_F_NO_PORT = (1 << 0)
} flags = 0;
@@ -744,7 +778,8 @@ static nserror nsurl__create_from_section(const char * const url_s,
continue;
}
- if (nsurl__is_unreserved(ascii_offset) == false) {
+ if ((section != URL_SCHEME && section != URL_HOST) &&
+ (nsurl__is_unreserved(ascii_offset) == false)) {
/* This character should be escaped after all,
* just let it get copied */
copy_len += 3;
@@ -766,7 +801,8 @@ static nserror nsurl__create_from_section(const char * const url_s,
length -= 2;
- } else if (nsurl__is_no_escape(*pos) == false) {
+ } else if ((section != URL_SCHEME && section != URL_HOST) &&
+ (nsurl__is_no_escape(*pos) == false)) {
/* This needs to be escaped */
if (copy_len > 0) {
@@ -819,11 +855,8 @@ static nserror nsurl__create_from_section(const char * const url_s,
switch (section) {
case URL_SCHEME:
if (length == 0) {
- /* No scheme, assuming http, and add to URL */
- if (lwc_intern_string("http", SLEN("http"),
- &url->scheme) != lwc_error_ok) {
- return NSERROR_NOMEM;
- }
+ /* No scheme, assuming http */
+ url->scheme = lwc_string_ref(corestring_lwc_http);
} else {
/* Add scheme to URL */
if (lwc_intern_string(norm_start, length,
@@ -946,9 +979,21 @@ static nserror nsurl__create_from_section(const char * const url_s,
}
/* host */
- if (lwc_intern_string(norm_start, length,
- &url->host) != lwc_error_ok) {
- return NSERROR_NOMEM;
+ /* Encode host according to IDNA2008 */
+ ret = idna_encode(norm_start, length, &host, &host_len);
+ if (ret == NSERROR_OK) {
+ /* valid idna encoding */
+ if (lwc_intern_string(host, host_len,
+ &url->host) != lwc_error_ok) {
+ return NSERROR_NOMEM;
+ }
+ free(host);
+ } else {
+ /* fall back to straight interning */
+ if (lwc_intern_string(norm_start, length,
+ &url->host) != lwc_error_ok) {
+ return NSERROR_NOMEM;
+ }
}
}
@@ -1223,6 +1268,39 @@ static void nsurl_calc_hash(nsurl *url)
}
+/**
+ * Destroy components
+ *
+ * \param c url components
+ */
+static void nsurl_destroy_components(struct nsurl_components *c)
+{
+ if (c->scheme)
+ lwc_string_unref(c->scheme);
+
+ if (c->username)
+ lwc_string_unref(c->username);
+
+ if (c->password)
+ lwc_string_unref(c->password);
+
+ if (c->host)
+ lwc_string_unref(c->host);
+
+ if (c->port)
+ lwc_string_unref(c->port);
+
+ if (c->path)
+ lwc_string_unref(c->path);
+
+ if (c->query)
+ lwc_string_unref(c->query);
+
+ if (c->fragment)
+ lwc_string_unref(c->fragment);
+}
+
+
#ifdef NSURL_DEBUG
/**
* Dump a NetSurf URL's internal components
@@ -1274,6 +1352,7 @@ nserror nsurl_create(const char * const url_s, nsurl **url)
struct nsurl_component_lengths str_len = { 0, 0, 0, 0, 0, 0, 0, 0 };
enum nsurl_string_flags str_flags = 0;
nserror e = NSERROR_OK;
+ bool match;
assert(url_s != NULL);
@@ -1302,8 +1381,22 @@ nserror nsurl_create(const char * const url_s, nsurl **url)
/* Finished with buffer */
free(buff);
- if (e != NSERROR_OK)
+ if (e != NSERROR_OK) {
+ nsurl_destroy_components(&c);
return NSERROR_NOMEM;
+ }
+
+ /* Validate URL */
+ if ((lwc_string_isequal(c.scheme, corestring_lwc_http,
+ &match) == lwc_error_ok && match == true) ||
+ (lwc_string_isequal(c.scheme, corestring_lwc_https,
+ &match) == lwc_error_ok && match == true)) {
+ /* http, https must have host */
+ if (c.host == NULL) {
+ nsurl_destroy_components(&c);
+ return NSERROR_BAD_URL;
+ }
+ }
/* Get the string length and find which parts of url are present */
nsurl__get_string_data(&c, NSURL_WITH_FRAGMENT, &length,
@@ -1311,8 +1404,10 @@ nserror nsurl_create(const char * const url_s, nsurl **url)
/* Create NetSurf URL object */
*url = malloc(sizeof(nsurl) + length + 1); /* Add 1 for \0 */
- if (*url == NULL)
+ if (*url == NULL) {
+ nsurl_destroy_components(&c);
return NSERROR_NOMEM;
+ }
(*url)->components = c;
(*url)->length = length;
@@ -1355,29 +1450,7 @@ void nsurl_unref(nsurl *url)
#endif
/* Release lwc strings */
- if (url->components.scheme)
- lwc_string_unref(url->components.scheme);
-
- if (url->components.username)
- lwc_string_unref(url->components.username);
-
- if (url->components.password)
- lwc_string_unref(url->components.password);
-
- if (url->components.host)
- lwc_string_unref(url->components.host);
-
- if (url->components.port)
- lwc_string_unref(url->components.port);
-
- if (url->components.path)
- lwc_string_unref(url->components.path);
-
- if (url->components.query)
- lwc_string_unref(url->components.query);
-
- if (url->components.fragment)
- lwc_string_unref(url->components.fragment);
+ nsurl_destroy_components(&url->components);
/* Free the NetSurf URL */
free(url);
@@ -1688,6 +1761,10 @@ nserror nsurl_join(const nsurl *base, const char *rel, nsurl **joined)
assert(base != NULL);
assert(rel != NULL);
+#ifdef NSURL_DEBUG
+ LOG(("base: \"%s\", rel: \"%s\"", nsurl_access(base), rel));
+#endif
+
/* Peg out the URL sections */
nsurl__get_string_markers(rel, &m, true);
@@ -1695,11 +1772,13 @@ nserror nsurl_join(const nsurl *base, const char *rel, nsurl **joined)
length = nsurl__get_longest_section(&m);
/* Initially assume that the joined URL can be formed entierly from
- * the relative URL. */
+ * the relative URL.
+ */
joined_parts = NSURL_F_REL;
/* Update joined_compnents to indicate any required parts from the
- * base URL. */
+ * base URL.
+ */
if (m.scheme_end - m.start <= 0) {
/* The relative url has no scheme.
* Use base URL's scheme. */
@@ -1729,7 +1808,8 @@ nserror nsurl_join(const nsurl *base, const char *rel, nsurl **joined)
}
/* Allocate enough memory to url escape the longest section, plus
- * space for path merging (if required). */
+ * space for path merging (if required).
+ */
if (joined_parts & NSURL_F_MERGED_PATH) {
/* Need to merge paths */
length += (base->components.path != NULL) ?
@@ -1741,8 +1821,9 @@ nserror nsurl_join(const nsurl *base, const char *rel, nsurl **joined)
lwc_string_length(base->components.path) : 0);
buff = malloc(length + 5);
- if (buff == NULL)
+ if (buff == NULL) {
return NSERROR_NOMEM;
+ }
buff_pos = buff;
@@ -1755,8 +1836,11 @@ nserror nsurl_join(const nsurl *base, const char *rel, nsurl **joined)
} else {
c.scheme_type = m.scheme_type;
- error |= nsurl__create_from_section(rel, URL_SCHEME, &m,
- buff, &c);
+ error = nsurl__create_from_section(rel, URL_SCHEME, &m, buff, &c);
+ if (error != NSERROR_OK) {
+ free(buff);
+ return error;
+ }
}
if (joined_parts & NSURL_F_BASE_AUTHORITY) {
@@ -1765,10 +1849,16 @@ nserror nsurl_join(const nsurl *base, const char *rel, nsurl **joined)
c.host = nsurl__component_copy(base->components.host);
c.port = nsurl__component_copy(base->components.port);
} else {
- error |= nsurl__create_from_section(rel, URL_CREDENTIALS, &m,
- buff, &c);
- error |= nsurl__create_from_section(rel, URL_HOST, &m,
- buff, &c);
+ error = nsurl__create_from_section(rel, URL_CREDENTIALS, &m,
+ buff, &c);
+ if (error == NSERROR_OK) {
+ error = nsurl__create_from_section(rel, URL_HOST, &m,
+ buff, &c);
+ }
+ if (error != NSERROR_OK) {
+ free(buff);
+ return error;
+ }
}
if (joined_parts & NSURL_F_BASE_PATH) {
@@ -1818,8 +1908,12 @@ nserror nsurl_join(const nsurl *base, const char *rel, nsurl **joined)
m_path.query = new_length;
buff_start = buff_pos + new_length;
- error |= nsurl__create_from_section(buff_pos, URL_PATH, &m_path,
+ error = nsurl__create_from_section(buff_pos, URL_PATH, &m_path,
buff_start, &c);
+ if (error != NSERROR_OK) {
+ free(buff);
+ return error;
+ }
} else {
struct url_markers m_path;
@@ -1835,24 +1929,34 @@ nserror nsurl_join(const nsurl *base, const char *rel, nsurl **joined)
m_path.query = new_length;
buff_start = buff_pos + new_length;
- error |= nsurl__create_from_section(buff_pos, URL_PATH, &m_path,
+
+ error = nsurl__create_from_section(buff_pos, URL_PATH, &m_path,
buff_start, &c);
+ if (error != NSERROR_OK) {
+ free(buff);
+ return error;
+ }
}
- if (joined_parts & NSURL_F_BASE_QUERY)
+ if (joined_parts & NSURL_F_BASE_QUERY) {
c.query = nsurl__component_copy(base->components.query);
- else
- error |= nsurl__create_from_section(rel, URL_QUERY, &m,
+ } else {
+ error = nsurl__create_from_section(rel, URL_QUERY, &m,
buff, &c);
+ if (error != NSERROR_OK) {
+ free(buff);
+ return error;
+ }
+ }
- error |= nsurl__create_from_section(rel, URL_FRAGMENT, &m,
- buff, &c);
+ error = nsurl__create_from_section(rel, URL_FRAGMENT, &m, buff, &c);
/* Free temporary buffer */
free(buff);
- if (error != NSERROR_OK)
- return NSERROR_NOMEM;
+ if (error != NSERROR_OK) {
+ return error;
+ }
/* Get the string length and find which parts of url are present */
nsurl__get_string_data(&c, NSURL_WITH_FRAGMENT, &length,
@@ -1860,8 +1964,9 @@ nserror nsurl_join(const nsurl *base, const char *rel, nsurl **joined)
/* Create NetSurf URL object */
*joined = malloc(sizeof(nsurl) + length + 1); /* Add 1 for \0 */
- if (*joined == NULL)
+ if (*joined == NULL) {
return NSERROR_NOMEM;
+ }
(*joined)->components = c;
(*joined)->length = length;
@@ -1885,6 +1990,15 @@ nserror nsurl_defragment(const nsurl *url, nsurl **no_frag)
size_t length;
char *pos;
+ /* check for source url having no fragment already */
+ if (url->components.fragment == NULL) {
+ *no_frag = (nsurl *)url;
+
+ (*no_frag)->count++;
+
+ return NSERROR_OK;
+ }
+
/* Find the change in length from url to new_url */
length = url->length;
if (url->components.fragment != NULL) {
@@ -2006,8 +2120,9 @@ nserror nsurl_refragment(const nsurl *url, lwc_string *frag, nsurl **new_url)
nserror nsurl_replace_query(const nsurl *url, const char *query,
nsurl **new_url)
{
- int query_len;
- int base_len;
+ int query_len; /* Length of new query string, including '?' */
+ int frag_len = 0; /* Length of fragment, including '#' */
+ int base_len; /* Length of URL up to start of query */
char *pos;
size_t len;
lwc_string *lwc_query;
@@ -2025,11 +2140,12 @@ nserror nsurl_replace_query(const nsurl *url, const char *query,
base_len -= lwc_string_length(url->components.query);
}
if (url->components.fragment != NULL) {
- base_len -= 1 + lwc_string_length(url->components.fragment);
+ frag_len = 1 + lwc_string_length(url->components.fragment);
+ base_len -= frag_len;
}
/* Set new_url's length */
- len = base_len + query_len;
+ len = base_len + query_len + frag_len;
/* Create NetSurf URL object */
*new_url = malloc(sizeof(nsurl) + len + 1); /* Add 1 for \0 */
@@ -2052,10 +2168,9 @@ nserror nsurl_replace_query(const nsurl *url, const char *query,
pos += query_len;
if (url->components.fragment != NULL) {
const char *frag = lwc_string_data(url->components.fragment);
- size_t frag_len = lwc_string_length(url->components.fragment);
*pos = '#';
- memcpy(++pos, frag, frag_len);
- pos += frag_len;
+ memcpy(++pos, frag, frag_len - 1);
+ pos += frag_len - 1;
}
*pos = '\0';
diff --git a/utils/punycode.c b/utils/punycode.c
new file mode 100644
index 000000000..8b2197d66
--- /dev/null
+++ b/utils/punycode.c
@@ -0,0 +1,280 @@
+/*
+punycode-sample.c 2.0.0 (2004-Mar-21-Sun)
+http://www.nicemice.net/idn/
+Adam M. Costello
+http://www.nicemice.net/amc/
+
+This is ANSI C code (C89) implementing Punycode 1.0.x.
+*/
+
+/**********************************************************/
+/* Implementation (would normally go in its own .c file): */
+
+#include <string.h>
+
+#include "punycode.h"
+
+/*** Bootstring parameters for Punycode ***/
+
+enum { base = 36, tmin = 1, tmax = 26, skew = 38, damp = 700,
+ initial_bias = 72, initial_n = 0x80, delimiter = 0x2D };
+
+/* basic(cp) tests whether cp is a basic code point: */
+#define basic(cp) ((punycode_uint)(cp) < 0x80)
+
+/* delim(cp) tests whether cp is a delimiter: */
+#define delim(cp) ((cp) == delimiter)
+
+/* decode_digit(cp) returns the numeric value of a basic code */
+/* point (for use in representing integers) in the range 0 to */
+/* base-1, or base if cp does not represent a value. */
+
+static punycode_uint decode_digit(punycode_uint cp)
+{
+ return cp - 48 < 10 ? cp - 22 : cp - 65 < 26 ? cp - 65 :
+ cp - 97 < 26 ? cp - 97 : base;
+}
+
+/* encode_digit(d,flag) returns the basic code point whose value */
+/* (when used for representing integers) is d, which needs to be in */
+/* the range 0 to base-1. The lowercase form is used unless flag is */
+/* nonzero, in which case the uppercase form is used. The behavior */
+/* is undefined if flag is nonzero and digit d has no uppercase form. */
+
+static char encode_digit(punycode_uint d, int flag)
+{
+ return d + 22 + 75 * (d < 26) - ((flag != 0) << 5);
+ /* 0..25 map to ASCII a..z or A..Z */
+ /* 26..35 map to ASCII 0..9 */
+}
+
+/* flagged(bcp) tests whether a basic code point is flagged */
+/* (uppercase). The behavior is undefined if bcp is not a */
+/* basic code point. */
+
+#define flagged(bcp) ((punycode_uint)(bcp) - 65 < 26)
+
+/* encode_basic(bcp,flag) forces a basic code point to lowercase */
+/* if flag is zero, uppercase if flag is nonzero, and returns */
+/* the resulting code point. The code point is unchanged if it */
+/* is caseless. The behavior is undefined if bcp is not a basic */
+/* code point. */
+
+static char encode_basic(punycode_uint bcp, int flag)
+{
+ bcp -= (bcp - 97 < 26) << 5;
+ return bcp + ((!flag && (bcp - 65 < 26)) << 5);
+}
+
+/*** Platform-specific constants ***/
+
+/* maxint is the maximum value of a punycode_uint variable: */
+static const punycode_uint maxint = -1;
+/* Because maxint is unsigned, -1 becomes the maximum value. */
+
+/*** Bias adaptation function ***/
+
+static punycode_uint adapt(
+ punycode_uint delta, punycode_uint numpoints, int firsttime )
+{
+ punycode_uint k;
+
+ delta = firsttime ? delta / damp : delta >> 1;
+ /* delta >> 1 is a faster way of doing delta / 2 */
+ delta += delta / numpoints;
+
+ for (k = 0; delta > ((base - tmin) * tmax) / 2; k += base) {
+ delta /= base - tmin;
+ }
+
+ return k + (base - tmin + 1) * delta / (delta + skew);
+}
+
+/*** Main encode function ***/
+
+enum punycode_status punycode_encode(
+ size_t input_length_orig,
+ const punycode_uint input[],
+ const unsigned char case_flags[],
+ size_t *output_length,
+ char output[] )
+{
+ punycode_uint input_length, n, delta, h, b, bias, j, m, q, k, t;
+ size_t out, max_out;
+
+ /* The Punycode spec assumes that the input length is the same type */
+ /* of integer as a code point, so we need to convert the size_t to */
+ /* a punycode_uint, which could overflow. */
+
+ if (input_length_orig > maxint) return punycode_overflow;
+ input_length = (punycode_uint) input_length_orig;
+
+ /* Initialize the state: */
+
+ n = initial_n;
+ delta = 0;
+ out = 0;
+ max_out = *output_length;
+ bias = initial_bias;
+
+ /* Handle the basic code points: */
+
+ for (j = 0; j < input_length; ++j) {
+ if (basic(input[j])) {
+ if (max_out - out < 2) return punycode_big_output;
+ output[out++] = case_flags ?
+ encode_basic(input[j], case_flags[j]) : (char) input[j];
+ }
+ /* else if (input[j] < n) return punycode_bad_input; */
+ /* (not needed for Punycode with unsigned code points) */
+ }
+
+ h = b = (punycode_uint) out;
+ /* cannot overflow because out <= input_length <= maxint */
+
+ /* h is the number of code points that have been handled, b is the */
+ /* number of basic code points, and out is the number of ASCII code */
+ /* points that have been output. */
+
+ if (b > 0) output[out++] = delimiter;
+
+ /* Main encoding loop: */
+
+ while (h < input_length) {
+ /* All non-basic code points < n have been */
+ /* handled already. Find the next larger one: */
+
+ for (m = maxint, j = 0; j < input_length; ++j) {
+ /* if (basic(input[j])) continue; */
+ /* (not needed for Punycode) */
+ if (input[j] >= n && input[j] < m) m = input[j];
+ }
+
+ /* Increase delta enough to advance the decoder's */
+ /* <n,i> state to <m,0>, but guard against overflow: */
+
+ if (m - n > (maxint - delta) / (h + 1)) return punycode_overflow;
+ delta += (m - n) * (h + 1);
+ n = m;
+
+ for (j = 0; j < input_length; ++j) {
+ /* Punycode does not need to check whether input[j] is basic: */
+ if (input[j] < n /* || basic(input[j]) */ ) {
+ if (++delta == 0) return punycode_overflow;
+ }
+
+ if (input[j] == n) {
+ /* Represent delta as a generalized variable-length integer: */
+
+ for (q = delta, k = base; ; k += base) {
+ if (out >= max_out) return punycode_big_output;
+ t = k <= bias /* + tmin */ ? tmin : /* +tmin not needed */
+ k >= bias + tmax ? tmax : k - bias;
+ if (q < t) break;
+ output[out++] = encode_digit(t + (q - t) % (base - t), 0);
+ q = (q - t) / (base - t);
+ }
+
+ output[out++] = encode_digit(q, case_flags && case_flags[j]);
+ bias = adapt(delta, h + 1, h == b);
+ delta = 0;
+ ++h;
+ }
+ }
+
+ ++delta, ++n;
+ }
+
+ *output_length = out;
+ return punycode_success;
+}
+
+/*** Main decode function ***/
+
+enum punycode_status punycode_decode(
+ size_t input_length,
+ const char input[],
+ size_t *output_length,
+ punycode_uint output[],
+ unsigned char case_flags[] )
+{
+ punycode_uint n, out, i, max_out, bias, oldi, w, k, digit, t;
+ size_t b, j, in;
+
+ /* Initialize the state: */
+
+ n = initial_n;
+ out = i = 0;
+ max_out = *output_length > maxint ? maxint
+ : (punycode_uint) *output_length;
+ bias = initial_bias;
+
+ /* Handle the basic code points: Let b be the number of input code */
+ /* points before the last delimiter, or 0 if there is none, then */
+ /* copy the first b code points to the output. */
+
+ for (b = j = 0; j < input_length; ++j) if (delim(input[j])) b = j;
+ if (b > max_out) return punycode_big_output;
+
+ for (j = 0; j < b; ++j) {
+ if (case_flags) case_flags[out] = flagged(input[j]);
+ if (!basic(input[j])) return punycode_bad_input;
+ output[out++] = input[j];
+ }
+
+ /* Main decoding loop: Start just after the last delimiter if any */
+ /* basic code points were copied; start at the beginning otherwise. */
+
+ for (in = b > 0 ? b + 1 : 0; in < input_length; ++out) {
+
+ /* in is the index of the next ASCII code point to be consumed, */
+ /* and out is the number of code points in the output array. */
+
+ /* Decode a generalized variable-length integer into delta, */
+ /* which gets added to i. The overflow checking is easier */
+ /* if we increase i as we go, then subtract off its starting */
+ /* value at the end to obtain delta. */
+
+ for (oldi = i, w = 1, k = base; ; k += base) {
+ if (in >= input_length) return punycode_bad_input;
+ digit = decode_digit(input[in++]);
+ if (digit >= base) return punycode_bad_input;
+ if (digit > (maxint - i) / w) return punycode_overflow;
+ i += digit * w;
+ t = k <= bias /* + tmin */ ? tmin : /* +tmin not needed */
+ k >= bias + tmax ? tmax : k - bias;
+ if (digit < t) break;
+ if (w > maxint / (base - t)) return punycode_overflow;
+ w *= (base - t);
+ }
+
+ bias = adapt(i - oldi, out + 1, oldi == 0);
+
+ /* i was supposed to wrap around from out+1 to 0, */
+ /* incrementing n each time, so we'll fix that now: */
+
+ if (i / (out + 1) > maxint - n) return punycode_overflow;
+ n += i / (out + 1);
+ i %= (out + 1);
+
+ /* Insert n at position i of the output: */
+
+ /* not needed for Punycode: */
+ /* if (basic(n)) return punycode_bad_input; */
+ if (out >= max_out) return punycode_big_output;
+
+ if (case_flags) {
+ memmove(case_flags + i + 1, case_flags + i, out - i);
+ /* Case of last ASCII code point determines case flag: */
+ case_flags[i] = flagged(input[in - 1]);
+ }
+
+ memmove(output + i + 1, output + i, (out - i) * sizeof *output);
+ output[i++] = n;
+ }
+
+ *output_length = (size_t) out;
+ /* cannot overflow because out <= old value of *output_length */
+ return punycode_success;
+}
+
diff --git a/utils/punycode.h b/utils/punycode.h
new file mode 100644
index 000000000..15269cc69
--- /dev/null
+++ b/utils/punycode.h
@@ -0,0 +1,167 @@
+/*
+punycode-sample.c 2.0.0 (2004-Mar-21-Sun)
+http://www.nicemice.net/idn/
+Adam M. Costello
+http://www.nicemice.net/amc/
+
+This is ANSI C code (C89) implementing Punycode 1.0.x.
+
+This single file contains three sections (an interface, an
+implementation, and a wrapper for testing) that would normally belong
+in three separate files (punycode.h, punycode.c, punycode-test.c), but
+here they are bundled into one file (punycode-sample.c) for convenient
+testing. Anyone wishing to reuse this code will probably want to split
+it apart.
+
+*/
+
+/************************************************************/
+/* Public interface (would normally go in its own .h file): */
+
+#include <limits.h>
+#include <stddef.h>
+
+enum punycode_status {
+ punycode_success = 0,
+ punycode_bad_input = 1, /* Input is invalid. */
+ punycode_big_output = 2, /* Output would exceed the space provided. */
+ punycode_overflow = 3 /* Wider integers needed to process input. */
+};
+
+/* punycode_uint needs to be unsigned and needs to be */
+/* at least 26 bits wide. The particular type can be */
+/* specified by defining PUNYCODE_UINT, otherwise a */
+/* suitable type will be chosen automatically. */
+
+#ifdef PUNYCODE_UINT
+ typedef PUNYCODE_UINT punycode_uint;
+#elif UINT_MAX >= (1 << 26) - 1
+ typedef unsigned int punycode_uint;
+#else
+ typedef unsigned long punycode_uint;
+#endif
+
+enum punycode_status punycode_encode(
+ size_t, /* input_length */
+ const punycode_uint [], /* input */
+ const unsigned char [], /* case_flags */
+ size_t *, /* output_length */
+ char [] /* output */
+);
+
+/*
+ punycode_encode() converts a sequence of code points (presumed to be
+ Unicode code points) to Punycode.
+
+ Input arguments (to be supplied by the caller):
+
+ input_length
+ The number of code points in the input array and the number
+ of flags in the case_flags array.
+
+ input
+ An array of code points. They are presumed to be Unicode
+ code points, but that is not strictly necessary. The
+ array contains code points, not code units. UTF-16 uses
+ code units D800 through DFFF to refer to code points
+ 10000..10FFFF. The code points D800..DFFF do not occur in
+ any valid Unicode string. The code points that can occur in
+ Unicode strings (0..D7FF and E000..10FFFF) are also called
+ Unicode scalar values.
+
+ case_flags
+ A null pointer or an array of boolean values parallel to
+ the input array. Nonzero (true, flagged) suggests that the
+ corresponding Unicode character be forced to uppercase after
+ being decoded (if possible), and zero (false, unflagged)
+ suggests that it be forced to lowercase (if possible).
+ ASCII code points (0..7F) are encoded literally, except that
+ ASCII letters are forced to uppercase or lowercase according
+ to the corresponding case flags. If case_flags is a null
+ pointer then ASCII letters are left as they are, and other
+ code points are treated as unflagged.
+
+ Output arguments (to be filled in by the function):
+
+ output
+ An array of ASCII code points. It is *not* null-terminated;
+ it will contain zeros if and only if the input contains
+ zeros. (Of course the caller can leave room for a
+ terminator and add one if needed.)
+
+ Input/output arguments (to be supplied by the caller and overwritten
+ by the function):
+
+ output_length
+ The caller passes in the maximum number of ASCII code points
+ that it can receive. On successful return it will contain
+ the number of ASCII code points actually output.
+
+ Return value:
+
+ Can be any of the punycode_status values defined above except
+ punycode_bad_input. If not punycode_success, then output_size
+ and output might contain garbage.
+*/
+
+enum punycode_status punycode_decode(
+ size_t, /* input_length */
+ const char [], /* input */
+ size_t *, /* output_length */
+ punycode_uint [], /* output */
+ unsigned char [] /* case_flags */
+);
+
+/*
+ punycode_decode() converts Punycode to a sequence of code points
+ (presumed to be Unicode code points).
+
+ Input arguments (to be supplied by the caller):
+
+ input_length
+ The number of ASCII code points in the input array.
+
+ input
+ An array of ASCII code points (0..7F).
+
+ Output arguments (to be filled in by the function):
+
+ output
+ An array of code points like the input argument of
+ punycode_encode() (see above).
+
+ case_flags
+ A null pointer (if the flags are not needed by the caller)
+ or an array of boolean values parallel to the output array.
+ Nonzero (true, flagged) suggests that the corresponding
+ Unicode character be forced to uppercase by the caller (if
+ possible), and zero (false, unflagged) suggests that it
+ be forced to lowercase (if possible). ASCII code points
+ (0..7F) are output already in the proper case, but their
+ flags will be set appropriately so that applying the flags
+ would be harmless.
+
+ Input/output arguments (to be supplied by the caller and overwritten
+ by the function):
+
+ output_length
+ The caller passes in the maximum number of code points
+ that it can receive into the output array (which is also
+ the maximum number of flags that it can receive into the
+ case_flags array, if case_flags is not a null pointer). On
+ successful return it will contain the number of code points
+ actually output (which is also the number of flags actually
+ output, if case_flags is not a null pointer). The decoder
+ will never need to output more code points than the number
+ of ASCII code points in the input, because of the way the
+ encoding is defined. The number of code points output
+ cannot exceed the maximum possible value of a punycode_uint,
+ even if the supplied output_length is greater than that.
+
+ Return value:
+
+ Can be any of the punycode_status values defined above. If not
+ punycode_success, then output_length, output, and case_flags
+ might contain garbage.
+*/
+
diff --git a/utils/schedule.h b/utils/schedule.h
deleted file mode 100644
index b5fe386cc..000000000
--- a/utils/schedule.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2011 Daniel Silverstone <dsilvers@netsurf-browser.org>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/** \file
- * Job scheduler (interface).
- */
-
-#ifndef _NETSURF_UTILS_SCHEDULE_H_
-#define _NETSURF_UTILS_SCHEDULE_H_
-
-/* In platform specific schedule.c. */
-typedef void (*schedule_callback_fn)(void *p);
-
-void schedule(int t, schedule_callback_fn callback, void *p);
-void schedule_remove(schedule_callback_fn callback, void *p);
-
-#endif
diff --git a/utils/time.h b/utils/time.h
new file mode 100644
index 000000000..bde2ff66a
--- /dev/null
+++ b/utils/time.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * \file utils/time.h
+ * \brief Interface to time operations.
+ */
+
+#ifndef _NETSURF_UTILS_TIME_H_
+#define _NETSURF_UTILS_TIME_H_
+
+#include <time.h>
+
+/**
+ * Write the time in seconds since epoch to a buffer.
+ *
+ * This is provided as strftime is not generally portable.
+ *
+ * @param str The destination buffer.
+ * @param size The length of the destination buffer.
+ * @param timep The pointer to the time to write.
+ * @return The length of the string written.
+ */
+int nsc_sntimet(char *str, size_t size, time_t *timep);
+
+/**
+ * Parse time in seconds since epoc.
+ *
+ * This is provided as strptime is not generally portable.
+ *
+ * @param str The source buffer.
+ * @param size The length of the source buffer.
+ * @param timep Pointer to result.
+ * @return NSERROR_OK on success or error code on faliure.
+ */
+nserror nsc_snptimet(char *str, size_t size, time_t *timep);
+
+#endif
diff --git a/utils/types.h b/utils/types.h
index e3f2e838c..035ff76cb 100644
--- a/utils/types.h
+++ b/utils/types.h
@@ -49,7 +49,11 @@ struct redraw_context {
};
-/* Content located at a specific spatial location */
+/**
+ * Content located at a specific spatial location.
+ *
+ * \todo This structure should contain a nsurl not a string.
+ */
struct contextual_content {
const char *link_url;
struct hlcache_handle *object;
diff --git a/utils/url.c b/utils/url.c
index 447f85c5a..37fa93967 100644
--- a/utils/url.c
+++ b/utils/url.c
@@ -19,22 +19,17 @@
*/
/** \file
- * URL parsing and joining (implementation).
+ * \brief Implementation of URL parsing and joining operations.
*/
-#include <sys/types.h>
-#include <assert.h>
#include <ctype.h>
-#include <stdbool.h>
-#include <stdlib.h>
#include <string.h>
-#include <unistd.h>
+#include <curl/curl.h>
-#include "curl/curl.h"
#include "utils/config.h"
#include "utils/log.h"
-#include "utils/url.h"
#include "utils/utils.h"
+#include "utils/url.h"
struct url_components_internal {
char *buffer; /* buffer used for all the following data */
@@ -48,12 +43,7 @@ struct url_components_internal {
regex_t url_re, url_up_re;
-/**
- * Initialise URL routines.
- *
- * Compiles regular expressions required by the url_ functions.
- */
-
+/* exported interface documented in utils/url.h */
void url_init(void)
{
/* regex from RFC 2396 */
@@ -75,16 +65,7 @@ void url_init(void)
REG_EXTENDED);
}
-
-/**
- * Check whether a host string is an IP address. It should support and
- * detect IPv4 addresses (all of dotted-quad or subsets, decimal or
- * hexadecimal notations) and IPv6 addresses (including those containing
- * embedded IPv4 addresses.)
- *
- * \param host a hostname terminated by '\0'
- * \return true if the hostname is an IP address, false otherwise
- */
+/* exported interface documented in utils/url.h */
bool url_host_is_ip_address(const char *host)
{
struct in_addr ipv4;
@@ -95,7 +76,7 @@ bool url_host_is_ip_address(const char *host)
struct in6_addr ipv6;
char ipv6_addr[64];
#endif
- /* FIXME TODO: Some parts of urldb.c (and perhaps other parts of
+ /** @todo FIXME Some parts of urldb.c (and perhaps other parts of
* NetSurf) make confusions between hosts and "prefixes", we can
* sometimes be erroneously passed more than just a host. Sometimes
* we may be passed trailing slashes, or even whole path segments.
@@ -175,13 +156,12 @@ out_true:
*
* See RFC 3986 for reference.
*
- * \param url a valid absolute or relative URL
- * \param result pointer to buffer to hold components
- * \return URL_FUNC_OK on success
+ * \param url A valid absolute or relative URL.
+ * \param result Pointer to buffer to hold components.
+ * \return NSERROR_OK on success
*/
-
-static url_func_result url_get_components(const char *url,
- struct url_components *result)
+static nserror
+url_get_components(const char *url, struct url_components *result)
{
int storage_length;
char *storage_end;
@@ -202,7 +182,7 @@ static url_func_result url_get_components(const char *url,
storage_length = strlen(url) + 8;
internal->buffer = malloc(storage_length);
if (!internal->buffer)
- return URL_FUNC_NOMEM;
+ return NSERROR_NOMEM;
storage_end = internal->buffer;
/* look for a valid scheme */
@@ -280,65 +260,7 @@ static url_func_result url_get_components(const char *url,
}
assert((result->buffer + storage_length) >= storage_end);
- return URL_FUNC_OK;
-}
-
-
-/**
- * Reform a URL from separate components
- *
- * See RFC 3986 for reference.
- *
- * \param components the components to reform into a URL
- * \return a new URL allocated on the heap, or NULL on failure
- */
-
-static char *url_reform_components(const struct url_components *components)
-{
- int scheme_len = 0, authority_len = 0, path_len = 0, query_len = 0,
- fragment_len = 0;
- char *result, *url;
-
- /* 5.3 */
- if (components->scheme)
- scheme_len = strlen(components->scheme) + 1;
- if (components->authority)
- authority_len = strlen(components->authority) + 2;
- if (components->path)
- path_len = strlen(components->path);
- if (components->query)
- query_len = strlen(components->query) + 1;
- if (components->fragment)
- fragment_len = strlen(components->fragment) + 1;
-
- /* claim memory */
- url = result = malloc(scheme_len + authority_len + path_len +
- query_len + fragment_len + 1);
- if (!url) {
- LOG(("malloc failed"));
- return NULL;
- }
-
- /* rebuild URL */
- if (components->scheme) {
- sprintf(url, "%s:", components->scheme);
- url += scheme_len;
- }
- if (components->authority) {
- sprintf(url, "//%s", components->authority);
- url += authority_len;
- }
- if (components->path) {
- sprintf(url, "%s", components->path);
- url += path_len;
- }
- if (components->query) {
- sprintf(url, "?%s", components->query);
- url += query_len;
- }
- if (components->fragment)
- sprintf(url, "#%s", components->fragment);
- return result;
+ return NSERROR_OK;
}
@@ -359,279 +281,22 @@ static void url_destroy_components(const struct url_components *components)
}
-/**
- * Resolve a relative URL to absolute form.
- *
- * \param rel relative URL
- * \param base base URL, must be absolute and cleaned as by nsurl_create()
- * \param result pointer to pointer to buffer to hold absolute url
- * \return URL_FUNC_OK on success
- */
-
-url_func_result url_join(const char *rel, const char *base, char **result)
+/* exported interface documented in utils/url.h */
+nserror url_scheme(const char *url, char **result)
{
- url_func_result status = URL_FUNC_NOMEM;
- struct url_components_internal base_components = {0,0,0,0,0,0};
- struct url_components_internal *base_ptr = &base_components;
- struct url_components_internal rel_components = {0,0,0,0,0,0};
- struct url_components_internal *rel_ptr = &rel_components;
- struct url_components_internal merged_components = {0,0,0,0,0,0};
- struct url_components_internal *merged_ptr = &merged_components;
- char *merge_path = NULL, *split_point;
- char *input, *output, *start = NULL;
- int len, buf_len;
-
- (*result) = 0;
-
- assert(base);
- assert(rel);
-
-
- /* break down the relative URL (not cached, corruptable) */
- status = url_get_components(rel, (struct url_components *) rel_ptr);
- if (status != URL_FUNC_OK) {
- LOG(("relative url '%s' failed to get components", rel));
- return URL_FUNC_FAILED;
- }
-
- /* [1] relative URL is absolute, use it entirely */
- merged_components = rel_components;
- if (rel_components.scheme)
- goto url_join_reform_url;
-
- /* break down the base URL (possibly cached, not corruptable) */
- status = url_get_components(base, (struct url_components *) base_ptr);
- if (status != URL_FUNC_OK) {
- url_destroy_components((struct url_components *) rel_ptr);
- LOG(("base url '%s' failed to get components", base));
- return URL_FUNC_FAILED;
- }
-
- /* [2] relative authority takes presidence */
- merged_components.scheme = base_components.scheme;
- if (rel_components.authority)
- goto url_join_reform_url;
-
- /* [3] handle empty paths */
- merged_components.authority = base_components.authority;
- if (!rel_components.path) {
- merged_components.path = base_components.path;
- if (!rel_components.query)
- merged_components.query = base_components.query;
- goto url_join_reform_url;
- }
-
- /* [4] handle valid paths */
- if (rel_components.path[0] == '/')
- merged_components.path = rel_components.path;
- else {
- /* 5.2.3 */
- if ((base_components.authority) && (!base_components.path)) {
- merge_path = malloc(strlen(rel_components.path) + 2);
- if (!merge_path) {
- LOG(("malloc failed"));
- goto url_join_no_mem;
- }
- sprintf(merge_path, "/%s", rel_components.path);
- merged_components.path = merge_path;
- } else {
- split_point = base_components.path ?
- strrchr(base_components.path, '/') :
- NULL;
- if (!split_point) {
- merged_components.path = rel_components.path;
- } else {
- len = ++split_point - base_components.path;
- buf_len = len + 1 + strlen(rel_components.path);
- merge_path = malloc(buf_len);
- if (!merge_path) {
- LOG(("malloc failed"));
- goto url_join_no_mem;
- }
- memcpy(merge_path, base_components.path, len);
- memcpy(merge_path + len, rel_components.path,
- strlen(rel_components.path));
- merge_path[buf_len - 1] = '\0';
- merged_components.path = merge_path;
- }
- }
- }
-
-url_join_reform_url:
- /* 5.2.4 */
- input = merged_components.path;
- if ((input) && (strchr(input, '.'))) {
- /* [1] remove all dot references */
- output = start = malloc(strlen(input) + 1);
- if (!output) {
- LOG(("malloc failed"));
- goto url_join_no_mem;
- }
- merged_components.path = output;
- *output = '\0';
-
- while (*input != '\0') {
- /* [2A] */
- if (input[0] == '.') {
- if (input[1] == '/') {
- input = input + 2;
- continue;
- } else if ((input[1] == '.') &&
- (input[2] == '/')) {
- input = input + 3;
- continue;
- }
- }
-
- /* [2B] */
- if ((input[0] == '/') && (input[1] == '.')) {
- if (input[2] == '/') {
- input = input + 2;
- continue;
- } else if (input[2] == '\0') {
- input = input + 1;
- *input = '/';
- continue;
- }
-
- /* [2C] */
- if ((input[2] == '.') && ((input[3] == '/') ||
- (input[3] == '\0'))) {
- if (input[3] == '/') {
- input = input + 3;
- } else {
- input = input + 2;
- *input = '/';
- }
-
- if ((output > start) &&
- (output[-1] == '/'))
- *--output = '\0';
- split_point = strrchr(start, '/');
- if (!split_point)
- output = start;
- else
- output = split_point;
- *output = '\0';
- continue;
- }
- }
-
-
- /* [2D] */
- if (input[0] == '.') {
- if (input[1] == '\0') {
- input = input + 1;
- continue;
- } else if ((input[1] == '.') &&
- (input[2] == '\0')) {
- input = input + 2;
- continue;
- }
- }
-
- /* [2E] */
- if (*input == '/')
- *output++ = *input++;
- while ((*input != '/') && (*input != '\0'))
- *output++ = *input++;
- *output = '\0';
- }
- /* [3] */
- merged_components.path = start;
- }
-
- /* 5.3 */
- *result = url_reform_components((struct url_components *) merged_ptr);
- if (!(*result))
- goto url_join_no_mem;
-
- /* return success */
- status = URL_FUNC_OK;
-
-url_join_no_mem:
- free(start);
- free(merge_path);
- url_destroy_components((struct url_components *) base_ptr);
- url_destroy_components((struct url_components *) rel_ptr);
- return status;
-}
-
-
-/**
- * Return the host name from an URL.
- *
- * \param url an absolute URL
- * \param result pointer to pointer to buffer to hold host name
- * \return URL_FUNC_OK on success
- */
-
-url_func_result url_host(const char *url, char **result)
-{
- url_func_result status;
+ nserror status;
struct url_components components;
- const char *host_start, *host_end;
assert(url);
status = url_get_components(url, &components);
- if (status == URL_FUNC_OK) {
- if (!components.authority) {
- url_destroy_components(&components);
- return URL_FUNC_FAILED;
- }
- host_start = strchr(components.authority, '@');
- host_start = host_start ? host_start + 1 : components.authority;
-
- /* skip over an IPv6 address if there is one */
- if (host_start[0] == '[') {
- host_end = strchr(host_start, ']') + 1;
- } else {
- host_end = strchr(host_start, ':');
- }
-
- if (!host_end)
- host_end = components.authority +
- strlen(components.authority);
-
- *result = malloc(host_end - host_start + 1);
- if (!(*result)) {
- url_destroy_components(&components);
- return URL_FUNC_FAILED;
- }
- memcpy((*result), host_start, host_end - host_start);
- (*result)[host_end - host_start] = '\0';
- }
- url_destroy_components(&components);
- return status;
-}
-
-
-/**
- * Return the scheme name from an URL.
- *
- * See RFC 3986, 3.1 for reference.
- *
- * \param url an absolute URL
- * \param result pointer to pointer to buffer to hold scheme name
- * \return URL_FUNC_OK on success
- */
-
-url_func_result url_scheme(const char *url, char **result)
-{
- url_func_result status;
- struct url_components components;
-
- assert(url);
-
- status = url_get_components(url, &components);
- if (status == URL_FUNC_OK) {
+ if (status == NSERROR_OK) {
if (!components.scheme) {
- status = URL_FUNC_FAILED;
+ status = NSERROR_NOT_FOUND;
} else {
*result = strdup(components.scheme);
if (!(*result))
- status = URL_FUNC_NOMEM;
+ status = NSERROR_NOMEM;
}
}
url_destroy_components(&components);
@@ -639,45 +304,31 @@ url_func_result url_scheme(const char *url, char **result)
}
-/**
- * Extract path segment from an URL
- *
- * \param url an absolute URL
- * \param result pointer to pointer to buffer to hold result
- * \return URL_FUNC_OK on success
- */
-
-url_func_result url_path(const char *url, char **result)
+/* exported interface documented in utils/url.h */
+nserror url_path(const char *url, char **result)
{
- url_func_result status;
+ nserror status;
struct url_components components;
assert(url);
status = url_get_components(url, &components);
- if (status == URL_FUNC_OK) {
+ if (status == NSERROR_OK) {
if (!components.path) {
- status = URL_FUNC_FAILED;
+ status = NSERROR_NOT_FOUND;
} else {
*result = strdup(components.path);
if (!(*result))
- status = URL_FUNC_NOMEM;
+ status = NSERROR_NOMEM;
}
}
url_destroy_components(&components);
return status;
}
-/**
- * Attempt to find a nice filename for a URL.
- *
- * \param url an absolute URL
- * \param result pointer to pointer to buffer to hold filename
- * \param remove_extensions remove any extensions from the filename
- * \return URL_FUNC_OK on success
- */
-url_func_result url_nice(const char *url, char **result,
+/* exported interface documented in utils/url.h */
+nserror url_nice(const char *url, char **result,
bool remove_extensions)
{
int m;
@@ -691,7 +342,7 @@ url_func_result url_nice(const char *url, char **result,
m = regexec(&url_re, url, 10, match, 0);
if (m) {
LOG(("url '%s' failed to match regex", url));
- return URL_FUNC_FAILED;
+ return NSERROR_NOT_FOUND;
}
/* extract the last component of the path, if possible */
@@ -737,7 +388,7 @@ url_func_result url_nice(const char *url, char **result,
*result = malloc(end - start + 1);
if (!*result) {
LOG(("malloc failed"));
- return URL_FUNC_NOMEM;
+ return NSERROR_NOMEM;
}
strncpy(*result, url + start, end - start);
(*result)[end - start] = 0;
@@ -748,7 +399,7 @@ url_func_result url_nice(const char *url, char **result,
*dot = 0;
}
- return URL_FUNC_OK;
+ return NSERROR_OK;
no_path:
@@ -760,7 +411,7 @@ no_path:
match[URL_RE_AUTHORITY].rm_so + 1);
if (!*result) {
LOG(("malloc failed"));
- return URL_FUNC_NOMEM;
+ return NSERROR_NOMEM;
}
strncpy(*result, url + match[URL_RE_AUTHORITY].rm_so,
match[URL_RE_AUTHORITY].rm_eo -
@@ -772,50 +423,38 @@ no_path:
if ((*result)[i] == '.')
(*result)[i] = '_';
- return URL_FUNC_OK;
+ return NSERROR_OK;
}
- return URL_FUNC_FAILED;
+ return NSERROR_NOT_FOUND;
}
-/**
- * Convert an escaped string to plain.
- * \param result unescaped string owned by caller must be freed with free()
- * \return URL_FUNC_OK on success
- */
-url_func_result url_unescape(const char *str, char **result)
+
+/* exported interface documented in utils/url.h */
+nserror url_unescape(const char *str, char **result)
{
char *curlstr;
char *retstr;
curlstr = curl_unescape(str, 0);
if (curlstr == NULL) {
- return URL_FUNC_NOMEM;
+ return NSERROR_NOMEM;
}
retstr = strdup(curlstr);
curl_free(curlstr);
if (retstr == NULL) {
- return URL_FUNC_NOMEM;
+ return NSERROR_NOMEM;
}
*result = retstr;
- return URL_FUNC_OK;
+ return NSERROR_OK;
}
-/**
- * Escape a string suitable for inclusion in an URL.
- *
- * \param unescaped the unescaped string
- * \param toskip number of bytes to skip in unescaped string
- * \param sptoplus true iff spaces should be converted to +
- * \param escexceptions NULL or a string of characters excluded to be escaped
- * \param result pointer to pointer to buffer to hold escaped string
- * \return URL_FUNC_OK on success
- */
-url_func_result url_escape(const char *unescaped, size_t toskip,
+/* exported interface documented in utils/url.h */
+nserror url_escape(const char *unescaped, size_t toskip,
bool sptoplus, const char *escexceptions, char **result)
{
size_t len;
@@ -823,18 +462,18 @@ url_func_result url_escape(const char *unescaped, size_t toskip,
const char *c;
if (!unescaped || !result)
- return URL_FUNC_FAILED;
+ return NSERROR_NOT_FOUND;
*result = NULL;
len = strlen(unescaped);
if (len < toskip)
- return URL_FUNC_FAILED;
+ return NSERROR_NOT_FOUND;
len -= toskip;
escaped = malloc(len * 3 + 1);
if (!escaped)
- return URL_FUNC_NOMEM;
+ return NSERROR_NOMEM;
for (c = unescaped + toskip, d = escaped; *c; c++) {
/* Check if we should escape this byte.
@@ -864,7 +503,7 @@ url_func_result url_escape(const char *unescaped, size_t toskip,
tmpres = malloc(d - escaped + toskip);
if (!tmpres) {
free(escaped);
- return URL_FUNC_NOMEM;
+ return NSERROR_NOMEM;
}
memcpy(tmpres, unescaped, toskip);
@@ -873,70 +512,5 @@ url_func_result url_escape(const char *unescaped, size_t toskip,
free(escaped);
- return URL_FUNC_OK;
-}
-
-
-#ifdef TEST
-
-int main(int argc, char *argv[])
-{
- int i;
- url_func_result res;
- char *s;
- url_init();
- for (i = 1; i != argc; i++) {
-/* printf("==> '%s'\n", argv[i]);
- res = url_normalize(argv[i], &s);
- if (res == URL_FUNC_OK) {
- printf("<== '%s'\n", s);
- free(s);
- }*/
-/* printf("==> '%s'\n", argv[i]);
- res = url_host(argv[i], &s);
- if (res == URL_FUNC_OK) {
- printf("<== '%s'\n", s);
- free(s);
- }*/
- if (1 != i) {
- res = url_join(argv[i], argv[1], &s);
- if (res == URL_FUNC_OK) {
- printf("'%s' + '%s' \t= '%s'\n", argv[1],
- argv[i], s);
- free(s);
- }
- }
-/* printf("'%s' => ", argv[i]);
- res = url_nice(argv[i], &s, true);
- if (res == URL_FUNC_OK) {
- printf("'%s', ", s);
- free(s);
- } else {
- printf("failed %u, ", res);
- }
- res = url_nice(argv[i], &s, false);
- if (res == URL_FUNC_OK) {
- printf("'%s', ", s);
- free(s);
- } else {
- printf("failed %u, ", res);
- }
- printf("\n");*/
- }
- return 0;
+ return NSERROR_OK;
}
-
-void regcomp_wrapper(regex_t *preg, const char *regex, int cflags)
-{
- char errbuf[200];
- int r;
- r = regcomp(preg, regex, cflags);
- if (r) {
- regerror(r, preg, errbuf, sizeof errbuf);
- fprintf(stderr, "Failed to compile regexp '%s'\n", regex);
- fprintf(stderr, "error: %s\n", errbuf);
- exit(1);
- }
-}
-
-#endif
diff --git a/utils/url.h b/utils/url.h
index 7c716d723..f1aff0e93 100644
--- a/utils/url.h
+++ b/utils/url.h
@@ -17,26 +17,23 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/**
+/**
* \file utils/url.h
- * \brief URL parsing and joining (interface).
+ * \brief Interface to URL parsing and joining operations.
*/
#ifndef _NETSURF_UTILS_URL_H_
#define _NETSURF_UTILS_URL_H_
-/** File url prefix */
+#include "utils/errors.h"
+
+/** File url prefix. */
#define FILE_SCHEME_PREFIX "file:///"
-/** File url prefix length */
-#define FILE_SCHEME_PREFIX_LEN 8
-/** URL utility function return codes */
-typedef enum {
- URL_FUNC_OK, /**< No error */
- URL_FUNC_NOMEM, /**< Insufficient memory */
- URL_FUNC_FAILED /**< Non fatal error (eg failed to match regex) */
-} url_func_result;
+/** File url prefix length. */
+#define FILE_SCHEME_PREFIX_LEN 8
+/** Split out components of a url. */
struct url_components {
const char *buffer;
const char *scheme;
@@ -46,19 +43,78 @@ struct url_components {
const char *fragment;
};
+
+/**
+ * Initialise URL routines.
+ *
+ * Compiles regular expressions required by the url_ functions.
+ */
void url_init(void);
+
+
+/**
+ * Check whether a host string is an IP address.
+ *
+ * This call detects IPv4 addresses (all of dotted-quad or subsets,
+ * decimal or hexadecimal notations) and IPv6 addresses (including
+ * those containing embedded IPv4 addresses.)
+ *
+ * \param host a hostname terminated by '\0'
+ * \return true if the hostname is an IP address, false otherwise
+ */
bool url_host_is_ip_address(const char *host);
-url_func_result url_join(const char *rel, const char *base, char **result);
-url_func_result url_host(const char *url, char **result);
-url_func_result url_scheme(const char *url, char **result);
-url_func_result url_nice(const char *url, char **result,
- bool remove_extensions);
-url_func_result url_escape(const char *unescaped, size_t toskip,
- bool sptoplus, const char *escexceptions, char **result);
-url_func_result url_unescape(const char *str, char **result);
-url_func_result url_path(const char *url, char **result);
-
-char *path_to_url(const char *path);
-char *url_to_path(const char *url);
+
+
+/**
+ * Return the scheme name from an URL.
+ *
+ * See RFC 3986, 3.1 for reference.
+ *
+ * \param url an absolute URL
+ * \param result pointer to pointer to buffer to hold scheme name
+ * \return NSERROR_OK on success
+ */
+nserror url_scheme(const char *url, char **result);
+
+
+/**
+ * Attempt to find a nice filename for a URL.
+ *
+ * \param url an absolute URL
+ * \param result pointer to pointer to buffer to hold filename
+ * \param remove_extensions remove any extensions from the filename
+ * \return NSERROR_OK on success
+ */
+nserror url_nice(const char *url, char **result, bool remove_extensions);
+
+/**
+ * Escape a string suitable for inclusion in an URL.
+ *
+ * \param unescaped the unescaped string
+ * \param toskip number of bytes to skip in unescaped string
+ * \param sptoplus true iff spaces should be converted to +
+ * \param escexceptions NULL or a string of characters excluded to be escaped
+ * \param result pointer to pointer to buffer to hold escaped string
+ * \return NSERROR_OK on success
+ */
+nserror url_escape(const char *unescaped, size_t toskip, bool sptoplus, const char *escexceptions, char **result);
+
+
+/**
+ * Convert an escaped string to plain.
+ * \param result unescaped string owned by caller must be freed with free()
+ * \return NSERROR_OK on success
+ */
+nserror url_unescape(const char *str, char **result);
+
+
+/**
+ * Extract path segment from an URL
+ *
+ * \param url an absolute URL
+ * \param result pointer to pointer to buffer to hold result
+ * \return NSERROR_OK on success
+ */
+nserror url_path(const char *url, char **result);
#endif
diff --git a/utils/utf8.c b/utils/utf8.c
index 8e9587d20..a8e3e5de8 100644
--- a/utils/utf8.c
+++ b/utils/utf8.c
@@ -29,27 +29,20 @@
#include <parserutils/charset/utf8.h>
+#include "desktop/gui_factory.h"
+
#include "utils/config.h"
#include "utils/log.h"
#include "utils/utf8.h"
-/**
- * Convert a UTF-8 multibyte sequence into a single UCS4 character
- *
- * Encoding of UCS values outside the UTF-16 plane has been removed from
- * RFC3629. This function conforms to RFC2279, however.
- *
- * \param s_in The sequence to process
- * \param l Length of sequence
- * \return UCS4 character
- */
+/* exported interface documented in utils/utf8.h */
uint32_t utf8_to_ucs4(const char *s_in, size_t l)
{
uint32_t ucs4;
size_t len;
parserutils_error perror;
- perror = parserutils_charset_utf8_to_ucs4((const uint8_t *) s_in, l,
+ perror = parserutils_charset_utf8_to_ucs4((const uint8_t *) s_in, l,
&ucs4, &len);
if (perror != PARSERUTILS_OK)
ucs4 = 0xfffd;
@@ -57,16 +50,7 @@ uint32_t utf8_to_ucs4(const char *s_in, size_t l)
return ucs4;
}
-/**
- * Convert a single UCS4 character into a UTF-8 multibyte sequence
- *
- * Encoding of UCS values outside the UTF-16 plane has been removed from
- * RFC3629. This function conforms to RFC2279, however.
- *
- * \param c The character to process (0 <= c <= 0x7FFFFFFF)
- * \param s Pointer to 6 byte long output buffer
- * \return Length of multibyte sequence
- */
+/* exported interface documented in utils/utf8.h */
size_t utf8_from_ucs4(uint32_t c, char *s)
{
uint8_t *in = (uint8_t *) s;
@@ -84,24 +68,13 @@ size_t utf8_from_ucs4(uint32_t c, char *s)
return 6 - len;
}
-/**
- * Calculate the length (in characters) of a NULL-terminated UTF-8 string
- *
- * \param s The string
- * \return Length of string
- */
+/* exported interface documented in utils/utf8.h */
size_t utf8_length(const char *s)
{
return utf8_bounded_length(s, strlen(s));
}
-/**
- * Calculated the length (in characters) of a bounded UTF-8 string
- *
- * \param s The string
- * \param l Maximum length of input (in bytes)
- * \return Length of string, in characters
- */
+/* exported interface documented in utils/utf8.h */
size_t utf8_bounded_length(const char *s, size_t l)
{
size_t len;
@@ -114,14 +87,7 @@ size_t utf8_bounded_length(const char *s, size_t l)
return len;
}
-/**
- * Calculate the length (in bytes) of a bounded UTF-8 string
- *
- * \param s The string
- * \param l Maximum length of input (in bytes)
- * \param c Maximum number of characters to measure
- * \return Length of string, in bytes
- */
+/* exported interface documented in utils/utf8.h */
size_t utf8_bounded_byte_length(const char *s, size_t l, size_t c)
{
size_t len = 0;
@@ -132,12 +98,7 @@ size_t utf8_bounded_byte_length(const char *s, size_t l, size_t c)
return len;
}
-/**
- * Calculate the length (in bytes) of a UTF-8 character
- *
- * \param s Pointer to start of character
- * \return Length of character, in bytes
- */
+/* exported interface documented in utils/utf8.h */
size_t utf8_char_byte_length(const char *s)
{
size_t len;
@@ -150,13 +111,7 @@ size_t utf8_char_byte_length(const char *s)
return len;
}
-/**
- * Find previous legal UTF-8 char in string
- *
- * \param s The string
- * \param o Offset in the string to start at
- * \return Offset of first byte of previous legal character
- */
+/* exported interface documented in utils/utf8.h */
size_t utf8_prev(const char *s, size_t o)
{
uint32_t prev;
@@ -168,20 +123,13 @@ size_t utf8_prev(const char *s, size_t o)
return prev;
}
-/**
- * Find next legal UTF-8 char in string
- *
- * \param s The string
- * \param l Maximum offset in string
- * \param o Offset in the string to start at
- * \return Offset of first byte of next legal character
- */
+/* exported interface documented in utils/utf8.h */
size_t utf8_next(const char *s, size_t l, size_t o)
{
uint32_t next;
parserutils_error perror;
- perror = parserutils_charset_utf8_next((const uint8_t *) s, l, o,
+ perror = parserutils_charset_utf8_next((const uint8_t *) s, l, o,
&next);
assert(perror == PARSERUTILS_OK);
@@ -202,16 +150,16 @@ static inline void utf8_clear_cd_cache(void)
last_cd.cd = 0;
}
-/**
- * Finalise the UTF-8 library
- */
-void utf8_finalise(void)
+/* exported interface documented in utils/utf8.h */
+nserror utf8_finalise(void)
{
if (last_cd.cd != 0)
iconv_close(last_cd.cd);
/* paranoia follows */
utf8_clear_cd_cache();
+
+ return NSERROR_OK;
}
@@ -224,11 +172,16 @@ void utf8_finalise(void)
* \param to The encoding name to convert to
* \param result Pointer to location in which to store result.
* \param result_len Pointer to location in which to store result length.
- * \return Appropriate utf8_convert_ret value
+ * \return NSERROR_OK for no error, NSERROR_NOMEM on allocation error,
+ * NSERROR_BAD_ENCODING for a bad character encoding
*/
-static utf8_convert_ret utf8_convert(const char *string, size_t len,
- const char *from, const char *to,
- char **result, size_t *result_len)
+static nserror
+utf8_convert(const char *string,
+ size_t len,
+ const char *from,
+ const char *to,
+ char **result,
+ size_t *result_len)
{
iconv_t cd;
char *temp, *out, *in;
@@ -237,16 +190,16 @@ static utf8_convert_ret utf8_convert(const char *string, size_t len,
assert(string && from && to && result);
if (string[0] == '\0') {
- /* On AmigaOS, iconv() returns an error if we pass an
- * empty string. This prevents iconv() being called as
+ /* On AmigaOS, iconv() returns an error if we pass an
+ * empty string. This prevents iconv() being called as
* there is no conversion necessary anyway. */
*result = strdup("");
if (!(*result)) {
*result = NULL;
- return UTF8_CONVERT_NOMEM;
+ return NSERROR_NOMEM;
}
- return UTF8_CONVERT_OK;
+ return NSERROR_OK;
}
if (strcasecmp(from, to) == 0) {
@@ -255,10 +208,10 @@ static utf8_convert_ret utf8_convert(const char *string, size_t len,
*(result) = strndup(string, slen);
if (!(*result)) {
*(result) = NULL;
- return UTF8_CONVERT_NOMEM;
+ return NSERROR_NOMEM;
}
- return UTF8_CONVERT_OK;
+ return NSERROR_OK;
}
in = (char *)string;
@@ -274,9 +227,9 @@ static utf8_convert_ret utf8_convert(const char *string, size_t len,
cd = iconv_open(to, from);
if (cd == (iconv_t)-1) {
if (errno == EINVAL)
- return UTF8_CONVERT_BADENC;
+ return NSERROR_BAD_ENCODING;
/* default to no memory */
- return UTF8_CONVERT_NOMEM;
+ return NSERROR_NOMEM;
}
/* close the last cd - we don't care if this fails */
@@ -284,8 +237,8 @@ static utf8_convert_ret utf8_convert(const char *string, size_t len,
iconv_close(last_cd.cd);
/* and copy the to/from/cd data into last_cd */
- strncpy(last_cd.from, from, sizeof(last_cd.from));
- strncpy(last_cd.to, to, sizeof(last_cd.to));
+ snprintf(last_cd.from, sizeof(last_cd.from), "%s", from);
+ snprintf(last_cd.to, sizeof(last_cd.to), "%s", to);
last_cd.cd = cd;
}
@@ -297,8 +250,9 @@ static utf8_convert_ret utf8_convert(const char *string, size_t len,
rlen = slen * 4 + 4;
temp = out = malloc(rlen);
- if (!out)
- return UTF8_CONVERT_NOMEM;
+ if (!out) {
+ return NSERROR_NOMEM;
+ }
/* perform conversion */
if (iconv(cd, (void *) &in, &slen, &out, &rlen) == (size_t)-1) {
@@ -312,14 +266,14 @@ static utf8_convert_ret utf8_convert(const char *string, size_t len,
* a) Insufficiently large output buffer
* b) Invalid input byte sequence
* c) Incomplete input sequence */
- return UTF8_CONVERT_NOMEM;
+ return NSERROR_NOMEM;
}
*(result) = realloc(temp, out - temp + 4);
if (!(*result)) {
free(temp);
*(result) = NULL; /* for sanity's sake */
- return UTF8_CONVERT_NOMEM;
+ return NSERROR_NOMEM;
}
/* NULL terminate - needs 4 characters as we may have
@@ -330,42 +284,32 @@ static utf8_convert_ret utf8_convert(const char *string, size_t len,
*result_len = (out - temp);
}
- return UTF8_CONVERT_OK;
+ return NSERROR_OK;
}
-/**
- * Convert a UTF8 string into the named encoding
- *
- * \param string The NULL-terminated string to convert
- * \param encname The encoding name (suitable for passing to iconv)
- * \param len Length of input string to consider (in bytes), or 0
- * \param result Pointer to location to store result (allocated on heap)
- * \return Appropriate utf8_convert_ret value
- */
-utf8_convert_ret utf8_to_enc(const char *string, const char *encname,
+/* exported interface documented in utils/utf8.h */
+nserror utf8_to_enc(const char *string, const char *encname,
size_t len, char **result)
{
return utf8_convert(string, len, "UTF-8", encname, result, NULL);
}
-/**
- * Convert a string in the named encoding into a UTF-8 string
- *
- * \param string The NULL-terminated string to convert
- * \param encname The encoding name (suitable for passing to iconv)
- * \param len Length of input string to consider (in bytes), or 0
- * \param result Pointer to location to store result (allocated on heap)
- * \return Appropriate utf8_convert_ret value
- */
-utf8_convert_ret utf8_from_enc(const char *string, const char *encname,
+/* exported interface documented in utils/utf8.h */
+nserror utf8_from_enc(const char *string, const char *encname,
size_t len, char **result, size_t *result_len)
{
return utf8_convert(string, len, encname, "UTF-8", result, result_len);
}
-static utf8_convert_ret utf8_convert_html_chunk(iconv_t cd,
- const char *chunk, size_t inlen,
- char **out, size_t *outlen)
+/**
+ * convert a chunk of html data
+ */
+static nserror
+utf8_convert_html_chunk(iconv_t cd,
+ const char *chunk,
+ size_t inlen,
+ char **out,
+ size_t *outlen)
{
size_t ret, esclen;
uint32_t ucs4;
@@ -377,7 +321,7 @@ static utf8_convert_ret utf8_convert_html_chunk(iconv_t cd,
break;
if (errno != EILSEQ)
- return UTF8_CONVERT_NOMEM;
+ return NSERROR_NOMEM;
ucs4 = utf8_to_ucs4(chunk, inlen);
esclen = snprintf(escape, sizeof(escape), "&#x%06x;", ucs4);
@@ -385,34 +329,25 @@ static utf8_convert_ret utf8_convert_html_chunk(iconv_t cd,
ret = iconv(cd, (void *) &pescape, &esclen,
(void *) out, outlen);
if (ret == (size_t) -1)
- return UTF8_CONVERT_NOMEM;
+ return NSERROR_NOMEM;
esclen = utf8_next(chunk, inlen, 0);
chunk += esclen;
inlen -= esclen;
}
- return UTF8_CONVERT_OK;
+ return NSERROR_OK;
}
-/**
- * Convert a UTF-8 encoded string into a string of the given encoding,
- * applying HTML escape sequences where necessary.
- *
- * \param string String to convert (NUL-terminated)
- * \param encname Name of encoding to convert to
- * \param len Length, in bytes, of the input string, or 0
- * \param result Pointer to location to receive result
- * \return Appropriate utf8_convert_ret value
- */
-utf8_convert_ret utf8_to_html(const char *string, const char *encname,
- size_t len, char **result)
+/* exported interface documented in utils/utf8.h */
+nserror
+utf8_to_html(const char *string, const char *encname, size_t len, char **result)
{
iconv_t cd;
const char *in;
char *out, *origout;
size_t off, prev_off, inlen, outlen, origoutlen, esclen;
- utf8_convert_ret ret;
+ nserror ret;
char *pescape, escape[11];
if (len == 0)
@@ -425,29 +360,28 @@ utf8_convert_ret utf8_to_html(const char *string, const char *encname,
sizeof(last_cd.to)) == 0 &&
last_cd.cd != 0) {
cd = last_cd.cd;
- }
- else {
+ } else {
/* no match, so create a new cd */
cd = iconv_open(encname, "UTF-8");
if (cd == (iconv_t) -1) {
if (errno == EINVAL)
- return UTF8_CONVERT_BADENC;
+ return NSERROR_BAD_ENCODING;
/* default to no memory */
- return UTF8_CONVERT_NOMEM;
+ return NSERROR_NOMEM;
}
/* close the last cd - we don't care if this fails */
if (last_cd.cd)
iconv_close(last_cd.cd);
- /* and copy the to/from/cd data into last_cd */
- strncpy(last_cd.from, "UTF-8", sizeof(last_cd.from));
- strncpy(last_cd.to, encname, sizeof(last_cd.to));
+ /* and safely copy the to/from/cd data into last_cd */
+ snprintf(last_cd.from, sizeof(last_cd.from), "UTF-8");
+ snprintf(last_cd.to, sizeof(last_cd.to), "%s", encname);
last_cd.cd = cd;
}
- /* Worst case is ASCII -> UCS4, with all characters escaped:
- * "&#xYYYYYY;", thus each input character may become a string
+ /* Worst case is ASCII -> UCS4, with all characters escaped:
+ * "&#xYYYYYY;", thus each input character may become a string
* of 10 UCS4 characters, each 4 bytes in length, plus four for
* terminating the string */
origoutlen = outlen = len * 10 * 4 + 4;
@@ -455,7 +389,7 @@ utf8_convert_ret utf8_to_html(const char *string, const char *encname,
if (out == NULL) {
iconv_close(cd);
utf8_clear_cd_cache();
- return UTF8_CONVERT_NOMEM;
+ return NSERROR_NOMEM;
}
/* Process input in chunks between characters we must escape */
@@ -470,7 +404,7 @@ utf8_convert_ret utf8_to_html(const char *string, const char *encname,
inlen = off - prev_off;
ret = utf8_convert_html_chunk(cd, in, inlen,
&out, &outlen);
- if (ret != UTF8_CONVERT_OK) {
+ if (ret != NSERROR_OK) {
free(origout);
iconv_close(cd);
utf8_clear_cd_cache();
@@ -484,7 +418,7 @@ utf8_convert_ret utf8_to_html(const char *string, const char *encname,
pescape = escape;
ret = utf8_convert_html_chunk(cd, pescape, esclen,
&out, &outlen);
- if (ret != UTF8_CONVERT_OK) {
+ if (ret != NSERROR_OK) {
free(origout);
iconv_close(cd);
utf8_clear_cd_cache();
@@ -502,7 +436,7 @@ utf8_convert_ret utf8_to_html(const char *string, const char *encname,
in = string + prev_off;
inlen = len - prev_off;
ret = utf8_convert_html_chunk(cd, in, inlen, &out, &outlen);
- if (ret != UTF8_CONVERT_OK) {
+ if (ret != NSERROR_OK) {
free(origout);
iconv_close(cd);
utf8_clear_cd_cache();
@@ -518,30 +452,21 @@ utf8_convert_ret utf8_to_html(const char *string, const char *encname,
*result = realloc(origout, origoutlen - outlen);
if (*result == NULL) {
free(origout);
- return UTF8_CONVERT_NOMEM;
+ return NSERROR_NOMEM;
}
- return UTF8_CONVERT_OK;
+ return NSERROR_OK;
}
-
-/**
- * Save the given utf8 text to a file, converting to local encoding.
- *
- * \param utf8_text text to save to file
- * \param path pathname to save to
- * \return true iff the save succeeded
- */
-
+/* exported interface documented in utils/utf8.h */
bool utf8_save_text(const char *utf8_text, const char *path)
{
- utf8_convert_ret ret;
+ nserror ret;
char *conv;
FILE *out;
- ret = utf8_to_local_encoding(utf8_text, strlen(utf8_text), &conv);
-
- if (ret != UTF8_CONVERT_OK) {
+ ret = guit->utf8->utf8_to_local(utf8_text, strlen(utf8_text), &conv);
+ if (ret != NSERROR_OK) {
LOG(("failed to convert to local encoding, return %d", ret));
return false;
}
@@ -562,5 +487,3 @@ bool utf8_save_text(const char *utf8_text, const char *path)
return false;
}
-
-
diff --git a/utils/utf8.h b/utils/utf8.h
index 68d42d3ea..7509dde52 100644
--- a/utils/utf8.h
+++ b/utils/utf8.h
@@ -26,40 +26,139 @@
#include <stdbool.h>
#include <stdint.h>
-typedef enum {
- UTF8_CONVERT_OK,
- UTF8_CONVERT_NOMEM,
- UTF8_CONVERT_BADENC
-} utf8_convert_ret;
+#include "utils/errors.h"
+/**
+ * Convert a UTF-8 multibyte sequence into a single UCS4 character
+ *
+ * Encoding of UCS values outside the UTF-16 plane has been removed from
+ * RFC3629. This function conforms to RFC2279, however.
+ *
+ * \param s_in The sequence to process
+ * \param l Length of sequence
+ * \return UCS4 character
+ */
uint32_t utf8_to_ucs4(const char *s, size_t l);
+
+/**
+ * Convert a single UCS4 character into a UTF-8 multibyte sequence
+ *
+ * Encoding of UCS values outside the UTF-16 plane has been removed from
+ * RFC3629. This function conforms to RFC2279, however.
+ *
+ * \param c The character to process (0 <= c <= 0x7FFFFFFF)
+ * \param s Pointer to 6 byte long output buffer
+ * \return Length of multibyte sequence
+ */
size_t utf8_from_ucs4(uint32_t c, char *s);
+
+/**
+ * Calculate the length (in characters) of a NULL-terminated UTF-8 string
+ *
+ * \param s The string
+ * \return Length of string
+ */
size_t utf8_length(const char *s);
+
+/**
+ * Calculated the length (in characters) of a bounded UTF-8 string
+ *
+ * \param s The string
+ * \param l Maximum length of input (in bytes)
+ * \return Length of string, in characters
+ */
size_t utf8_bounded_length(const char *s, size_t l);
+
+/**
+ * Calculate the length (in bytes) of a bounded UTF-8 string
+ *
+ * \param s The string
+ * \param l Maximum length of input (in bytes)
+ * \param c Maximum number of characters to measure
+ * \return Length of string, in bytes
+ */
size_t utf8_bounded_byte_length(const char *s, size_t l, size_t c);
+/**
+ * Calculate the length (in bytes) of a UTF-8 character
+ *
+ * \param s Pointer to start of character
+ * \return Length of character, in bytes
+ */
size_t utf8_char_byte_length(const char *s);
+
+/**
+ * Find previous legal UTF-8 char in string
+ *
+ * \param s The string
+ * \param o Offset in the string to start at
+ * \return Offset of first byte of previous legal character
+ */
size_t utf8_prev(const char *s, size_t o);
+
+/**
+ * Find next legal UTF-8 char in string
+ *
+ * \param s The string
+ * \param l Maximum offset in string
+ * \param o Offset in the string to start at
+ * \return Offset of first byte of next legal character
+ */
size_t utf8_next(const char *s, size_t l, size_t o);
-utf8_convert_ret utf8_to_enc(const char *string, const char *encname,
+
+/**
+ * Convert a UTF8 string into the named encoding
+ *
+ * \param string The NULL-terminated string to convert
+ * \param encname The encoding name (suitable for passing to iconv)
+ * \param len Length of input string to consider (in bytes), or 0
+ * \param result Pointer to location to store result (allocated on heap)
+ * \return standard nserror value
+ */
+nserror utf8_to_enc(const char *string, const char *encname,
size_t len, char **result);
-utf8_convert_ret utf8_from_enc(const char *string, const char *encname,
+
+/**
+ * Convert a string in the named encoding into a UTF-8 string
+ *
+ * \param string The NULL-terminated string to convert
+ * \param encname The encoding name (suitable for passing to iconv)
+ * \param len Length of input string to consider (in bytes), or 0
+ * \param result Pointer to location to store result (allocated on heap)
+ * \return standard nserror value
+ */
+nserror utf8_from_enc(const char *string, const char *encname,
size_t len, char **result, size_t *result_len);
-utf8_convert_ret utf8_to_html(const char *string, const char *encname,
+/**
+ * Convert a UTF-8 encoded string into a string of the given encoding,
+ * applying HTML escape sequences where necessary.
+ *
+ * \param string String to convert (NUL-terminated)
+ * \param encname Name of encoding to convert to
+ * \param len Length, in bytes, of the input string, or 0
+ * \param result Pointer to location to receive result
+ * \return standard nserror code
+ */
+nserror utf8_to_html(const char *string, const char *encname,
size_t len, char **result);
+/**
+ * Save the given utf8 text to a file, converting to local encoding.
+ *
+ * \param utf8_text text to save to file
+ * \param path pathname to save to
+ * \return true iff the save succeeded
+ */
bool utf8_save_text(const char *utf8_text, const char *path);
-/* These two are platform specific */
-utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len,
- char **result);
-utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len,
- char **result);
-void utf8_finalise(void);
+/**
+ * Finalise the UTF-8 library
+ */
+nserror utf8_finalise(void);
#endif
diff --git a/utils/utf8proc.c b/utils/utf8proc.c
new file mode 100644
index 000000000..3e0b25f58
--- /dev/null
+++ b/utils/utf8proc.c
@@ -0,0 +1,594 @@
+/*
+ * Copyright (c) 2009 Public Software Group e. V., Berlin, Germany
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * This library contains derived data from a modified version of the
+ * Unicode data files.
+ *
+ * The original data files are available at
+ * http://www.unicode.org/Public/UNIDATA/
+ *
+ * Please notice the copyright statement in the file "utf8proc_data.c".
+ */
+
+
+/*
+ * File name: utf8proc.c
+ *
+ * Description:
+ * Implementation of libutf8proc.
+ */
+
+
+#include "utf8proc.h"
+#include "utf8proc_data.c"
+
+
+const int8_t utf8proc_utf8class[256] = {
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+#define UTF8PROC_HANGUL_SBASE 0xAC00
+#define UTF8PROC_HANGUL_LBASE 0x1100
+#define UTF8PROC_HANGUL_VBASE 0x1161
+#define UTF8PROC_HANGUL_TBASE 0x11A7
+#define UTF8PROC_HANGUL_LCOUNT 19
+#define UTF8PROC_HANGUL_VCOUNT 21
+#define UTF8PROC_HANGUL_TCOUNT 28
+#define UTF8PROC_HANGUL_NCOUNT 588
+#define UTF8PROC_HANGUL_SCOUNT 11172
+/* END is exclusive */
+#define UTF8PROC_HANGUL_L_START 0x1100
+#define UTF8PROC_HANGUL_L_END 0x115A
+#define UTF8PROC_HANGUL_L_FILLER 0x115F
+#define UTF8PROC_HANGUL_V_START 0x1160
+#define UTF8PROC_HANGUL_V_END 0x11A3
+#define UTF8PROC_HANGUL_T_START 0x11A8
+#define UTF8PROC_HANGUL_T_END 0x11FA
+#define UTF8PROC_HANGUL_S_START 0xAC00
+#define UTF8PROC_HANGUL_S_END 0xD7A4
+
+
+#define UTF8PROC_BOUNDCLASS_START 0
+#define UTF8PROC_BOUNDCLASS_OTHER 1
+#define UTF8PROC_BOUNDCLASS_CR 2
+#define UTF8PROC_BOUNDCLASS_LF 3
+#define UTF8PROC_BOUNDCLASS_CONTROL 4
+#define UTF8PROC_BOUNDCLASS_EXTEND 5
+#define UTF8PROC_BOUNDCLASS_L 6
+#define UTF8PROC_BOUNDCLASS_V 7
+#define UTF8PROC_BOUNDCLASS_T 8
+#define UTF8PROC_BOUNDCLASS_LV 9
+#define UTF8PROC_BOUNDCLASS_LVT 10
+
+
+const char *utf8proc_version(void) {
+ return "1.1.6";
+}
+
+const char *utf8proc_errmsg(ssize_t errcode) {
+ switch (errcode) {
+ case UTF8PROC_ERROR_NOMEM:
+ return "Memory for processing UTF-8 data could not be allocated.";
+ case UTF8PROC_ERROR_OVERFLOW:
+ return "UTF-8 string is too long to be processed.";
+ case UTF8PROC_ERROR_INVALIDUTF8:
+ return "Invalid UTF-8 string";
+ case UTF8PROC_ERROR_NOTASSIGNED:
+ return "Unassigned Unicode code point found in UTF-8 string.";
+ case UTF8PROC_ERROR_INVALIDOPTS:
+ return "Invalid options for UTF-8 processing chosen.";
+ default:
+ return "An unknown error occured while processing UTF-8 data.";
+ }
+}
+
+ssize_t utf8proc_iterate(
+ const uint8_t *str, ssize_t strlen, int32_t *dst
+) {
+ int length;
+ int i;
+ int32_t uc = -1;
+ *dst = -1;
+ if (!strlen) return 0;
+ length = utf8proc_utf8class[str[0]];
+ if (!length) return UTF8PROC_ERROR_INVALIDUTF8;
+ if (strlen >= 0 && length > strlen) return UTF8PROC_ERROR_INVALIDUTF8;
+ for (i=1; i<length; i++) {
+ if ((str[i] & 0xC0) != 0x80) return UTF8PROC_ERROR_INVALIDUTF8;
+ }
+ switch (length) {
+ case 1:
+ uc = str[0];
+ break;
+ case 2:
+ uc = ((str[0] & 0x1F) << 6) + (str[1] & 0x3F);
+ if (uc < 0x80) uc = -1;
+ break;
+ case 3:
+ uc = ((str[0] & 0x0F) << 12) + ((str[1] & 0x3F) << 6)
+ + (str[2] & 0x3F);
+ if (uc < 0x800 || (uc >= 0xD800 && uc < 0xE000) ||
+ (uc >= 0xFDD0 && uc < 0xFDF0)) uc = -1;
+ break;
+ case 4:
+ uc = ((str[0] & 0x07) << 18) + ((str[1] & 0x3F) << 12)
+ + ((str[2] & 0x3F) << 6) + (str[3] & 0x3F);
+ if (uc < 0x10000 || uc >= 0x110000) uc = -1;
+ break;
+ }
+ if (uc < 0 || ((uc & 0xFFFF) >= 0xFFFE))
+ return UTF8PROC_ERROR_INVALIDUTF8;
+ *dst = uc;
+ return length;
+}
+
+bool utf8proc_codepoint_valid(int32_t uc) {
+ if (uc < 0 || uc >= 0x110000 ||
+ ((uc & 0xFFFF) >= 0xFFFE) || (uc >= 0xD800 && uc < 0xE000) ||
+ (uc >= 0xFDD0 && uc < 0xFDF0)) return false;
+ else return true;
+}
+
+ssize_t utf8proc_encode_char(int32_t uc, uint8_t *dst) {
+ if (uc < 0x00) {
+ return 0;
+ } else if (uc < 0x80) {
+ dst[0] = uc;
+ return 1;
+ } else if (uc < 0x800) {
+ dst[0] = 0xC0 + (uc >> 6);
+ dst[1] = 0x80 + (uc & 0x3F);
+ return 2;
+ } else if (uc == 0xFFFF) {
+ dst[0] = 0xFF;
+ return 1;
+ } else if (uc == 0xFFFE) {
+ dst[0] = 0xFE;
+ return 1;
+ } else if (uc < 0x10000) {
+ dst[0] = 0xE0 + (uc >> 12);
+ dst[1] = 0x80 + ((uc >> 6) & 0x3F);
+ dst[2] = 0x80 + (uc & 0x3F);
+ return 3;
+ } else if (uc < 0x110000) {
+ dst[0] = 0xF0 + (uc >> 18);
+ dst[1] = 0x80 + ((uc >> 12) & 0x3F);
+ dst[2] = 0x80 + ((uc >> 6) & 0x3F);
+ dst[3] = 0x80 + (uc & 0x3F);
+ return 4;
+ } else return 0;
+}
+
+const utf8proc_property_t *utf8proc_get_property(int32_t uc) {
+ /* ASSERT: uc >= 0 && uc < 0x110000 */
+ return utf8proc_properties + (
+ utf8proc_stage2table[
+ utf8proc_stage1table[uc >> 8] + (uc & 0xFF)
+ ]
+ );
+}
+
+#define utf8proc_decompose_lump(replacement_uc) \
+ return utf8proc_decompose_char((replacement_uc), dst, bufsize, \
+ options & ~UTF8PROC_LUMP, last_boundclass)
+
+ssize_t utf8proc_decompose_char(int32_t uc, int32_t *dst, ssize_t bufsize,
+ int options, int *last_boundclass) {
+ /* ASSERT: uc >= 0 && uc < 0x110000 */
+ const utf8proc_property_t *property;
+ utf8proc_propval_t category;
+ int32_t hangul_sindex;
+ property = utf8proc_get_property(uc);
+ category = property->category;
+ hangul_sindex = uc - UTF8PROC_HANGUL_SBASE;
+ if (options & (UTF8PROC_COMPOSE|UTF8PROC_DECOMPOSE)) {
+ if (hangul_sindex >= 0 && hangul_sindex < UTF8PROC_HANGUL_SCOUNT) {
+ int32_t hangul_tindex;
+ if (bufsize >= 1) {
+ dst[0] = UTF8PROC_HANGUL_LBASE +
+ hangul_sindex / UTF8PROC_HANGUL_NCOUNT;
+ if (bufsize >= 2) dst[1] = UTF8PROC_HANGUL_VBASE +
+ (hangul_sindex % UTF8PROC_HANGUL_NCOUNT) / UTF8PROC_HANGUL_TCOUNT;
+ }
+ hangul_tindex = hangul_sindex % UTF8PROC_HANGUL_TCOUNT;
+ if (!hangul_tindex) return 2;
+ if (bufsize >= 3) dst[2] = UTF8PROC_HANGUL_TBASE + hangul_tindex;
+ return 3;
+ }
+ }
+ if (options & UTF8PROC_REJECTNA) {
+ if (!category) return UTF8PROC_ERROR_NOTASSIGNED;
+ }
+ if (options & UTF8PROC_IGNORE) {
+ if (property->ignorable) return 0;
+ }
+ if (options & UTF8PROC_LUMP) {
+ if (category == UTF8PROC_CATEGORY_ZS) utf8proc_decompose_lump(0x0020);
+ if (uc == 0x2018 || uc == 0x2019 || uc == 0x02BC || uc == 0x02C8)
+ utf8proc_decompose_lump(0x0027);
+ if (category == UTF8PROC_CATEGORY_PD || uc == 0x2212)
+ utf8proc_decompose_lump(0x002D);
+ if (uc == 0x2044 || uc == 0x2215) utf8proc_decompose_lump(0x002F);
+ if (uc == 0x2236) utf8proc_decompose_lump(0x003A);
+ if (uc == 0x2039 || uc == 0x2329 || uc == 0x3008)
+ utf8proc_decompose_lump(0x003C);
+ if (uc == 0x203A || uc == 0x232A || uc == 0x3009)
+ utf8proc_decompose_lump(0x003E);
+ if (uc == 0x2216) utf8proc_decompose_lump(0x005C);
+ if (uc == 0x02C4 || uc == 0x02C6 || uc == 0x2038 || uc == 0x2303)
+ utf8proc_decompose_lump(0x005E);
+ if (category == UTF8PROC_CATEGORY_PC || uc == 0x02CD)
+ utf8proc_decompose_lump(0x005F);
+ if (uc == 0x02CB) utf8proc_decompose_lump(0x0060);
+ if (uc == 0x2223) utf8proc_decompose_lump(0x007C);
+ if (uc == 0x223C) utf8proc_decompose_lump(0x007E);
+ if ((options & UTF8PROC_NLF2LS) && (options & UTF8PROC_NLF2PS)) {
+ if (category == UTF8PROC_CATEGORY_ZL ||
+ category == UTF8PROC_CATEGORY_ZP)
+ utf8proc_decompose_lump(0x000A);
+ }
+ }
+ if (options & UTF8PROC_STRIPMARK) {
+ if (category == UTF8PROC_CATEGORY_MN ||
+ category == UTF8PROC_CATEGORY_MC ||
+ category == UTF8PROC_CATEGORY_ME) return 0;
+ }
+ if (options & UTF8PROC_CASEFOLD) {
+ if (property->casefold_mapping) {
+ const int32_t *casefold_entry;
+ ssize_t written = 0;
+ for (casefold_entry = property->casefold_mapping;
+ *casefold_entry >= 0; casefold_entry++) {
+ written += utf8proc_decompose_char(*casefold_entry, dst+written,
+ (bufsize > written) ? (bufsize - written) : 0, options,
+ last_boundclass);
+ if (written < 0) return UTF8PROC_ERROR_OVERFLOW;
+ }
+ return written;
+ }
+ }
+ if (options & (UTF8PROC_COMPOSE|UTF8PROC_DECOMPOSE)) {
+ if (property->decomp_mapping &&
+ (!property->decomp_type || (options & UTF8PROC_COMPAT))) {
+ const int32_t *decomp_entry;
+ ssize_t written = 0;
+ for (decomp_entry = property->decomp_mapping;
+ *decomp_entry >= 0; decomp_entry++) {
+ written += utf8proc_decompose_char(*decomp_entry, dst+written,
+ (bufsize > written) ? (bufsize - written) : 0, options,
+ last_boundclass);
+ if (written < 0) return UTF8PROC_ERROR_OVERFLOW;
+ }
+ return written;
+ }
+ }
+ if (options & UTF8PROC_CHARBOUND) {
+ bool boundary;
+ int tbc, lbc;
+ tbc =
+ (uc == 0x000D) ? UTF8PROC_BOUNDCLASS_CR :
+ (uc == 0x000A) ? UTF8PROC_BOUNDCLASS_LF :
+ ((category == UTF8PROC_CATEGORY_ZL ||
+ category == UTF8PROC_CATEGORY_ZP ||
+ category == UTF8PROC_CATEGORY_CC ||
+ category == UTF8PROC_CATEGORY_CF) &&
+ !(uc == 0x200C || uc == 0x200D)) ? UTF8PROC_BOUNDCLASS_CONTROL :
+ property->extend ? UTF8PROC_BOUNDCLASS_EXTEND :
+ ((uc >= UTF8PROC_HANGUL_L_START && uc < UTF8PROC_HANGUL_L_END) ||
+ uc == UTF8PROC_HANGUL_L_FILLER) ? UTF8PROC_BOUNDCLASS_L :
+ (uc >= UTF8PROC_HANGUL_V_START && uc < UTF8PROC_HANGUL_V_END) ?
+ UTF8PROC_BOUNDCLASS_V :
+ (uc >= UTF8PROC_HANGUL_T_START && uc < UTF8PROC_HANGUL_T_END) ?
+ UTF8PROC_BOUNDCLASS_T :
+ (uc >= UTF8PROC_HANGUL_S_START && uc < UTF8PROC_HANGUL_S_END) ? (
+ ((uc-UTF8PROC_HANGUL_SBASE) % UTF8PROC_HANGUL_TCOUNT == 0) ?
+ UTF8PROC_BOUNDCLASS_LV : UTF8PROC_BOUNDCLASS_LVT
+ ) :
+ UTF8PROC_BOUNDCLASS_OTHER;
+ lbc = *last_boundclass;
+ boundary =
+ (tbc == UTF8PROC_BOUNDCLASS_EXTEND) ? false :
+ (lbc == UTF8PROC_BOUNDCLASS_START) ? true :
+ (lbc == UTF8PROC_BOUNDCLASS_CR &&
+ tbc == UTF8PROC_BOUNDCLASS_LF) ? false :
+ (lbc == UTF8PROC_BOUNDCLASS_CONTROL) ? true :
+ (tbc == UTF8PROC_BOUNDCLASS_CONTROL) ? true :
+ (lbc == UTF8PROC_BOUNDCLASS_L &&
+ (tbc == UTF8PROC_BOUNDCLASS_L ||
+ tbc == UTF8PROC_BOUNDCLASS_V ||
+ tbc == UTF8PROC_BOUNDCLASS_LV ||
+ tbc == UTF8PROC_BOUNDCLASS_LVT)) ? false :
+ ((lbc == UTF8PROC_BOUNDCLASS_LV ||
+ lbc == UTF8PROC_BOUNDCLASS_V) &&
+ (tbc == UTF8PROC_BOUNDCLASS_V ||
+ tbc == UTF8PROC_BOUNDCLASS_T)) ? false :
+ ((lbc == UTF8PROC_BOUNDCLASS_LVT ||
+ lbc == UTF8PROC_BOUNDCLASS_T) &&
+ tbc == UTF8PROC_BOUNDCLASS_T) ? false :
+ true;
+ *last_boundclass = tbc;
+ if (boundary) {
+ if (bufsize >= 1) dst[0] = 0xFFFF;
+ if (bufsize >= 2) dst[1] = uc;
+ return 2;
+ }
+ }
+ if (bufsize >= 1) *dst = uc;
+ return 1;
+}
+
+ssize_t utf8proc_decompose(
+ const uint8_t *str, ssize_t strlen,
+ int32_t *buffer, ssize_t bufsize, int options
+) {
+ /* strlen will be ignored, if UTF8PROC_NULLTERM is set in options */
+ ssize_t wpos = 0;
+ if ((options & UTF8PROC_COMPOSE) && (options & UTF8PROC_DECOMPOSE))
+ return UTF8PROC_ERROR_INVALIDOPTS;
+ if ((options & UTF8PROC_STRIPMARK) &&
+ !(options & UTF8PROC_COMPOSE) && !(options & UTF8PROC_DECOMPOSE))
+ return UTF8PROC_ERROR_INVALIDOPTS;
+ {
+ int32_t uc;
+ ssize_t rpos = 0;
+ ssize_t decomp_result;
+ int boundclass = UTF8PROC_BOUNDCLASS_START;
+ while (1) {
+ if (options & UTF8PROC_NULLTERM) {
+ rpos += utf8proc_iterate(str + rpos, -1, &uc);
+ /* checking of return value is not neccessary,
+ as 'uc' is < 0 in case of error */
+ if (uc < 0) return UTF8PROC_ERROR_INVALIDUTF8;
+ if (rpos < 0) return UTF8PROC_ERROR_OVERFLOW;
+ if (uc == 0) break;
+ } else {
+ if (rpos >= strlen) break;
+ rpos += utf8proc_iterate(str + rpos, strlen - rpos, &uc);
+ if (uc < 0) return UTF8PROC_ERROR_INVALIDUTF8;
+ }
+ decomp_result = utf8proc_decompose_char(
+ uc, buffer + wpos, (bufsize > wpos) ? (bufsize - wpos) : 0, options,
+ &boundclass
+ );
+ if (decomp_result < 0) return decomp_result;
+ wpos += decomp_result;
+ /* prohibiting integer overflows due to too long strings: */
+ if (wpos < 0 || wpos > (ssize_t)(SSIZE_MAX/sizeof(int32_t)/2))
+ return UTF8PROC_ERROR_OVERFLOW;
+ }
+ }
+ if ((options & (UTF8PROC_COMPOSE|UTF8PROC_DECOMPOSE)) && bufsize >= wpos) {
+ ssize_t pos = 0;
+ while (pos < wpos-1) {
+ int32_t uc1, uc2;
+ const utf8proc_property_t *property1, *property2;
+ uc1 = buffer[pos];
+ uc2 = buffer[pos+1];
+ property1 = utf8proc_get_property(uc1);
+ property2 = utf8proc_get_property(uc2);
+ if (property1->combining_class > property2->combining_class &&
+ property2->combining_class > 0) {
+ buffer[pos] = uc2;
+ buffer[pos+1] = uc1;
+ if (pos > 0) pos--; else pos++;
+ } else {
+ pos++;
+ }
+ }
+ }
+ return wpos;
+}
+
+ssize_t utf8proc_normalise(int32_t *buffer, ssize_t length, int options) {
+ /* UTF8PROC_NULLTERM option will be ignored, 'length' is never ignored
+ ASSERT: 'buffer' has one spare byte of free space at the end! */
+ if (options & (UTF8PROC_NLF2LS | UTF8PROC_NLF2PS | UTF8PROC_STRIPCC)) {
+ ssize_t rpos;
+ ssize_t wpos = 0;
+ int32_t uc;
+ for (rpos = 0; rpos < length; rpos++) {
+ uc = buffer[rpos];
+ if (uc == 0x000D && rpos < length-1 && buffer[rpos+1] == 0x000A) rpos++;
+ if (uc == 0x000A || uc == 0x000D || uc == 0x0085 ||
+ ((options & UTF8PROC_STRIPCC) && (uc == 0x000B || uc == 0x000C))) {
+ if (options & UTF8PROC_NLF2LS) {
+ if (options & UTF8PROC_NLF2PS) {
+ buffer[wpos++] = 0x000A;
+ } else {
+ buffer[wpos++] = 0x2028;
+ }
+ } else {
+ if (options & UTF8PROC_NLF2PS) {
+ buffer[wpos++] = 0x2029;
+ } else {
+ buffer[wpos++] = 0x0020;
+ }
+ }
+ } else if ((options & UTF8PROC_STRIPCC) &&
+ (uc < 0x0020 || (uc >= 0x007F && uc < 0x00A0))) {
+ if (uc == 0x0009) buffer[wpos++] = 0x0020;
+ } else {
+ buffer[wpos++] = uc;
+ }
+ }
+ length = wpos;
+ }
+ if (options & UTF8PROC_COMPOSE) {
+ int32_t *starter = NULL;
+ int32_t current_char;
+ const utf8proc_property_t *starter_property = NULL, *current_property;
+ utf8proc_propval_t max_combining_class = -1;
+ ssize_t rpos;
+ ssize_t wpos = 0;
+ int32_t composition;
+ for (rpos = 0; rpos < length; rpos++) {
+ current_char = buffer[rpos];
+ current_property = utf8proc_get_property(current_char);
+ if (starter && current_property->combining_class > max_combining_class) {
+ /* combination perhaps possible */
+ int32_t hangul_lindex;
+ int32_t hangul_sindex;
+ hangul_lindex = *starter - UTF8PROC_HANGUL_LBASE;
+ if (hangul_lindex >= 0 && hangul_lindex < UTF8PROC_HANGUL_LCOUNT) {
+ int32_t hangul_vindex;
+ hangul_vindex = current_char - UTF8PROC_HANGUL_VBASE;
+ if (hangul_vindex >= 0 && hangul_vindex < UTF8PROC_HANGUL_VCOUNT) {
+ *starter = UTF8PROC_HANGUL_SBASE +
+ (hangul_lindex * UTF8PROC_HANGUL_VCOUNT + hangul_vindex) *
+ UTF8PROC_HANGUL_TCOUNT;
+ starter_property = NULL;
+ continue;
+ }
+ }
+ hangul_sindex = *starter - UTF8PROC_HANGUL_SBASE;
+ if (hangul_sindex >= 0 && hangul_sindex < UTF8PROC_HANGUL_SCOUNT &&
+ (hangul_sindex % UTF8PROC_HANGUL_TCOUNT) == 0) {
+ int32_t hangul_tindex;
+ hangul_tindex = current_char - UTF8PROC_HANGUL_TBASE;
+ if (hangul_tindex >= 0 && hangul_tindex < UTF8PROC_HANGUL_TCOUNT) {
+ *starter += hangul_tindex;
+ starter_property = NULL;
+ continue;
+ }
+ }
+ if (!starter_property) {
+ starter_property = utf8proc_get_property(*starter);
+ }
+ if (starter_property->comb1st_index >= 0 &&
+ current_property->comb2nd_index >= 0) {
+ composition = utf8proc_combinations[
+ starter_property->comb1st_index +
+ current_property->comb2nd_index
+ ];
+ if (composition >= 0 && (!(options & UTF8PROC_STABLE) ||
+ !(utf8proc_get_property(composition)->comp_exclusion))) {
+ *starter = composition;
+ starter_property = NULL;
+ continue;
+ }
+ }
+ }
+ buffer[wpos] = current_char;
+ if (current_property->combining_class) {
+ if (current_property->combining_class > max_combining_class) {
+ max_combining_class = current_property->combining_class;
+ }
+ } else {
+ starter = buffer + wpos;
+ starter_property = NULL;
+ max_combining_class = -1;
+ }
+ wpos++;
+ }
+ length = wpos;
+ }
+ return length;
+}
+
+ssize_t utf8proc_reencode(int32_t *buffer, ssize_t length, int options) {
+ length = utf8proc_normalise(buffer, length, options);
+ if (length < 0) return length;
+
+ {
+ ssize_t rpos, wpos = 0;
+ int32_t uc;
+ for (rpos = 0; rpos < length; rpos++) {
+ uc = buffer[rpos];
+ wpos += utf8proc_encode_char(uc, ((uint8_t *)buffer) + wpos);
+ }
+ ((uint8_t *)buffer)[wpos] = 0;
+ return wpos;
+ }
+}
+
+ssize_t utf8proc_map(
+ const uint8_t *str, ssize_t strlen, uint8_t **dstptr, int options
+) {
+ int32_t *buffer;
+ ssize_t result;
+ *dstptr = NULL;
+ result = utf8proc_decompose(str, strlen, NULL, 0, options);
+ if (result < 0) return result;
+ buffer = malloc(result * sizeof(int32_t) + 1);
+ if (!buffer) return UTF8PROC_ERROR_NOMEM;
+ result = utf8proc_decompose(str, strlen, buffer, result, options);
+ if (result < 0) {
+ free(buffer);
+ return result;
+ }
+ result = utf8proc_reencode(buffer, result, options);
+ if (result < 0) {
+ free(buffer);
+ return result;
+ }
+ {
+ int32_t *newptr;
+ newptr = realloc(buffer, (size_t)result+1);
+ if (newptr) buffer = newptr;
+ }
+ *dstptr = (uint8_t *)buffer;
+ return result;
+}
+
+uint8_t *utf8proc_NFD(const uint8_t *str) {
+ uint8_t *retval;
+ utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE |
+ UTF8PROC_DECOMPOSE);
+ return retval;
+}
+
+uint8_t *utf8proc_NFC(const uint8_t *str) {
+ uint8_t *retval;
+ utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE |
+ UTF8PROC_COMPOSE);
+ return retval;
+}
+
+uint8_t *utf8proc_NFKD(const uint8_t *str) {
+ uint8_t *retval;
+ utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE |
+ UTF8PROC_DECOMPOSE | UTF8PROC_COMPAT);
+ return retval;
+}
+
+uint8_t *utf8proc_NFKC(const uint8_t *str) {
+ uint8_t *retval;
+ utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE |
+ UTF8PROC_COMPOSE | UTF8PROC_COMPAT);
+ return retval;
+}
+
diff --git a/utils/utf8proc.h b/utils/utf8proc.h
new file mode 100644
index 000000000..c07477987
--- /dev/null
+++ b/utils/utf8proc.h
@@ -0,0 +1,393 @@
+/*
+ * Copyright (c) 2009 Public Software Group e. V., Berlin, Germany
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+
+/*
+ * File name: utf8proc.h
+ *
+ * Description:
+ * Header files for libutf8proc, which is a mapping tool for UTF-8 strings
+ * with following features:
+ * - decomposing and composing of strings
+ * - replacing compatibility characters with their equivalents
+ * - stripping of "default ignorable characters"
+ * like SOFT-HYPHEN or ZERO-WIDTH-SPACE
+ * - folding of certain characters for string comparison
+ * (e.g. HYPHEN U+2010 and MINUS U+2212 to ASCII "-")
+ * (see "LUMP" option)
+ * - optional rejection of strings containing non-assigned code points
+ * - stripping of control characters
+ * - stripping of character marks (accents, etc.)
+ * - transformation of LF, CRLF, CR and NEL to line-feed (LF)
+ * or to the unicode chararacters for paragraph separation (PS)
+ * or line separation (LS).
+ * - unicode case folding (for case insensitive string comparisons)
+ * - rejection of illegal UTF-8 data
+ * (i.e. UTF-8 encoded UTF-16 surrogates)
+ * - support for korean hangul characters
+ * Unicode Version 5.0.0 is supported.
+ */
+
+
+#ifndef UTF8PROC_H
+#define UTF8PROC_H
+
+
+#include <stdlib.h>
+#include <sys/types.h>
+#ifdef _MSC_VER
+typedef signed char int8_t;
+typedef unsigned char uint8_t;
+typedef short int16_t;
+typedef unsigned short uint16_t;
+typedef int int32_t;
+#ifdef _WIN64
+#define ssize_t __int64
+#else
+#define ssize_t int
+#endif
+typedef unsigned char bool;
+enum {false, true};
+#else
+#include <stdbool.h>
+#include <inttypes.h>
+#endif
+#include <limits.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef SSIZE_MAX
+#define SSIZE_MAX ((size_t)SIZE_MAX/2)
+#endif
+
+#define UTF8PROC_CCC_VIRAMA 9
+
+#define UTF8PROC_NULLTERM (1<<0)
+#define UTF8PROC_STABLE (1<<1)
+#define UTF8PROC_COMPAT (1<<2)
+#define UTF8PROC_COMPOSE (1<<3)
+#define UTF8PROC_DECOMPOSE (1<<4)
+#define UTF8PROC_IGNORE (1<<5)
+#define UTF8PROC_REJECTNA (1<<6)
+#define UTF8PROC_NLF2LS (1<<7)
+#define UTF8PROC_NLF2PS (1<<8)
+#define UTF8PROC_NLF2LF (UTF8PROC_NLF2LS | UTF8PROC_NLF2PS)
+#define UTF8PROC_STRIPCC (1<<9)
+#define UTF8PROC_CASEFOLD (1<<10)
+#define UTF8PROC_CHARBOUND (1<<11)
+#define UTF8PROC_LUMP (1<<12)
+#define UTF8PROC_STRIPMARK (1<<13)
+/*
+ * Flags being regarded by several functions in the library:
+ * NULLTERM: The given UTF-8 input is NULL terminated.
+ * STABLE: Unicode Versioning Stability has to be respected.
+ * COMPAT: Compatiblity decomposition
+ * (i.e. formatting information is lost)
+ * COMPOSE: Return a result with composed characters.
+ * DECOMPOSE: Return a result with decomposed characters.
+ * IGNORE: Strip "default ignorable characters"
+ * REJECTNA: Return an error, if the input contains unassigned
+ * code points.
+ * NLF2LS: Indicating that NLF-sequences (LF, CRLF, CR, NEL) are
+ * representing a line break, and should be converted to the
+ * unicode character for line separation (LS).
+ * NLF2PS: Indicating that NLF-sequences are representing a paragraph
+ * break, and should be converted to the unicode character for
+ * paragraph separation (PS).
+ * NLF2LF: Indicating that the meaning of NLF-sequences is unknown.
+ * STRIPCC: Strips and/or convers control characters.
+ * NLF-sequences are transformed into space, except if one of
+ * the NLF2LS/PS/LF options is given.
+ * HorizontalTab (HT) and FormFeed (FF) are treated as a
+ * NLF-sequence in this case.
+ * All other control characters are simply removed.
+ * CASEFOLD: Performs unicode case folding, to be able to do a
+ * case-insensitive string comparison.
+ * CHARBOUND: Inserts 0xFF bytes at the beginning of each sequence which
+ * is representing a single grapheme cluster (see UAX#29).
+ * LUMP: Lumps certain characters together
+ * (e.g. HYPHEN U+2010 and MINUS U+2212 to ASCII "-").
+ * (See lump.txt for details.)
+ * If NLF2LF is set, this includes a transformation of
+ * paragraph and line separators to ASCII line-feed (LF).
+ * STRIPMARK: Strips all character markings
+ * (non-spacing, spacing and enclosing) (i.e. accents)
+ * NOTE: this option works only with COMPOSE or DECOMPOSE
+ */
+
+#define UTF8PROC_ERROR_NOMEM -1
+#define UTF8PROC_ERROR_OVERFLOW -2
+#define UTF8PROC_ERROR_INVALIDUTF8 -3
+#define UTF8PROC_ERROR_NOTASSIGNED -4
+#define UTF8PROC_ERROR_INVALIDOPTS -5
+/*
+ * Error codes being returned by almost all functions:
+ * ERROR_NOMEM: Memory could not be allocated.
+ * ERROR_OVERFLOW: The given string is too long to be processed.
+ * ERROR_INVALIDUTF8: The given string is not a legal UTF-8 string.
+ * ERROR_NOTASSIGNED: The REJECTNA flag was set,
+ * and an unassigned code point was found.
+ * ERROR_INVALIDOPTS: Invalid options have been used.
+ */
+
+typedef int16_t utf8proc_propval_t;
+typedef struct utf8proc_property_struct {
+ utf8proc_propval_t category;
+ utf8proc_propval_t combining_class;
+ utf8proc_propval_t bidi_class;
+ utf8proc_propval_t decomp_type;
+ const int32_t *decomp_mapping;
+ unsigned bidi_mirrored:1;
+ int32_t uppercase_mapping;
+ int32_t lowercase_mapping;
+ int32_t titlecase_mapping;
+ int32_t comb1st_index;
+ int32_t comb2nd_index;
+ unsigned comp_exclusion:1;
+ unsigned ignorable:1;
+ unsigned control_boundary:1;
+ unsigned extend:1;
+ const int32_t *casefold_mapping;
+} utf8proc_property_t;
+
+#define UTF8PROC_CATEGORY_LU 1
+#define UTF8PROC_CATEGORY_LL 2
+#define UTF8PROC_CATEGORY_LT 3
+#define UTF8PROC_CATEGORY_LM 4
+#define UTF8PROC_CATEGORY_LO 5
+#define UTF8PROC_CATEGORY_MN 6
+#define UTF8PROC_CATEGORY_MC 7
+#define UTF8PROC_CATEGORY_ME 8
+#define UTF8PROC_CATEGORY_ND 9
+#define UTF8PROC_CATEGORY_NL 10
+#define UTF8PROC_CATEGORY_NO 11
+#define UTF8PROC_CATEGORY_PC 12
+#define UTF8PROC_CATEGORY_PD 13
+#define UTF8PROC_CATEGORY_PS 14
+#define UTF8PROC_CATEGORY_PE 15
+#define UTF8PROC_CATEGORY_PI 16
+#define UTF8PROC_CATEGORY_PF 17
+#define UTF8PROC_CATEGORY_PO 18
+#define UTF8PROC_CATEGORY_SM 19
+#define UTF8PROC_CATEGORY_SC 20
+#define UTF8PROC_CATEGORY_SK 21
+#define UTF8PROC_CATEGORY_SO 22
+#define UTF8PROC_CATEGORY_ZS 23
+#define UTF8PROC_CATEGORY_ZL 24
+#define UTF8PROC_CATEGORY_ZP 25
+#define UTF8PROC_CATEGORY_CC 26
+#define UTF8PROC_CATEGORY_CF 27
+#define UTF8PROC_CATEGORY_CS 28
+#define UTF8PROC_CATEGORY_CO 29
+#define UTF8PROC_CATEGORY_CN 30
+#define UTF8PROC_BIDI_CLASS_L 1
+#define UTF8PROC_BIDI_CLASS_LRE 2
+#define UTF8PROC_BIDI_CLASS_LRO 3
+#define UTF8PROC_BIDI_CLASS_R 4
+#define UTF8PROC_BIDI_CLASS_AL 5
+#define UTF8PROC_BIDI_CLASS_RLE 6
+#define UTF8PROC_BIDI_CLASS_RLO 7
+#define UTF8PROC_BIDI_CLASS_PDF 8
+#define UTF8PROC_BIDI_CLASS_EN 9
+#define UTF8PROC_BIDI_CLASS_ES 10
+#define UTF8PROC_BIDI_CLASS_ET 11
+#define UTF8PROC_BIDI_CLASS_AN 12
+#define UTF8PROC_BIDI_CLASS_CS 13
+#define UTF8PROC_BIDI_CLASS_NSM 14
+#define UTF8PROC_BIDI_CLASS_BN 15
+#define UTF8PROC_BIDI_CLASS_B 16
+#define UTF8PROC_BIDI_CLASS_S 17
+#define UTF8PROC_BIDI_CLASS_WS 18
+#define UTF8PROC_BIDI_CLASS_ON 19
+#define UTF8PROC_DECOMP_TYPE_FONT 1
+#define UTF8PROC_DECOMP_TYPE_NOBREAK 2
+#define UTF8PROC_DECOMP_TYPE_INITIAL 3
+#define UTF8PROC_DECOMP_TYPE_MEDIAL 4
+#define UTF8PROC_DECOMP_TYPE_FINAL 5
+#define UTF8PROC_DECOMP_TYPE_ISOLATED 6
+#define UTF8PROC_DECOMP_TYPE_CIRCLE 7
+#define UTF8PROC_DECOMP_TYPE_SUPER 8
+#define UTF8PROC_DECOMP_TYPE_SUB 9
+#define UTF8PROC_DECOMP_TYPE_VERTICAL 10
+#define UTF8PROC_DECOMP_TYPE_WIDE 11
+#define UTF8PROC_DECOMP_TYPE_NARROW 12
+#define UTF8PROC_DECOMP_TYPE_SMALL 13
+#define UTF8PROC_DECOMP_TYPE_SQUARE 14
+#define UTF8PROC_DECOMP_TYPE_FRACTION 15
+#define UTF8PROC_DECOMP_TYPE_COMPAT 16
+
+extern const int8_t utf8proc_utf8class[256];
+
+const char *utf8proc_version(void);
+
+const char *utf8proc_errmsg(ssize_t errcode);
+/*
+ * Returns a static error string for the given error code.
+ */
+
+ssize_t utf8proc_iterate(const uint8_t *str, ssize_t strlen, int32_t *dst);
+/*
+ * Reads a single char from the UTF-8 sequence being pointed to by 'str'.
+ * The maximum number of bytes read is 'strlen', unless 'strlen' is
+ * negative.
+ * If a valid unicode char could be read, it is stored in the variable
+ * being pointed to by 'dst', otherwise that variable will be set to -1.
+ * In case of success the number of bytes read is returned, otherwise a
+ * negative error code is returned.
+ */
+
+bool utf8proc_codepoint_valid(int32_t uc);
+/*
+ * Returns 1, if the given unicode code-point is valid, otherwise 0.
+ */
+
+ssize_t utf8proc_encode_char(int32_t uc, uint8_t *dst);
+/*
+ * Encodes the unicode char with the code point 'uc' as an UTF-8 string in
+ * the byte array being pointed to by 'dst'. This array has to be at least
+ * 4 bytes long.
+ * In case of success the number of bytes written is returned,
+ * otherwise 0.
+ * This function does not check if 'uc' is a valid unicode code point.
+ */
+
+const utf8proc_property_t *utf8proc_get_property(int32_t uc);
+/*
+ * Returns a pointer to a (constant) struct containing information about
+ * the unicode char with the given code point 'uc'.
+ * If the character is not existent a pointer to a special struct is
+ * returned, where 'category' is a NULL pointer.
+ * WARNING: The parameter 'uc' has to be in the range of 0x0000 to
+ * 0x10FFFF, otherwise the program might crash!
+ */
+
+ssize_t utf8proc_decompose_char(
+ int32_t uc, int32_t *dst, ssize_t bufsize,
+ int options, int *last_boundclass
+);
+/*
+ * Writes a decomposition of the unicode char 'uc' into the array being
+ * pointed to by 'dst'.
+ * Following flags in the 'options' field are regarded:
+ * REJECTNA: an unassigned unicode code point leads to an error
+ * IGNORE: "default ignorable" chars are stripped
+ * CASEFOLD: unicode casefolding is applied
+ * COMPAT: replace certain characters with their
+ * compatibility decomposition
+ * CHARBOUND: Inserts 0xFF bytes before each grapheme cluster
+ * LUMP: lumps certain different characters together
+ * STRIPMARK: removes all character marks
+ * The pointer 'last_boundclass' has to point to an integer variable which
+ * is storing the last character boundary class, if the CHARBOUND option
+ * is used.
+ * In case of success the number of chars written is returned,
+ * in case of an error, a negative error code is returned.
+ * If the number of written chars would be bigger than 'bufsize',
+ * the buffer (up to 'bufsize') has inpredictable data, and the needed
+ * buffer size is returned.
+ * WARNING: The parameter 'uc' has to be in the range of 0x0000 to
+ * 0x10FFFF, otherwise the program might crash!
+ */
+
+ssize_t utf8proc_decompose(
+ const uint8_t *str, ssize_t strlen,
+ int32_t *buffer, ssize_t bufsize, int options
+);
+/*
+ * Does the same as 'utf8proc_decompose_char', but acts on a whole UTF-8
+ * string, and orders the decomposed sequences correctly.
+ * If the NULLTERM flag in 'options' is set, processing will be stopped,
+ * when a NULL byte is encounted, otherwise 'strlen' bytes are processed.
+ * The result in form of unicode code points is written into the buffer
+ * being pointed to by 'buffer', having the length of 'bufsize' entries.
+ * In case of success the number of chars written is returned,
+ * in case of an error, a negative error code is returned.
+ * If the number of written chars would be bigger than 'bufsize',
+ * the buffer (up to 'bufsize') has inpredictable data, and the needed
+ * buffer size is returned.
+ */
+
+ssize_t utf8proc_normalise(int32_t *buffer, ssize_t length, int options);
+/*
+ * Reencodes the sequence of unicode characters given by the pointer
+ * 'buffer' and 'length'. See utf8proc_reencode for further details.
+ */
+
+ssize_t utf8proc_reencode(int32_t *buffer, ssize_t length, int options);
+/*
+ * Reencodes the sequence of unicode characters given by the pointer
+ * 'buffer' and 'length' as UTF-8.
+ * The result is stored in the same memory area where the data is read.
+ * Following flags in the 'options' field are regarded:
+ * NLF2LS: converts LF, CRLF, CR and NEL into LS
+ * NLF2PS: converts LF, CRLF, CR and NEL into PS
+ * NLF2LF: converts LF, CRLF, CR and NEL into LF
+ * STRIPCC: strips or converts all non-affected control characters
+ * COMPOSE: tries to combine decomposed characters into composite
+ * characters
+ * STABLE: prohibits combining characters which would violate
+ * the unicode versioning stability
+ * In case of success the length of the resulting UTF-8 string is
+ * returned, otherwise a negative error code is returned.
+ * WARNING: The amount of free space being pointed to by 'buffer', has to
+ * exceed the amount of the input data by one byte, and the
+ * entries of the array pointed to by 'str' have to be in the
+ * range of 0x0000 to 0x10FFFF, otherwise the program might
+ * crash!
+ */
+
+ssize_t utf8proc_map(
+ const uint8_t *str, ssize_t strlen, uint8_t **dstptr, int options
+);
+/*
+ * Maps the given UTF-8 string being pointed to by 'str' to a new UTF-8
+ * string, which is allocated dynamically, and afterwards pointed to by
+ * the pointer being pointed to by 'dstptr'.
+ * If the NULLTERM flag in the 'options' field is set, the length is
+ * determined by a NULL terminator, otherwise the parameter 'strlen' is
+ * evaluated to determine the string length, but in any case the result
+ * will be NULL terminated (though it might contain NULL characters
+ * before). Other flags in the 'options' field are passed to the functions
+ * defined above, and regarded as described.
+ * In case of success the length of the new string is returned,
+ * otherwise a negative error code is returned.
+ * NOTICE: The memory of the new UTF-8 string will have been allocated with
+ * 'malloc', and has theirfore to be freed with 'free'.
+ */
+
+uint8_t *utf8proc_NFD(const uint8_t *str);
+uint8_t *utf8proc_NFC(const uint8_t *str);
+uint8_t *utf8proc_NFKD(const uint8_t *str);
+uint8_t *utf8proc_NFKC(const uint8_t *str);
+/*
+ * Returns a pointer to newly allocated memory of a NFD, NFC, NFKD or NFKC
+ * normalized version of the null-terminated string 'str'.
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/utils/utf8proc_data.c b/utils/utf8proc_data.c
new file mode 100644
index 000000000..69411279c
--- /dev/null
+++ b/utils/utf8proc_data.c
@@ -0,0 +1,13383 @@
+/*
+ * This file contains derived data from a modified version of the
+ * Unicode data files.
+ *
+ * The original data files are available at
+ * http://www.unicode.org/Public/UNIDATA/
+ *
+ *
+ * COPYRIGHT AND PERMISSION NOTICE
+ *
+ * Copyright (c) 1991-2007 Unicode, Inc. All rights reserved. Distributed
+ * under the Terms of Use in http://www.unicode.org/copyright.html.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of the Unicode data files and any associated documentation (the "Data
+ * Files") or Unicode software and any associated documentation (the
+ * "Software") to deal in the Data Files or Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, and/or sell copies of the Data Files or Software, and
+ * to permit persons to whom the Data Files or Software are furnished to do
+ * so, provided that (a) the above copyright notice(s) and this permission
+ * notice appear with all copies of the Data Files or Software, (b) both the
+ * above copyright notice(s) and this permission notice appear in associated
+ * documentation, and (c) there is clear notice in each modified Data File or
+ * in the Software as well as in the documentation associated with the Data
+ * File(s) or Software that the data or software has been modified.
+ *
+ * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+ * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
+ * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR
+ * CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+ * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder shall
+ * not be used in advertising or otherwise to promote the sale, use or other
+ * dealings in these Data Files or Software without prior written
+ * authorization of the copyright holder.
+ */
+
+
+const int32_t utf8proc_sequences[] = {
+ 97, -1, 98, -1, 99, -1, 100,
+ -1, 101, -1, 102, -1, 103, -1, 104,
+ -1, 105, -1, 106, -1, 107, -1, 108,
+ -1, 109, -1, 110, -1, 111, -1, 112,
+ -1, 113, -1, 114, -1, 115, -1, 116,
+ -1, 117, -1, 118, -1, 119, -1, 120,
+ -1, 121, -1, 122, -1, 32, -1, 32,
+ 776, -1, 32, 772, -1, 50, -1, 51,
+ -1, 32, 769, -1, 956, -1, 32, 807,
+ -1, 49, -1, 49, 8260, 52, -1, 49,
+ 8260, 50, -1, 51, 8260, 52, -1, 65,
+ 768, -1, 224, -1, 65, 769, -1, 225,
+ -1, 65, 770, -1, 226, -1, 65, 771,
+ -1, 227, -1, 65, 776, -1, 228, -1,
+ 65, 778, -1, 229, -1, 230, -1, 67,
+ 807, -1, 231, -1, 69, 768, -1, 232,
+ -1, 69, 769, -1, 233, -1, 69, 770,
+ -1, 234, -1, 69, 776, -1, 235, -1,
+ 73, 768, -1, 236, -1, 73, 769, -1,
+ 237, -1, 73, 770, -1, 238, -1, 73,
+ 776, -1, 239, -1, 240, -1, 78, 771,
+ -1, 241, -1, 79, 768, -1, 242, -1,
+ 79, 769, -1, 243, -1, 79, 770, -1,
+ 244, -1, 79, 771, -1, 245, -1, 79,
+ 776, -1, 246, -1, 248, -1, 85, 768,
+ -1, 249, -1, 85, 769, -1, 250, -1,
+ 85, 770, -1, 251, -1, 85, 776, -1,
+ 252, -1, 89, 769, -1, 253, -1, 254,
+ -1, 115, 115, -1, 97, 768, -1, 97,
+ 769, -1, 97, 770, -1, 97, 771, -1,
+ 97, 776, -1, 97, 778, -1, 99, 807,
+ -1, 101, 768, -1, 101, 769, -1, 101,
+ 770, -1, 101, 776, -1, 105, 768, -1,
+ 105, 769, -1, 105, 770, -1, 105, 776,
+ -1, 110, 771, -1, 111, 768, -1, 111,
+ 769, -1, 111, 770, -1, 111, 771, -1,
+ 111, 776, -1, 117, 768, -1, 117, 769,
+ -1, 117, 770, -1, 117, 776, -1, 121,
+ 769, -1, 121, 776, -1, 65, 772, -1,
+ 257, -1, 97, 772, -1, 65, 774, -1,
+ 259, -1, 97, 774, -1, 65, 808, -1,
+ 261, -1, 97, 808, -1, 67, 769, -1,
+ 263, -1, 99, 769, -1, 67, 770, -1,
+ 265, -1, 99, 770, -1, 67, 775, -1,
+ 267, -1, 99, 775, -1, 67, 780, -1,
+ 269, -1, 99, 780, -1, 68, 780, -1,
+ 271, -1, 100, 780, -1, 273, -1, 69,
+ 772, -1, 275, -1, 101, 772, -1, 69,
+ 774, -1, 277, -1, 101, 774, -1, 69,
+ 775, -1, 279, -1, 101, 775, -1, 69,
+ 808, -1, 281, -1, 101, 808, -1, 69,
+ 780, -1, 283, -1, 101, 780, -1, 71,
+ 770, -1, 285, -1, 103, 770, -1, 71,
+ 774, -1, 287, -1, 103, 774, -1, 71,
+ 775, -1, 289, -1, 103, 775, -1, 71,
+ 807, -1, 291, -1, 103, 807, -1, 72,
+ 770, -1, 293, -1, 104, 770, -1, 295,
+ -1, 73, 771, -1, 297, -1, 105, 771,
+ -1, 73, 772, -1, 299, -1, 105, 772,
+ -1, 73, 774, -1, 301, -1, 105, 774,
+ -1, 73, 808, -1, 303, -1, 105, 808,
+ -1, 73, 775, -1, 105, 775, -1, 73,
+ 74, -1, 307, -1, 105, 106, -1, 74,
+ 770, -1, 309, -1, 106, 770, -1, 75,
+ 807, -1, 311, -1, 107, 807, -1, 76,
+ 769, -1, 314, -1, 108, 769, -1, 76,
+ 807, -1, 316, -1, 108, 807, -1, 76,
+ 780, -1, 318, -1, 108, 780, -1, 76,
+ 183, -1, 320, -1, 108, 183, -1, 322,
+ -1, 78, 769, -1, 324, -1, 110, 769,
+ -1, 78, 807, -1, 326, -1, 110, 807,
+ -1, 78, 780, -1, 328, -1, 110, 780,
+ -1, 700, 110, -1, 331, -1, 79, 772,
+ -1, 333, -1, 111, 772, -1, 79, 774,
+ -1, 335, -1, 111, 774, -1, 79, 779,
+ -1, 337, -1, 111, 779, -1, 339, -1,
+ 82, 769, -1, 341, -1, 114, 769, -1,
+ 82, 807, -1, 343, -1, 114, 807, -1,
+ 82, 780, -1, 345, -1, 114, 780, -1,
+ 83, 769, -1, 347, -1, 115, 769, -1,
+ 83, 770, -1, 349, -1, 115, 770, -1,
+ 83, 807, -1, 351, -1, 115, 807, -1,
+ 83, 780, -1, 353, -1, 115, 780, -1,
+ 84, 807, -1, 355, -1, 116, 807, -1,
+ 84, 780, -1, 357, -1, 116, 780, -1,
+ 359, -1, 85, 771, -1, 361, -1, 117,
+ 771, -1, 85, 772, -1, 363, -1, 117,
+ 772, -1, 85, 774, -1, 365, -1, 117,
+ 774, -1, 85, 778, -1, 367, -1, 117,
+ 778, -1, 85, 779, -1, 369, -1, 117,
+ 779, -1, 85, 808, -1, 371, -1, 117,
+ 808, -1, 87, 770, -1, 373, -1, 119,
+ 770, -1, 89, 770, -1, 375, -1, 121,
+ 770, -1, 89, 776, -1, 255, -1, 90,
+ 769, -1, 378, -1, 122, 769, -1, 90,
+ 775, -1, 380, -1, 122, 775, -1, 90,
+ 780, -1, 382, -1, 122, 780, -1, 595,
+ -1, 387, -1, 389, -1, 596, -1, 392,
+ -1, 598, -1, 599, -1, 396, -1, 477,
+ -1, 601, -1, 603, -1, 402, -1, 608,
+ -1, 611, -1, 617, -1, 616, -1, 409,
+ -1, 623, -1, 626, -1, 629, -1, 79,
+ 795, -1, 417, -1, 111, 795, -1, 419,
+ -1, 421, -1, 640, -1, 424, -1, 643,
+ -1, 429, -1, 648, -1, 85, 795, -1,
+ 432, -1, 117, 795, -1, 650, -1, 651,
+ -1, 436, -1, 438, -1, 658, -1, 441,
+ -1, 445, -1, 68, 381, -1, 454, -1,
+ 68, 382, -1, 100, 382, -1, 76, 74,
+ -1, 457, -1, 76, 106, -1, 108, 106,
+ -1, 78, 74, -1, 460, -1, 78, 106,
+ -1, 110, 106, -1, 65, 780, -1, 462,
+ -1, 97, 780, -1, 73, 780, -1, 464,
+ -1, 105, 780, -1, 79, 780, -1, 466,
+ -1, 111, 780, -1, 85, 780, -1, 468,
+ -1, 117, 780, -1, 220, 772, -1, 470,
+ -1, 252, 772, -1, 220, 769, -1, 472,
+ -1, 252, 769, -1, 220, 780, -1, 474,
+ -1, 252, 780, -1, 220, 768, -1, 476,
+ -1, 252, 768, -1, 196, 772, -1, 479,
+ -1, 228, 772, -1, 550, 772, -1, 481,
+ -1, 551, 772, -1, 198, 772, -1, 483,
+ -1, 230, 772, -1, 485, -1, 71, 780,
+ -1, 487, -1, 103, 780, -1, 75, 780,
+ -1, 489, -1, 107, 780, -1, 79, 808,
+ -1, 491, -1, 111, 808, -1, 490, 772,
+ -1, 493, -1, 491, 772, -1, 439, 780,
+ -1, 495, -1, 658, 780, -1, 106, 780,
+ -1, 68, 90, -1, 499, -1, 68, 122,
+ -1, 100, 122, -1, 71, 769, -1, 501,
+ -1, 103, 769, -1, 405, -1, 447, -1,
+ 78, 768, -1, 505, -1, 110, 768, -1,
+ 197, 769, -1, 507, -1, 229, 769, -1,
+ 198, 769, -1, 509, -1, 230, 769, -1,
+ 216, 769, -1, 511, -1, 248, 769, -1,
+ 65, 783, -1, 513, -1, 97, 783, -1,
+ 65, 785, -1, 515, -1, 97, 785, -1,
+ 69, 783, -1, 517, -1, 101, 783, -1,
+ 69, 785, -1, 519, -1, 101, 785, -1,
+ 73, 783, -1, 521, -1, 105, 783, -1,
+ 73, 785, -1, 523, -1, 105, 785, -1,
+ 79, 783, -1, 525, -1, 111, 783, -1,
+ 79, 785, -1, 527, -1, 111, 785, -1,
+ 82, 783, -1, 529, -1, 114, 783, -1,
+ 82, 785, -1, 531, -1, 114, 785, -1,
+ 85, 783, -1, 533, -1, 117, 783, -1,
+ 85, 785, -1, 535, -1, 117, 785, -1,
+ 83, 806, -1, 537, -1, 115, 806, -1,
+ 84, 806, -1, 539, -1, 116, 806, -1,
+ 541, -1, 72, 780, -1, 543, -1, 104,
+ 780, -1, 414, -1, 547, -1, 549, -1,
+ 65, 775, -1, 551, -1, 97, 775, -1,
+ 69, 807, -1, 553, -1, 101, 807, -1,
+ 214, 772, -1, 555, -1, 246, 772, -1,
+ 213, 772, -1, 557, -1, 245, 772, -1,
+ 79, 775, -1, 559, -1, 111, 775, -1,
+ 558, 772, -1, 561, -1, 559, 772, -1,
+ 89, 772, -1, 563, -1, 121, 772, -1,
+ 11365, -1, 572, -1, 410, -1, 11366, -1,
+ 578, -1, 384, -1, 649, -1, 652, -1,
+ 583, -1, 585, -1, 587, -1, 589, -1,
+ 591, -1, 614, -1, 633, -1, 635, -1,
+ 641, -1, 32, 774, -1, 32, 775, -1,
+ 32, 778, -1, 32, 808, -1, 32, 771,
+ -1, 32, 779, -1, 661, -1, 768, -1,
+ 769, -1, 787, -1, 776, 769, -1, 953,
+ -1, 697, -1, 32, 837, -1, 59, -1,
+ 168, 769, -1, 913, 769, -1, 940, -1,
+ 183, -1, 917, 769, -1, 941, -1, 919,
+ 769, -1, 942, -1, 921, 769, -1, 943,
+ -1, 927, 769, -1, 972, -1, 933, 769,
+ -1, 973, -1, 937, 769, -1, 974, -1,
+ 970, 769, -1, 953, 776, 769, -1, 945,
+ -1, 946, -1, 947, -1, 948, -1, 949,
+ -1, 950, -1, 951, -1, 952, -1, 954,
+ -1, 955, -1, 957, -1, 958, -1, 959,
+ -1, 960, -1, 961, -1, 963, -1, 964,
+ -1, 965, -1, 966, -1, 967, -1, 968,
+ -1, 969, -1, 921, 776, -1, 970, -1,
+ 933, 776, -1, 971, -1, 945, 769, -1,
+ 949, 769, -1, 951, 769, -1, 953, 769,
+ -1, 971, 769, -1, 965, 776, 769, -1,
+ 953, 776, -1, 965, 776, -1, 959, 769,
+ -1, 965, 769, -1, 969, 769, -1, 933,
+ -1, 978, 769, -1, 978, 776, -1, 985,
+ -1, 987, -1, 989, -1, 991, -1, 993,
+ -1, 995, -1, 997, -1, 999, -1, 1001,
+ -1, 1003, -1, 1005, -1, 1007, -1, 962,
+ -1, 920, -1, 1016, -1, 931, -1, 1010,
+ -1, 1019, -1, 891, -1, 892, -1, 893,
+ -1, 1045, 768, -1, 1104, -1, 1045, 776,
+ -1, 1105, -1, 1106, -1, 1043, 769, -1,
+ 1107, -1, 1108, -1, 1109, -1, 1110, -1,
+ 1030, 776, -1, 1111, -1, 1112, -1, 1113,
+ -1, 1114, -1, 1115, -1, 1050, 769, -1,
+ 1116, -1, 1048, 768, -1, 1117, -1, 1059,
+ 774, -1, 1118, -1, 1119, -1, 1072, -1,
+ 1073, -1, 1074, -1, 1075, -1, 1076, -1,
+ 1077, -1, 1078, -1, 1079, -1, 1080, -1,
+ 1048, 774, -1, 1081, -1, 1082, -1, 1083,
+ -1, 1084, -1, 1085, -1, 1086, -1, 1087,
+ -1, 1088, -1, 1089, -1, 1090, -1, 1091,
+ -1, 1092, -1, 1093, -1, 1094, -1, 1095,
+ -1, 1096, -1, 1097, -1, 1098, -1, 1099,
+ -1, 1100, -1, 1101, -1, 1102, -1, 1103,
+ -1, 1080, 774, -1, 1077, 768, -1, 1077,
+ 776, -1, 1075, 769, -1, 1110, 776, -1,
+ 1082, 769, -1, 1080, 768, -1, 1091, 774,
+ -1, 1121, -1, 1123, -1, 1125, -1, 1127,
+ -1, 1129, -1, 1131, -1, 1133, -1, 1135,
+ -1, 1137, -1, 1139, -1, 1141, -1, 1140,
+ 783, -1, 1143, -1, 1141, 783, -1, 1145,
+ -1, 1147, -1, 1149, -1, 1151, -1, 1153,
+ -1, 1163, -1, 1165, -1, 1167, -1, 1169,
+ -1, 1171, -1, 1173, -1, 1175, -1, 1177,
+ -1, 1179, -1, 1181, -1, 1183, -1, 1185,
+ -1, 1187, -1, 1189, -1, 1191, -1, 1193,
+ -1, 1195, -1, 1197, -1, 1199, -1, 1201,
+ -1, 1203, -1, 1205, -1, 1207, -1, 1209,
+ -1, 1211, -1, 1213, -1, 1215, -1, 1231,
+ -1, 1046, 774, -1, 1218, -1, 1078, 774,
+ -1, 1220, -1, 1222, -1, 1224, -1, 1226,
+ -1, 1228, -1, 1230, -1, 1040, 774, -1,
+ 1233, -1, 1072, 774, -1, 1040, 776, -1,
+ 1235, -1, 1072, 776, -1, 1237, -1, 1045,
+ 774, -1, 1239, -1, 1077, 774, -1, 1241,
+ -1, 1240, 776, -1, 1243, -1, 1241, 776,
+ -1, 1046, 776, -1, 1245, -1, 1078, 776,
+ -1, 1047, 776, -1, 1247, -1, 1079, 776,
+ -1, 1249, -1, 1048, 772, -1, 1251, -1,
+ 1080, 772, -1, 1048, 776, -1, 1253, -1,
+ 1080, 776, -1, 1054, 776, -1, 1255, -1,
+ 1086, 776, -1, 1257, -1, 1256, 776, -1,
+ 1259, -1, 1257, 776, -1, 1069, 776, -1,
+ 1261, -1, 1101, 776, -1, 1059, 772, -1,
+ 1263, -1, 1091, 772, -1, 1059, 776, -1,
+ 1265, -1, 1091, 776, -1, 1059, 779, -1,
+ 1267, -1, 1091, 779, -1, 1063, 776, -1,
+ 1269, -1, 1095, 776, -1, 1271, -1, 1067,
+ 776, -1, 1273, -1, 1099, 776, -1, 1275,
+ -1, 1277, -1, 1279, -1, 1281, -1, 1283,
+ -1, 1285, -1, 1287, -1, 1289, -1, 1291,
+ -1, 1293, -1, 1295, -1, 1297, -1, 1299,
+ -1, 1377, -1, 1378, -1, 1379, -1, 1380,
+ -1, 1381, -1, 1382, -1, 1383, -1, 1384,
+ -1, 1385, -1, 1386, -1, 1387, -1, 1388,
+ -1, 1389, -1, 1390, -1, 1391, -1, 1392,
+ -1, 1393, -1, 1394, -1, 1395, -1, 1396,
+ -1, 1397, -1, 1398, -1, 1399, -1, 1400,
+ -1, 1401, -1, 1402, -1, 1403, -1, 1404,
+ -1, 1405, -1, 1406, -1, 1407, -1, 1408,
+ -1, 1409, -1, 1410, -1, 1411, -1, 1412,
+ -1, 1413, -1, 1414, -1, 1381, 1410, -1,
+ 1575, 1619, -1, 1575, 1620, -1, 1608, 1620,
+ -1, 1575, 1621, -1, 1610, 1620, -1, 1575,
+ 1652, -1, 1608, 1652, -1, 1735, 1652, -1,
+ 1610, 1652, -1, 1749, 1620, -1, 1729, 1620,
+ -1, 1746, 1620, -1, 2344, 2364, -1, 2352,
+ 2364, -1, 2355, 2364, -1, 2325, 2364, -1,
+ 2326, 2364, -1, 2327, 2364, -1, 2332, 2364,
+ -1, 2337, 2364, -1, 2338, 2364, -1, 2347,
+ 2364, -1, 2351, 2364, -1, 2503, 2494, -1,
+ 2503, 2519, -1, 2465, 2492, -1, 2466, 2492,
+ -1, 2479, 2492, -1, 2610, 2620, -1, 2616,
+ 2620, -1, 2582, 2620, -1, 2583, 2620, -1,
+ 2588, 2620, -1, 2603, 2620, -1, 2887, 2902,
+ -1, 2887, 2878, -1, 2887, 2903, -1, 2849,
+ 2876, -1, 2850, 2876, -1, 2962, 3031, -1,
+ 3014, 3006, -1, 3015, 3006, -1, 3014, 3031,
+ -1, 3142, 3158, -1, 3263, 3285, -1, 3270,
+ 3285, -1, 3270, 3286, -1, 3270, 3266, -1,
+ 3274, 3285, -1, 3398, 3390, -1, 3399, 3390,
+ -1, 3398, 3415, -1, 3545, 3530, -1, 3545,
+ 3535, -1, 3548, 3530, -1, 3545, 3551, -1,
+ 3661, 3634, -1, 3789, 3762, -1, 3755, 3737,
+ -1, 3755, 3745, -1, 3851, -1, 3906, 4023,
+ -1, 3916, 4023, -1, 3921, 4023, -1, 3926,
+ 4023, -1, 3931, 4023, -1, 3904, 4021, -1,
+ 3953, 3954, -1, 3953, 3956, -1, 4018, 3968,
+ -1, 4018, 3969, -1, 4019, 3968, -1, 4019,
+ 3969, -1, 3953, 3968, -1, 3986, 4023, -1,
+ 3996, 4023, -1, 4001, 4023, -1, 4006, 4023,
+ -1, 4011, 4023, -1, 3984, 4021, -1, 4133,
+ 4142, -1, 11520, -1, 11521, -1, 11522, -1,
+ 11523, -1, 11524, -1, 11525, -1, 11526, -1,
+ 11527, -1, 11528, -1, 11529, -1, 11530, -1,
+ 11531, -1, 11532, -1, 11533, -1, 11534, -1,
+ 11535, -1, 11536, -1, 11537, -1, 11538, -1,
+ 11539, -1, 11540, -1, 11541, -1, 11542, -1,
+ 11543, -1, 11544, -1, 11545, -1, 11546, -1,
+ 11547, -1, 11548, -1, 11549, -1, 11550, -1,
+ 11551, -1, 11552, -1, 11553, -1, 11554, -1,
+ 11555, -1, 11556, -1, 11557, -1, 4316, -1,
+ 6917, 6965, -1, 6919, 6965, -1, 6921, 6965,
+ -1, 6923, 6965, -1, 6925, 6965, -1, 6929,
+ 6965, -1, 6970, 6965, -1, 6972, 6965, -1,
+ 6974, 6965, -1, 6975, 6965, -1, 6978, 6965,
+ -1, 65, -1, 198, -1, 66, -1, 68,
+ -1, 69, -1, 398, -1, 71, -1, 72,
+ -1, 73, -1, 74, -1, 75, -1, 76,
+ -1, 77, -1, 78, -1, 79, -1, 546,
+ -1, 80, -1, 82, -1, 84, -1, 85,
+ -1, 87, -1, 592, -1, 593, -1, 7426,
+ -1, 604, -1, 7446, -1, 7447, -1, 7453,
+ -1, 7461, -1, 594, -1, 597, -1, 607,
+ -1, 609, -1, 613, -1, 618, -1, 7547,
+ -1, 669, -1, 621, -1, 7557, -1, 671,
+ -1, 625, -1, 624, -1, 627, -1, 628,
+ -1, 632, -1, 642, -1, 427, -1, 7452,
+ -1, 656, -1, 657, -1, 65, 805, -1,
+ 7681, -1, 97, 805, -1, 66, 775, -1,
+ 7683, -1, 98, 775, -1, 66, 803, -1,
+ 7685, -1, 98, 803, -1, 66, 817, -1,
+ 7687, -1, 98, 817, -1, 199, 769, -1,
+ 7689, -1, 231, 769, -1, 68, 775, -1,
+ 7691, -1, 100, 775, -1, 68, 803, -1,
+ 7693, -1, 100, 803, -1, 68, 817, -1,
+ 7695, -1, 100, 817, -1, 68, 807, -1,
+ 7697, -1, 100, 807, -1, 68, 813, -1,
+ 7699, -1, 100, 813, -1, 274, 768, -1,
+ 7701, -1, 275, 768, -1, 274, 769, -1,
+ 7703, -1, 275, 769, -1, 69, 813, -1,
+ 7705, -1, 101, 813, -1, 69, 816, -1,
+ 7707, -1, 101, 816, -1, 552, 774, -1,
+ 7709, -1, 553, 774, -1, 70, 775, -1,
+ 7711, -1, 102, 775, -1, 71, 772, -1,
+ 7713, -1, 103, 772, -1, 72, 775, -1,
+ 7715, -1, 104, 775, -1, 72, 803, -1,
+ 7717, -1, 104, 803, -1, 72, 776, -1,
+ 7719, -1, 104, 776, -1, 72, 807, -1,
+ 7721, -1, 104, 807, -1, 72, 814, -1,
+ 7723, -1, 104, 814, -1, 73, 816, -1,
+ 7725, -1, 105, 816, -1, 207, 769, -1,
+ 7727, -1, 239, 769, -1, 75, 769, -1,
+ 7729, -1, 107, 769, -1, 75, 803, -1,
+ 7731, -1, 107, 803, -1, 75, 817, -1,
+ 7733, -1, 107, 817, -1, 76, 803, -1,
+ 7735, -1, 108, 803, -1, 7734, 772, -1,
+ 7737, -1, 7735, 772, -1, 76, 817, -1,
+ 7739, -1, 108, 817, -1, 76, 813, -1,
+ 7741, -1, 108, 813, -1, 77, 769, -1,
+ 7743, -1, 109, 769, -1, 77, 775, -1,
+ 7745, -1, 109, 775, -1, 77, 803, -1,
+ 7747, -1, 109, 803, -1, 78, 775, -1,
+ 7749, -1, 110, 775, -1, 78, 803, -1,
+ 7751, -1, 110, 803, -1, 78, 817, -1,
+ 7753, -1, 110, 817, -1, 78, 813, -1,
+ 7755, -1, 110, 813, -1, 213, 769, -1,
+ 7757, -1, 245, 769, -1, 213, 776, -1,
+ 7759, -1, 245, 776, -1, 332, 768, -1,
+ 7761, -1, 333, 768, -1, 332, 769, -1,
+ 7763, -1, 333, 769, -1, 80, 769, -1,
+ 7765, -1, 112, 769, -1, 80, 775, -1,
+ 7767, -1, 112, 775, -1, 82, 775, -1,
+ 7769, -1, 114, 775, -1, 82, 803, -1,
+ 7771, -1, 114, 803, -1, 7770, 772, -1,
+ 7773, -1, 7771, 772, -1, 82, 817, -1,
+ 7775, -1, 114, 817, -1, 83, 775, -1,
+ 7777, -1, 115, 775, -1, 83, 803, -1,
+ 7779, -1, 115, 803, -1, 346, 775, -1,
+ 7781, -1, 347, 775, -1, 352, 775, -1,
+ 7783, -1, 353, 775, -1, 7778, 775, -1,
+ 7785, -1, 7779, 775, -1, 84, 775, -1,
+ 7787, -1, 116, 775, -1, 84, 803, -1,
+ 7789, -1, 116, 803, -1, 84, 817, -1,
+ 7791, -1, 116, 817, -1, 84, 813, -1,
+ 7793, -1, 116, 813, -1, 85, 804, -1,
+ 7795, -1, 117, 804, -1, 85, 816, -1,
+ 7797, -1, 117, 816, -1, 85, 813, -1,
+ 7799, -1, 117, 813, -1, 360, 769, -1,
+ 7801, -1, 361, 769, -1, 362, 776, -1,
+ 7803, -1, 363, 776, -1, 86, 771, -1,
+ 7805, -1, 118, 771, -1, 86, 803, -1,
+ 7807, -1, 118, 803, -1, 87, 768, -1,
+ 7809, -1, 119, 768, -1, 87, 769, -1,
+ 7811, -1, 119, 769, -1, 87, 776, -1,
+ 7813, -1, 119, 776, -1, 87, 775, -1,
+ 7815, -1, 119, 775, -1, 87, 803, -1,
+ 7817, -1, 119, 803, -1, 88, 775, -1,
+ 7819, -1, 120, 775, -1, 88, 776, -1,
+ 7821, -1, 120, 776, -1, 89, 775, -1,
+ 7823, -1, 121, 775, -1, 90, 770, -1,
+ 7825, -1, 122, 770, -1, 90, 803, -1,
+ 7827, -1, 122, 803, -1, 90, 817, -1,
+ 7829, -1, 122, 817, -1, 104, 817, -1,
+ 116, 776, -1, 119, 778, -1, 121, 778,
+ -1, 97, 702, -1, 383, 775, -1, 65,
+ 803, -1, 7841, -1, 97, 803, -1, 65,
+ 777, -1, 7843, -1, 97, 777, -1, 194,
+ 769, -1, 7845, -1, 226, 769, -1, 194,
+ 768, -1, 7847, -1, 226, 768, -1, 194,
+ 777, -1, 7849, -1, 226, 777, -1, 194,
+ 771, -1, 7851, -1, 226, 771, -1, 7840,
+ 770, -1, 7853, -1, 7841, 770, -1, 258,
+ 769, -1, 7855, -1, 259, 769, -1, 258,
+ 768, -1, 7857, -1, 259, 768, -1, 258,
+ 777, -1, 7859, -1, 259, 777, -1, 258,
+ 771, -1, 7861, -1, 259, 771, -1, 7840,
+ 774, -1, 7863, -1, 7841, 774, -1, 69,
+ 803, -1, 7865, -1, 101, 803, -1, 69,
+ 777, -1, 7867, -1, 101, 777, -1, 69,
+ 771, -1, 7869, -1, 101, 771, -1, 202,
+ 769, -1, 7871, -1, 234, 769, -1, 202,
+ 768, -1, 7873, -1, 234, 768, -1, 202,
+ 777, -1, 7875, -1, 234, 777, -1, 202,
+ 771, -1, 7877, -1, 234, 771, -1, 7864,
+ 770, -1, 7879, -1, 7865, 770, -1, 73,
+ 777, -1, 7881, -1, 105, 777, -1, 73,
+ 803, -1, 7883, -1, 105, 803, -1, 79,
+ 803, -1, 7885, -1, 111, 803, -1, 79,
+ 777, -1, 7887, -1, 111, 777, -1, 212,
+ 769, -1, 7889, -1, 244, 769, -1, 212,
+ 768, -1, 7891, -1, 244, 768, -1, 212,
+ 777, -1, 7893, -1, 244, 777, -1, 212,
+ 771, -1, 7895, -1, 244, 771, -1, 7884,
+ 770, -1, 7897, -1, 7885, 770, -1, 416,
+ 769, -1, 7899, -1, 417, 769, -1, 416,
+ 768, -1, 7901, -1, 417, 768, -1, 416,
+ 777, -1, 7903, -1, 417, 777, -1, 416,
+ 771, -1, 7905, -1, 417, 771, -1, 416,
+ 803, -1, 7907, -1, 417, 803, -1, 85,
+ 803, -1, 7909, -1, 117, 803, -1, 85,
+ 777, -1, 7911, -1, 117, 777, -1, 431,
+ 769, -1, 7913, -1, 432, 769, -1, 431,
+ 768, -1, 7915, -1, 432, 768, -1, 431,
+ 777, -1, 7917, -1, 432, 777, -1, 431,
+ 771, -1, 7919, -1, 432, 771, -1, 431,
+ 803, -1, 7921, -1, 432, 803, -1, 89,
+ 768, -1, 7923, -1, 121, 768, -1, 89,
+ 803, -1, 7925, -1, 121, 803, -1, 89,
+ 777, -1, 7927, -1, 121, 777, -1, 89,
+ 771, -1, 7929, -1, 121, 771, -1, 945,
+ 787, -1, 945, 788, -1, 7936, 768, -1,
+ 7937, 768, -1, 7936, 769, -1, 7937, 769,
+ -1, 7936, 834, -1, 7937, 834, -1, 913,
+ 787, -1, 7936, -1, 913, 788, -1, 7937,
+ -1, 7944, 768, -1, 7938, -1, 7945, 768,
+ -1, 7939, -1, 7944, 769, -1, 7940, -1,
+ 7945, 769, -1, 7941, -1, 7944, 834, -1,
+ 7942, -1, 7945, 834, -1, 7943, -1, 949,
+ 787, -1, 949, 788, -1, 7952, 768, -1,
+ 7953, 768, -1, 7952, 769, -1, 7953, 769,
+ -1, 917, 787, -1, 7952, -1, 917, 788,
+ -1, 7953, -1, 7960, 768, -1, 7954, -1,
+ 7961, 768, -1, 7955, -1, 7960, 769, -1,
+ 7956, -1, 7961, 769, -1, 7957, -1, 951,
+ 787, -1, 951, 788, -1, 7968, 768, -1,
+ 7969, 768, -1, 7968, 769, -1, 7969, 769,
+ -1, 7968, 834, -1, 7969, 834, -1, 919,
+ 787, -1, 7968, -1, 919, 788, -1, 7969,
+ -1, 7976, 768, -1, 7970, -1, 7977, 768,
+ -1, 7971, -1, 7976, 769, -1, 7972, -1,
+ 7977, 769, -1, 7973, -1, 7976, 834, -1,
+ 7974, -1, 7977, 834, -1, 7975, -1, 953,
+ 787, -1, 953, 788, -1, 7984, 768, -1,
+ 7985, 768, -1, 7984, 769, -1, 7985, 769,
+ -1, 7984, 834, -1, 7985, 834, -1, 921,
+ 787, -1, 7984, -1, 921, 788, -1, 7985,
+ -1, 7992, 768, -1, 7986, -1, 7993, 768,
+ -1, 7987, -1, 7992, 769, -1, 7988, -1,
+ 7993, 769, -1, 7989, -1, 7992, 834, -1,
+ 7990, -1, 7993, 834, -1, 7991, -1, 959,
+ 787, -1, 959, 788, -1, 8000, 768, -1,
+ 8001, 768, -1, 8000, 769, -1, 8001, 769,
+ -1, 927, 787, -1, 8000, -1, 927, 788,
+ -1, 8001, -1, 8008, 768, -1, 8002, -1,
+ 8009, 768, -1, 8003, -1, 8008, 769, -1,
+ 8004, -1, 8009, 769, -1, 8005, -1, 965,
+ 787, -1, 965, 788, -1, 8016, 768, -1,
+ 965, 787, 768, -1, 8017, 768, -1, 8016,
+ 769, -1, 965, 787, 769, -1, 8017, 769,
+ -1, 8016, 834, -1, 965, 787, 834, -1,
+ 8017, 834, -1, 933, 788, -1, 8017, -1,
+ 8025, 768, -1, 8019, -1, 8025, 769, -1,
+ 8021, -1, 8025, 834, -1, 8023, -1, 969,
+ 787, -1, 969, 788, -1, 8032, 768, -1,
+ 8033, 768, -1, 8032, 769, -1, 8033, 769,
+ -1, 8032, 834, -1, 8033, 834, -1, 937,
+ 787, -1, 8032, -1, 937, 788, -1, 8033,
+ -1, 8040, 768, -1, 8034, -1, 8041, 768,
+ -1, 8035, -1, 8040, 769, -1, 8036, -1,
+ 8041, 769, -1, 8037, -1, 8040, 834, -1,
+ 8038, -1, 8041, 834, -1, 8039, -1, 945,
+ 768, -1, 949, 768, -1, 951, 768, -1,
+ 953, 768, -1, 959, 768, -1, 965, 768,
+ -1, 969, 768, -1, 7936, 837, -1, 7936,
+ 953, -1, 7937, 837, -1, 7937, 953, -1,
+ 7938, 837, -1, 7938, 953, -1, 7939, 837,
+ -1, 7939, 953, -1, 7940, 837, -1, 7940,
+ 953, -1, 7941, 837, -1, 7941, 953, -1,
+ 7942, 837, -1, 7942, 953, -1, 7943, 837,
+ -1, 7943, 953, -1, 7944, 837, -1, 8064,
+ -1, 7945, 837, -1, 8065, -1, 7946, 837,
+ -1, 8066, -1, 7947, 837, -1, 8067, -1,
+ 7948, 837, -1, 8068, -1, 7949, 837, -1,
+ 8069, -1, 7950, 837, -1, 8070, -1, 7951,
+ 837, -1, 8071, -1, 7968, 837, -1, 7968,
+ 953, -1, 7969, 837, -1, 7969, 953, -1,
+ 7970, 837, -1, 7970, 953, -1, 7971, 837,
+ -1, 7971, 953, -1, 7972, 837, -1, 7972,
+ 953, -1, 7973, 837, -1, 7973, 953, -1,
+ 7974, 837, -1, 7974, 953, -1, 7975, 837,
+ -1, 7975, 953, -1, 7976, 837, -1, 8080,
+ -1, 7977, 837, -1, 8081, -1, 7978, 837,
+ -1, 8082, -1, 7979, 837, -1, 8083, -1,
+ 7980, 837, -1, 8084, -1, 7981, 837, -1,
+ 8085, -1, 7982, 837, -1, 8086, -1, 7983,
+ 837, -1, 8087, -1, 8032, 837, -1, 8032,
+ 953, -1, 8033, 837, -1, 8033, 953, -1,
+ 8034, 837, -1, 8034, 953, -1, 8035, 837,
+ -1, 8035, 953, -1, 8036, 837, -1, 8036,
+ 953, -1, 8037, 837, -1, 8037, 953, -1,
+ 8038, 837, -1, 8038, 953, -1, 8039, 837,
+ -1, 8039, 953, -1, 8040, 837, -1, 8096,
+ -1, 8041, 837, -1, 8097, -1, 8042, 837,
+ -1, 8098, -1, 8043, 837, -1, 8099, -1,
+ 8044, 837, -1, 8100, -1, 8045, 837, -1,
+ 8101, -1, 8046, 837, -1, 8102, -1, 8047,
+ 837, -1, 8103, -1, 945, 774, -1, 945,
+ 772, -1, 8048, 837, -1, 8048, 953, -1,
+ 945, 837, -1, 945, 953, -1, 940, 837,
+ -1, 940, 953, -1, 945, 834, -1, 8118,
+ 837, -1, 945, 834, 953, -1, 913, 774,
+ -1, 8112, -1, 913, 772, -1, 8113, -1,
+ 913, 768, -1, 8048, -1, 902, -1, 8049,
+ -1, 913, 837, -1, 8115, -1, 32, 787,
+ -1, 32, 834, -1, 168, 834, -1, 8052,
+ 837, -1, 8052, 953, -1, 951, 837, -1,
+ 951, 953, -1, 942, 837, -1, 942, 953,
+ -1, 951, 834, -1, 8134, 837, -1, 951,
+ 834, 953, -1, 917, 768, -1, 8050, -1,
+ 904, -1, 8051, -1, 919, 768, -1, 8052,
+ -1, 905, -1, 8053, -1, 919, 837, -1,
+ 8131, -1, 8127, 768, -1, 8127, 769, -1,
+ 8127, 834, -1, 953, 774, -1, 953, 772,
+ -1, 970, 768, -1, 953, 776, 768, -1,
+ 912, -1, 953, 834, -1, 970, 834, -1,
+ 953, 776, 834, -1, 921, 774, -1, 8144,
+ -1, 921, 772, -1, 8145, -1, 921, 768,
+ -1, 8054, -1, 906, -1, 8055, -1, 8190,
+ 768, -1, 8190, 769, -1, 8190, 834, -1,
+ 965, 774, -1, 965, 772, -1, 971, 768,
+ -1, 965, 776, 768, -1, 944, -1, 961,
+ 787, -1, 961, 788, -1, 965, 834, -1,
+ 971, 834, -1, 965, 776, 834, -1, 933,
+ 774, -1, 8160, -1, 933, 772, -1, 8161,
+ -1, 933, 768, -1, 8058, -1, 910, -1,
+ 8059, -1, 929, 788, -1, 8165, -1, 168,
+ 768, -1, 901, -1, 96, -1, 8060, 837,
+ -1, 8060, 953, -1, 969, 837, -1, 969,
+ 953, -1, 974, 837, -1, 974, 953, -1,
+ 969, 834, -1, 8182, 837, -1, 969, 834,
+ 953, -1, 927, 768, -1, 8056, -1, 908,
+ -1, 8057, -1, 937, 768, -1, 8060, -1,
+ 911, -1, 8061, -1, 937, 837, -1, 8179,
+ -1, 180, -1, 32, 788, -1, 8194, -1,
+ 8195, -1, 8208, -1, 32, 819, -1, 46,
+ -1, 46, 46, -1, 46, 46, 46, -1,
+ 8242, 8242, -1, 8242, 8242, 8242, -1, 8245,
+ 8245, -1, 8245, 8245, 8245, -1, 33, 33,
+ -1, 32, 773, -1, 63, 63, -1, 63,
+ 33, -1, 33, 63, -1, 8242, 8242, 8242,
+ 8242, -1, 48, -1, 52, -1, 53, -1,
+ 54, -1, 55, -1, 56, -1, 57, -1,
+ 43, -1, 8722, -1, 61, -1, 40, -1,
+ 41, -1, 82, 115, -1, 97, 47, 99,
+ -1, 97, 47, 115, -1, 67, -1, 176,
+ 67, -1, 99, 47, 111, -1, 99, 47,
+ 117, -1, 400, -1, 176, 70, -1, 78,
+ 111, -1, 81, -1, 83, 77, -1, 84,
+ 69, 76, -1, 84, 77, -1, 90, -1,
+ 937, -1, 197, -1, 70, -1, 8526, -1,
+ 1488, -1, 1489, -1, 1490, -1, 1491, -1,
+ 70, 65, 88, -1, 915, -1, 928, -1,
+ 8721, -1, 49, 8260, 51, -1, 50, 8260,
+ 51, -1, 49, 8260, 53, -1, 50, 8260,
+ 53, -1, 51, 8260, 53, -1, 52, 8260,
+ 53, -1, 49, 8260, 54, -1, 53, 8260,
+ 54, -1, 49, 8260, 56, -1, 51, 8260,
+ 56, -1, 53, 8260, 56, -1, 55, 8260,
+ 56, -1, 49, 8260, -1, 8560, -1, 73,
+ 73, -1, 8561, -1, 73, 73, 73, -1,
+ 8562, -1, 73, 86, -1, 8563, -1, 86,
+ -1, 8564, -1, 86, 73, -1, 8565, -1,
+ 86, 73, 73, -1, 8566, -1, 86, 73,
+ 73, 73, -1, 8567, -1, 73, 88, -1,
+ 8568, -1, 88, -1, 8569, -1, 88, 73,
+ -1, 8570, -1, 88, 73, 73, -1, 8571,
+ -1, 8572, -1, 8573, -1, 8574, -1, 8575,
+ -1, 105, 105, -1, 105, 105, 105, -1,
+ 105, 118, -1, 118, 105, -1, 118, 105,
+ 105, -1, 118, 105, 105, 105, -1, 105,
+ 120, -1, 120, 105, -1, 120, 105, 105,
+ -1, 8580, -1, 8592, 824, -1, 8594, 824,
+ -1, 8596, 824, -1, 8656, 824, -1, 8660,
+ 824, -1, 8658, 824, -1, 8707, 824, -1,
+ 8712, 824, -1, 8715, 824, -1, 8739, 824,
+ -1, 8741, 824, -1, 8747, 8747, -1, 8747,
+ 8747, 8747, -1, 8750, 8750, -1, 8750, 8750,
+ 8750, -1, 8764, 824, -1, 8771, 824, -1,
+ 8773, 824, -1, 8776, 824, -1, 61, 824,
+ -1, 8801, 824, -1, 8781, 824, -1, 60,
+ 824, -1, 62, 824, -1, 8804, 824, -1,
+ 8805, 824, -1, 8818, 824, -1, 8819, 824,
+ -1, 8822, 824, -1, 8823, 824, -1, 8826,
+ 824, -1, 8827, 824, -1, 8834, 824, -1,
+ 8835, 824, -1, 8838, 824, -1, 8839, 824,
+ -1, 8866, 824, -1, 8872, 824, -1, 8873,
+ 824, -1, 8875, 824, -1, 8828, 824, -1,
+ 8829, 824, -1, 8849, 824, -1, 8850, 824,
+ -1, 8882, 824, -1, 8883, 824, -1, 8884,
+ 824, -1, 8885, 824, -1, 12296, -1, 12297,
+ -1, 49, 48, -1, 49, 49, -1, 49,
+ 50, -1, 49, 51, -1, 49, 52, -1,
+ 49, 53, -1, 49, 54, -1, 49, 55,
+ -1, 49, 56, -1, 49, 57, -1, 50,
+ 48, -1, 40, 49, 41, -1, 40, 50,
+ 41, -1, 40, 51, 41, -1, 40, 52,
+ 41, -1, 40, 53, 41, -1, 40, 54,
+ 41, -1, 40, 55, 41, -1, 40, 56,
+ 41, -1, 40, 57, 41, -1, 40, 49,
+ 48, 41, -1, 40, 49, 49, 41, -1,
+ 40, 49, 50, 41, -1, 40, 49, 51,
+ 41, -1, 40, 49, 52, 41, -1, 40,
+ 49, 53, 41, -1, 40, 49, 54, 41,
+ -1, 40, 49, 55, 41, -1, 40, 49,
+ 56, 41, -1, 40, 49, 57, 41, -1,
+ 40, 50, 48, 41, -1, 49, 46, -1,
+ 50, 46, -1, 51, 46, -1, 52, 46,
+ -1, 53, 46, -1, 54, 46, -1, 55,
+ 46, -1, 56, 46, -1, 57, 46, -1,
+ 49, 48, 46, -1, 49, 49, 46, -1,
+ 49, 50, 46, -1, 49, 51, 46, -1,
+ 49, 52, 46, -1, 49, 53, 46, -1,
+ 49, 54, 46, -1, 49, 55, 46, -1,
+ 49, 56, 46, -1, 49, 57, 46, -1,
+ 50, 48, 46, -1, 40, 97, 41, -1,
+ 40, 98, 41, -1, 40, 99, 41, -1,
+ 40, 100, 41, -1, 40, 101, 41, -1,
+ 40, 102, 41, -1, 40, 103, 41, -1,
+ 40, 104, 41, -1, 40, 105, 41, -1,
+ 40, 106, 41, -1, 40, 107, 41, -1,
+ 40, 108, 41, -1, 40, 109, 41, -1,
+ 40, 110, 41, -1, 40, 111, 41, -1,
+ 40, 112, 41, -1, 40, 113, 41, -1,
+ 40, 114, 41, -1, 40, 115, 41, -1,
+ 40, 116, 41, -1, 40, 117, 41, -1,
+ 40, 118, 41, -1, 40, 119, 41, -1,
+ 40, 120, 41, -1, 40, 121, 41, -1,
+ 40, 122, 41, -1, 9424, -1, 9425, -1,
+ 9426, -1, 9427, -1, 9428, -1, 9429, -1,
+ 9430, -1, 9431, -1, 9432, -1, 9433, -1,
+ 9434, -1, 9435, -1, 9436, -1, 9437, -1,
+ 9438, -1, 9439, -1, 9440, -1, 9441, -1,
+ 83, -1, 9442, -1, 9443, -1, 9444, -1,
+ 9445, -1, 9446, -1, 9447, -1, 89, -1,
+ 9448, -1, 9449, -1, 8747, 8747, 8747, 8747,
+ -1, 58, 58, 61, -1, 61, 61, -1,
+ 61, 61, 61, -1, 10973, 824, -1, 11312,
+ -1, 11313, -1, 11314, -1, 11315, -1, 11316,
+ -1, 11317, -1, 11318, -1, 11319, -1, 11320,
+ -1, 11321, -1, 11322, -1, 11323, -1, 11324,
+ -1, 11325, -1, 11326, -1, 11327, -1, 11328,
+ -1, 11329, -1, 11330, -1, 11331, -1, 11332,
+ -1, 11333, -1, 11334, -1, 11335, -1, 11336,
+ -1, 11337, -1, 11338, -1, 11339, -1, 11340,
+ -1, 11341, -1, 11342, -1, 11343, -1, 11344,
+ -1, 11345, -1, 11346, -1, 11347, -1, 11348,
+ -1, 11349, -1, 11350, -1, 11351, -1, 11352,
+ -1, 11353, -1, 11354, -1, 11355, -1, 11356,
+ -1, 11357, -1, 11358, -1, 11361, -1, 619,
+ -1, 7549, -1, 637, -1, 11368, -1, 11370,
+ -1, 11372, -1, 11382, -1, 11393, -1, 11395,
+ -1, 11397, -1, 11399, -1, 11401, -1, 11403,
+ -1, 11405, -1, 11407, -1, 11409, -1, 11411,
+ -1, 11413, -1, 11415, -1, 11417, -1, 11419,
+ -1, 11421, -1, 11423, -1, 11425, -1, 11427,
+ -1, 11429, -1, 11431, -1, 11433, -1, 11435,
+ -1, 11437, -1, 11439, -1, 11441, -1, 11443,
+ -1, 11445, -1, 11447, -1, 11449, -1, 11451,
+ -1, 11453, -1, 11455, -1, 11457, -1, 11459,
+ -1, 11461, -1, 11463, -1, 11465, -1, 11467,
+ -1, 11469, -1, 11471, -1, 11473, -1, 11475,
+ -1, 11477, -1, 11479, -1, 11481, -1, 11483,
+ -1, 11485, -1, 11487, -1, 11489, -1, 11491,
+ -1, 11617, -1, 27597, -1, 40863, -1, 19968,
+ -1, 20008, -1, 20022, -1, 20031, -1, 20057,
+ -1, 20101, -1, 20108, -1, 20128, -1, 20154,
+ -1, 20799, -1, 20837, -1, 20843, -1, 20866,
+ -1, 20886, -1, 20907, -1, 20960, -1, 20981,
+ -1, 20992, -1, 21147, -1, 21241, -1, 21269,
+ -1, 21274, -1, 21304, -1, 21313, -1, 21340,
+ -1, 21353, -1, 21378, -1, 21430, -1, 21448,
+ -1, 21475, -1, 22231, -1, 22303, -1, 22763,
+ -1, 22786, -1, 22794, -1, 22805, -1, 22823,
+ -1, 22899, -1, 23376, -1, 23424, -1, 23544,
+ -1, 23567, -1, 23586, -1, 23608, -1, 23662,
+ -1, 23665, -1, 24027, -1, 24037, -1, 24049,
+ -1, 24062, -1, 24178, -1, 24186, -1, 24191,
+ -1, 24308, -1, 24318, -1, 24331, -1, 24339,
+ -1, 24400, -1, 24417, -1, 24435, -1, 24515,
+ -1, 25096, -1, 25142, -1, 25163, -1, 25903,
+ -1, 25908, -1, 25991, -1, 26007, -1, 26020,
+ -1, 26041, -1, 26080, -1, 26085, -1, 26352,
+ -1, 26376, -1, 26408, -1, 27424, -1, 27490,
+ -1, 27513, -1, 27571, -1, 27595, -1, 27604,
+ -1, 27611, -1, 27663, -1, 27668, -1, 27700,
+ -1, 28779, -1, 29226, -1, 29238, -1, 29243,
+ -1, 29247, -1, 29255, -1, 29273, -1, 29275,
+ -1, 29356, -1, 29572, -1, 29577, -1, 29916,
+ -1, 29926, -1, 29976, -1, 29983, -1, 29992,
+ -1, 30000, -1, 30091, -1, 30098, -1, 30326,
+ -1, 30333, -1, 30382, -1, 30399, -1, 30446,
+ -1, 30683, -1, 30690, -1, 30707, -1, 31034,
+ -1, 31160, -1, 31166, -1, 31348, -1, 31435,
+ -1, 31481, -1, 31859, -1, 31992, -1, 32566,
+ -1, 32593, -1, 32650, -1, 32701, -1, 32769,
+ -1, 32780, -1, 32786, -1, 32819, -1, 32895,
+ -1, 32905, -1, 33251, -1, 33258, -1, 33267,
+ -1, 33276, -1, 33292, -1, 33307, -1, 33311,
+ -1, 33390, -1, 33394, -1, 33400, -1, 34381,
+ -1, 34411, -1, 34880, -1, 34892, -1, 34915,
+ -1, 35198, -1, 35211, -1, 35282, -1, 35328,
+ -1, 35895, -1, 35910, -1, 35925, -1, 35960,
+ -1, 35997, -1, 36196, -1, 36208, -1, 36275,
+ -1, 36523, -1, 36554, -1, 36763, -1, 36784,
+ -1, 36789, -1, 37009, -1, 37193, -1, 37318,
+ -1, 37324, -1, 37329, -1, 38263, -1, 38272,
+ -1, 38428, -1, 38582, -1, 38585, -1, 38632,
+ -1, 38737, -1, 38750, -1, 38754, -1, 38761,
+ -1, 38859, -1, 38893, -1, 38899, -1, 38913,
+ -1, 39080, -1, 39131, -1, 39135, -1, 39318,
+ -1, 39321, -1, 39340, -1, 39592, -1, 39640,
+ -1, 39647, -1, 39717, -1, 39727, -1, 39730,
+ -1, 39740, -1, 39770, -1, 40165, -1, 40565,
+ -1, 40575, -1, 40613, -1, 40635, -1, 40643,
+ -1, 40653, -1, 40657, -1, 40697, -1, 40701,
+ -1, 40718, -1, 40723, -1, 40736, -1, 40763,
+ -1, 40778, -1, 40786, -1, 40845, -1, 40860,
+ -1, 40864, -1, 12306, -1, 21316, -1, 21317,
+ -1, 12363, 12441, -1, 12365, 12441, -1, 12367,
+ 12441, -1, 12369, 12441, -1, 12371, 12441, -1,
+ 12373, 12441, -1, 12375, 12441, -1, 12377, 12441,
+ -1, 12379, 12441, -1, 12381, 12441, -1, 12383,
+ 12441, -1, 12385, 12441, -1, 12388, 12441, -1,
+ 12390, 12441, -1, 12392, 12441, -1, 12399, 12441,
+ -1, 12399, 12442, -1, 12402, 12441, -1, 12402,
+ 12442, -1, 12405, 12441, -1, 12405, 12442, -1,
+ 12408, 12441, -1, 12408, 12442, -1, 12411, 12441,
+ -1, 12411, 12442, -1, 12358, 12441, -1, 32,
+ 12441, -1, 32, 12442, -1, 12445, 12441, -1,
+ 12424, 12426, -1, 12459, 12441, -1, 12461, 12441,
+ -1, 12463, 12441, -1, 12465, 12441, -1, 12467,
+ 12441, -1, 12469, 12441, -1, 12471, 12441, -1,
+ 12473, 12441, -1, 12475, 12441, -1, 12477, 12441,
+ -1, 12479, 12441, -1, 12481, 12441, -1, 12484,
+ 12441, -1, 12486, 12441, -1, 12488, 12441, -1,
+ 12495, 12441, -1, 12495, 12442, -1, 12498, 12441,
+ -1, 12498, 12442, -1, 12501, 12441, -1, 12501,
+ 12442, -1, 12504, 12441, -1, 12504, 12442, -1,
+ 12507, 12441, -1, 12507, 12442, -1, 12454, 12441,
+ -1, 12527, 12441, -1, 12528, 12441, -1, 12529,
+ 12441, -1, 12530, 12441, -1, 12541, 12441, -1,
+ 12467, 12488, -1, 4352, -1, 4353, -1, 4522,
+ -1, 4354, -1, 4524, -1, 4525, -1, 4355,
+ -1, 4356, -1, 4357, -1, 4528, -1, 4529,
+ -1, 4530, -1, 4531, -1, 4532, -1, 4533,
+ -1, 4378, -1, 4358, -1, 4359, -1, 4360,
+ -1, 4385, -1, 4361, -1, 4362, -1, 4363,
+ -1, 4364, -1, 4365, -1, 4366, -1, 4367,
+ -1, 4368, -1, 4369, -1, 4370, -1, 4449,
+ -1, 4450, -1, 4451, -1, 4452, -1, 4453,
+ -1, 4454, -1, 4455, -1, 4456, -1, 4457,
+ -1, 4458, -1, 4459, -1, 4460, -1, 4461,
+ -1, 4462, -1, 4463, -1, 4464, -1, 4465,
+ -1, 4466, -1, 4467, -1, 4468, -1, 4469,
+ -1, 4448, -1, 4372, -1, 4373, -1, 4551,
+ -1, 4552, -1, 4556, -1, 4558, -1, 4563,
+ -1, 4567, -1, 4569, -1, 4380, -1, 4573,
+ -1, 4575, -1, 4381, -1, 4382, -1, 4384,
+ -1, 4386, -1, 4387, -1, 4391, -1, 4393,
+ -1, 4395, -1, 4396, -1, 4397, -1, 4398,
+ -1, 4399, -1, 4402, -1, 4406, -1, 4416,
+ -1, 4423, -1, 4428, -1, 4593, -1, 4594,
+ -1, 4439, -1, 4440, -1, 4441, -1, 4484,
+ -1, 4485, -1, 4488, -1, 4497, -1, 4498,
+ -1, 4500, -1, 4510, -1, 4513, -1, 19977,
+ -1, 22235, -1, 19978, -1, 20013, -1, 19979,
+ -1, 30002, -1, 19993, -1, 19969, -1, 22825,
+ -1, 22320, -1, 40, 4352, 41, -1, 40,
+ 4354, 41, -1, 40, 4355, 41, -1, 40,
+ 4357, 41, -1, 40, 4358, 41, -1, 40,
+ 4359, 41, -1, 40, 4361, 41, -1, 40,
+ 4363, 41, -1, 40, 4364, 41, -1, 40,
+ 4366, 41, -1, 40, 4367, 41, -1, 40,
+ 4368, 41, -1, 40, 4369, 41, -1, 40,
+ 4370, 41, -1, 40, 4352, 4449, 41, -1,
+ 40, 4354, 4449, 41, -1, 40, 4355, 4449,
+ 41, -1, 40, 4357, 4449, 41, -1, 40,
+ 4358, 4449, 41, -1, 40, 4359, 4449, 41,
+ -1, 40, 4361, 4449, 41, -1, 40, 4363,
+ 4449, 41, -1, 40, 4364, 4449, 41, -1,
+ 40, 4366, 4449, 41, -1, 40, 4367, 4449,
+ 41, -1, 40, 4368, 4449, 41, -1, 40,
+ 4369, 4449, 41, -1, 40, 4370, 4449, 41,
+ -1, 40, 4364, 4462, 41, -1, 40, 4363,
+ 4457, 4364, 4453, 4523, 41, -1, 40, 4363,
+ 4457, 4370, 4462, 41, -1, 40, 19968, 41,
+ -1, 40, 20108, 41, -1, 40, 19977, 41,
+ -1, 40, 22235, 41, -1, 40, 20116, 41,
+ -1, 40, 20845, 41, -1, 40, 19971, 41,
+ -1, 40, 20843, 41, -1, 40, 20061, 41,
+ -1, 40, 21313, 41, -1, 40, 26376, 41,
+ -1, 40, 28779, 41, -1, 40, 27700, 41,
+ -1, 40, 26408, 41, -1, 40, 37329, 41,
+ -1, 40, 22303, 41, -1, 40, 26085, 41,
+ -1, 40, 26666, 41, -1, 40, 26377, 41,
+ -1, 40, 31038, 41, -1, 40, 21517, 41,
+ -1, 40, 29305, 41, -1, 40, 36001, 41,
+ -1, 40, 31069, 41, -1, 40, 21172, 41,
+ -1, 40, 20195, 41, -1, 40, 21628, 41,
+ -1, 40, 23398, 41, -1, 40, 30435, 41,
+ -1, 40, 20225, 41, -1, 40, 36039, 41,
+ -1, 40, 21332, 41, -1, 40, 31085, 41,
+ -1, 40, 20241, 41, -1, 40, 33258, 41,
+ -1, 40, 33267, 41, -1, 80, 84, 69,
+ -1, 50, 49, -1, 50, 50, -1, 50,
+ 51, -1, 50, 52, -1, 50, 53, -1,
+ 50, 54, -1, 50, 55, -1, 50, 56,
+ -1, 50, 57, -1, 51, 48, -1, 51,
+ 49, -1, 51, 50, -1, 51, 51, -1,
+ 51, 52, -1, 51, 53, -1, 4352, 4449,
+ -1, 4354, 4449, -1, 4355, 4449, -1, 4357,
+ 4449, -1, 4358, 4449, -1, 4359, 4449, -1,
+ 4361, 4449, -1, 4363, 4449, -1, 4364, 4449,
+ -1, 4366, 4449, -1, 4367, 4449, -1, 4368,
+ 4449, -1, 4369, 4449, -1, 4370, 4449, -1,
+ 4366, 4449, 4535, 4352, 4457, -1, 4364, 4462,
+ 4363, 4468, -1, 4363, 4462, -1, 20116, -1,
+ 20845, -1, 19971, -1, 20061, -1, 26666, -1,
+ 26377, -1, 31038, -1, 21517, -1, 29305, -1,
+ 36001, -1, 31069, -1, 21172, -1, 31192, -1,
+ 30007, -1, 36969, -1, 20778, -1, 21360, -1,
+ 27880, -1, 38917, -1, 20241, -1, 20889, -1,
+ 27491, -1, 24038, -1, 21491, -1, 21307, -1,
+ 23447, -1, 23398, -1, 30435, -1, 20225, -1,
+ 36039, -1, 21332, -1, 22812, -1, 51, 54,
+ -1, 51, 55, -1, 51, 56, -1, 51,
+ 57, -1, 52, 48, -1, 52, 49, -1,
+ 52, 50, -1, 52, 51, -1, 52, 52,
+ -1, 52, 53, -1, 52, 54, -1, 52,
+ 55, -1, 52, 56, -1, 52, 57, -1,
+ 53, 48, -1, 49, 26376, -1, 50, 26376,
+ -1, 51, 26376, -1, 52, 26376, -1, 53,
+ 26376, -1, 54, 26376, -1, 55, 26376, -1,
+ 56, 26376, -1, 57, 26376, -1, 49, 48,
+ 26376, -1, 49, 49, 26376, -1, 49, 50,
+ 26376, -1, 72, 103, -1, 101, 114, 103,
+ -1, 101, 86, -1, 76, 84, 68, -1,
+ 12450, -1, 12452, -1, 12454, -1, 12456, -1,
+ 12458, -1, 12459, -1, 12461, -1, 12463, -1,
+ 12465, -1, 12467, -1, 12469, -1, 12471, -1,
+ 12473, -1, 12475, -1, 12477, -1, 12479, -1,
+ 12481, -1, 12484, -1, 12486, -1, 12488, -1,
+ 12490, -1, 12491, -1, 12492, -1, 12493, -1,
+ 12494, -1, 12495, -1, 12498, -1, 12501, -1,
+ 12504, -1, 12507, -1, 12510, -1, 12511, -1,
+ 12512, -1, 12513, -1, 12514, -1, 12516, -1,
+ 12518, -1, 12520, -1, 12521, -1, 12522, -1,
+ 12523, -1, 12524, -1, 12525, -1, 12527, -1,
+ 12528, -1, 12529, -1, 12530, -1, 12450, 12497,
+ 12540, 12488, -1, 12450, 12523, 12501, 12449, -1,
+ 12450, 12531, 12506, 12450, -1, 12450, 12540, 12523,
+ -1, 12452, 12491, 12531, 12464, -1, 12452, 12531,
+ 12481, -1, 12454, 12457, 12531, -1, 12456, 12473,
+ 12463, 12540, 12489, -1, 12456, 12540, 12459, 12540,
+ -1, 12458, 12531, 12473, -1, 12458, 12540, 12512,
+ -1, 12459, 12452, 12522, -1, 12459, 12521, 12483,
+ 12488, -1, 12459, 12525, 12522, 12540, -1, 12460,
+ 12525, 12531, -1, 12460, 12531, 12510, -1, 12462,
+ 12460, -1, 12462, 12491, 12540, -1, 12461, 12517,
+ 12522, 12540, -1, 12462, 12523, 12480, 12540, -1,
+ 12461, 12525, -1, 12461, 12525, 12464, 12521, 12512,
+ -1, 12461, 12525, 12513, 12540, 12488, 12523, -1,
+ 12461, 12525, 12527, 12483, 12488, -1, 12464, 12521,
+ 12512, -1, 12464, 12521, 12512, 12488, 12531, -1,
+ 12463, 12523, 12476, 12452, 12525, -1, 12463, 12525,
+ 12540, 12493, -1, 12465, 12540, 12473, -1, 12467,
+ 12523, 12490, -1, 12467, 12540, 12509, -1, 12469,
+ 12452, 12463, 12523, -1, 12469, 12531, 12481, 12540,
+ 12512, -1, 12471, 12522, 12531, 12464, -1, 12475,
+ 12531, 12481, -1, 12475, 12531, 12488, -1, 12480,
+ 12540, 12473, -1, 12487, 12471, -1, 12489, 12523,
+ -1, 12488, 12531, -1, 12490, 12494, -1, 12494,
+ 12483, 12488, -1, 12495, 12452, 12484, -1, 12497,
+ 12540, 12475, 12531, 12488, -1, 12497, 12540, 12484,
+ -1, 12496, 12540, 12524, 12523, -1, 12500, 12450,
+ 12473, 12488, 12523, -1, 12500, 12463, 12523, -1,
+ 12500, 12467, -1, 12499, 12523, -1, 12501, 12449,
+ 12521, 12483, 12489, -1, 12501, 12451, 12540, 12488,
+ -1, 12502, 12483, 12471, 12455, 12523, -1, 12501,
+ 12521, 12531, -1, 12504, 12463, 12479, 12540, 12523,
+ -1, 12506, 12477, -1, 12506, 12491, 12498, -1,
+ 12504, 12523, 12484, -1, 12506, 12531, 12473, -1,
+ 12506, 12540, 12472, -1, 12505, 12540, 12479, -1,
+ 12509, 12452, 12531, 12488, -1, 12508, 12523, 12488,
+ -1, 12507, 12531, -1, 12509, 12531, 12489, -1,
+ 12507, 12540, 12523, -1, 12507, 12540, 12531, -1,
+ 12510, 12452, 12463, 12525, -1, 12510, 12452, 12523,
+ -1, 12510, 12483, 12495, -1, 12510, 12523, 12463,
+ -1, 12510, 12531, 12471, 12519, 12531, -1, 12511,
+ 12463, 12525, 12531, -1, 12511, 12522, -1, 12511,
+ 12522, 12496, 12540, 12523, -1, 12513, 12460, -1,
+ 12513, 12460, 12488, 12531, -1, 12513, 12540, 12488,
+ 12523, -1, 12516, 12540, 12489, -1, 12516, 12540,
+ 12523, -1, 12518, 12450, 12531, -1, 12522, 12483,
+ 12488, 12523, -1, 12522, 12521, -1, 12523, 12500,
+ 12540, -1, 12523, 12540, 12502, 12523, -1, 12524,
+ 12512, -1, 12524, 12531, 12488, 12466, 12531, -1,
+ 12527, 12483, 12488, -1, 48, 28857, -1, 49,
+ 28857, -1, 50, 28857, -1, 51, 28857, -1,
+ 52, 28857, -1, 53, 28857, -1, 54, 28857,
+ -1, 55, 28857, -1, 56, 28857, -1, 57,
+ 28857, -1, 49, 48, 28857, -1, 49, 49,
+ 28857, -1, 49, 50, 28857, -1, 49, 51,
+ 28857, -1, 49, 52, 28857, -1, 49, 53,
+ 28857, -1, 49, 54, 28857, -1, 49, 55,
+ 28857, -1, 49, 56, 28857, -1, 49, 57,
+ 28857, -1, 50, 48, 28857, -1, 50, 49,
+ 28857, -1, 50, 50, 28857, -1, 50, 51,
+ 28857, -1, 50, 52, 28857, -1, 104, 80,
+ 97, -1, 100, 97, -1, 65, 85, -1,
+ 98, 97, 114, -1, 111, 86, -1, 112,
+ 99, -1, 100, 109, -1, 100, 109, 178,
+ -1, 100, 109, 179, -1, 73, 85, -1,
+ 24179, 25104, -1, 26157, 21644, -1, 22823, 27491,
+ -1, 26126, 27835, -1, 26666, 24335, 20250, 31038,
+ -1, 112, 65, -1, 110, 65, -1, 956,
+ 65, -1, 109, 65, -1, 107, 65, -1,
+ 75, 66, -1, 77, 66, -1, 71, 66,
+ -1, 99, 97, 108, -1, 107, 99, 97,
+ 108, -1, 112, 70, -1, 110, 70, -1,
+ 956, 70, -1, 956, 103, -1, 109, 103,
+ -1, 107, 103, -1, 72, 122, -1, 107,
+ 72, 122, -1, 77, 72, 122, -1, 71,
+ 72, 122, -1, 84, 72, 122, -1, 956,
+ 8467, -1, 109, 8467, -1, 100, 8467, -1,
+ 107, 8467, -1, 102, 109, -1, 110, 109,
+ -1, 956, 109, -1, 109, 109, -1, 99,
+ 109, -1, 107, 109, -1, 109, 109, 178,
+ -1, 99, 109, 178, -1, 109, 178, -1,
+ 107, 109, 178, -1, 109, 109, 179, -1,
+ 99, 109, 179, -1, 109, 179, -1, 107,
+ 109, 179, -1, 109, 8725, 115, -1, 109,
+ 8725, 115, 178, -1, 80, 97, -1, 107,
+ 80, 97, -1, 77, 80, 97, -1, 71,
+ 80, 97, -1, 114, 97, 100, -1, 114,
+ 97, 100, 8725, 115, -1, 114, 97, 100,
+ 8725, 115, 178, -1, 112, 115, -1, 110,
+ 115, -1, 956, 115, -1, 109, 115, -1,
+ 112, 86, -1, 110, 86, -1, 956, 86,
+ -1, 109, 86, -1, 107, 86, -1, 77,
+ 86, -1, 112, 87, -1, 110, 87, -1,
+ 956, 87, -1, 109, 87, -1, 107, 87,
+ -1, 77, 87, -1, 107, 937, -1, 77,
+ 937, -1, 97, 46, 109, 46, -1, 66,
+ 113, -1, 99, 99, -1, 99, 100, -1,
+ 67, 8725, 107, 103, -1, 67, 111, 46,
+ -1, 100, 66, -1, 71, 121, -1, 104,
+ 97, -1, 72, 80, -1, 105, 110, -1,
+ 75, 75, -1, 75, 77, -1, 107, 116,
+ -1, 108, 109, -1, 108, 110, -1, 108,
+ 111, 103, -1, 108, 120, -1, 109, 98,
+ -1, 109, 105, 108, -1, 109, 111, 108,
+ -1, 80, 72, -1, 112, 46, 109, 46,
+ -1, 80, 80, 77, -1, 80, 82, -1,
+ 115, 114, -1, 83, 118, -1, 87, 98,
+ -1, 86, 8725, 109, -1, 65, 8725, 109,
+ -1, 49, 26085, -1, 50, 26085, -1, 51,
+ 26085, -1, 52, 26085, -1, 53, 26085, -1,
+ 54, 26085, -1, 55, 26085, -1, 56, 26085,
+ -1, 57, 26085, -1, 49, 48, 26085, -1,
+ 49, 49, 26085, -1, 49, 50, 26085, -1,
+ 49, 51, 26085, -1, 49, 52, 26085, -1,
+ 49, 53, 26085, -1, 49, 54, 26085, -1,
+ 49, 55, 26085, -1, 49, 56, 26085, -1,
+ 49, 57, 26085, -1, 50, 48, 26085, -1,
+ 50, 49, 26085, -1, 50, 50, 26085, -1,
+ 50, 51, 26085, -1, 50, 52, 26085, -1,
+ 50, 53, 26085, -1, 50, 54, 26085, -1,
+ 50, 55, 26085, -1, 50, 56, 26085, -1,
+ 50, 57, 26085, -1, 51, 48, 26085, -1,
+ 51, 49, 26085, -1, 103, 97, 108, -1,
+ 35912, -1, 26356, -1, 36040, -1, 28369, -1,
+ 20018, -1, 21477, -1, 22865, -1, 21895, -1,
+ 22856, -1, 25078, -1, 30313, -1, 32645, -1,
+ 34367, -1, 34746, -1, 35064, -1, 37007, -1,
+ 27138, -1, 27931, -1, 28889, -1, 29662, -1,
+ 33853, -1, 37226, -1, 39409, -1, 20098, -1,
+ 21365, -1, 27396, -1, 29211, -1, 34349, -1,
+ 40478, -1, 23888, -1, 28651, -1, 34253, -1,
+ 35172, -1, 25289, -1, 33240, -1, 34847, -1,
+ 24266, -1, 26391, -1, 28010, -1, 29436, -1,
+ 37070, -1, 20358, -1, 20919, -1, 21214, -1,
+ 25796, -1, 27347, -1, 29200, -1, 30439, -1,
+ 34310, -1, 34396, -1, 36335, -1, 38706, -1,
+ 39791, -1, 40442, -1, 30860, -1, 31103, -1,
+ 32160, -1, 33737, -1, 37636, -1, 35542, -1,
+ 22751, -1, 24324, -1, 31840, -1, 32894, -1,
+ 29282, -1, 30922, -1, 36034, -1, 38647, -1,
+ 22744, -1, 23650, -1, 27155, -1, 28122, -1,
+ 28431, -1, 32047, -1, 32311, -1, 38475, -1,
+ 21202, -1, 32907, -1, 20956, -1, 20940, -1,
+ 31260, -1, 32190, -1, 33777, -1, 38517, -1,
+ 35712, -1, 25295, -1, 35582, -1, 20025, -1,
+ 23527, -1, 24594, -1, 29575, -1, 30064, -1,
+ 21271, -1, 30971, -1, 20415, -1, 24489, -1,
+ 19981, -1, 27852, -1, 25976, -1, 32034, -1,
+ 21443, -1, 22622, -1, 30465, -1, 33865, -1,
+ 35498, -1, 27578, -1, 27784, -1, 25342, -1,
+ 33509, -1, 25504, -1, 30053, -1, 20142, -1,
+ 20841, -1, 20937, -1, 26753, -1, 31975, -1,
+ 33391, -1, 35538, -1, 37327, -1, 21237, -1,
+ 21570, -1, 24300, -1, 26053, -1, 28670, -1,
+ 31018, -1, 38317, -1, 39530, -1, 40599, -1,
+ 40654, -1, 26310, -1, 27511, -1, 36706, -1,
+ 24180, -1, 24976, -1, 25088, -1, 25754, -1,
+ 28451, -1, 29001, -1, 29833, -1, 31178, -1,
+ 32244, -1, 32879, -1, 36646, -1, 34030, -1,
+ 36899, -1, 37706, -1, 21015, -1, 21155, -1,
+ 21693, -1, 28872, -1, 35010, -1, 24265, -1,
+ 24565, -1, 25467, -1, 27566, -1, 31806, -1,
+ 29557, -1, 20196, -1, 22265, -1, 23994, -1,
+ 24604, -1, 29618, -1, 29801, -1, 32666, -1,
+ 32838, -1, 37428, -1, 38646, -1, 38728, -1,
+ 38936, -1, 20363, -1, 31150, -1, 37300, -1,
+ 38584, -1, 24801, -1, 20102, -1, 20698, -1,
+ 23534, -1, 23615, -1, 26009, -1, 29134, -1,
+ 30274, -1, 34044, -1, 36988, -1, 26248, -1,
+ 38446, -1, 21129, -1, 26491, -1, 26611, -1,
+ 27969, -1, 28316, -1, 29705, -1, 30041, -1,
+ 30827, -1, 32016, -1, 39006, -1, 25134, -1,
+ 38520, -1, 20523, -1, 23833, -1, 28138, -1,
+ 36650, -1, 24459, -1, 24900, -1, 26647, -1,
+ 38534, -1, 21033, -1, 21519, -1, 23653, -1,
+ 26131, -1, 26446, -1, 26792, -1, 27877, -1,
+ 29702, -1, 30178, -1, 32633, -1, 35023, -1,
+ 35041, -1, 38626, -1, 21311, -1, 28346, -1,
+ 21533, -1, 29136, -1, 29848, -1, 34298, -1,
+ 38563, -1, 40023, -1, 40607, -1, 26519, -1,
+ 28107, -1, 33256, -1, 31520, -1, 31890, -1,
+ 29376, -1, 28825, -1, 35672, -1, 20160, -1,
+ 33590, -1, 21050, -1, 20999, -1, 24230, -1,
+ 25299, -1, 31958, -1, 23429, -1, 27934, -1,
+ 26292, -1, 36667, -1, 38477, -1, 24275, -1,
+ 20800, -1, 21952, -1, 22618, -1, 26228, -1,
+ 20958, -1, 29482, -1, 30410, -1, 31036, -1,
+ 31070, -1, 31077, -1, 31119, -1, 38742, -1,
+ 31934, -1, 34322, -1, 35576, -1, 36920, -1,
+ 37117, -1, 39151, -1, 39164, -1, 39208, -1,
+ 40372, -1, 20398, -1, 20711, -1, 20813, -1,
+ 21193, -1, 21220, -1, 21329, -1, 21917, -1,
+ 22022, -1, 22120, -1, 22592, -1, 22696, -1,
+ 23652, -1, 24724, -1, 24936, -1, 24974, -1,
+ 25074, -1, 25935, -1, 26082, -1, 26257, -1,
+ 26757, -1, 28023, -1, 28186, -1, 28450, -1,
+ 29038, -1, 29227, -1, 29730, -1, 30865, -1,
+ 31049, -1, 31048, -1, 31056, -1, 31062, -1,
+ 31117, -1, 31118, -1, 31296, -1, 31361, -1,
+ 31680, -1, 32265, -1, 32321, -1, 32626, -1,
+ 32773, -1, 33261, -1, 33401, -1, 33879, -1,
+ 35088, -1, 35222, -1, 35585, -1, 35641, -1,
+ 36051, -1, 36104, -1, 36790, -1, 38627, -1,
+ 38911, -1, 38971, -1, 20006, -1, 20917, -1,
+ 20840, -1, 20352, -1, 20805, -1, 20864, -1,
+ 21191, -1, 21242, -1, 21845, -1, 21913, -1,
+ 21986, -1, 22707, -1, 22852, -1, 22868, -1,
+ 23138, -1, 23336, -1, 24274, -1, 24281, -1,
+ 24425, -1, 24493, -1, 24792, -1, 24910, -1,
+ 24840, -1, 24928, -1, 25140, -1, 25540, -1,
+ 25628, -1, 25682, -1, 25942, -1, 26395, -1,
+ 26454, -1, 28379, -1, 28363, -1, 28702, -1,
+ 30631, -1, 29237, -1, 29359, -1, 29809, -1,
+ 29958, -1, 30011, -1, 30237, -1, 30239, -1,
+ 30427, -1, 30452, -1, 30538, -1, 30528, -1,
+ 30924, -1, 31409, -1, 31867, -1, 32091, -1,
+ 32574, -1, 33618, -1, 33775, -1, 34681, -1,
+ 35137, -1, 35206, -1, 35519, -1, 35531, -1,
+ 35565, -1, 35722, -1, 36664, -1, 36978, -1,
+ 37273, -1, 37494, -1, 38524, -1, 38875, -1,
+ 38923, -1, 39698, -1, 141386, -1, 141380, -1,
+ 144341, -1, 15261, -1, 16408, -1, 16441, -1,
+ 152137, -1, 154832, -1, 163539, -1, 40771, -1,
+ 40846, -1, 102, 102, -1, 102, 105, -1,
+ 102, 108, -1, 102, 102, 105, -1, 102,
+ 102, 108, -1, 383, 116, -1, 115, 116,
+ -1, 1396, 1398, -1, 1396, 1381, -1, 1396,
+ 1387, -1, 1406, 1398, -1, 1396, 1389, -1,
+ 1497, 1460, -1, 1522, 1463, -1, 1506, -1,
+ 1492, -1, 1499, -1, 1500, -1, 1501, -1,
+ 1512, -1, 1514, -1, 1513, 1473, -1, 1513,
+ 1474, -1, 64329, 1473, -1, 64329, 1474, -1,
+ 1488, 1463, -1, 1488, 1464, -1, 1488, 1468,
+ -1, 1489, 1468, -1, 1490, 1468, -1, 1491,
+ 1468, -1, 1492, 1468, -1, 1493, 1468, -1,
+ 1494, 1468, -1, 1496, 1468, -1, 1497, 1468,
+ -1, 1498, 1468, -1, 1499, 1468, -1, 1500,
+ 1468, -1, 1502, 1468, -1, 1504, 1468, -1,
+ 1505, 1468, -1, 1507, 1468, -1, 1508, 1468,
+ -1, 1510, 1468, -1, 1511, 1468, -1, 1512,
+ 1468, -1, 1513, 1468, -1, 1514, 1468, -1,
+ 1493, 1465, -1, 1489, 1471, -1, 1499, 1471,
+ -1, 1508, 1471, -1, 1488, 1500, -1, 1649,
+ -1, 1659, -1, 1662, -1, 1664, -1, 1658,
+ -1, 1663, -1, 1657, -1, 1700, -1, 1702,
+ -1, 1668, -1, 1667, -1, 1670, -1, 1671,
+ -1, 1677, -1, 1676, -1, 1678, -1, 1672,
+ -1, 1688, -1, 1681, -1, 1705, -1, 1711,
+ -1, 1715, -1, 1713, -1, 1722, -1, 1723,
+ -1, 1728, -1, 1729, -1, 1726, -1, 1746,
+ -1, 1747, -1, 1709, -1, 1735, -1, 1734,
+ -1, 1736, -1, 1655, -1, 1739, -1, 1733,
+ -1, 1737, -1, 1744, -1, 1609, -1, 1574,
+ 1575, -1, 1574, 1749, -1, 1574, 1608, -1,
+ 1574, 1735, -1, 1574, 1734, -1, 1574, 1736,
+ -1, 1574, 1744, -1, 1574, 1609, -1, 1740,
+ -1, 1574, 1580, -1, 1574, 1581, -1, 1574,
+ 1605, -1, 1574, 1610, -1, 1576, 1580, -1,
+ 1576, 1581, -1, 1576, 1582, -1, 1576, 1605,
+ -1, 1576, 1609, -1, 1576, 1610, -1, 1578,
+ 1580, -1, 1578, 1581, -1, 1578, 1582, -1,
+ 1578, 1605, -1, 1578, 1609, -1, 1578, 1610,
+ -1, 1579, 1580, -1, 1579, 1605, -1, 1579,
+ 1609, -1, 1579, 1610, -1, 1580, 1581, -1,
+ 1580, 1605, -1, 1581, 1580, -1, 1581, 1605,
+ -1, 1582, 1580, -1, 1582, 1581, -1, 1582,
+ 1605, -1, 1587, 1580, -1, 1587, 1581, -1,
+ 1587, 1582, -1, 1587, 1605, -1, 1589, 1581,
+ -1, 1589, 1605, -1, 1590, 1580, -1, 1590,
+ 1581, -1, 1590, 1582, -1, 1590, 1605, -1,
+ 1591, 1581, -1, 1591, 1605, -1, 1592, 1605,
+ -1, 1593, 1580, -1, 1593, 1605, -1, 1594,
+ 1580, -1, 1594, 1605, -1, 1601, 1580, -1,
+ 1601, 1581, -1, 1601, 1582, -1, 1601, 1605,
+ -1, 1601, 1609, -1, 1601, 1610, -1, 1602,
+ 1581, -1, 1602, 1605, -1, 1602, 1609, -1,
+ 1602, 1610, -1, 1603, 1575, -1, 1603, 1580,
+ -1, 1603, 1581, -1, 1603, 1582, -1, 1603,
+ 1604, -1, 1603, 1605, -1, 1603, 1609, -1,
+ 1603, 1610, -1, 1604, 1580, -1, 1604, 1581,
+ -1, 1604, 1582, -1, 1604, 1605, -1, 1604,
+ 1609, -1, 1604, 1610, -1, 1605, 1580, -1,
+ 1605, 1581, -1, 1605, 1582, -1, 1605, 1605,
+ -1, 1605, 1609, -1, 1605, 1610, -1, 1606,
+ 1580, -1, 1606, 1581, -1, 1606, 1582, -1,
+ 1606, 1605, -1, 1606, 1609, -1, 1606, 1610,
+ -1, 1607, 1580, -1, 1607, 1605, -1, 1607,
+ 1609, -1, 1607, 1610, -1, 1610, 1580, -1,
+ 1610, 1581, -1, 1610, 1582, -1, 1610, 1605,
+ -1, 1610, 1609, -1, 1610, 1610, -1, 1584,
+ 1648, -1, 1585, 1648, -1, 1609, 1648, -1,
+ 32, 1612, 1617, -1, 32, 1613, 1617, -1,
+ 32, 1614, 1617, -1, 32, 1615, 1617, -1,
+ 32, 1616, 1617, -1, 32, 1617, 1648, -1,
+ 1574, 1585, -1, 1574, 1586, -1, 1574, 1606,
+ -1, 1576, 1585, -1, 1576, 1586, -1, 1576,
+ 1606, -1, 1578, 1585, -1, 1578, 1586, -1,
+ 1578, 1606, -1, 1579, 1585, -1, 1579, 1586,
+ -1, 1579, 1606, -1, 1605, 1575, -1, 1606,
+ 1585, -1, 1606, 1586, -1, 1606, 1606, -1,
+ 1610, 1585, -1, 1610, 1586, -1, 1610, 1606,
+ -1, 1574, 1582, -1, 1574, 1607, -1, 1576,
+ 1607, -1, 1578, 1607, -1, 1589, 1582, -1,
+ 1604, 1607, -1, 1606, 1607, -1, 1607, 1648,
+ -1, 1610, 1607, -1, 1579, 1607, -1, 1587,
+ 1607, -1, 1588, 1605, -1, 1588, 1607, -1,
+ 1600, 1614, 1617, -1, 1600, 1615, 1617, -1,
+ 1600, 1616, 1617, -1, 1591, 1609, -1, 1591,
+ 1610, -1, 1593, 1609, -1, 1593, 1610, -1,
+ 1594, 1609, -1, 1594, 1610, -1, 1587, 1609,
+ -1, 1587, 1610, -1, 1588, 1609, -1, 1588,
+ 1610, -1, 1581, 1609, -1, 1581, 1610, -1,
+ 1580, 1609, -1, 1580, 1610, -1, 1582, 1609,
+ -1, 1582, 1610, -1, 1589, 1609, -1, 1589,
+ 1610, -1, 1590, 1609, -1, 1590, 1610, -1,
+ 1588, 1580, -1, 1588, 1581, -1, 1588, 1582,
+ -1, 1588, 1585, -1, 1587, 1585, -1, 1589,
+ 1585, -1, 1590, 1585, -1, 1575, 1611, -1,
+ 1578, 1580, 1605, -1, 1578, 1581, 1580, -1,
+ 1578, 1581, 1605, -1, 1578, 1582, 1605, -1,
+ 1578, 1605, 1580, -1, 1578, 1605, 1581, -1,
+ 1578, 1605, 1582, -1, 1580, 1605, 1581, -1,
+ 1581, 1605, 1610, -1, 1581, 1605, 1609, -1,
+ 1587, 1581, 1580, -1, 1587, 1580, 1581, -1,
+ 1587, 1580, 1609, -1, 1587, 1605, 1581, -1,
+ 1587, 1605, 1580, -1, 1587, 1605, 1605, -1,
+ 1589, 1581, 1581, -1, 1589, 1605, 1605, -1,
+ 1588, 1581, 1605, -1, 1588, 1580, 1610, -1,
+ 1588, 1605, 1582, -1, 1588, 1605, 1605, -1,
+ 1590, 1581, 1609, -1, 1590, 1582, 1605, -1,
+ 1591, 1605, 1581, -1, 1591, 1605, 1605, -1,
+ 1591, 1605, 1610, -1, 1593, 1580, 1605, -1,
+ 1593, 1605, 1605, -1, 1593, 1605, 1609, -1,
+ 1594, 1605, 1605, -1, 1594, 1605, 1610, -1,
+ 1594, 1605, 1609, -1, 1601, 1582, 1605, -1,
+ 1602, 1605, 1581, -1, 1602, 1605, 1605, -1,
+ 1604, 1581, 1605, -1, 1604, 1581, 1610, -1,
+ 1604, 1581, 1609, -1, 1604, 1580, 1580, -1,
+ 1604, 1582, 1605, -1, 1604, 1605, 1581, -1,
+ 1605, 1581, 1580, -1, 1605, 1581, 1605, -1,
+ 1605, 1581, 1610, -1, 1605, 1580, 1581, -1,
+ 1605, 1580, 1605, -1, 1605, 1582, 1580, -1,
+ 1605, 1582, 1605, -1, 1605, 1580, 1582, -1,
+ 1607, 1605, 1580, -1, 1607, 1605, 1605, -1,
+ 1606, 1581, 1605, -1, 1606, 1581, 1609, -1,
+ 1606, 1580, 1605, -1, 1606, 1580, 1609, -1,
+ 1606, 1605, 1610, -1, 1606, 1605, 1609, -1,
+ 1610, 1605, 1605, -1, 1576, 1582, 1610, -1,
+ 1578, 1580, 1610, -1, 1578, 1580, 1609, -1,
+ 1578, 1582, 1610, -1, 1578, 1582, 1609, -1,
+ 1578, 1605, 1610, -1, 1578, 1605, 1609, -1,
+ 1580, 1605, 1610, -1, 1580, 1581, 1609, -1,
+ 1580, 1605, 1609, -1, 1587, 1582, 1609, -1,
+ 1589, 1581, 1610, -1, 1588, 1581, 1610, -1,
+ 1590, 1581, 1610, -1, 1604, 1580, 1610, -1,
+ 1604, 1605, 1610, -1, 1610, 1581, 1610, -1,
+ 1610, 1580, 1610, -1, 1610, 1605, 1610, -1,
+ 1605, 1605, 1610, -1, 1602, 1605, 1610, -1,
+ 1606, 1581, 1610, -1, 1593, 1605, 1610, -1,
+ 1603, 1605, 1610, -1, 1606, 1580, 1581, -1,
+ 1605, 1582, 1610, -1, 1604, 1580, 1605, -1,
+ 1603, 1605, 1605, -1, 1580, 1581, 1610, -1,
+ 1581, 1580, 1610, -1, 1605, 1580, 1610, -1,
+ 1601, 1605, 1610, -1, 1576, 1581, 1610, -1,
+ 1587, 1582, 1610, -1, 1606, 1580, 1610, -1,
+ 1589, 1604, 1746, -1, 1602, 1604, 1746, -1,
+ 1575, 1604, 1604, 1607, -1, 1575, 1603, 1576,
+ 1585, -1, 1605, 1581, 1605, 1583, -1, 1589,
+ 1604, 1593, 1605, -1, 1585, 1587, 1608, 1604,
+ -1, 1593, 1604, 1610, 1607, -1, 1608, 1587,
+ 1604, 1605, -1, 1589, 1604, 1609, -1, 1589,
+ 1604, 1609, 32, 1575, 1604, 1604, 1607, 32,
+ 1593, 1604, 1610, 1607, 32, 1608, 1587, 1604,
+ 1605, -1, 1580, 1604, 32, 1580, 1604, 1575,
+ 1604, 1607, -1, 1585, 1740, 1575, 1604, -1,
+ 44, -1, 12289, -1, 12290, -1, 58, -1,
+ 33, -1, 63, -1, 12310, -1, 12311, -1,
+ 8230, -1, 8229, -1, 8212, -1, 8211, -1,
+ 95, -1, 123, -1, 125, -1, 12308, -1,
+ 12309, -1, 12304, -1, 12305, -1, 12298, -1,
+ 12299, -1, 12300, -1, 12301, -1, 12302, -1,
+ 12303, -1, 91, -1, 93, -1, 8254, -1,
+ 35, -1, 38, -1, 42, -1, 45, -1,
+ 60, -1, 62, -1, 92, -1, 36, -1,
+ 37, -1, 64, -1, 32, 1611, -1, 1600,
+ 1611, -1, 32, 1612, -1, 32, 1613, -1,
+ 32, 1614, -1, 1600, 1614, -1, 32, 1615,
+ -1, 1600, 1615, -1, 32, 1616, -1, 1600,
+ 1616, -1, 32, 1617, -1, 1600, 1617, -1,
+ 32, 1618, -1, 1600, 1618, -1, 1569, -1,
+ 1570, -1, 1571, -1, 1572, -1, 1573, -1,
+ 1574, -1, 1575, -1, 1576, -1, 1577, -1,
+ 1578, -1, 1579, -1, 1580, -1, 1581, -1,
+ 1582, -1, 1583, -1, 1584, -1, 1585, -1,
+ 1586, -1, 1587, -1, 1588, -1, 1589, -1,
+ 1590, -1, 1591, -1, 1592, -1, 1593, -1,
+ 1594, -1, 1601, -1, 1602, -1, 1603, -1,
+ 1604, -1, 1605, -1, 1606, -1, 1607, -1,
+ 1608, -1, 1610, -1, 1604, 1570, -1, 1604,
+ 1571, -1, 1604, 1573, -1, 1604, 1575, -1,
+ 34, -1, 39, -1, 47, -1, 65345, -1,
+ 65346, -1, 65347, -1, 65348, -1, 65349, -1,
+ 65350, -1, 65351, -1, 65352, -1, 65353, -1,
+ 65354, -1, 65355, -1, 65356, -1, 65357, -1,
+ 65358, -1, 65359, -1, 65360, -1, 65361, -1,
+ 65362, -1, 65363, -1, 65364, -1, 65365, -1,
+ 65366, -1, 65367, -1, 65368, -1, 65369, -1,
+ 65370, -1, 94, -1, 124, -1, 126, -1,
+ 10629, -1, 10630, -1, 12539, -1, 12449, -1,
+ 12451, -1, 12453, -1, 12455, -1, 12457, -1,
+ 12515, -1, 12517, -1, 12519, -1, 12483, -1,
+ 12540, -1, 12531, -1, 12441, -1, 12442, -1,
+ 12644, -1, 12593, -1, 12594, -1, 12595, -1,
+ 12596, -1, 12597, -1, 12598, -1, 12599, -1,
+ 12600, -1, 12601, -1, 12602, -1, 12603, -1,
+ 12604, -1, 12605, -1, 12606, -1, 12607, -1,
+ 12608, -1, 12609, -1, 12610, -1, 12611, -1,
+ 12612, -1, 12613, -1, 12614, -1, 12615, -1,
+ 12616, -1, 12617, -1, 12618, -1, 12619, -1,
+ 12620, -1, 12621, -1, 12622, -1, 12623, -1,
+ 12624, -1, 12625, -1, 12626, -1, 12627, -1,
+ 12628, -1, 12629, -1, 12630, -1, 12631, -1,
+ 12632, -1, 12633, -1, 12634, -1, 12635, -1,
+ 12636, -1, 12637, -1, 12638, -1, 12639, -1,
+ 12640, -1, 12641, -1, 12642, -1, 12643, -1,
+ 162, -1, 163, -1, 172, -1, 175, -1,
+ 166, -1, 165, -1, 8361, -1, 9474, -1,
+ 8592, -1, 8593, -1, 8594, -1, 8595, -1,
+ 9632, -1, 9675, -1, 66600, -1, 66601, -1,
+ 66602, -1, 66603, -1, 66604, -1, 66605, -1,
+ 66606, -1, 66607, -1, 66608, -1, 66609, -1,
+ 66610, -1, 66611, -1, 66612, -1, 66613, -1,
+ 66614, -1, 66615, -1, 66616, -1, 66617, -1,
+ 66618, -1, 66619, -1, 66620, -1, 66621, -1,
+ 66622, -1, 66623, -1, 66624, -1, 66625, -1,
+ 66626, -1, 66627, -1, 66628, -1, 66629, -1,
+ 66630, -1, 66631, -1, 66632, -1, 66633, -1,
+ 66634, -1, 66635, -1, 66636, -1, 66637, -1,
+ 66638, -1, 66639, -1, 119127, 119141, -1, 119128,
+ 119141, -1, 119135, 119150, -1, 119135, 119151, -1,
+ 119135, 119152, -1, 119135, 119153, -1, 119135, 119154,
+ -1, 119225, 119141, -1, 119226, 119141, -1, 119227,
+ 119150, -1, 119228, 119150, -1, 119227, 119151, -1,
+ 119228, 119151, -1, 305, -1, 567, -1, 913,
+ -1, 914, -1, 916, -1, 917, -1, 918,
+ -1, 919, -1, 921, -1, 922, -1, 923,
+ -1, 924, -1, 925, -1, 926, -1, 927,
+ -1, 929, -1, 1012, -1, 932, -1, 934,
+ -1, 935, -1, 936, -1, 8711, -1, 8706,
+ -1, 1013, -1, 977, -1, 1008, -1, 981,
+ -1, 1009, -1, 982, -1, 988, -1, 20029,
+ -1, 20024, -1, 20033, -1, 131362, -1, 20320,
+ -1, 20411, -1, 20482, -1, 20602, -1, 20633,
+ -1, 20687, -1, 13470, -1, 132666, -1, 20820,
+ -1, 20836, -1, 20855, -1, 132380, -1, 13497,
+ -1, 20839, -1, 20877, -1, 132427, -1, 20887,
+ -1, 20900, -1, 20172, -1, 20908, -1, 168415,
+ -1, 20995, -1, 13535, -1, 21051, -1, 21062,
+ -1, 21106, -1, 21111, -1, 13589, -1, 21253,
+ -1, 21254, -1, 21321, -1, 21338, -1, 21363,
+ -1, 21373, -1, 21375, -1, 133676, -1, 28784,
+ -1, 21450, -1, 21471, -1, 133987, -1, 21483,
+ -1, 21489, -1, 21510, -1, 21662, -1, 21560,
+ -1, 21576, -1, 21608, -1, 21666, -1, 21750,
+ -1, 21776, -1, 21843, -1, 21859, -1, 21892,
+ -1, 21931, -1, 21939, -1, 21954, -1, 22294,
+ -1, 22295, -1, 22097, -1, 22132, -1, 22766,
+ -1, 22478, -1, 22516, -1, 22541, -1, 22411,
+ -1, 22578, -1, 22577, -1, 22700, -1, 136420,
+ -1, 22770, -1, 22775, -1, 22790, -1, 22810,
+ -1, 22818, -1, 22882, -1, 136872, -1, 136938,
+ -1, 23020, -1, 23067, -1, 23079, -1, 23000,
+ -1, 23142, -1, 14062, -1, 14076, -1, 23304,
+ -1, 23358, -1, 137672, -1, 23491, -1, 23512,
+ -1, 23539, -1, 138008, -1, 23551, -1, 23558,
+ -1, 24403, -1, 14209, -1, 23648, -1, 23744,
+ -1, 23693, -1, 138724, -1, 23875, -1, 138726,
+ -1, 23918, -1, 23915, -1, 23932, -1, 24033,
+ -1, 24034, -1, 14383, -1, 24061, -1, 24104,
+ -1, 24125, -1, 24169, -1, 14434, -1, 139651,
+ -1, 14460, -1, 24240, -1, 24243, -1, 24246,
+ -1, 172946, -1, 140081, -1, 33281, -1, 24354,
+ -1, 14535, -1, 144056, -1, 156122, -1, 24418,
+ -1, 24427, -1, 14563, -1, 24474, -1, 24525,
+ -1, 24535, -1, 24569, -1, 24705, -1, 14650,
+ -1, 14620, -1, 141012, -1, 24775, -1, 24904,
+ -1, 24908, -1, 24954, -1, 25010, -1, 24996,
+ -1, 25007, -1, 25054, -1, 25104, -1, 25115,
+ -1, 25181, -1, 25265, -1, 25300, -1, 25424,
+ -1, 142092, -1, 25405, -1, 25340, -1, 25448,
+ -1, 25475, -1, 25572, -1, 142321, -1, 25634,
+ -1, 25541, -1, 25513, -1, 14894, -1, 25705,
+ -1, 25726, -1, 25757, -1, 25719, -1, 14956,
+ -1, 25964, -1, 143370, -1, 26083, -1, 26360,
+ -1, 26185, -1, 15129, -1, 15112, -1, 15076,
+ -1, 20882, -1, 20885, -1, 26368, -1, 26268,
+ -1, 32941, -1, 17369, -1, 26401, -1, 26462,
+ -1, 26451, -1, 144323, -1, 15177, -1, 26618,
+ -1, 26501, -1, 26706, -1, 144493, -1, 26766,
+ -1, 26655, -1, 26900, -1, 26946, -1, 27043,
+ -1, 27114, -1, 27304, -1, 145059, -1, 27355,
+ -1, 15384, -1, 27425, -1, 145575, -1, 27476,
+ -1, 15438, -1, 27506, -1, 27551, -1, 27579,
+ -1, 146061, -1, 138507, -1, 146170, -1, 27726,
+ -1, 146620, -1, 27839, -1, 27853, -1, 27751,
+ -1, 27926, -1, 27966, -1, 28009, -1, 28024,
+ -1, 28037, -1, 146718, -1, 27956, -1, 28207,
+ -1, 28270, -1, 15667, -1, 28359, -1, 147153,
+ -1, 28153, -1, 28526, -1, 147294, -1, 147342,
+ -1, 28614, -1, 28729, -1, 28699, -1, 15766,
+ -1, 28746, -1, 28797, -1, 28791, -1, 28845,
+ -1, 132389, -1, 28997, -1, 148067, -1, 29084,
+ -1, 148395, -1, 29224, -1, 29264, -1, 149000,
+ -1, 29312, -1, 29333, -1, 149301, -1, 149524,
+ -1, 29562, -1, 29579, -1, 16044, -1, 29605,
+ -1, 16056, -1, 29767, -1, 29788, -1, 29829,
+ -1, 29898, -1, 16155, -1, 29988, -1, 150582,
+ -1, 30014, -1, 150674, -1, 139679, -1, 30224,
+ -1, 151457, -1, 151480, -1, 151620, -1, 16380,
+ -1, 16392, -1, 151795, -1, 151794, -1, 151833,
+ -1, 151859, -1, 30494, -1, 30495, -1, 30603,
+ -1, 16454, -1, 16534, -1, 152605, -1, 30798,
+ -1, 16611, -1, 153126, -1, 153242, -1, 153285,
+ -1, 31211, -1, 16687, -1, 31306, -1, 31311,
+ -1, 153980, -1, 154279, -1, 31470, -1, 16898,
+ -1, 154539, -1, 31686, -1, 31689, -1, 16935,
+ -1, 154752, -1, 31954, -1, 17056, -1, 31976,
+ -1, 31971, -1, 32000, -1, 155526, -1, 32099,
+ -1, 17153, -1, 32199, -1, 32258, -1, 32325,
+ -1, 17204, -1, 156200, -1, 156231, -1, 17241,
+ -1, 156377, -1, 32634, -1, 156478, -1, 32661,
+ -1, 32762, -1, 156890, -1, 156963, -1, 32864,
+ -1, 157096, -1, 32880, -1, 144223, -1, 17365,
+ -1, 32946, -1, 33027, -1, 17419, -1, 33086,
+ -1, 23221, -1, 157607, -1, 157621, -1, 144275,
+ -1, 144284, -1, 33284, -1, 36766, -1, 17515,
+ -1, 33425, -1, 33419, -1, 33437, -1, 21171,
+ -1, 33457, -1, 33459, -1, 33469, -1, 33510,
+ -1, 158524, -1, 33565, -1, 33635, -1, 33709,
+ -1, 33571, -1, 33725, -1, 33767, -1, 33619,
+ -1, 33738, -1, 33740, -1, 33756, -1, 158774,
+ -1, 159083, -1, 158933, -1, 17707, -1, 34033,
+ -1, 34035, -1, 34070, -1, 160714, -1, 34148,
+ -1, 159532, -1, 17757, -1, 17761, -1, 159665,
+ -1, 159954, -1, 17771, -1, 34384, -1, 34407,
+ -1, 34409, -1, 34473, -1, 34440, -1, 34574,
+ -1, 34530, -1, 34600, -1, 34667, -1, 34694,
+ -1, 17879, -1, 34785, -1, 34817, -1, 17913,
+ -1, 34912, -1, 161383, -1, 35031, -1, 35038,
+ -1, 17973, -1, 35066, -1, 13499, -1, 161966,
+ -1, 162150, -1, 18110, -1, 18119, -1, 35488,
+ -1, 162984, -1, 36011, -1, 36033, -1, 36123,
+ -1, 36215, -1, 163631, -1, 133124, -1, 36299,
+ -1, 36284, -1, 36336, -1, 133342, -1, 36564,
+ -1, 165330, -1, 165357, -1, 37012, -1, 37105,
+ -1, 37137, -1, 165678, -1, 37147, -1, 37432,
+ -1, 37591, -1, 37592, -1, 37500, -1, 37881,
+ -1, 37909, -1, 166906, -1, 38283, -1, 18837,
+ -1, 38327, -1, 167287, -1, 18918, -1, 38595,
+ -1, 23986, -1, 38691, -1, 168261, -1, 168474,
+ -1, 19054, -1, 19062, -1, 38880, -1, 168970,
+ -1, 19122, -1, 169110, -1, 38953, -1, 169398,
+ -1, 39138, -1, 19251, -1, 39209, -1, 39335,
+ -1, 39362, -1, 39422, -1, 19406, -1, 170800,
+ -1, 40000, -1, 40189, -1, 19662, -1, 19693,
+ -1, 40295, -1, 172238, -1, 19704, -1, 172293,
+ -1, 172558, -1, 172689, -1, 19798, -1, 40702,
+ -1, 40709, -1, 40719, -1, 40726, -1, 173568,
+ -1, };
+
+const uint16_t utf8proc_stage1table[] = {
+ 0, 256, 512, 768, 1024, 1280, 1536,
+ 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584,
+ 3840, 4096, 4352, 4608, 4864, 5120, 5376, 5632,
+ 5888, 6144, 6400, 6656, 6912, 2048, 7168, 7424,
+ 7680, 7936, 8192, 8448, 8704, 8960, 9216, 9472,
+ 9728, 9984, 10240, 10496, 10752, 11008, 11264, 11520,
+ 11776, 12032, 12288, 12544, 12800, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 13056, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 13312, 13568, 5376, 5376, 5376, 13824, 2048, 2048,
+ 14080, 14336, 2048, 2048, 2048, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 14592, 14848, 14848, 14848, 14848, 14848, 14848, 14848,
+ 14848, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15360, 15616, 15872, 16128, 16384, 16640,
+ 16896, 17152, 17408, 2048, 17664, 17920, 2048, 2048,
+ 2048, 18176, 18432, 18688, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 5376, 5376, 5376, 18944, 19200, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 19456, 19712, 19968, 20224, 20480, 20736, 20992,
+ 21248, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376,
+ 5376, 5376, 5376, 5376, 5376, 5376, 5376, 21504,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 21760, 22016, 22272, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 22528, 22784, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 23040, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104,
+ 23040, };
+
+const uint16_t utf8proc_stage2table[] = {
+ 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2, 3, 2, 4, 3, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 5, 5, 5,
+ 6, 7, 8, 8, 9, 10, 9, 8,
+ 8, 11, 12, 8, 13, 14, 15, 14,
+ 14, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 14, 8, 17, 18, 19,
+ 8, 8, 20, 21, 22, 23, 24, 25,
+ 26, 27, 28, 29, 30, 31, 32, 33,
+ 34, 35, 36, 37, 38, 39, 40, 41,
+ 42, 43, 44, 45, 11, 8, 12, 46,
+ 47, 46, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, 57, 58, 59, 60, 61,
+ 62, 63, 64, 65, 66, 67, 68, 69,
+ 70, 71, 72, 73, 11, 74, 12, 74,
+ 1, 1, 1, 1, 1, 1, 3, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 75, 8, 10, 10, 10, 10, 76,
+ 76, 77, 76, 78, 79, 74, 80, 76,
+ 81, 82, 83, 84, 85, 86, 87, 76,
+ 8, 88, 89, 90, 91, 92, 93, 94,
+ 8, 95, 96, 97, 98, 99, 100, 101,
+ 102, 103, 104, 105, 106, 107, 108, 109,
+ 110, 111, 112, 113, 114, 115, 116, 117,
+ 74, 118, 119, 120, 121, 122, 123, 124,
+ 125, 126, 127, 128, 129, 130, 131, 132,
+ 133, 134, 135, 136, 137, 138, 139, 140,
+ 141, 142, 143, 144, 145, 146, 147, 148,
+ 74, 149, 150, 151, 152, 153, 154, 155,
+ 156, 157, 158, 159, 160, 161, 162, 163,
+ 164, 165, 166, 167, 168, 169, 170, 171,
+ 172, 173, 174, 175, 176, 177, 178, 179,
+ 180, 181, 182, 183, 184, 185, 186, 187,
+ 188, 189, 190, 191, 192, 193, 194, 195,
+ 196, 197, 198, 199, 200, 201, 202, 203,
+ 204, 205, 206, 207, 208, 209, 210, 211,
+ 212, 213, 214, 215, 216, 217, 218, 219,
+ 220, 221, 222, 223, 224, 225, 226, 227,
+ 228, 229, 230, 231, 232, 233, 234, 235,
+ 236, 237, 238, 239, 240, 241, 242, 243,
+ 244, 245, 246, 247, 248, 249, 250, 251,
+ 252, 253, 254, 255, 256, 257, 258, 259,
+ 260, 261, 262, 263, 264, 265, 266, 267,
+ 268, 269, 270, 271, 272, 273, 274, 275,
+ 276, 277, 278, 279, 280, 281, 282, 283,
+ 284, 285, 286, 287, 288, 289, 290, 291,
+ 292, 293, 294, 295, 296, 297, 213, 298,
+ 299, 300, 301, 302, 303, 304, 305, 306,
+ 307, 308, 309, 310, 213, 311, 312, 313,
+ 314, 315, 316, 317, 318, 319, 320, 321,
+ 322, 323, 324, 213, 213, 325, 326, 327,
+ 328, 329, 330, 331, 332, 333, 334, 335,
+ 336, 337, 338, 213, 339, 340, 341, 213,
+ 342, 339, 339, 339, 339, 343, 344, 345,
+ 346, 347, 348, 349, 350, 351, 352, 353,
+ 354, 355, 356, 357, 358, 359, 360, 361,
+ 362, 363, 364, 365, 366, 367, 368, 369,
+ 370, 371, 372, 373, 374, 375, 376, 377,
+ 378, 379, 380, 381, 382, 383, 384, 385,
+ 386, 387, 388, 389, 390, 391, 392, 393,
+ 394, 395, 396, 397, 398, 399, 400, 401,
+ 402, 403, 404, 405, 406, 407, 408, 409,
+ 410, 411, 412, 413, 414, 415, 416, 417,
+ 418, 419, 420, 421, 422, 423, 424, 425,
+ 426, 427, 428, 429, 430, 431, 432, 433,
+ 434, 435, 213, 436, 437, 438, 439, 440,
+ 441, 442, 443, 444, 445, 446, 447, 448,
+ 449, 450, 451, 452, 453, 213, 213, 213,
+ 213, 213, 213, 454, 455, 456, 457, 458,
+ 213, 213, 459, 460, 461, 462, 463, 464,
+ 465, 466, 467, 468, 469, 470, 471, 472,
+ 473, 213, 213, 213, 474, 475, 213, 476,
+ 477, 213, 478, 213, 479, 213, 213, 213,
+ 213, 480, 213, 213, 481, 213, 213, 213,
+ 213, 482, 483, 213, 484, 213, 213, 213,
+ 485, 213, 213, 486, 213, 213, 487, 213,
+ 213, 213, 213, 213, 213, 213, 488, 213,
+ 213, 489, 213, 213, 490, 213, 213, 213,
+ 213, 491, 492, 493, 494, 495, 213, 213,
+ 213, 213, 213, 496, 213, 339, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 497, 498, 499, 500, 501, 502, 503,
+ 504, 505, 506, 506, 507, 507, 507, 507,
+ 507, 507, 507, 46, 46, 46, 46, 506,
+ 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 507, 507, 46, 46, 46, 46, 46,
+ 46, 508, 509, 510, 511, 512, 513, 46,
+ 46, 514, 515, 516, 517, 518, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 507,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 519, 520, 521, 522, 523, 524, 525,
+ 526, 527, 528, 529, 530, 531, 524, 524,
+ 532, 524, 533, 524, 534, 535, 536, 537,
+ 537, 537, 537, 536, 538, 537, 537, 537,
+ 537, 537, 539, 539, 540, 541, 542, 543,
+ 544, 545, 537, 537, 537, 537, 546, 547,
+ 537, 548, 549, 537, 537, 550, 550, 550,
+ 550, 551, 537, 537, 537, 537, 524, 524,
+ 524, 552, 553, 554, 555, 556, 557, 524,
+ 537, 537, 537, 524, 524, 524, 537, 537,
+ 558, 524, 524, 524, 537, 537, 537, 537,
+ 524, 536, 537, 537, 524, 559, 560, 560,
+ 559, 560, 560, 559, 524, 524, 524, 524,
+ 524, 524, 524, 524, 524, 524, 524, 524,
+ 524, 0, 0, 0, 0, 561, 46, 0,
+ 0, 0, 0, 562, 563, 564, 565, 566,
+ 0, 0, 0, 0, 0, 86, 567, 568,
+ 569, 570, 571, 572, 0, 573, 0, 574,
+ 575, 576, 577, 578, 579, 580, 581, 582,
+ 583, 584, 585, 586, 587, 588, 589, 590,
+ 591, 592, 593, 0, 594, 595, 596, 597,
+ 598, 599, 600, 601, 602, 603, 604, 605,
+ 606, 607, 608, 609, 610, 611, 612, 613,
+ 614, 615, 616, 617, 618, 619, 620, 621,
+ 622, 623, 624, 625, 626, 627, 628, 629,
+ 630, 631, 632, 633, 634, 635, 636, 637,
+ 0, 638, 639, 640, 641, 642, 643, 644,
+ 213, 645, 646, 647, 648, 649, 650, 651,
+ 652, 653, 654, 655, 656, 657, 658, 659,
+ 660, 661, 662, 663, 664, 665, 666, 667,
+ 668, 669, 670, 671, 213, 672, 673, 74,
+ 674, 675, 676, 677, 678, 213, 679, 680,
+ 681, 682, 683, 684, 685, 686, 687, 688,
+ 689, 690, 691, 692, 693, 694, 695, 696,
+ 697, 698, 699, 700, 701, 702, 703, 704,
+ 705, 706, 707, 708, 709, 710, 711, 712,
+ 713, 714, 715, 716, 717, 718, 719, 720,
+ 721, 722, 723, 724, 725, 726, 727, 728,
+ 729, 730, 731, 732, 733, 734, 735, 736,
+ 737, 738, 739, 740, 741, 742, 743, 744,
+ 745, 746, 747, 748, 749, 750, 751, 752,
+ 753, 754, 755, 756, 757, 758, 759, 760,
+ 761, 762, 763, 764, 765, 766, 767, 768,
+ 769, 770, 771, 772, 773, 774, 775, 776,
+ 777, 778, 779, 780, 781, 782, 783, 784,
+ 785, 786, 787, 788, 789, 790, 791, 792,
+ 793, 794, 795, 796, 797, 798, 799, 800,
+ 801, 802, 803, 804, 805, 806, 807, 808,
+ 809, 810, 811, 812, 524, 524, 524, 524,
+ 0, 813, 813, 814, 815, 816, 817, 818,
+ 819, 820, 821, 822, 823, 824, 825, 826,
+ 827, 828, 829, 830, 831, 832, 833, 834,
+ 835, 836, 837, 838, 839, 840, 841, 842,
+ 843, 844, 845, 846, 847, 848, 849, 850,
+ 851, 852, 853, 854, 855, 856, 857, 858,
+ 859, 860, 861, 862, 863, 864, 865, 866,
+ 867, 868, 869, 870, 871, 872, 873, 874,
+ 875, 876, 877, 878, 879, 880, 881, 882,
+ 883, 884, 885, 886, 887, 888, 889, 890,
+ 891, 892, 893, 894, 895, 896, 897, 898,
+ 899, 900, 901, 902, 903, 904, 905, 906,
+ 907, 908, 909, 910, 911, 912, 913, 914,
+ 915, 916, 917, 918, 919, 920, 921, 922,
+ 923, 924, 925, 926, 927, 928, 929, 930,
+ 931, 932, 933, 934, 935, 936, 937, 938,
+ 939, 940, 941, 942, 943, 944, 945, 946,
+ 947, 948, 949, 950, 951, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 952, 953, 954, 955, 956, 957,
+ 958, 959, 960, 961, 962, 963, 964, 965,
+ 966, 967, 968, 969, 970, 971, 972, 973,
+ 974, 975, 976, 977, 978, 979, 980, 981,
+ 982, 983, 984, 985, 986, 987, 988, 989,
+ 0, 0, 507, 990, 990, 990, 990, 990,
+ 990, 0, 991, 992, 993, 994, 995, 996,
+ 997, 998, 999, 1000, 1001, 1002, 1003, 1004,
+ 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012,
+ 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020,
+ 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028,
+ 1029, 0, 990, 1030, 0, 0, 0, 0,
+ 0, 0, 537, 524, 524, 524, 524, 537,
+ 524, 524, 524, 1031, 537, 524, 524, 524,
+ 524, 524, 524, 537, 537, 537, 537, 537,
+ 537, 524, 524, 537, 524, 524, 1031, 1032,
+ 524, 1033, 1034, 1035, 1036, 1037, 1038, 1039,
+ 1040, 1041, 1042, 1042, 1043, 1044, 1045, 1046,
+ 1047, 1046, 1048, 1049, 1046, 524, 537, 1046,
+ 1041, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 0, 0, 0, 0,
+ 0, 1050, 1050, 1050, 1046, 1046, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1051, 1051, 1051, 1051, 0, 0, 0,
+ 0, 0, 0, 0, 1052, 14, 1053, 76,
+ 76, 524, 524, 524, 524, 524, 524, 0,
+ 0, 0, 0, 0, 1053, 0, 0, 1053,
+ 1053, 0, 1054, 1055, 1056, 1057, 1058, 1059,
+ 1060, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 0, 0, 0, 0,
+ 0, 1061, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1062, 1054, 1063, 1064, 1065, 1066, 1067,
+ 1068, 1069, 1070, 1071, 1072, 1073, 1074, 537,
+ 524, 524, 524, 524, 524, 537, 524, 524,
+ 0, 1075, 1075, 1075, 1075, 1075, 1075, 1075,
+ 1075, 1075, 1075, 9, 1076, 1076, 1053, 1054,
+ 1054, 1077, 1054, 1054, 1054, 1054, 1078, 1079,
+ 1080, 1081, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1082, 1083, 1084, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1085, 1086, 1053, 1087, 524,
+ 524, 524, 524, 524, 524, 524, 1051, 813,
+ 524, 524, 524, 524, 537, 524, 1061, 1061,
+ 524, 524, 76, 537, 524, 524, 537, 1054,
+ 1054, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 1054, 1054, 1054, 1088, 1088,
+ 1054, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 0,
+ 80, 1054, 1089, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 524, 537, 524, 524, 537, 524, 524,
+ 537, 537, 537, 524, 537, 537, 524, 537,
+ 524, 524, 524, 537, 524, 537, 524, 537,
+ 524, 537, 524, 524, 0, 0, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1090,
+ 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090,
+ 1090, 1090, 1054, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1091, 1091, 1091, 1091, 1091, 1091, 1091,
+ 1091, 1091, 1091, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 524, 524, 524, 524,
+ 524, 524, 524, 537, 524, 1092, 1092, 76,
+ 8, 8, 8, 1092, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1090, 1090, 1093, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 1094, 1095, 339, 339, 339, 339, 339,
+ 339, 1096, 1097, 339, 1098, 1099, 339, 339,
+ 339, 339, 339, 0, 0, 1100, 339, 1093,
+ 1093, 1093, 1090, 1090, 1090, 1090, 1090, 1090,
+ 1090, 1090, 1093, 1093, 1093, 1093, 1101, 0,
+ 0, 339, 524, 537, 524, 524, 0, 0,
+ 0, 1102, 1103, 1104, 1105, 1106, 1107, 1108,
+ 1109, 339, 339, 1090, 1090, 990, 990, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 990, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 339, 339, 339, 339,
+ 339, 0, 1090, 1093, 1093, 0, 339, 339,
+ 339, 339, 339, 339, 339, 339, 0, 0,
+ 339, 339, 0, 0, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 0, 0, 0, 339,
+ 339, 339, 339, 0, 0, 1111, 339, 1112,
+ 1093, 1093, 1090, 1090, 1090, 1090, 0, 0,
+ 1113, 1093, 0, 0, 1114, 1115, 1101, 339,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1116, 0, 0, 0, 0, 1117, 1118, 0,
+ 1119, 339, 339, 1090, 1090, 0, 0, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 339, 339, 10, 10, 1120, 1120, 1120,
+ 1120, 1120, 1120, 812, 0, 0, 0, 0,
+ 0, 0, 1090, 1090, 1093, 0, 339, 339,
+ 339, 339, 339, 339, 0, 0, 0, 0,
+ 339, 339, 0, 0, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 1121, 0, 339, 1122,
+ 0, 339, 339, 0, 0, 1111, 0, 1093,
+ 1093, 1093, 1090, 1090, 0, 0, 0, 0,
+ 1090, 1090, 0, 0, 1090, 1090, 1101, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1123, 1124, 1125, 339, 0, 1126,
+ 0, 0, 0, 0, 0, 0, 0, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1090, 1090, 339, 339, 339, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1090, 1090, 1093, 0, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 0,
+ 339, 339, 339, 0, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 0, 339, 339,
+ 339, 339, 339, 0, 0, 1111, 339, 1093,
+ 1093, 1093, 1090, 1090, 1090, 1090, 1090, 0,
+ 1090, 1090, 1093, 0, 1093, 1093, 1101, 0,
+ 0, 339, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 1090, 1090, 0, 0, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 0, 10, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1090, 1093, 1093, 0, 339, 339,
+ 339, 339, 339, 339, 339, 339, 0, 0,
+ 339, 339, 0, 0, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 0, 339, 339,
+ 339, 339, 339, 0, 0, 1111, 339, 1127,
+ 1090, 1093, 1090, 1090, 1090, 0, 0, 0,
+ 1128, 1129, 0, 0, 1130, 1131, 1101, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1132,
+ 1133, 0, 0, 0, 0, 1134, 1135, 0,
+ 339, 339, 339, 0, 0, 0, 0, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 812, 339, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1090, 339, 0, 339, 339,
+ 339, 339, 339, 339, 0, 0, 0, 339,
+ 339, 339, 0, 1136, 339, 1137, 339, 0,
+ 0, 0, 339, 339, 0, 339, 0, 339,
+ 339, 0, 0, 0, 339, 339, 0, 0,
+ 0, 339, 339, 339, 0, 0, 0, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 0, 0, 0, 0, 1138,
+ 1093, 1090, 1093, 1093, 0, 0, 0, 1139,
+ 1140, 1093, 0, 1141, 1142, 1143, 1101, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1144, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1120, 1120, 1120, 76, 76, 76, 76,
+ 76, 76, 10, 76, 0, 0, 0, 0,
+ 0, 0, 1093, 1093, 1093, 0, 339, 339,
+ 339, 339, 339, 339, 339, 339, 0, 339,
+ 339, 339, 0, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 0, 339, 339,
+ 339, 339, 339, 0, 0, 0, 0, 1090,
+ 1090, 1090, 1093, 1093, 1093, 1093, 0, 1145,
+ 1090, 1146, 0, 1090, 1090, 1090, 1101, 0,
+ 0, 0, 0, 0, 0, 0, 1147, 1148,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 0, 0, 0, 0, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1093, 1093, 0, 339, 339,
+ 339, 339, 339, 339, 339, 339, 0, 339,
+ 339, 339, 0, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 0, 339, 339,
+ 339, 339, 339, 0, 0, 1111, 339, 1093,
+ 1149, 1150, 1093, 1151, 1093, 1093, 0, 1152,
+ 1153, 1154, 0, 1155, 1156, 1090, 1101, 0,
+ 0, 0, 0, 0, 0, 0, 1157, 1158,
+ 0, 0, 0, 0, 0, 0, 0, 339,
+ 0, 339, 339, 1090, 1090, 0, 0, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 0, 76, 76, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1093, 1093, 0, 339, 339,
+ 339, 339, 339, 339, 339, 339, 0, 339,
+ 339, 339, 0, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 0, 0, 0, 0, 1159,
+ 1093, 1093, 1090, 1090, 1090, 0, 0, 1160,
+ 1161, 1093, 0, 1162, 1163, 1164, 1101, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1165, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 0, 0, 0, 0, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1093, 1093, 0, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 0, 0, 0, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 0, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 0, 339, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 0, 0, 0, 1166, 0, 0, 0, 0,
+ 1167, 1093, 1093, 1090, 1090, 1090, 0, 1090,
+ 0, 1093, 1168, 1169, 1093, 1170, 1171, 1172,
+ 1173, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1093, 1093, 990, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 1090, 339, 1174, 1090, 1090, 1090,
+ 1090, 1175, 1175, 1101, 0, 0, 0, 0,
+ 10, 339, 339, 339, 339, 339, 339, 507,
+ 1090, 1176, 1176, 1176, 1176, 1090, 1090, 1090,
+ 990, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 990, 990, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 339, 339, 0, 339, 0, 0,
+ 339, 339, 0, 339, 0, 0, 339, 0,
+ 0, 0, 0, 0, 0, 339, 339, 339,
+ 339, 0, 339, 339, 339, 339, 339, 339,
+ 339, 0, 339, 339, 339, 0, 339, 0,
+ 339, 0, 0, 339, 339, 0, 339, 339,
+ 339, 339, 1090, 339, 1177, 1090, 1090, 1090,
+ 1090, 1178, 1178, 0, 1090, 1090, 339, 0,
+ 0, 339, 339, 339, 339, 339, 0, 507,
+ 0, 1179, 1179, 1179, 1179, 1090, 1090, 0,
+ 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 0, 0, 1180, 1181, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 812, 812, 812, 990, 990, 990,
+ 990, 990, 990, 990, 990, 1182, 990, 990,
+ 990, 990, 990, 990, 812, 812, 812, 812,
+ 812, 537, 537, 812, 812, 812, 812, 812,
+ 812, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1120, 1120, 1120, 1120, 1120,
+ 1120, 1120, 1120, 1120, 1120, 812, 537, 812,
+ 537, 812, 1183, 11, 12, 11, 12, 1093,
+ 1093, 339, 339, 339, 1184, 339, 339, 339,
+ 339, 0, 339, 339, 339, 339, 1185, 339,
+ 339, 339, 339, 1186, 339, 339, 339, 339,
+ 1187, 339, 339, 339, 339, 1188, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 1189, 339, 0, 0, 0, 0,
+ 0, 0, 1190, 1191, 1192, 1193, 1194, 1195,
+ 1196, 1197, 1198, 1191, 1191, 1191, 1191, 1090,
+ 1093, 1191, 1199, 524, 524, 1101, 990, 524,
+ 524, 339, 339, 339, 339, 0, 0, 0,
+ 0, 1090, 1090, 1090, 1200, 1090, 1090, 1090,
+ 1090, 0, 1090, 1090, 1090, 1090, 1201, 1090,
+ 1090, 1090, 1090, 1202, 1090, 1090, 1090, 1090,
+ 1203, 1090, 1090, 1090, 1090, 1204, 1090, 1090,
+ 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090,
+ 1090, 1090, 1205, 1090, 1090, 1090, 0, 812,
+ 812, 812, 812, 812, 812, 812, 812, 537,
+ 812, 812, 812, 812, 812, 812, 0, 0,
+ 812, 990, 990, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 0, 339, 339, 1206, 1207,
+ 339, 0, 339, 339, 0, 1093, 1090, 1208,
+ 1090, 1090, 1093, 1090, 0, 0, 0, 1090,
+ 1111, 1093, 1101, 0, 0, 0, 0, 0,
+ 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 990, 990, 990, 990, 990,
+ 990, 339, 339, 339, 339, 339, 339, 1093,
+ 1093, 1090, 1090, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1209, 1210, 1211, 1212, 1213, 1214, 1215,
+ 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223,
+ 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231,
+ 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239,
+ 1240, 1241, 1242, 1243, 1244, 1245, 1246, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 990, 1247, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 0, 0, 0, 0, 0,
+ 1248, 1248, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 339, 339, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 0, 339, 0, 339, 339, 339, 339, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 339, 339, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 339, 339, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 0, 339, 0, 339, 339, 339, 339, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 0, 339, 339, 339, 339, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 0, 0, 0, 0,
+ 524, 812, 990, 990, 990, 990, 990, 990,
+ 990, 990, 1120, 1120, 1120, 1120, 1120, 1120,
+ 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120,
+ 1120, 1120, 1120, 1120, 1120, 1120, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 990, 990,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 7, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 11, 12, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 990, 990, 990, 1249,
+ 1249, 1249, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 0, 339,
+ 339, 339, 339, 1090, 1090, 1101, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 1090, 1090, 1101, 990, 990,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 1090, 1090, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 0, 339,
+ 339, 339, 0, 1090, 1090, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 1250, 1250, 1093,
+ 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1093,
+ 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1090,
+ 1093, 1093, 1090, 1090, 1090, 1090, 1090, 1090,
+ 1090, 1090, 1090, 1101, 1090, 990, 990, 990,
+ 507, 990, 990, 990, 10, 339, 524, 0,
+ 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 0, 0, 0, 0, 0,
+ 0, 1251, 1251, 1251, 1251, 1251, 1251, 1251,
+ 1251, 1251, 1251, 0, 0, 0, 0, 0,
+ 0, 8, 8, 8, 8, 8, 8, 1030,
+ 8, 8, 8, 8, 558, 558, 558, 7,
+ 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 507, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 1032, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 0, 0,
+ 0, 1090, 1090, 1090, 1093, 1093, 1093, 1093,
+ 1090, 1090, 1252, 1252, 1252, 0, 0, 0,
+ 0, 1093, 1093, 1090, 1093, 1093, 1093, 1093,
+ 1093, 1093, 1031, 524, 537, 0, 0, 0,
+ 0, 76, 0, 0, 0, 8, 8, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 0,
+ 0, 339, 339, 339, 339, 339, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 0, 0, 0, 0, 0,
+ 0, 1093, 1093, 1093, 1093, 1093, 1093, 1093,
+ 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093,
+ 1093, 1093, 339, 339, 339, 339, 339, 339,
+ 339, 1093, 1093, 0, 0, 0, 0, 0,
+ 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 0, 0, 0, 0, 8,
+ 8, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 524, 537, 1093, 1093, 1093, 0, 0, 990,
+ 990, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1090, 1090, 1090, 1090, 1093, 1253, 1254,
+ 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262,
+ 339, 339, 1263, 1264, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 1111, 1265, 1090,
+ 1090, 1090, 1090, 1266, 1267, 1268, 1269, 1270,
+ 1271, 1272, 1273, 1274, 1275, 1276, 339, 339,
+ 339, 339, 339, 339, 339, 0, 0, 0,
+ 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 990, 990, 990, 990, 990,
+ 990, 990, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 524, 537, 524, 524,
+ 524, 524, 524, 524, 524, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 1277, 1278, 1279,
+ 507, 1280, 1281, 1282, 1283, 1284, 1285, 1286,
+ 1287, 1288, 1289, 1290, 507, 1291, 1292, 1293,
+ 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301,
+ 1302, 1303, 1304, 1305, 1306, 1307, 1308, 507,
+ 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316,
+ 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324,
+ 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332,
+ 1333, 1334, 1335, 1336, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 1337, 213, 213, 213, 213, 1338, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 1339, 1340, 1341, 1342,
+ 1307, 1343, 1344, 1345, 1346, 1347, 1348, 1349,
+ 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357,
+ 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365,
+ 1366, 1367, 1368, 1369, 1370, 1371, 1372, 1373,
+ 1374, 524, 524, 537, 524, 524, 524, 524,
+ 524, 524, 524, 537, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 524,
+ 537, 1375, 1376, 1377, 1378, 1379, 1380, 1381,
+ 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389,
+ 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397,
+ 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405,
+ 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413,
+ 1414, 1415, 1416, 1417, 1418, 1419, 1420, 1421,
+ 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429,
+ 1430, 1431, 1432, 1433, 1434, 1435, 1436, 1437,
+ 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445,
+ 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453,
+ 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461,
+ 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469,
+ 1470, 1471, 1472, 1473, 1474, 1475, 1476, 1477,
+ 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485,
+ 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493,
+ 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501,
+ 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509,
+ 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517,
+ 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525,
+ 1526, 1527, 1528, 1529, 1530, 0, 0, 0,
+ 0, 1531, 1532, 1533, 1534, 1535, 1536, 1537,
+ 1538, 1539, 1540, 1541, 1542, 1543, 1544, 1545,
+ 1546, 1547, 1548, 1549, 1550, 1551, 1552, 1553,
+ 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561,
+ 1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569,
+ 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577,
+ 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585,
+ 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593,
+ 1594, 1595, 1596, 1597, 1598, 1599, 1600, 1601,
+ 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609,
+ 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617,
+ 1618, 1619, 1620, 0, 0, 0, 0, 0,
+ 0, 1621, 1622, 1623, 1624, 1625, 1626, 1627,
+ 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635,
+ 1636, 1637, 1638, 1639, 1640, 1641, 1642, 0,
+ 0, 1643, 1644, 1645, 1646, 1647, 1648, 0,
+ 0, 1649, 1650, 1651, 1652, 1653, 1654, 1655,
+ 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663,
+ 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671,
+ 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679,
+ 1680, 1681, 1682, 1683, 1684, 1685, 1686, 0,
+ 0, 1687, 1688, 1689, 1690, 1691, 1692, 0,
+ 0, 1693, 1694, 1695, 1696, 1697, 1698, 1699,
+ 1700, 0, 1701, 0, 1702, 0, 1703, 0,
+ 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711,
+ 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719,
+ 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727,
+ 1728, 1729, 1730, 1731, 1732, 1733, 1734, 0,
+ 0, 1735, 1736, 1737, 1738, 1739, 1740, 1741,
+ 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749,
+ 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757,
+ 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765,
+ 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773,
+ 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781,
+ 1782, 1783, 1784, 1785, 1786, 1787, 0, 1788,
+ 1789, 1790, 1791, 1792, 1793, 1794, 1795, 1796,
+ 1797, 1798, 1799, 1800, 1801, 1802, 0, 1803,
+ 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811,
+ 1812, 1813, 1814, 1815, 1816, 0, 0, 1817,
+ 1818, 1819, 1820, 1821, 1822, 0, 1823, 1824,
+ 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832,
+ 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840,
+ 1841, 0, 0, 1842, 1843, 1844, 0, 1845,
+ 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853,
+ 0, 1854, 1855, 1856, 1856, 1856, 1856, 1856,
+ 1857, 1856, 1856, 1856, 80, 1858, 1858, 1250,
+ 1859, 1030, 1860, 1030, 1030, 1030, 1030, 8,
+ 1861, 79, 91, 11, 79, 79, 91, 11,
+ 79, 8, 8, 8, 8, 1862, 1863, 1864,
+ 8, 1865, 1866, 1867, 1868, 1869, 1870, 1871,
+ 75, 9, 9, 9, 1872, 1873, 8, 1874,
+ 1875, 8, 79, 91, 8, 1876, 8, 1877,
+ 47, 47, 8, 8, 8, 1878, 11, 12,
+ 1879, 1880, 1881, 8, 8, 8, 8, 8,
+ 8, 8, 8, 74, 8, 47, 8, 8,
+ 1882, 8, 8, 8, 8, 8, 8, 8,
+ 1856, 80, 80, 80, 80, 0, 0, 0,
+ 0, 0, 0, 80, 80, 80, 80, 80,
+ 80, 1883, 1884, 0, 0, 1885, 1886, 1887,
+ 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895,
+ 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903,
+ 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911,
+ 0, 1912, 1913, 1914, 1915, 1916, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 10, 10, 10, 10, 10, 10, 10,
+ 10, 1917, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 524, 524, 550, 550, 524, 524, 524,
+ 524, 550, 550, 550, 524, 524, 813, 813,
+ 813, 813, 524, 813, 813, 813, 550, 550,
+ 524, 537, 524, 550, 550, 537, 537, 537,
+ 537, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1918, 1919, 1920, 1921, 76, 1922, 1923,
+ 1924, 76, 1925, 1926, 1927, 1927, 1927, 1928,
+ 1929, 1930, 1930, 1931, 1932, 76, 1933, 1934,
+ 76, 76, 1935, 1936, 1937, 1937, 1937, 76,
+ 76, 1938, 1939, 1940, 76, 1941, 76, 1942,
+ 76, 1941, 76, 1943, 1944, 1945, 1920, 82,
+ 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953,
+ 1954, 1955, 1956, 76, 1957, 1958, 1959, 1960,
+ 1961, 1962, 74, 74, 74, 74, 1963, 1964,
+ 1946, 1956, 1965, 76, 74, 76, 76, 1966,
+ 0, 0, 0, 0, 1967, 1968, 1969, 1970,
+ 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978,
+ 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986,
+ 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
+ 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+ 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+ 2011, 1249, 1249, 1249, 2012, 2013, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2014, 74, 2015, 74, 2016, 76, 76,
+ 76, 76, 76, 2017, 2018, 76, 76, 76,
+ 76, 74, 76, 76, 74, 76, 76, 74,
+ 76, 76, 76, 76, 76, 76, 76, 2019,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 2020, 2021,
+ 2022, 2023, 76, 2024, 76, 2025, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 2026, 2026, 2027, 2028, 74, 74,
+ 74, 2029, 2030, 2026, 2031, 2032, 2026, 74,
+ 74, 74, 2026, 13, 83, 74, 2026, 2026,
+ 74, 74, 74, 2026, 2026, 2026, 2026, 74,
+ 2026, 2026, 2026, 2026, 2033, 2034, 2035, 2036,
+ 74, 74, 74, 74, 2026, 2037, 2038, 2026,
+ 2039, 2040, 2026, 2026, 2026, 74, 74, 74,
+ 74, 74, 2026, 74, 2026, 2041, 2026, 2026,
+ 2026, 2026, 2042, 2026, 2043, 2044, 2045, 2026,
+ 2046, 2047, 2048, 2026, 2026, 2026, 2049, 74,
+ 74, 74, 74, 2026, 2026, 2026, 2026, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 2026, 2050, 2051, 2052, 74, 2053, 2054, 2026,
+ 2026, 2026, 2026, 2026, 2026, 74, 2055, 2056,
+ 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064,
+ 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2026,
+ 2026, 2072, 2073, 2074, 2075, 2076, 2077, 2078,
+ 2079, 2080, 2081, 2026, 2026, 2026, 74, 74,
+ 2026, 2026, 2082, 2083, 74, 74, 74, 74,
+ 74, 2026, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 2084, 2026, 74, 74, 2026,
+ 2026, 2085, 2086, 2026, 2087, 2088, 2089, 2090,
+ 2091, 2026, 2026, 2092, 2093, 2094, 2095, 2026,
+ 2026, 2026, 74, 74, 74, 74, 74, 2026,
+ 2026, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 2026, 2026, 2026, 2026, 2026, 74,
+ 74, 2026, 2026, 74, 74, 74, 74, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2096, 2097, 2098, 2099, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2100, 2101, 2102, 2103, 74,
+ 74, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 76, 76, 76, 76, 76, 76, 76,
+ 76, 2026, 2026, 2026, 2026, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 2026, 2026, 76, 76, 76, 76, 76,
+ 76, 76, 2104, 2105, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 76, 74, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 812, 76,
+ 76, 76, 76, 76, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 74, 74, 74,
+ 74, 74, 74, 76, 76, 76, 76, 76,
+ 76, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2106, 2107, 2108, 2109, 2110, 2111, 2112,
+ 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120,
+ 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128,
+ 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136,
+ 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144,
+ 2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152,
+ 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160,
+ 2161, 2162, 2163, 2164, 2165, 2166, 2167, 2168,
+ 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176,
+ 2177, 2178, 2179, 2180, 2181, 2182, 2183, 2184,
+ 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192,
+ 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200,
+ 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208,
+ 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216,
+ 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224,
+ 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232,
+ 2233, 2234, 2235, 2236, 2237, 2238, 2239, 2240,
+ 2241, 2242, 2243, 2244, 1251, 1251, 1251, 1251,
+ 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251,
+ 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251,
+ 1251, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 74, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 74, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 74, 74, 74, 74, 74, 74, 74,
+ 74, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 74, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 0, 0,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 812, 76, 76,
+ 76, 76, 76, 76, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 76, 76, 76, 76, 0, 76,
+ 76, 76, 76, 0, 0, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 0, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 0, 76, 0,
+ 76, 76, 76, 76, 0, 0, 0, 76,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 0, 0, 76, 76, 76, 76, 76, 76,
+ 76, 11, 12, 11, 12, 11, 12, 11,
+ 12, 11, 12, 11, 12, 11, 12, 1251,
+ 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251,
+ 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251,
+ 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251,
+ 1251, 1251, 1251, 1251, 1251, 76, 0, 0,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 0, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 0, 2026, 74, 74, 2026, 2026, 11, 12,
+ 74, 74, 74, 74, 0, 0, 0, 0,
+ 0, 74, 74, 74, 2026, 2026, 2026, 2026,
+ 74, 74, 74, 74, 74, 2026, 2026, 2026,
+ 74, 74, 74, 2026, 2026, 2026, 2026, 11,
+ 12, 11, 12, 11, 12, 0, 0, 0,
+ 0, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 11, 12, 11, 12,
+ 11, 12, 11, 12, 11, 12, 11, 12,
+ 11, 12, 11, 12, 11, 12, 11, 12,
+ 11, 12, 74, 74, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 74, 74, 74, 74, 74, 74, 74,
+ 74, 2026, 74, 74, 74, 74, 74, 74,
+ 74, 2026, 2026, 2026, 2026, 2026, 2026, 74,
+ 74, 74, 2026, 74, 74, 74, 74, 2026,
+ 2026, 2026, 2026, 2026, 74, 2026, 2026, 74,
+ 74, 11, 12, 11, 12, 2026, 74, 74,
+ 74, 74, 2026, 74, 2026, 2026, 2026, 74,
+ 74, 2026, 2026, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 2026, 2026, 2026,
+ 2026, 2026, 2026, 74, 74, 11, 12, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 2026, 2026, 2245, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 74, 2026,
+ 2026, 2026, 2026, 74, 74, 2026, 74, 2026,
+ 74, 74, 2026, 74, 2026, 2026, 2026, 2026,
+ 74, 74, 74, 74, 74, 2026, 2026, 74,
+ 74, 74, 74, 74, 74, 2026, 2026, 2026,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 2026, 2026, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 2026, 2026, 74,
+ 74, 74, 74, 2026, 2026, 2026, 2026, 74,
+ 2026, 2026, 74, 74, 2026, 2246, 2247, 2248,
+ 74, 74, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 74, 74, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 74,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 74, 74, 74, 74, 74, 2249, 2250, 2026,
+ 74, 74, 74, 2026, 2026, 2026, 2026, 2026,
+ 74, 74, 74, 74, 74, 2026, 2026, 2026,
+ 74, 74, 74, 74, 2026, 74, 74, 74,
+ 2026, 2026, 2026, 2026, 2026, 74, 2026, 74,
+ 74, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 0, 0, 0, 0,
+ 0, 76, 76, 76, 76, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2251, 2252, 2253, 2254, 2255, 2256, 2257,
+ 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265,
+ 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273,
+ 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281,
+ 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289,
+ 2290, 2291, 2292, 2293, 2294, 2295, 2296, 2297,
+ 0, 2298, 2299, 2300, 2301, 2302, 2303, 2304,
+ 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312,
+ 2313, 2314, 2315, 2316, 2317, 2318, 2319, 2320,
+ 2321, 2322, 2323, 2324, 2325, 2326, 2327, 2328,
+ 2329, 2330, 2331, 2332, 2333, 2334, 2335, 2336,
+ 2337, 2338, 2339, 2340, 2341, 2342, 2343, 2344,
+ 0, 2345, 2346, 2347, 2348, 2349, 2350, 2351,
+ 2352, 2353, 2354, 2355, 2356, 2357, 0, 0,
+ 0, 0, 0, 0, 0, 213, 2358, 2359,
+ 213, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2360, 2361, 2362, 2363, 2364, 2365, 2366,
+ 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374,
+ 2375, 2376, 2377, 2378, 2379, 2380, 2381, 2382,
+ 2383, 2384, 2385, 2386, 2387, 2388, 2389, 2390,
+ 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398,
+ 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406,
+ 2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414,
+ 2415, 2416, 2417, 2418, 2419, 2420, 2421, 2422,
+ 2423, 2424, 2425, 2426, 2427, 2428, 2429, 2430,
+ 2431, 2432, 2433, 2434, 2435, 2436, 2437, 2438,
+ 2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446,
+ 2447, 2448, 2449, 2450, 2451, 2452, 2453, 2454,
+ 2455, 2456, 2457, 2458, 2459, 213, 76, 76,
+ 76, 76, 76, 76, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 8, 8, 8, 8, 1251, 8,
+ 8, 2460, 2461, 2462, 2463, 2464, 2465, 2466,
+ 2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474,
+ 2475, 2476, 2477, 2478, 2479, 2480, 2481, 2482,
+ 2483, 2484, 2485, 2486, 2487, 2488, 2489, 2490,
+ 2491, 2492, 2493, 2494, 2495, 2496, 2497, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 2498, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 8, 8, 79, 91, 79, 91, 8,
+ 8, 8, 79, 91, 8, 79, 91, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 1030, 0, 0, 0, 0, 79, 91, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 0, 76, 76, 76, 76,
+ 2499, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 2500, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2501, 2502, 2503, 2504, 2505, 2506, 2507,
+ 2508, 2509, 2510, 2511, 2512, 2513, 2514, 2515,
+ 2516, 2517, 2518, 2519, 2520, 2521, 2522, 2523,
+ 2524, 2525, 2526, 2527, 2528, 2529, 2530, 2531,
+ 2532, 2533, 2534, 2535, 2536, 2537, 2538, 2539,
+ 2540, 2541, 2542, 2543, 2544, 2545, 2546, 2547,
+ 2548, 2549, 2550, 2551, 2552, 2553, 2554, 2555,
+ 2556, 2557, 2558, 2559, 2560, 2561, 2562, 2563,
+ 2564, 2565, 2566, 2567, 2568, 2569, 2570, 2571,
+ 2572, 2573, 2574, 2575, 2576, 2577, 2578, 2579,
+ 2580, 2581, 2582, 2583, 2584, 2585, 2586, 2587,
+ 2588, 2589, 2590, 2591, 2592, 2593, 2594, 2595,
+ 2596, 2597, 2598, 2599, 2600, 2601, 2602, 2603,
+ 2604, 2605, 2606, 2607, 2608, 2609, 2610, 2611,
+ 2612, 2613, 2614, 2615, 2616, 2617, 2618, 2619,
+ 2620, 2621, 2622, 2623, 2624, 2625, 2626, 2627,
+ 2628, 2629, 2630, 2631, 2632, 2633, 2634, 2635,
+ 2636, 2637, 2638, 2639, 2640, 2641, 2642, 2643,
+ 2644, 2645, 2646, 2647, 2648, 2649, 2650, 2651,
+ 2652, 2653, 2654, 2655, 2656, 2657, 2658, 2659,
+ 2660, 2661, 2662, 2663, 2664, 2665, 2666, 2667,
+ 2668, 2669, 2670, 2671, 2672, 2673, 2674, 2675,
+ 2676, 2677, 2678, 2679, 2680, 2681, 2682, 2683,
+ 2684, 2685, 2686, 2687, 2688, 2689, 2690, 2691,
+ 2692, 2693, 2694, 2695, 2696, 2697, 2698, 2699,
+ 2700, 2701, 2702, 2703, 2704, 2705, 2706, 2707,
+ 2708, 2709, 2710, 2711, 2712, 2713, 2714, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 0, 0, 0,
+ 0, 2715, 8, 8, 8, 76, 507, 339,
+ 1249, 11, 12, 11, 12, 11, 12, 11,
+ 12, 11, 12, 76, 76, 11, 12, 11,
+ 12, 11, 12, 11, 12, 1030, 11, 12,
+ 12, 76, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 2716, 1032, 536, 1031, 2717,
+ 2717, 1030, 507, 507, 507, 507, 507, 2718,
+ 76, 2719, 2720, 2721, 507, 339, 8, 76,
+ 76, 0, 339, 339, 339, 339, 339, 2722,
+ 339, 339, 339, 339, 2723, 2724, 2725, 2726,
+ 2727, 2728, 2729, 2730, 2731, 2732, 2733, 2734,
+ 2735, 2736, 2737, 2738, 2739, 2740, 2741, 2742,
+ 2743, 2744, 2745, 2746, 339, 2747, 2748, 2749,
+ 2750, 2751, 2752, 339, 339, 339, 339, 339,
+ 2753, 2754, 2755, 2756, 2757, 2758, 2759, 2760,
+ 2761, 2762, 2763, 2764, 2765, 2766, 2767, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 2768, 339, 339,
+ 0, 0, 2769, 2770, 2771, 2772, 2773, 2774,
+ 2775, 1030, 339, 339, 339, 339, 339, 2776,
+ 339, 339, 339, 339, 2777, 2778, 2779, 2780,
+ 2781, 2782, 2783, 2784, 2785, 2786, 2787, 2788,
+ 2789, 2790, 2791, 2792, 2793, 2794, 2795, 2796,
+ 2797, 2798, 2799, 2800, 339, 2801, 2802, 2803,
+ 2804, 2805, 2806, 339, 339, 339, 339, 339,
+ 2807, 2808, 2809, 2810, 2811, 2812, 2813, 2814,
+ 2815, 2816, 2817, 2818, 2819, 2820, 2821, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 2822, 2823, 2824, 2825, 339, 2826, 339, 339,
+ 2827, 2828, 2829, 2830, 8, 507, 2831, 2832,
+ 2833, 0, 0, 0, 0, 0, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 0, 0,
+ 0, 0, 2834, 2835, 2836, 2837, 2838, 2839,
+ 2840, 2841, 2842, 2843, 2844, 2845, 2846, 2847,
+ 2848, 2849, 2850, 2851, 2852, 2853, 2854, 2855,
+ 2856, 2857, 2858, 2859, 2860, 2861, 2862, 2863,
+ 2864, 2865, 2866, 2867, 2868, 2869, 2870, 2871,
+ 2872, 2873, 2874, 2875, 2876, 2877, 2878, 2879,
+ 2880, 2881, 2882, 2883, 2884, 2885, 2886, 2887,
+ 2888, 2889, 2890, 2891, 2892, 2893, 2894, 2895,
+ 2896, 2897, 2898, 2899, 2900, 2901, 2902, 2903,
+ 2904, 2905, 2906, 2907, 2908, 2909, 2910, 2911,
+ 2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919,
+ 2920, 2921, 2922, 2923, 2924, 2925, 2926, 2927,
+ 0, 812, 812, 2928, 2929, 2930, 2931, 2932,
+ 2933, 2934, 2935, 2936, 2937, 2938, 2939, 2940,
+ 2941, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 0, 0, 0, 0, 0, 0, 0,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 2942, 2943, 2944, 2945, 2946, 2947, 2948,
+ 2949, 2950, 2951, 2952, 2953, 2954, 2955, 2956,
+ 2957, 2958, 2959, 2960, 2961, 2962, 2963, 2964,
+ 2965, 2966, 2967, 2968, 2969, 2970, 2971, 2972,
+ 0, 2973, 2974, 2975, 2976, 2977, 2978, 2979,
+ 2980, 2981, 2982, 2983, 2984, 2985, 2986, 2987,
+ 2988, 2989, 2990, 2991, 2992, 2993, 2994, 2995,
+ 2996, 2997, 2998, 2999, 3000, 3001, 3002, 3003,
+ 3004, 3005, 3006, 3007, 3008, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3009, 3010, 3011, 3012, 3013, 3014, 3015,
+ 3016, 3017, 3018, 3019, 3020, 3021, 3022, 3023,
+ 3024, 3025, 3026, 3027, 3028, 3029, 3030, 3031,
+ 3032, 3033, 3034, 3035, 3036, 3037, 3038, 3039,
+ 3040, 3041, 3042, 3043, 3044, 3045, 3046, 3047,
+ 3048, 3049, 3050, 3051, 3052, 3053, 3054, 3055,
+ 812, 3056, 3057, 3058, 3059, 3060, 3061, 3062,
+ 3063, 3064, 3065, 3066, 3067, 3068, 3069, 3070,
+ 3071, 3072, 3073, 3074, 3075, 3076, 3077, 3078,
+ 3079, 3080, 3081, 3082, 3083, 3084, 3085, 3086,
+ 3087, 3088, 3089, 3090, 3091, 3092, 3093, 3094,
+ 3095, 3096, 3097, 3098, 3099, 3100, 3101, 3102,
+ 3103, 3104, 3105, 3106, 3107, 3108, 3109, 3110,
+ 3111, 3112, 3113, 3114, 3115, 3116, 3117, 3118,
+ 3119, 3120, 3121, 3122, 3123, 3124, 3125, 3126,
+ 3127, 3128, 3129, 3130, 3131, 3132, 3133, 3134,
+ 3135, 3136, 3137, 3138, 3139, 3140, 3141, 3142,
+ 3143, 3144, 3145, 3146, 3147, 3148, 3149, 3150,
+ 3151, 3152, 3153, 3154, 3155, 3156, 3157, 3158,
+ 3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166,
+ 3167, 3168, 3169, 3170, 3171, 3172, 3173, 3174,
+ 3175, 3176, 3177, 3178, 3179, 3180, 3181, 3182,
+ 0, 3183, 3184, 3185, 3186, 3187, 3188, 3189,
+ 3190, 3191, 3192, 3193, 3194, 3195, 3196, 3197,
+ 3198, 3199, 3200, 3201, 3202, 3203, 3204, 3205,
+ 3206, 3207, 3208, 3209, 3210, 3211, 3212, 3213,
+ 3214, 3215, 3216, 3217, 3218, 3219, 3220, 3221,
+ 3222, 3223, 3224, 3225, 3226, 3227, 3228, 3229,
+ 3230, 3231, 3232, 3233, 3234, 3235, 3236, 3237,
+ 3238, 3239, 3240, 3241, 3242, 3243, 3244, 3245,
+ 3246, 3247, 3248, 3249, 3250, 3251, 3252, 3253,
+ 3254, 3255, 3256, 3257, 3258, 3259, 3260, 3261,
+ 3262, 3263, 3264, 3265, 3266, 3267, 3268, 3269,
+ 3270, 3271, 3272, 3273, 3274, 3275, 3276, 3277,
+ 3278, 3279, 3280, 3281, 3282, 3283, 3284, 3285,
+ 3286, 3287, 3288, 3289, 3290, 3291, 3292, 3293,
+ 3294, 3295, 3296, 3297, 3298, 3299, 3300, 3301,
+ 3302, 3303, 3304, 3305, 3306, 3307, 3308, 3309,
+ 3310, 3311, 3312, 3313, 3314, 3315, 3316, 3317,
+ 3318, 3319, 3320, 3321, 3322, 3323, 3324, 3325,
+ 3326, 3327, 3328, 3329, 3330, 3331, 3332, 3333,
+ 3334, 3335, 3336, 3337, 3338, 3339, 3340, 3341,
+ 3342, 3343, 3344, 3345, 3346, 3347, 3348, 3349,
+ 3350, 3351, 3352, 3353, 3354, 3355, 3356, 3357,
+ 3358, 3359, 3360, 3361, 3362, 3363, 3364, 3365,
+ 3366, 3367, 3368, 3369, 3370, 3371, 3372, 3373,
+ 3374, 3375, 3376, 3377, 3378, 3379, 3380, 3381,
+ 3382, 3383, 3384, 3385, 3386, 3387, 3388, 3389,
+ 3390, 3391, 3392, 3393, 3394, 3395, 3396, 3397,
+ 3398, 3399, 3400, 3401, 3402, 3403, 3404, 3405,
+ 3406, 3407, 3408, 3409, 3410, 3411, 3412, 3413,
+ 3414, 3415, 3416, 3417, 3418, 3419, 3420, 3421,
+ 3422, 3423, 3424, 3425, 3426, 3427, 3428, 3429,
+ 3430, 3431, 3432, 3433, 3434, 3435, 3436, 3437,
+ 3438, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 507, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 0, 0,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 506, 506, 506, 506, 0, 0, 0, 0,
+ 0, 46, 46, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 1252, 339, 339, 339, 1101,
+ 339, 339, 339, 339, 1090, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 1093, 1093, 1090, 1090,
+ 1093, 76, 76, 76, 76, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 8, 8, 8,
+ 8, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3441, 3442, 3443, 3444, 3445, 3446, 3447,
+ 3448, 3448, 3449, 3450, 3451, 3452, 3453, 3454,
+ 3455, 3456, 3457, 3458, 3459, 3460, 3461, 3462,
+ 3463, 3464, 3465, 3466, 3467, 3468, 3469, 3470,
+ 3471, 3472, 3473, 3474, 3475, 3476, 3477, 3478,
+ 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3486,
+ 3487, 3488, 3489, 3490, 3491, 3492, 3493, 3494,
+ 3495, 3496, 3497, 3498, 3499, 3500, 3501, 3502,
+ 3503, 3504, 3505, 3506, 3507, 3508, 3509, 3510,
+ 3511, 3512, 3513, 3514, 3515, 3516, 3517, 3518,
+ 3519, 3520, 3521, 3522, 3523, 3524, 3525, 3526,
+ 3527, 3528, 3529, 3530, 3531, 3460, 3532, 3533,
+ 3534, 3535, 3536, 3537, 3538, 3539, 3540, 3541,
+ 3542, 3543, 3544, 3545, 3546, 3547, 3548, 3549,
+ 3550, 3551, 3552, 3553, 3554, 3555, 3556, 3557,
+ 3558, 3559, 3560, 3561, 3562, 3563, 3564, 3565,
+ 3566, 3567, 3568, 3569, 3570, 3571, 3572, 3573,
+ 3574, 3575, 3576, 3577, 3578, 3579, 3580, 3581,
+ 3582, 3583, 3584, 3585, 3586, 3587, 3588, 3589,
+ 3590, 3591, 3592, 3593, 3594, 3595, 3596, 3597,
+ 3598, 3599, 3550, 3600, 3601, 3602, 3603, 3604,
+ 3605, 3606, 3607, 3534, 3608, 3609, 3610, 3611,
+ 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619,
+ 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627,
+ 3460, 3628, 3629, 3630, 3631, 3632, 3633, 3634,
+ 3635, 3636, 3637, 3638, 3639, 3640, 3641, 3642,
+ 3643, 3644, 3645, 3646, 3647, 3648, 3649, 3650,
+ 3651, 3652, 3653, 3654, 3536, 3655, 3656, 3657,
+ 3658, 3659, 3660, 3661, 3662, 3663, 3664, 3665,
+ 3666, 3667, 3668, 3669, 3670, 3671, 3672, 3673,
+ 3674, 3675, 3676, 3677, 3678, 3679, 3680, 3681,
+ 3682, 3683, 3684, 3685, 3686, 3687, 3688, 3689,
+ 3690, 3691, 3692, 3693, 3694, 3695, 3696, 3697,
+ 3698, 3699, 3700, 3701, 3702, 3703, 3704, 339,
+ 339, 3705, 339, 3706, 339, 339, 3707, 3708,
+ 3709, 3710, 3711, 3712, 3713, 3714, 3715, 3716,
+ 339, 3717, 339, 3718, 339, 339, 3719, 3720,
+ 339, 339, 339, 3721, 3722, 3723, 3724, 0,
+ 0, 3725, 3726, 3727, 3728, 3729, 3730, 3731,
+ 3732, 3733, 3734, 3735, 3736, 3737, 3738, 3739,
+ 3740, 3741, 3742, 3743, 3744, 3745, 3746, 3747,
+ 3748, 3749, 3750, 3751, 3752, 3753, 3754, 3755,
+ 3756, 3757, 3758, 3759, 3760, 3761, 3762, 3763,
+ 3589, 3764, 3765, 3766, 3767, 3768, 3769, 3769,
+ 3770, 3771, 3772, 3773, 3774, 3775, 3776, 3777,
+ 3719, 3778, 3779, 3780, 0, 0, 0, 0,
+ 0, 3781, 3782, 3783, 3784, 3785, 3786, 3787,
+ 3788, 3731, 3789, 3790, 3791, 3705, 3792, 3793,
+ 3794, 3795, 3796, 3797, 3798, 3799, 3800, 3801,
+ 3802, 3803, 3740, 3804, 3741, 3805, 3806, 3807,
+ 3808, 3809, 3706, 3481, 3810, 3811, 3812, 3551,
+ 3638, 3813, 3814, 3748, 3815, 3749, 3816, 3817,
+ 3818, 3708, 3819, 3820, 3821, 3822, 3823, 3709,
+ 3824, 3825, 3826, 3827, 3828, 3829, 3763, 3830,
+ 3831, 3589, 3832, 3767, 3833, 3834, 3835, 3836,
+ 3837, 3772, 3838, 3718, 3839, 3773, 3532, 3840,
+ 3774, 3841, 3776, 3842, 3843, 3844, 3845, 3846,
+ 3778, 3714, 3847, 3779, 3848, 3780, 3849, 3448,
+ 3850, 3851, 3852, 3853, 3854, 3855, 3856, 3857,
+ 3858, 3859, 3860, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3861, 3862, 3863, 3864, 3865, 3866, 3867,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3868, 3869, 3870, 3871,
+ 3872, 0, 0, 0, 0, 0, 3873, 3874,
+ 3875, 3876, 3877, 3878, 3879, 3880, 3881, 3882,
+ 3883, 3884, 3885, 3886, 3887, 3888, 3889, 3890,
+ 3891, 3892, 3893, 3894, 3895, 3896, 3897, 3898,
+ 0, 3899, 3900, 3901, 3902, 3903, 0, 3904,
+ 0, 3905, 3906, 0, 3907, 3908, 0, 3909,
+ 3910, 3911, 3912, 3913, 3914, 3915, 3916, 3917,
+ 3918, 3919, 3920, 3921, 3922, 3923, 3924, 3925,
+ 3926, 3927, 3928, 3929, 3930, 3931, 3932, 3933,
+ 3934, 3935, 3936, 3937, 3938, 3939, 3940, 3941,
+ 3942, 3943, 3944, 3945, 3946, 3947, 3948, 3949,
+ 3950, 3951, 3952, 3953, 3954, 3955, 3956, 3957,
+ 3958, 3959, 3960, 3961, 3962, 3963, 3964, 3965,
+ 3966, 3967, 3968, 3969, 3970, 3971, 3972, 3973,
+ 3974, 3975, 3976, 3977, 3978, 3979, 3980, 3981,
+ 3982, 3983, 3984, 3985, 3986, 3987, 3988, 3989,
+ 3990, 3991, 3992, 3993, 3994, 3995, 3996, 3997,
+ 3998, 3999, 4000, 4001, 4002, 4003, 4004, 4005,
+ 4006, 4007, 4008, 4009, 4010, 4011, 4012, 4013,
+ 4014, 4015, 4016, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4017, 4018, 4019, 4020,
+ 4021, 4022, 4023, 4024, 4025, 4026, 4027, 4028,
+ 4029, 4030, 4031, 4032, 4033, 4034, 4035, 4036,
+ 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044,
+ 4045, 4046, 4047, 4048, 4049, 4050, 4051, 4052,
+ 4053, 4054, 4055, 4056, 4057, 4058, 4059, 4060,
+ 4061, 4062, 4063, 4064, 4055, 4065, 4066, 4067,
+ 4068, 4069, 4070, 4071, 4072, 4073, 4074, 4075,
+ 4076, 4077, 4078, 4079, 4080, 4081, 4082, 4083,
+ 4084, 4085, 4086, 4087, 4088, 4089, 4090, 4091,
+ 4092, 4093, 4094, 4095, 4096, 4097, 4098, 4099,
+ 4100, 4101, 4102, 4103, 4104, 4105, 4106, 4107,
+ 4108, 4109, 4110, 4111, 4112, 4113, 4114, 4115,
+ 4116, 4117, 4118, 4119, 4120, 4121, 4122, 4123,
+ 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131,
+ 4132, 4133, 4134, 4135, 4136, 4137, 4138, 4139,
+ 4140, 4141, 4142, 4143, 4144, 4145, 4146, 4147,
+ 4148, 4149, 4150, 4151, 4152, 4153, 4154, 4155,
+ 4156, 4157, 4158, 4159, 4160, 4161, 4162, 4163,
+ 4164, 4056, 4165, 4166, 4167, 4168, 4169, 4170,
+ 4171, 4172, 4173, 4174, 4175, 4176, 4177, 4178,
+ 4179, 4180, 4181, 4182, 4183, 4184, 4185, 4186,
+ 4187, 4188, 4189, 4190, 4191, 4192, 4193, 4194,
+ 4195, 4196, 4197, 4198, 4199, 4200, 4201, 4202,
+ 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4210,
+ 4211, 4212, 4213, 4214, 4215, 4216, 4217, 4218,
+ 4219, 4220, 4221, 4222, 4223, 4224, 4225, 4226,
+ 4227, 4228, 4229, 4230, 4231, 4232, 4233, 4234,
+ 4235, 4236, 4237, 4238, 4239, 4240, 4241, 4242,
+ 4243, 4244, 4245, 4246, 4247, 4248, 4249, 4250,
+ 4251, 4252, 4253, 4254, 4255, 4256, 4257, 4258,
+ 4259, 4260, 4261, 4262, 4263, 4264, 4265, 4266,
+ 4267, 4268, 4269, 4270, 4271, 4272, 4273, 4274,
+ 4275, 4276, 4277, 4278, 4279, 4280, 4281, 4282,
+ 4283, 4284, 4285, 4286, 4287, 4288, 4289, 4290,
+ 4291, 4292, 4293, 4294, 4295, 4296, 4297, 4298,
+ 4299, 4300, 4301, 4302, 4303, 4304, 4305, 4306,
+ 4307, 4308, 4309, 4310, 4311, 4312, 4313, 4314,
+ 4315, 4316, 4317, 4318, 4319, 4320, 4321, 4322,
+ 4323, 4324, 4325, 4326, 4327, 4328, 4329, 4330,
+ 4331, 4332, 4333, 4334, 4335, 4336, 4337, 4338,
+ 4339, 4340, 4341, 4342, 4343, 4344, 4345, 4346,
+ 4347, 4348, 4349, 4350, 4351, 4352, 4353, 4354,
+ 4355, 4356, 4357, 4358, 4359, 4360, 4361, 4362,
+ 4363, 4364, 4365, 4366, 4367, 4368, 4369, 4370,
+ 4371, 4372, 4373, 4374, 4375, 4376, 4377, 4378,
+ 4379, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 4380, 4381, 4382, 4383, 4384, 4385, 4386,
+ 4387, 4388, 4389, 4390, 4391, 4392, 4393, 4394,
+ 4395, 4396, 4397, 4398, 4399, 4400, 4401, 4402,
+ 4403, 4404, 4405, 4406, 4407, 4408, 4409, 4410,
+ 4411, 4412, 4413, 4414, 4415, 4416, 4417, 4418,
+ 4419, 4420, 4421, 4422, 4423, 4424, 4425, 4426,
+ 4427, 4428, 4429, 4430, 4431, 4432, 4433, 4434,
+ 4435, 4436, 4437, 4438, 4439, 4440, 4441, 4442,
+ 4443, 0, 0, 4444, 4445, 4446, 4447, 4448,
+ 4449, 4450, 4451, 4452, 4453, 4454, 4455, 4456,
+ 4457, 4458, 4459, 4460, 4461, 4462, 4463, 4464,
+ 4465, 4466, 4467, 4468, 4469, 4470, 4471, 4472,
+ 4473, 4474, 4475, 4476, 4477, 4478, 4479, 4480,
+ 4481, 4482, 4483, 4484, 4485, 4486, 4487, 4488,
+ 4489, 4490, 4491, 4492, 4493, 4494, 4495, 4496,
+ 4497, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 4498, 4499, 4500, 4501, 4502, 4503, 4504,
+ 4505, 4506, 4507, 4508, 4509, 4510, 76, 0,
+ 0, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 4511, 4512, 4513, 4514, 4515, 4516, 4517,
+ 4518, 4519, 4520, 0, 0, 0, 0, 0,
+ 0, 524, 524, 524, 524, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 4521, 4522, 4523, 4524, 4524, 4525, 4526,
+ 4527, 4528, 4529, 4530, 4531, 4532, 4533, 4534,
+ 4535, 4536, 4537, 4538, 4539, 4540, 8, 8,
+ 4541, 4542, 4543, 4543, 4543, 4543, 4544, 4544,
+ 4544, 4545, 4546, 4547, 0, 4548, 4549, 4550,
+ 4551, 4552, 4553, 4554, 4555, 4556, 4557, 4558,
+ 4559, 4560, 4561, 4562, 4563, 4564, 4565, 4566,
+ 0, 4567, 4568, 4569, 4570, 0, 0, 0,
+ 0, 4571, 4572, 4573, 1054, 4574, 0, 4575,
+ 4576, 4577, 4578, 4579, 4580, 4581, 4582, 4583,
+ 4584, 4585, 4586, 4587, 4588, 4589, 4590, 4591,
+ 4592, 4593, 4594, 4595, 4596, 4597, 4598, 4599,
+ 4600, 4601, 4602, 4603, 4604, 4605, 4606, 4607,
+ 4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615,
+ 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623,
+ 4624, 4625, 4626, 4627, 4628, 4629, 4630, 4631,
+ 4632, 4633, 4634, 4635, 4636, 4637, 4638, 4639,
+ 4640, 4641, 4642, 4643, 4644, 4645, 4646, 4647,
+ 4648, 4649, 4650, 4651, 4652, 4653, 4654, 4655,
+ 4656, 4657, 4658, 4659, 4660, 4661, 4662, 4663,
+ 4664, 4665, 4666, 4667, 4668, 4669, 4670, 4671,
+ 4672, 4673, 4674, 4675, 4676, 4677, 4678, 4679,
+ 4680, 4681, 4682, 4683, 4684, 4685, 4686, 4687,
+ 4688, 4689, 4690, 4691, 4692, 4693, 4694, 4695,
+ 4696, 4697, 4698, 4699, 4700, 4701, 4702, 4703,
+ 4704, 4705, 4706, 4707, 4708, 4709, 0, 0,
+ 80, 0, 4710, 4711, 4712, 4713, 4714, 4715,
+ 4716, 4717, 4718, 4719, 4720, 4721, 4722, 4723,
+ 4724, 4725, 4726, 4727, 4728, 4729, 4730, 4731,
+ 4732, 4733, 4734, 4735, 4736, 4737, 4738, 4739,
+ 4740, 4741, 4742, 4743, 4744, 4745, 4746, 4747,
+ 4748, 4749, 4750, 4751, 4752, 4753, 4754, 4755,
+ 4756, 4757, 4758, 4759, 4760, 4761, 4762, 4763,
+ 4764, 4765, 4766, 4767, 4768, 4769, 4770, 4771,
+ 4772, 4773, 4774, 4775, 4776, 4777, 4778, 4779,
+ 4780, 4781, 4782, 4783, 4784, 4785, 4786, 4787,
+ 4788, 4789, 4790, 4791, 4792, 4793, 4794, 4795,
+ 4796, 4797, 4798, 4799, 4800, 4801, 4802, 4803,
+ 4804, 4805, 4806, 4807, 4808, 4809, 4810, 4811,
+ 4812, 4813, 4814, 4815, 4816, 4817, 4818, 4819,
+ 4820, 4821, 4822, 4823, 4824, 4825, 4826, 4827,
+ 4828, 4829, 4830, 4831, 4832, 4833, 4834, 4835,
+ 4836, 4837, 4838, 4839, 4840, 4841, 4842, 4843,
+ 4844, 4845, 4846, 4847, 4848, 4849, 4850, 4851,
+ 4852, 4853, 4854, 4855, 4856, 4857, 4858, 4859,
+ 4860, 4861, 4862, 4863, 4864, 4865, 4866, 4867,
+ 4868, 4869, 4870, 4871, 4872, 4873, 4874, 4875,
+ 4876, 4877, 4878, 4879, 4880, 4881, 4882, 4883,
+ 4884, 4885, 4886, 4887, 4888, 4889, 4890, 4891,
+ 4892, 4893, 4894, 4895, 4896, 4897, 4898, 4899,
+ 0, 0, 0, 4900, 4901, 4902, 4903, 4904,
+ 4905, 0, 0, 4906, 4907, 4908, 4909, 4910,
+ 4911, 0, 0, 4912, 4913, 4914, 4915, 4916,
+ 4917, 0, 0, 4918, 4919, 4920, 0, 0,
+ 0, 4921, 4922, 4923, 4924, 4925, 4926, 4927,
+ 0, 4928, 4929, 4930, 4931, 4932, 4933, 4934,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 4935, 4935, 4935, 76, 76, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 0, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 0, 339, 339, 0,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 0, 0, 0, 0,
+ 0, 990, 8, 812, 0, 0, 0, 0,
+ 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120,
+ 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120,
+ 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120,
+ 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120,
+ 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120,
+ 1120, 1120, 1120, 1120, 1120, 0, 0, 0,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 4936, 4936, 4936, 4936, 4936, 4936, 4936,
+ 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936,
+ 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936,
+ 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936,
+ 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936,
+ 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936,
+ 4936, 4936, 4936, 4936, 4936, 4936, 1251, 1251,
+ 1251, 1251, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 1251, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 0, 1120, 1120, 1120, 1120, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 1249, 339, 339, 339, 339, 339,
+ 339, 339, 339, 1249, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 0,
+ 990, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 990, 1249, 1249, 1249, 1249, 1249, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 4937, 4938, 4939, 4940, 4941, 4942, 4943,
+ 4944, 4945, 4946, 4947, 4948, 4949, 4950, 4951,
+ 4952, 4953, 4954, 4955, 4956, 4957, 4958, 4959,
+ 4960, 4961, 4962, 4963, 4964, 4965, 4966, 4967,
+ 4968, 4969, 4970, 4971, 4972, 4973, 4974, 4975,
+ 4976, 4977, 4978, 4979, 4980, 4981, 4982, 4983,
+ 4984, 4985, 4986, 4987, 4988, 4989, 4990, 4991,
+ 4992, 4993, 4994, 4995, 4996, 4997, 4998, 4999,
+ 5000, 5001, 5002, 5003, 5004, 5005, 5006, 5007,
+ 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015,
+ 5016, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 0,
+ 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1050, 1050, 1050, 1050, 1050, 1050, 0,
+ 0, 1050, 0, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 0,
+ 1050, 1050, 0, 0, 0, 1050, 0, 0,
+ 1050, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 5017,
+ 5017, 5017, 5017, 0, 0, 0, 0, 0,
+ 8, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1050, 1090, 1090, 1090, 0, 1090, 1090,
+ 0, 0, 0, 0, 0, 1090, 537, 1090,
+ 524, 1050, 1050, 1050, 1050, 0, 1050, 1050,
+ 1050, 0, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 0, 0, 0,
+ 0, 524, 550, 537, 0, 0, 0, 0,
+ 1101, 5017, 5017, 5017, 5017, 5017, 5017, 5017,
+ 5017, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
+ 1046, 1046, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249,
+ 1249, 1249, 1249, 1249, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 990, 990, 990, 990, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 0, 0, 0, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 5018, 5019, 812, 812, 812, 812, 812, 5020,
+ 5021, 5022, 5023, 5024, 5025, 5026, 5027, 5028,
+ 550, 550, 550, 812, 812, 812, 5029, 5030,
+ 5031, 5032, 5033, 5034, 80, 80, 80, 80,
+ 80, 80, 80, 80, 537, 537, 537, 537,
+ 537, 537, 537, 537, 812, 812, 524, 524,
+ 524, 524, 524, 537, 537, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 524, 524, 524, 524, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 5035, 5036, 5037, 5038, 5039, 5040,
+ 5041, 5042, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 524, 524, 524, 76, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1120, 1120, 1120, 1120, 1120, 1120, 1120,
+ 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120,
+ 1120, 1120, 1120, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 5043, 1945, 1920, 1963, 1947, 1948, 5044,
+ 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047,
+ 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052,
+ 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946,
+ 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060,
+ 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067,
+ 5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920,
+ 1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046,
+ 1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048,
+ 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055,
+ 5056, 5057, 1964, 1946, 5058, 1926, 0, 1956,
+ 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063,
+ 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071,
+ 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044,
+ 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047,
+ 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052,
+ 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946,
+ 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060,
+ 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067,
+ 5068, 5069, 5070, 5071, 5072, 5043, 0, 1920,
+ 1963, 0, 0, 5044, 0, 0, 5045, 5046,
+ 0, 0, 1933, 5047, 1935, 1936, 0, 5048,
+ 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055,
+ 5056, 5057, 1964, 0, 5058, 0, 1928, 1956,
+ 1965, 5059, 1932, 5060, 5061, 0, 5062, 5063,
+ 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071,
+ 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044,
+ 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047,
+ 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052,
+ 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946,
+ 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060,
+ 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067,
+ 5068, 5069, 5070, 5071, 5072, 5043, 1945, 0,
+ 1963, 1947, 1948, 5044, 0, 0, 5045, 5046,
+ 1931, 1950, 1933, 5047, 1935, 1936, 0, 5048,
+ 5049, 5050, 5051, 5052, 5053, 5054, 0, 5055,
+ 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956,
+ 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063,
+ 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071,
+ 5072, 5043, 1945, 0, 1963, 1947, 1948, 5044,
+ 0, 1930, 5045, 5046, 1931, 1950, 0, 5047,
+ 0, 0, 0, 5048, 5049, 5050, 5051, 5052,
+ 5053, 5054, 0, 5055, 5056, 5057, 1964, 1946,
+ 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060,
+ 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067,
+ 5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920,
+ 1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046,
+ 1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048,
+ 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055,
+ 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956,
+ 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063,
+ 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071,
+ 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044,
+ 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047,
+ 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052,
+ 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946,
+ 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060,
+ 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067,
+ 5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920,
+ 1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046,
+ 1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048,
+ 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055,
+ 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956,
+ 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063,
+ 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071,
+ 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044,
+ 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047,
+ 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052,
+ 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946,
+ 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060,
+ 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067,
+ 5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920,
+ 1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046,
+ 1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048,
+ 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055,
+ 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956,
+ 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063,
+ 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071,
+ 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044,
+ 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047,
+ 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052,
+ 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946,
+ 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060,
+ 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067,
+ 5068, 5069, 5070, 5071, 5072, 5073, 5074, 0,
+ 0, 5075, 5076, 1960, 5077, 5078, 5079, 5080,
+ 5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088,
+ 1961, 5089, 5090, 5091, 5092, 5093, 5094, 5095,
+ 5096, 5097, 5098, 5099, 5100, 1959, 5101, 5102,
+ 5103, 5104, 5105, 5106, 5107, 5108, 5109, 5110,
+ 5111, 5112, 1958, 5113, 5114, 5115, 5116, 5117,
+ 5118, 5119, 5120, 5121, 5122, 5123, 5124, 5125,
+ 5126, 5127, 5128, 5075, 5076, 1960, 5077, 5078,
+ 5079, 5080, 5081, 5082, 5083, 5084, 5085, 5086,
+ 5087, 5088, 1961, 5089, 5090, 5091, 5092, 5093,
+ 5094, 5095, 5096, 5097, 5098, 5099, 5100, 1959,
+ 5101, 5102, 5103, 5104, 5105, 5106, 5107, 5108,
+ 5109, 5110, 5111, 5112, 1958, 5113, 5114, 5115,
+ 5116, 5117, 5118, 5119, 5120, 5121, 5122, 5123,
+ 5124, 5125, 5126, 5127, 5128, 5075, 5076, 1960,
+ 5077, 5078, 5079, 5080, 5081, 5082, 5083, 5084,
+ 5085, 5086, 5087, 5088, 1961, 5089, 5090, 5091,
+ 5092, 5093, 5094, 5095, 5096, 5097, 5098, 5099,
+ 5100, 1959, 5101, 5102, 5103, 5104, 5105, 5106,
+ 5107, 5108, 5109, 5110, 5111, 5112, 1958, 5113,
+ 5114, 5115, 5116, 5117, 5118, 5119, 5120, 5121,
+ 5122, 5123, 5124, 5125, 5126, 5127, 5128, 5075,
+ 5076, 1960, 5077, 5078, 5079, 5080, 5081, 5082,
+ 5083, 5084, 5085, 5086, 5087, 5088, 1961, 5089,
+ 5090, 5091, 5092, 5093, 5094, 5095, 5096, 5097,
+ 5098, 5099, 5100, 1959, 5101, 5102, 5103, 5104,
+ 5105, 5106, 5107, 5108, 5109, 5110, 5111, 5112,
+ 1958, 5113, 5114, 5115, 5116, 5117, 5118, 5119,
+ 5120, 5121, 5122, 5123, 5124, 5125, 5126, 5127,
+ 5128, 5075, 5076, 1960, 5077, 5078, 5079, 5080,
+ 5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088,
+ 1961, 5089, 5090, 5091, 5092, 5093, 5094, 5095,
+ 5096, 5097, 5098, 5099, 5100, 1959, 5101, 5102,
+ 5103, 5104, 5105, 5106, 5107, 5108, 5109, 5110,
+ 5111, 5112, 1958, 5113, 5114, 5115, 5116, 5117,
+ 5118, 5119, 5120, 5121, 5122, 5123, 5124, 5125,
+ 5126, 5127, 5128, 5129, 5130, 0, 0, 5131,
+ 5132, 5133, 5134, 5135, 5136, 5137, 5138, 5139,
+ 5140, 5131, 5132, 5133, 5134, 5135, 5136, 5137,
+ 5138, 5139, 5140, 5131, 5132, 5133, 5134, 5135,
+ 5136, 5137, 5138, 5139, 5140, 5131, 5132, 5133,
+ 5134, 5135, 5136, 5137, 5138, 5139, 5140, 5131,
+ 5132, 5133, 5134, 5135, 5136, 5137, 5138, 5139,
+ 5140, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 5141, 5142, 5143, 5144, 5145, 3725, 5146,
+ 5147, 5148, 5149, 3726, 5150, 5151, 5152, 3727,
+ 5153, 5154, 5155, 5156, 5157, 5158, 5159, 5160,
+ 5161, 5162, 5163, 5164, 3782, 5165, 5166, 5167,
+ 5168, 5169, 5170, 5171, 5172, 5173, 3787, 3728,
+ 3729, 3788, 5174, 5175, 3538, 5176, 3730, 5177,
+ 5178, 5179, 5180, 5180, 5180, 5181, 5182, 5183,
+ 5184, 5185, 5186, 5187, 5188, 5189, 5190, 5191,
+ 5192, 5193, 5194, 5195, 5196, 5197, 5198, 5198,
+ 3790, 5199, 5200, 5201, 5202, 3732, 5203, 5204,
+ 5205, 3691, 5206, 5207, 5208, 5209, 5210, 5211,
+ 5212, 5213, 5214, 5215, 5216, 5217, 5218, 5219,
+ 5220, 5221, 5222, 5223, 5224, 5225, 5226, 5227,
+ 5228, 5229, 5230, 5231, 5231, 5232, 5233, 5234,
+ 3534, 5235, 5236, 5237, 5238, 5239, 5240, 5241,
+ 5242, 3737, 5243, 5244, 5245, 5246, 5247, 5248,
+ 5249, 5250, 5251, 5252, 5253, 5254, 5255, 5256,
+ 5257, 5258, 5259, 5260, 5261, 5262, 5263, 3480,
+ 5264, 5265, 5266, 5266, 5267, 5268, 5268, 5269,
+ 5270, 5271, 5272, 5273, 5274, 5275, 5276, 5277,
+ 5278, 5279, 5280, 5281, 3738, 5282, 5283, 5284,
+ 5285, 3802, 5285, 5286, 3740, 5287, 5288, 5289,
+ 5290, 3741, 3453, 5291, 5292, 5293, 5294, 5295,
+ 5296, 5297, 5298, 5299, 5300, 5301, 5302, 5303,
+ 5304, 5305, 5306, 5307, 5308, 5309, 5310, 5311,
+ 5312, 3742, 5313, 5314, 5315, 5316, 5317, 5318,
+ 3744, 5319, 5320, 5321, 5322, 5323, 5324, 5325,
+ 5326, 3481, 3810, 5327, 5328, 5329, 5330, 5331,
+ 5332, 5333, 5334, 3745, 5335, 5336, 5337, 5338,
+ 3853, 5339, 5340, 5341, 5342, 5343, 5344, 5345,
+ 5346, 5347, 5348, 5349, 5350, 5351, 3551, 5352,
+ 5353, 5354, 5355, 5356, 5357, 5358, 5359, 5360,
+ 5361, 5362, 3746, 3638, 5363, 5364, 5365, 5366,
+ 5367, 5368, 5369, 5370, 3814, 5371, 5372, 5373,
+ 5374, 5375, 5376, 5377, 5378, 3815, 5379, 5380,
+ 5381, 5382, 5383, 5384, 5385, 5386, 5387, 5388,
+ 5389, 5390, 3817, 5391, 5392, 5393, 5394, 5395,
+ 5396, 5397, 5398, 5399, 5400, 5401, 5401, 5402,
+ 5403, 3819, 5404, 5405, 5406, 5407, 5408, 5409,
+ 5410, 3537, 5411, 5412, 5413, 5414, 5415, 5416,
+ 5417, 3825, 5418, 5419, 5420, 5421, 5422, 5423,
+ 5423, 3826, 3855, 5424, 5425, 5426, 5427, 5428,
+ 3499, 3828, 5429, 5430, 3757, 5431, 5432, 3713,
+ 5433, 5434, 3761, 5435, 5436, 5437, 5438, 5438,
+ 5439, 5440, 5441, 5442, 5443, 5444, 5445, 5446,
+ 5447, 5448, 5449, 5450, 5451, 5452, 5453, 5454,
+ 5455, 5456, 5457, 5458, 5459, 5460, 5461, 5462,
+ 5463, 5464, 5465, 3767, 5466, 5467, 5468, 5469,
+ 5470, 5471, 5472, 5473, 5474, 5475, 5476, 5477,
+ 5478, 5479, 5480, 5481, 5267, 5482, 5483, 5484,
+ 5485, 5486, 5487, 5488, 5489, 5490, 5491, 5492,
+ 5493, 3555, 5494, 5495, 5496, 5497, 5498, 5499,
+ 3770, 5500, 5501, 5502, 5503, 5504, 5505, 5506,
+ 5507, 5508, 5509, 5510, 5511, 5512, 5513, 5514,
+ 5515, 5516, 5517, 5518, 5519, 3494, 5520, 5521,
+ 5522, 5523, 5524, 5525, 3835, 5526, 5527, 5528,
+ 5529, 5530, 5531, 5532, 5533, 5534, 5535, 5536,
+ 5537, 5538, 5539, 5540, 5541, 5542, 5543, 5544,
+ 5545, 3840, 3841, 5546, 5547, 5548, 5549, 5550,
+ 5551, 5552, 5553, 5554, 5555, 5556, 5557, 5558,
+ 3842, 5559, 5560, 5561, 5562, 5563, 5564, 5565,
+ 5566, 5567, 5568, 5569, 5570, 5571, 5572, 5573,
+ 5574, 5575, 5576, 5577, 5578, 5579, 5580, 5581,
+ 5582, 5583, 5584, 5585, 5586, 5587, 5588, 3848,
+ 3848, 5589, 5590, 5591, 5592, 5593, 5594, 5595,
+ 5596, 5597, 5598, 3849, 5599, 5600, 5601, 5602,
+ 5603, 5604, 5605, 5606, 5607, 5608, 5609, 5610,
+ 5611, 5612, 5613, 5614, 5615, 5616, 5617, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 80, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 558, 558, 558, 558, 558, 558, 558,
+ 558, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 0,
+ 0, };
+
+const utf8proc_property_t utf8proc_properties[] = {
+ {0, 0, 0, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_BN, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_S, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL},
+ {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_B, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL},
+ {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_WS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL},
+ {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_B, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_S, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ES, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17580, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17400, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17640, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 97, -1, 0, -1, false, false, false, false, utf8proc_sequences + 0},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 98, -1, 8640, -1, false, false, false, false, utf8proc_sequences + 2},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 99, -1, 60, -1, false, false, false, false, utf8proc_sequences + 4},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 100, -1, 960, -1, false, false, false, false, utf8proc_sequences + 6},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 101, -1, 120, -1, false, false, false, false, utf8proc_sequences + 8},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 102, -1, 9120, -1, false, false, false, false, utf8proc_sequences + 10},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 103, -1, 1080, -1, false, false, false, false, utf8proc_sequences + 12},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 104, -1, 1200, -1, false, false, false, false, utf8proc_sequences + 14},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 105, -1, 180, -1, false, false, false, false, utf8proc_sequences + 16},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 106, -1, 1320, -1, false, false, false, false, utf8proc_sequences + 18},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 107, -1, 1440, -1, false, false, false, false, utf8proc_sequences + 20},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 108, -1, 1560, -1, false, false, false, false, utf8proc_sequences + 22},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 109, -1, 9480, -1, false, false, false, false, utf8proc_sequences + 24},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 110, -1, 240, -1, false, false, false, false, utf8proc_sequences + 26},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 111, -1, 300, -1, false, false, false, false, utf8proc_sequences + 28},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 112, -1, 9720, -1, false, false, false, false, utf8proc_sequences + 30},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 113, -1, -1, -1, false, false, false, false, utf8proc_sequences + 32},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 114, -1, 1680, -1, false, false, false, false, utf8proc_sequences + 34},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 115, -1, 1800, -1, false, false, false, false, utf8proc_sequences + 36},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 116, -1, 1920, -1, false, false, false, false, utf8proc_sequences + 38},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 117, -1, 360, -1, false, false, false, false, utf8proc_sequences + 40},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 118, -1, 10560, -1, false, false, false, false, utf8proc_sequences + 42},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 119, -1, 2040, -1, false, false, false, false, utf8proc_sequences + 44},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 120, -1, 10680, -1, false, false, false, false, utf8proc_sequences + 46},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 121, -1, 420, -1, false, false, false, false, utf8proc_sequences + 48},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 122, -1, 2160, -1, false, false, false, false, utf8proc_sequences + 50},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 65, -1, 65, 480, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66, -1, 66, 8700, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 67, -1, 67, 540, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 68, -1, 68, 1020, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 69, -1, 69, 600, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 70, -1, 70, 9180, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 71, -1, 71, 1140, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 72, -1, 72, 1260, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 73, -1, 73, 660, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 74, -1, 74, 1380, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 75, -1, 75, 1500, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 76, -1, 76, 1620, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 77, -1, 77, 9540, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 78, -1, 78, 720, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 79, -1, 79, 780, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 80, -1, 80, 9780, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 81, -1, 81, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 82, -1, 82, 1740, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 83, -1, 83, 1860, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 84, -1, 84, 1980, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 85, -1, 85, 840, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 86, -1, 86, 10620, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 87, -1, 87, 2100, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 88, -1, 88, 10740, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 89, -1, 89, 900, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 90, -1, 90, 2220, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_NOBREAK, utf8proc_sequences + 52, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 54, false, -1, -1, -1, 3600, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 0, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PI, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_BN, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 57, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ET, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ET, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 64, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 67, false, 924, -1, 924, -1, -1, false, false, false, false, utf8proc_sequences + 67},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 69, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 28, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PF, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 74, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 78, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 82, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 86, false, -1, 224, -1, -1, -1, false, false, false, false, utf8proc_sequences + 89},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 91, false, -1, 225, -1, -1, -1, false, false, false, false, utf8proc_sequences + 94},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 96, false, -1, 226, -1, 10860, -1, false, false, false, false, utf8proc_sequences + 99},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 101, false, -1, 227, -1, -1, -1, false, false, false, false, utf8proc_sequences + 104},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 106, false, -1, 228, -1, 2400, -1, false, false, false, false, utf8proc_sequences + 109},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 111, false, -1, 229, -1, 3000, -1, false, false, false, false, utf8proc_sequences + 114},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 230, -1, 2640, -1, false, false, false, false, utf8proc_sequences + 116},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 118, false, -1, 231, -1, 8760, -1, false, false, false, false, utf8proc_sequences + 121},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 123, false, -1, 232, -1, -1, -1, false, false, false, false, utf8proc_sequences + 126},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 128, false, -1, 233, -1, -1, -1, false, false, false, false, utf8proc_sequences + 131},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 133, false, -1, 234, -1, 11220, -1, false, false, false, false, utf8proc_sequences + 136},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 138, false, -1, 235, -1, -1, -1, false, false, false, false, utf8proc_sequences + 141},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 143, false, -1, 236, -1, -1, -1, false, false, false, false, utf8proc_sequences + 146},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 148, false, -1, 237, -1, -1, -1, false, false, false, false, utf8proc_sequences + 151},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 153, false, -1, 238, -1, -1, -1, false, false, false, false, utf8proc_sequences + 156},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 158, false, -1, 239, -1, 9240, -1, false, false, false, false, utf8proc_sequences + 161},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 240, -1, -1, -1, false, false, false, false, utf8proc_sequences + 163},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 165, false, -1, 241, -1, -1, -1, false, false, false, false, utf8proc_sequences + 168},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 170, false, -1, 242, -1, -1, -1, false, false, false, false, utf8proc_sequences + 173},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 175, false, -1, 243, -1, -1, -1, false, false, false, false, utf8proc_sequences + 178},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 180, false, -1, 244, -1, 11460, -1, false, false, false, false, utf8proc_sequences + 183},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 185, false, -1, 245, -1, 3360, -1, false, false, false, false, utf8proc_sequences + 188},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 190, false, -1, 246, -1, 3240, -1, false, false, false, false, utf8proc_sequences + 193},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 248, -1, 3120, -1, false, false, false, false, utf8proc_sequences + 195},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 197, false, -1, 249, -1, -1, -1, false, false, false, false, utf8proc_sequences + 200},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 202, false, -1, 250, -1, -1, -1, false, false, false, false, utf8proc_sequences + 205},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 207, false, -1, 251, -1, -1, -1, false, false, false, false, utf8proc_sequences + 210},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 212, false, -1, 252, -1, 2280, -1, false, false, false, false, utf8proc_sequences + 215},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 217, false, -1, 253, -1, -1, -1, false, false, false, false, utf8proc_sequences + 220},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 254, -1, -1, -1, false, false, false, false, utf8proc_sequences + 222},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 224},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 227, false, 192, -1, 192, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 230, false, 193, -1, 193, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 233, false, 194, -1, 194, 10920, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 236, false, 195, -1, 195, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 239, false, 196, -1, 196, 2460, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 242, false, 197, -1, 197, 3060, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 198, -1, 198, 2700, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 245, false, 199, -1, 199, 8820, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 248, false, 200, -1, 200, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 251, false, 201, -1, 201, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 254, false, 202, -1, 202, 11280, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 257, false, 203, -1, 203, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 260, false, 204, -1, 204, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 263, false, 205, -1, 205, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 266, false, 206, -1, 206, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 269, false, 207, -1, 207, 9300, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 208, -1, 208, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 272, false, 209, -1, 209, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 275, false, 210, -1, 210, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 278, false, 211, -1, 211, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 281, false, 212, -1, 212, 11520, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 284, false, 213, -1, 213, 3420, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 287, false, 214, -1, 214, 3300, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 216, -1, 216, 3180, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 290, false, 217, -1, 217, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 293, false, 218, -1, 218, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 296, false, 219, -1, 219, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 299, false, 220, -1, 220, 2340, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 302, false, 221, -1, 221, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 222, -1, 222, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 305, false, 376, -1, 376, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 308, false, -1, 257, -1, -1, -1, false, false, false, false, utf8proc_sequences + 311},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 313, false, 256, -1, 256, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 316, false, -1, 259, -1, 11100, -1, false, false, false, false, utf8proc_sequences + 319},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 321, false, 258, -1, 258, 11160, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 324, false, -1, 261, -1, -1, -1, false, false, false, false, utf8proc_sequences + 327},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 329, false, 260, -1, 260, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 332, false, -1, 263, -1, -1, -1, false, false, false, false, utf8proc_sequences + 335},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 337, false, 262, -1, 262, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 340, false, -1, 265, -1, -1, -1, false, false, false, false, utf8proc_sequences + 343},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 345, false, 264, -1, 264, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 348, false, -1, 267, -1, -1, -1, false, false, false, false, utf8proc_sequences + 351},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 353, false, 266, -1, 266, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 356, false, -1, 269, -1, -1, -1, false, false, false, false, utf8proc_sequences + 359},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 361, false, 268, -1, 268, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 364, false, -1, 271, -1, -1, -1, false, false, false, false, utf8proc_sequences + 367},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 369, false, 270, -1, 270, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 273, -1, -1, -1, false, false, false, false, utf8proc_sequences + 372},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 272, -1, 272, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 374, false, -1, 275, -1, 8880, -1, false, false, false, false, utf8proc_sequences + 377},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 379, false, 274, -1, 274, 8940, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 382, false, -1, 277, -1, -1, -1, false, false, false, false, utf8proc_sequences + 385},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 387, false, 276, -1, 276, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 390, false, -1, 279, -1, -1, -1, false, false, false, false, utf8proc_sequences + 393},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 395, false, 278, -1, 278, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 398, false, -1, 281, -1, -1, -1, false, false, false, false, utf8proc_sequences + 401},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 403, false, 280, -1, 280, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 406, false, -1, 283, -1, -1, -1, false, false, false, false, utf8proc_sequences + 409},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 411, false, 282, -1, 282, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 414, false, -1, 285, -1, -1, -1, false, false, false, false, utf8proc_sequences + 417},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 419, false, 284, -1, 284, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 422, false, -1, 287, -1, -1, -1, false, false, false, false, utf8proc_sequences + 425},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 427, false, 286, -1, 286, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 430, false, -1, 289, -1, -1, -1, false, false, false, false, utf8proc_sequences + 433},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 435, false, 288, -1, 288, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 438, false, -1, 291, -1, -1, -1, false, false, false, false, utf8proc_sequences + 441},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 443, false, 290, -1, 290, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 446, false, -1, 293, -1, -1, -1, false, false, false, false, utf8proc_sequences + 449},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 451, false, 292, -1, 292, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 295, -1, -1, -1, false, false, false, false, utf8proc_sequences + 454},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 294, -1, 294, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 456, false, -1, 297, -1, -1, -1, false, false, false, false, utf8proc_sequences + 459},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 461, false, 296, -1, 296, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 464, false, -1, 299, -1, -1, -1, false, false, false, false, utf8proc_sequences + 467},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 469, false, 298, -1, 298, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 472, false, -1, 301, -1, -1, -1, false, false, false, false, utf8proc_sequences + 475},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 477, false, 300, -1, 300, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 480, false, -1, 303, -1, -1, -1, false, false, false, false, utf8proc_sequences + 483},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 485, false, 302, -1, 302, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 488, false, -1, 105, -1, -1, -1, false, false, false, false, utf8proc_sequences + 491},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 73, -1, 73, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 494, false, -1, 307, -1, -1, -1, false, false, false, false, utf8proc_sequences + 497},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 499, false, 306, -1, 306, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 502, false, -1, 309, -1, -1, -1, false, false, false, false, utf8proc_sequences + 505},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 507, false, 308, -1, 308, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 510, false, -1, 311, -1, -1, -1, false, false, false, false, utf8proc_sequences + 513},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 515, false, 310, -1, 310, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 518, false, -1, 314, -1, -1, -1, false, false, false, false, utf8proc_sequences + 521},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 523, false, 313, -1, 313, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 526, false, -1, 316, -1, -1, -1, false, false, false, false, utf8proc_sequences + 529},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 531, false, 315, -1, 315, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 534, false, -1, 318, -1, -1, -1, false, false, false, false, utf8proc_sequences + 537},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 539, false, 317, -1, 317, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 542, false, -1, 320, -1, -1, -1, false, false, false, false, utf8proc_sequences + 545},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 547, false, 319, -1, 319, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 322, -1, -1, -1, false, false, false, false, utf8proc_sequences + 550},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 321, -1, 321, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 552, false, -1, 324, -1, -1, -1, false, false, false, false, utf8proc_sequences + 555},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 557, false, 323, -1, 323, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 560, false, -1, 326, -1, -1, -1, false, false, false, false, utf8proc_sequences + 563},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 565, false, 325, -1, 325, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 568, false, -1, 328, -1, -1, -1, false, false, false, false, utf8proc_sequences + 571},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 573, false, 327, -1, 327, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 576, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 576},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 331, -1, -1, -1, false, false, false, false, utf8proc_sequences + 579},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 330, -1, 330, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 581, false, -1, 333, -1, 9600, -1, false, false, false, false, utf8proc_sequences + 584},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 586, false, 332, -1, 332, 9660, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 589, false, -1, 335, -1, -1, -1, false, false, false, false, utf8proc_sequences + 592},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 594, false, 334, -1, 334, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 597, false, -1, 337, -1, -1, -1, false, false, false, false, utf8proc_sequences + 600},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 602, false, 336, -1, 336, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 339, -1, -1, -1, false, false, false, false, utf8proc_sequences + 605},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 338, -1, 338, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 607, false, -1, 341, -1, -1, -1, false, false, false, false, utf8proc_sequences + 610},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 612, false, 340, -1, 340, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 615, false, -1, 343, -1, -1, -1, false, false, false, false, utf8proc_sequences + 618},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 620, false, 342, -1, 342, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 623, false, -1, 345, -1, -1, -1, false, false, false, false, utf8proc_sequences + 626},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 628, false, 344, -1, 344, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 631, false, -1, 347, -1, 9960, -1, false, false, false, false, utf8proc_sequences + 634},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 636, false, 346, -1, 346, 10020, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 639, false, -1, 349, -1, -1, -1, false, false, false, false, utf8proc_sequences + 642},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 644, false, 348, -1, 348, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 647, false, -1, 351, -1, -1, -1, false, false, false, false, utf8proc_sequences + 650},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 652, false, 350, -1, 350, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 655, false, -1, 353, -1, 10080, -1, false, false, false, false, utf8proc_sequences + 658},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 660, false, 352, -1, 352, 10140, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 663, false, -1, 355, -1, -1, -1, false, false, false, false, utf8proc_sequences + 666},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 668, false, 354, -1, 354, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 671, false, -1, 357, -1, -1, -1, false, false, false, false, utf8proc_sequences + 674},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 676, false, 356, -1, 356, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 359, -1, -1, -1, false, false, false, false, utf8proc_sequences + 679},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 358, -1, 358, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 681, false, -1, 361, -1, 10320, -1, false, false, false, false, utf8proc_sequences + 684},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 686, false, 360, -1, 360, 10380, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 689, false, -1, 363, -1, 10440, -1, false, false, false, false, utf8proc_sequences + 692},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 694, false, 362, -1, 362, 10500, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 697, false, -1, 365, -1, -1, -1, false, false, false, false, utf8proc_sequences + 700},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 702, false, 364, -1, 364, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 705, false, -1, 367, -1, -1, -1, false, false, false, false, utf8proc_sequences + 708},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 710, false, 366, -1, 366, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 713, false, -1, 369, -1, -1, -1, false, false, false, false, utf8proc_sequences + 716},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 718, false, 368, -1, 368, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 721, false, -1, 371, -1, -1, -1, false, false, false, false, utf8proc_sequences + 724},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 726, false, 370, -1, 370, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 729, false, -1, 373, -1, -1, -1, false, false, false, false, utf8proc_sequences + 732},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 734, false, 372, -1, 372, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 737, false, -1, 375, -1, -1, -1, false, false, false, false, utf8proc_sequences + 740},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 742, false, 374, -1, 374, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 745, false, -1, 255, -1, -1, -1, false, false, false, false, utf8proc_sequences + 748},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 750, false, -1, 378, -1, -1, -1, false, false, false, false, utf8proc_sequences + 753},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 755, false, 377, -1, 377, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 758, false, -1, 380, -1, -1, -1, false, false, false, false, utf8proc_sequences + 761},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 763, false, 379, -1, 379, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 766, false, -1, 382, -1, -1, -1, false, false, false, false, utf8proc_sequences + 769},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 771, false, 381, -1, 381, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 36, false, 83, -1, 83, 10800, -1, false, false, false, false, utf8proc_sequences + 36},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 579, -1, 579, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 595, -1, -1, -1, false, false, false, false, utf8proc_sequences + 774},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 387, -1, -1, -1, false, false, false, false, utf8proc_sequences + 776},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 386, -1, 386, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 389, -1, -1, -1, false, false, false, false, utf8proc_sequences + 778},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 388, -1, 388, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 596, -1, -1, -1, false, false, false, false, utf8proc_sequences + 780},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 392, -1, -1, -1, false, false, false, false, utf8proc_sequences + 782},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 391, -1, 391, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 598, -1, -1, -1, false, false, false, false, utf8proc_sequences + 784},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 599, -1, -1, -1, false, false, false, false, utf8proc_sequences + 786},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 396, -1, -1, -1, false, false, false, false, utf8proc_sequences + 788},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 395, -1, 395, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 477, -1, -1, -1, false, false, false, false, utf8proc_sequences + 790},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 601, -1, -1, -1, false, false, false, false, utf8proc_sequences + 792},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 603, -1, -1, -1, false, false, false, false, utf8proc_sequences + 794},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 402, -1, -1, -1, false, false, false, false, utf8proc_sequences + 796},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 401, -1, 401, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 608, -1, -1, -1, false, false, false, false, utf8proc_sequences + 798},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 611, -1, -1, -1, false, false, false, false, utf8proc_sequences + 800},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 502, -1, 502, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 617, -1, -1, -1, false, false, false, false, utf8proc_sequences + 802},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 616, -1, -1, -1, false, false, false, false, utf8proc_sequences + 804},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 409, -1, -1, -1, false, false, false, false, utf8proc_sequences + 806},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 408, -1, 408, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 573, -1, 573, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 623, -1, -1, -1, false, false, false, false, utf8proc_sequences + 808},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 626, -1, -1, -1, false, false, false, false, utf8proc_sequences + 810},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 544, -1, 544, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 629, -1, -1, -1, false, false, false, false, utf8proc_sequences + 812},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 814, false, -1, 417, -1, 11700, -1, false, false, false, false, utf8proc_sequences + 817},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 819, false, 416, -1, 416, 11760, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 419, -1, -1, -1, false, false, false, false, utf8proc_sequences + 822},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 418, -1, 418, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 421, -1, -1, -1, false, false, false, false, utf8proc_sequences + 824},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 420, -1, 420, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 640, -1, -1, -1, false, false, false, false, utf8proc_sequences + 826},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 424, -1, -1, -1, false, false, false, false, utf8proc_sequences + 828},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 423, -1, 423, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 643, -1, -1, -1, false, false, false, false, utf8proc_sequences + 830},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 429, -1, -1, -1, false, false, false, false, utf8proc_sequences + 832},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 428, -1, 428, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 648, -1, -1, -1, false, false, false, false, utf8proc_sequences + 834},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 836, false, -1, 432, -1, 11820, -1, false, false, false, false, utf8proc_sequences + 839},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 841, false, 431, -1, 431, 11880, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 650, -1, -1, -1, false, false, false, false, utf8proc_sequences + 844},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 651, -1, -1, -1, false, false, false, false, utf8proc_sequences + 846},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 436, -1, -1, -1, false, false, false, false, utf8proc_sequences + 848},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 435, -1, 435, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 438, -1, -1, -1, false, false, false, false, utf8proc_sequences + 850},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 437, -1, 437, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 658, -1, 2880, -1, false, false, false, false, utf8proc_sequences + 852},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 441, -1, -1, -1, false, false, false, false, utf8proc_sequences + 854},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 440, -1, 440, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 445, -1, -1, -1, false, false, false, false, utf8proc_sequences + 856},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 444, -1, 444, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 503, -1, 503, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 858, false, -1, 454, 453, -1, -1, false, false, false, false, utf8proc_sequences + 861},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 863, false, 452, 454, 453, -1, -1, false, false, false, false, utf8proc_sequences + 861},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 866, false, 452, -1, 453, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 869, false, -1, 457, 456, -1, -1, false, false, false, false, utf8proc_sequences + 872},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 874, false, 455, 457, 456, -1, -1, false, false, false, false, utf8proc_sequences + 872},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 877, false, 455, -1, 456, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 880, false, -1, 460, 459, -1, -1, false, false, false, false, utf8proc_sequences + 883},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 885, false, 458, 460, 459, -1, -1, false, false, false, false, utf8proc_sequences + 883},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 888, false, 458, -1, 459, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 891, false, -1, 462, -1, -1, -1, false, false, false, false, utf8proc_sequences + 894},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 896, false, 461, -1, 461, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 899, false, -1, 464, -1, -1, -1, false, false, false, false, utf8proc_sequences + 902},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 904, false, 463, -1, 463, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 907, false, -1, 466, -1, -1, -1, false, false, false, false, utf8proc_sequences + 910},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 912, false, 465, -1, 465, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 915, false, -1, 468, -1, -1, -1, false, false, false, false, utf8proc_sequences + 918},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 920, false, 467, -1, 467, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 923, false, -1, 470, -1, -1, -1, false, false, false, false, utf8proc_sequences + 926},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 928, false, 469, -1, 469, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 931, false, -1, 472, -1, -1, -1, false, false, false, false, utf8proc_sequences + 934},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 936, false, 471, -1, 471, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 939, false, -1, 474, -1, -1, -1, false, false, false, false, utf8proc_sequences + 942},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 944, false, 473, -1, 473, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 947, false, -1, 476, -1, -1, -1, false, false, false, false, utf8proc_sequences + 950},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 952, false, 475, -1, 475, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 398, -1, 398, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 955, false, -1, 479, -1, -1, -1, false, false, false, false, utf8proc_sequences + 958},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 960, false, 478, -1, 478, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 963, false, -1, 481, -1, -1, -1, false, false, false, false, utf8proc_sequences + 966},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 968, false, 480, -1, 480, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 971, false, -1, 483, -1, -1, -1, false, false, false, false, utf8proc_sequences + 974},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 976, false, 482, -1, 482, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 485, -1, -1, -1, false, false, false, false, utf8proc_sequences + 979},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 484, -1, 484, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 981, false, -1, 487, -1, -1, -1, false, false, false, false, utf8proc_sequences + 984},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 986, false, 486, -1, 486, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 989, false, -1, 489, -1, -1, -1, false, false, false, false, utf8proc_sequences + 992},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 994, false, 488, -1, 488, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 997, false, -1, 491, -1, 2760, -1, false, false, false, false, utf8proc_sequences + 1000},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1002, false, 490, -1, 490, 2820, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1005, false, -1, 493, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1008},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1010, false, 492, -1, 492, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1013, false, -1, 495, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1016},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1018, false, 494, -1, 494, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1021, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1021},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1024, false, -1, 499, 498, -1, -1, false, false, false, false, utf8proc_sequences + 1027},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1029, false, 497, 499, 498, -1, -1, false, false, false, false, utf8proc_sequences + 1027},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1032, false, 497, -1, 498, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1035, false, -1, 501, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1038},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1040, false, 500, -1, 500, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 405, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1043},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 447, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1045},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1047, false, -1, 505, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1050},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1052, false, 504, -1, 504, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1055, false, -1, 507, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1058},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1060, false, 506, -1, 506, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1063, false, -1, 509, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1066},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1068, false, 508, -1, 508, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1071, false, -1, 511, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1074},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1076, false, 510, -1, 510, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1079, false, -1, 513, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1082},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1084, false, 512, -1, 512, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1087, false, -1, 515, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1090},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1092, false, 514, -1, 514, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1095, false, -1, 517, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1098},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1100, false, 516, -1, 516, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1103, false, -1, 519, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1106},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1108, false, 518, -1, 518, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1111, false, -1, 521, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1114},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1116, false, 520, -1, 520, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1119, false, -1, 523, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1122},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1124, false, 522, -1, 522, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1127, false, -1, 525, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1130},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1132, false, 524, -1, 524, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1135, false, -1, 527, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1138},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1140, false, 526, -1, 526, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1143, false, -1, 529, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1146},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1148, false, 528, -1, 528, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1151, false, -1, 531, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1154},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1156, false, 530, -1, 530, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1159, false, -1, 533, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1162},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1164, false, 532, -1, 532, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1167, false, -1, 535, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1170},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1172, false, 534, -1, 534, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1175, false, -1, 537, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1178},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1180, false, 536, -1, 536, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1183, false, -1, 539, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1186},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1188, false, 538, -1, 538, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 541, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1191},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 540, -1, 540, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1193, false, -1, 543, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1196},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1198, false, 542, -1, 542, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 414, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1201},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 547, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1203},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 546, -1, 546, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 549, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1205},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 548, -1, 548, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1207, false, -1, 551, -1, 2520, -1, false, false, false, false, utf8proc_sequences + 1210},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1212, false, 550, -1, 550, 2580, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1215, false, -1, 553, -1, 9000, -1, false, false, false, false, utf8proc_sequences + 1218},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1220, false, 552, -1, 552, 9060, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1223, false, -1, 555, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1226},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1228, false, 554, -1, 554, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1231, false, -1, 557, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1234},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1236, false, 556, -1, 556, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1239, false, -1, 559, -1, 3480, -1, false, false, false, false, utf8proc_sequences + 1242},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1244, false, 558, -1, 558, 3540, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1247, false, -1, 561, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1250},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1252, false, 560, -1, 560, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1255, false, -1, 563, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1258},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1260, false, 562, -1, 562, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11365, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1263},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 572, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1265},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 571, -1, 571, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 410, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1267},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11366, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1269},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 578, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1271},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 577, -1, 577, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 384, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1273},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 649, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1275},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 652, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1277},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 583, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1279},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 582, -1, 582, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 585, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1281},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 584, -1, 584, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 587, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1283},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 586, -1, 586, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 589, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1285},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 588, -1, 588, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 591, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1287},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 590, -1, 590, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 385, -1, 385, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 390, -1, 390, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 393, -1, 393, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 394, -1, 394, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 399, -1, 399, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 400, -1, 400, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 403, -1, 403, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 404, -1, 404, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 407, -1, 407, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 406, -1, 406, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11362, -1, 11362, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 412, -1, 412, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 413, -1, 413, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 415, -1, 415, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11364, -1, 11364, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 422, -1, 422, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 425, -1, 425, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 430, -1, 430, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 580, -1, 580, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 433, -1, 433, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 434, -1, 434, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 581, -1, 581, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 439, -1, 439, 2940, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 14, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1289, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 18, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 34, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1293, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1295, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 44, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 48, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1297, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1306, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1309, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1312, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 22, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 36, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 46, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1315, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 0, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 2, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 3, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 7, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 8, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 10, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 4, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 46, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 5, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 12, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 11, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 14, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 15, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 47, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 48, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 232, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 216, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 13, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 202, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 40, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 45, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 39, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 16, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 202, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 6, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 202, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 9, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 42, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 44, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 43, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 41, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 1, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 1, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 51, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 1317, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 1319, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 49, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 1321, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 1323, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 240, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, 921, -1, 921, -1, 50, false, false, false, true, utf8proc_sequences + 1326},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, true, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 233, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 234, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 1328, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1330, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1021, -1, 1021, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1022, -1, 1022, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1023, -1, 1023, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 1333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 1335, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1338, false, -1, 940, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1341},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 1343, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1345, false, -1, 941, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1348},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1350, false, -1, 942, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1353},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1355, false, -1, 943, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1358},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1360, false, -1, 972, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1363},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1365, false, -1, 973, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1368},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1370, false, -1, 974, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1373},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1375, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1378},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 945, -1, 3660, -1, false, false, false, false, utf8proc_sequences + 1382},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 946, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1384},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 947, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1386},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 948, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1388},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 949, -1, 3720, -1, false, false, false, false, utf8proc_sequences + 1390},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 950, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1392},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 951, -1, 3780, -1, false, false, false, false, utf8proc_sequences + 1394},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 952, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1396},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 953, -1, 3840, -1, false, false, false, false, utf8proc_sequences + 1326},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 954, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1398},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 955, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1400},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 956, -1, -1, -1, false, false, false, false, utf8proc_sequences + 67},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 957, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1402},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 958, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1404},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 959, -1, 3900, -1, false, false, false, false, utf8proc_sequences + 1406},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 960, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1408},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 961, -1, 16260, -1, false, false, false, false, utf8proc_sequences + 1410},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 963, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1412},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 964, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1414},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 965, -1, 3960, -1, false, false, false, false, utf8proc_sequences + 1416},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 966, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1418},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 967, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1420},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 968, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1422},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 969, -1, 4020, -1, false, false, false, false, utf8proc_sequences + 1424},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1426, false, -1, 970, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1429},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1431, false, -1, 971, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1434},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1436, false, 902, -1, 902, 15780, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1439, false, 904, -1, 904, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1442, false, 905, -1, 905, 15960, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1445, false, 906, -1, 906, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1448, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1451},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 913, -1, 913, 4140, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 914, -1, 914, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 915, -1, 915, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 916, -1, 916, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 917, -1, 917, 4200, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 918, -1, 918, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 919, -1, 919, 4260, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 920, -1, 920, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 921, -1, 921, 4320, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 922, -1, 922, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 923, -1, 923, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 924, -1, 924, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 925, -1, 925, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 926, -1, 926, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 927, -1, 927, 4500, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 928, -1, 928, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 929, -1, 929, 16200, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 931, -1, 931, -1, -1, false, false, false, false, utf8proc_sequences + 1412},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 931, -1, 931, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 932, -1, 932, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 933, -1, 933, 4440, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 934, -1, 934, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 935, -1, 935, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 936, -1, 936, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 937, -1, 937, 4560, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1455, false, 938, -1, 938, 4080, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1458, false, 939, -1, 939, 4380, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1461, false, 908, -1, 908, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1464, false, 910, -1, 910, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1467, false, 911, -1, 911, 16380, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1384, false, 914, -1, 914, -1, -1, false, false, false, false, utf8proc_sequences + 1384},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1396, false, 920, -1, 920, -1, -1, false, false, false, false, utf8proc_sequences + 1396},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1470, false, -1, -1, -1, 4620, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1475, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1418, false, 934, -1, 934, -1, -1, false, false, false, false, utf8proc_sequences + 1418},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1408, false, 928, -1, 928, -1, -1, false, false, false, false, utf8proc_sequences + 1408},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 985, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1478},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 984, -1, 984, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 987, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1480},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 986, -1, 986, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 989, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1482},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 988, -1, 988, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 991, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1484},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 990, -1, 990, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 993, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1486},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 992, -1, 992, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 995, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1488},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 994, -1, 994, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 997, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1490},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 996, -1, 996, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 999, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1492},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 998, -1, 998, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1001, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1494},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1000, -1, 1000, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1003, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1496},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1002, -1, 1002, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1005, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1498},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1004, -1, 1004, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1007, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1500},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1006, -1, 1006, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1398, false, 922, -1, 922, -1, -1, false, false, false, false, utf8proc_sequences + 1398},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1410, false, 929, -1, 929, -1, -1, false, false, false, false, utf8proc_sequences + 1410},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1502, false, 1017, -1, 1017, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1504, false, -1, 952, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1396},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1390, false, 917, -1, 917, -1, -1, false, false, false, false, utf8proc_sequences + 1390},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1016, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1506},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1015, -1, 1015, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1508, false, -1, 1010, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1510},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1019, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1512},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1018, -1, 1018, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 891, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1514},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 892, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1516},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 893, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1518},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1520, false, -1, 1104, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1523},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1525, false, -1, 1105, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1528},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1106, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1530},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1532, false, -1, 1107, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1535},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1108, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1537},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1109, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1539},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1110, -1, 4800, -1, false, false, false, false, utf8proc_sequences + 1541},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1543, false, -1, 1111, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1546},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1112, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1548},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1113, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1550},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1114, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1552},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1115, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1554},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1556, false, -1, 1116, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1559},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1561, false, -1, 1117, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1564},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1566, false, -1, 1118, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1569},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1119, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1571},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1072, -1, 5640, -1, false, false, false, false, utf8proc_sequences + 1573},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1073, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1575},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1074, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1577},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1075, -1, 4740, -1, false, false, false, false, utf8proc_sequences + 1579},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1076, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1581},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1077, -1, 4680, -1, false, false, false, false, utf8proc_sequences + 1583},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1078, -1, 5520, -1, false, false, false, false, utf8proc_sequences + 1585},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1079, -1, 5880, -1, false, false, false, false, utf8proc_sequences + 1587},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1080, -1, 4920, -1, false, false, false, false, utf8proc_sequences + 1589},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1591, false, -1, 1081, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1594},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1082, -1, 4860, -1, false, false, false, false, utf8proc_sequences + 1596},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1083, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1598},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1084, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1600},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1085, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1602},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1086, -1, 6000, -1, false, false, false, false, utf8proc_sequences + 1604},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1087, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1606},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1088, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1608},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1089, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1610},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1090, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1612},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1091, -1, 4980, -1, false, false, false, false, utf8proc_sequences + 1614},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1092, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1616},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1093, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1618},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1094, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1620},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1095, -1, 6360, -1, false, false, false, false, utf8proc_sequences + 1622},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1096, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1624},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1097, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1626},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1098, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1628},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1099, -1, 6480, -1, false, false, false, false, utf8proc_sequences + 1630},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1100, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1632},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1101, -1, 6240, -1, false, false, false, false, utf8proc_sequences + 1634},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1102, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1636},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1103, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1638},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1040, -1, 1040, 5700, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1041, -1, 1041, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1042, -1, 1042, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1043, -1, 1043, 5160, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1044, -1, 1044, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1045, -1, 1045, 5100, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1046, -1, 1046, 5580, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1047, -1, 1047, 5940, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1048, -1, 1048, 5040, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1640, false, 1049, -1, 1049, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1050, -1, 1050, 5280, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1051, -1, 1051, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1052, -1, 1052, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1053, -1, 1053, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1054, -1, 1054, 6060, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1055, -1, 1055, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1056, -1, 1056, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1057, -1, 1057, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1058, -1, 1058, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1059, -1, 1059, 5340, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1060, -1, 1060, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1061, -1, 1061, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1062, -1, 1062, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1063, -1, 1063, 6420, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1064, -1, 1064, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1065, -1, 1065, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1066, -1, 1066, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1067, -1, 1067, 6540, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1068, -1, 1068, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1069, -1, 1069, 6300, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1070, -1, 1070, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1071, -1, 1071, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1643, false, 1024, -1, 1024, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1646, false, 1025, -1, 1025, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1026, -1, 1026, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1649, false, 1027, -1, 1027, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1028, -1, 1028, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1029, -1, 1029, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1030, -1, 1030, 5220, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1652, false, 1031, -1, 1031, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1032, -1, 1032, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1033, -1, 1033, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1034, -1, 1034, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1035, -1, 1035, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1655, false, 1036, -1, 1036, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1658, false, 1037, -1, 1037, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1661, false, 1038, -1, 1038, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1039, -1, 1039, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1121, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1664},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1120, -1, 1120, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1123, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1666},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1122, -1, 1122, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1125, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1668},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1124, -1, 1124, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1127, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1670},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1126, -1, 1126, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1129, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1672},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1128, -1, 1128, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1131, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1674},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1130, -1, 1130, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1133, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1676},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1132, -1, 1132, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1135, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1678},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1134, -1, 1134, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1137, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1680},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1136, -1, 1136, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1139, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1682},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1138, -1, 1138, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1141, -1, 5400, -1, false, false, false, false, utf8proc_sequences + 1684},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1140, -1, 1140, 5460, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1686, false, -1, 1143, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1689},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1691, false, 1142, -1, 1142, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1145, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1694},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1144, -1, 1144, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1147, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1696},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1146, -1, 1146, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1149, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1698},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1148, -1, 1148, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1151, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1700},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1150, -1, 1150, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1153, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1702},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1152, -1, 1152, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ME, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1163, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1704},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1162, -1, 1162, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1165, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1706},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1164, -1, 1164, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1167, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1708},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1166, -1, 1166, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1169, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1710},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1168, -1, 1168, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1171, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1712},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1170, -1, 1170, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1173, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1714},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1172, -1, 1172, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1175, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1716},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1174, -1, 1174, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1177, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1718},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1176, -1, 1176, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1179, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1720},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1178, -1, 1178, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1181, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1722},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1180, -1, 1180, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1183, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1724},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1182, -1, 1182, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1185, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1726},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1184, -1, 1184, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1187, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1728},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1186, -1, 1186, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1189, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1730},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1188, -1, 1188, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1191, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1732},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1190, -1, 1190, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1193, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1734},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1192, -1, 1192, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1195, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1736},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1194, -1, 1194, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1197, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1738},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1196, -1, 1196, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1199, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1740},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1198, -1, 1198, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1201, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1742},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1200, -1, 1200, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1203, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1744},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1202, -1, 1202, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1205, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1746},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1204, -1, 1204, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1207, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1748},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1206, -1, 1206, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1209, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1750},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1208, -1, 1208, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1211, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1752},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1210, -1, 1210, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1213, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1754},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1212, -1, 1212, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1215, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1756},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1214, -1, 1214, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1231, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1758},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1760, false, -1, 1218, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1763},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1765, false, 1217, -1, 1217, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1220, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1768},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1219, -1, 1219, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1222, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1770},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1221, -1, 1221, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1224, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1772},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1223, -1, 1223, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1226, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1774},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1225, -1, 1225, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1228, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1776},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1227, -1, 1227, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1230, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1778},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1229, -1, 1229, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1216, -1, 1216, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1780, false, -1, 1233, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1783},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1785, false, 1232, -1, 1232, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1788, false, -1, 1235, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1791},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1793, false, 1234, -1, 1234, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1237, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1796},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1236, -1, 1236, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1798, false, -1, 1239, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1801},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1803, false, 1238, -1, 1238, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1241, -1, 5760, -1, false, false, false, false, utf8proc_sequences + 1806},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1240, -1, 1240, 5820, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1808, false, -1, 1243, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1811},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1813, false, 1242, -1, 1242, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1816, false, -1, 1245, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1819},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1821, false, 1244, -1, 1244, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1824, false, -1, 1247, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1827},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1829, false, 1246, -1, 1246, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1249, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1832},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1248, -1, 1248, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1834, false, -1, 1251, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1837},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1839, false, 1250, -1, 1250, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1842, false, -1, 1253, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1845},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1847, false, 1252, -1, 1252, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1850, false, -1, 1255, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1853},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1855, false, 1254, -1, 1254, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1257, -1, 6120, -1, false, false, false, false, utf8proc_sequences + 1858},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1256, -1, 1256, 6180, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1860, false, -1, 1259, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1863},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1865, false, 1258, -1, 1258, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1868, false, -1, 1261, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1871},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1873, false, 1260, -1, 1260, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1876, false, -1, 1263, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1879},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1881, false, 1262, -1, 1262, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1884, false, -1, 1265, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1887},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1889, false, 1264, -1, 1264, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1892, false, -1, 1267, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1895},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1897, false, 1266, -1, 1266, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1900, false, -1, 1269, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1903},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1905, false, 1268, -1, 1268, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1271, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1908},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1270, -1, 1270, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1910, false, -1, 1273, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1913},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1915, false, 1272, -1, 1272, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1275, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1918},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1274, -1, 1274, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1277, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1920},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1276, -1, 1276, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1279, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1922},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1278, -1, 1278, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1281, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1924},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1280, -1, 1280, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1283, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1926},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1282, -1, 1282, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1285, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1928},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1284, -1, 1284, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1287, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1930},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1286, -1, 1286, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1289, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1932},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1288, -1, 1288, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1291, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1934},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1290, -1, 1290, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1293, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1936},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1292, -1, 1292, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1295, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1938},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1294, -1, 1294, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1297, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1940},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1296, -1, 1296, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1299, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1942},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1298, -1, 1298, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1377, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1944},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1378, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1946},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1379, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1948},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1380, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1950},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1381, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1952},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1382, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1954},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1383, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1956},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1384, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1958},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1385, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1960},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1386, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1962},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1387, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1964},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1388, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1966},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1389, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1968},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1390, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1970},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1391, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1972},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1392, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1974},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1393, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1976},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1394, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1978},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1395, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1980},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1396, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1982},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1397, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1984},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1398, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1986},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1399, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1988},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1400, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1990},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1401, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1992},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1402, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1994},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1403, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1996},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1404, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1998},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1405, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2000},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1406, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2002},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1407, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2004},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1408, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2006},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1409, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2008},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1410, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2010},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1411, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2012},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1412, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2014},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1413, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2016},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1414, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2018},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1329, -1, 1329, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1330, -1, 1330, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1331, -1, 1331, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1332, -1, 1332, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1333, -1, 1333, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1334, -1, 1334, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1335, -1, 1335, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1336, -1, 1336, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1337, -1, 1337, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1338, -1, 1338, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1339, -1, 1339, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1340, -1, 1340, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1341, -1, 1341, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1342, -1, 1342, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1343, -1, 1343, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1344, -1, 1344, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1345, -1, 1345, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1346, -1, 1346, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1347, -1, 1347, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1348, -1, 1348, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1349, -1, 1349, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1350, -1, 1350, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1351, -1, 1351, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1352, -1, 1352, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1353, -1, 1353, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1354, -1, 1354, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1355, -1, 1355, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1356, -1, 1356, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1357, -1, 1357, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1358, -1, 1358, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1359, -1, 1359, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1360, -1, 1360, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1361, -1, 1361, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1362, -1, 1362, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1363, -1, 1363, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1364, -1, 1364, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1365, -1, 1365, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1366, -1, 1366, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2020, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2020},
+ {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 222, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 228, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 10, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 11, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 12, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 13, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 14, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 15, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 16, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 17, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 18, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 19, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 20, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 21, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 22, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 23, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 24, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 25, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6600, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6660, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6720, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 27, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 28, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 29, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 30, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 31, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 32, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 33, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 34, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 17, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 18, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 19, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_AN, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_AN, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 35, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6840, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6900, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2056, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6780, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 36, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 6960, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7020, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7080, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 7, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 20, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 9, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2068, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2071, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2074, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2077, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2080, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2083, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2086, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2089, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 7, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 21, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7140, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 22, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2098, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2101, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2104, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2107, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2110, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2113, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2116, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2119, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2122, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 24, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7200, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 23, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 25, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2134, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2137, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7260, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 27, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7320, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7380, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2149, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 26, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, 7440, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2152, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 84, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 91, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 28, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7500, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 31, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7560, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2164, false, -1, -1, -1, 7620, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 29, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 30, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 32, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7680, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7740, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 33, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 9, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 34, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 35, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7800, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2182, false, -1, -1, -1, 7860, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 36, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 103, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 107, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 118, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 122, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2197, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NOBREAK, utf8proc_sequences + 2203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 216, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2205, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2208, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2211, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2214, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2217, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2220, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 129, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 130, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2223, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 132, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2226, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2229, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2232, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2235, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2238, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2241, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2244, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2247, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2250, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2253, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2256, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2259, false, -1, -1, -1, -1, -1, true, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7920, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2262, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 37, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11520, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2265},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11521, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2267},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11522, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2269},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11523, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2271},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11524, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2273},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11525, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2275},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11526, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2277},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11527, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2279},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11528, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2281},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11529, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2283},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11530, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2285},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11531, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2287},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11532, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2289},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11533, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2291},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11534, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2293},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11535, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2295},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11536, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2297},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11537, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2299},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11538, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2301},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11539, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2303},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11540, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2305},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11541, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2307},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11542, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2309},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11543, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2311},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11544, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2313},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11545, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2315},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11546, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2317},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11547, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2319},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11548, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2321},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11549, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2323},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11550, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2325},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11551, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2327},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11552, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2329},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11553, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2331},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11554, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2333},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11555, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2335},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11556, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2337},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11557, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2339},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2341, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, true, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7980, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2343, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8040, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2346, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8100, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2349, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8160, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2352, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8220, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2355, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8280, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2358, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 38, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, 8340, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2361, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, 8400, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2364, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8460, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8520, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2367, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2370, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, 8580, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2373, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 9, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2376, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2378, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2394, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2402, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2406, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2408, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2412, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2414, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2416, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 0, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 8, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 794, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2424, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 12, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 20, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 24, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 579, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 28, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 780, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2426, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2428, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 30, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 38, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 40, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2430, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 808, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 42, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2432, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 16, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 34, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 40, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 42, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1602, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11363, -1, 11363, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2434, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2436, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 163, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 10, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2438, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2442, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 804, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 802, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2444, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2446, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2448, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2450, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2456, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2458, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 810, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2460, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2462, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 812, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2466, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2468, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 844, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 846, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1277, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 50, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2474, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 852, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2476, false, -1, 7681, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2479},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2481, false, 7680, -1, 7680, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2484, false, -1, 7683, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2487},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2489, false, 7682, -1, 7682, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2492, false, -1, 7685, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2495},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2497, false, 7684, -1, 7684, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2500, false, -1, 7687, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2503},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2505, false, 7686, -1, 7686, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2508, false, -1, 7689, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2511},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2513, false, 7688, -1, 7688, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2516, false, -1, 7691, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2519},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2521, false, 7690, -1, 7690, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2524, false, -1, 7693, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2527},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2529, false, 7692, -1, 7692, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2532, false, -1, 7695, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2535},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2537, false, 7694, -1, 7694, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2540, false, -1, 7697, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2543},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2545, false, 7696, -1, 7696, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2548, false, -1, 7699, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2551},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2553, false, 7698, -1, 7698, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2556, false, -1, 7701, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2559},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2561, false, 7700, -1, 7700, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2564, false, -1, 7703, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2567},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2569, false, 7702, -1, 7702, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2572, false, -1, 7705, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2575},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2577, false, 7704, -1, 7704, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2580, false, -1, 7707, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2583},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2585, false, 7706, -1, 7706, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2588, false, -1, 7709, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2591},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2593, false, 7708, -1, 7708, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2596, false, -1, 7711, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2599},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2601, false, 7710, -1, 7710, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2604, false, -1, 7713, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2607},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2609, false, 7712, -1, 7712, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2612, false, -1, 7715, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2615},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2617, false, 7714, -1, 7714, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2620, false, -1, 7717, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2623},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2625, false, 7716, -1, 7716, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2628, false, -1, 7719, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2631},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2633, false, 7718, -1, 7718, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2636, false, -1, 7721, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2639},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2641, false, 7720, -1, 7720, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2644, false, -1, 7723, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2647},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2649, false, 7722, -1, 7722, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2652, false, -1, 7725, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2655},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2657, false, 7724, -1, 7724, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2660, false, -1, 7727, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2663},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2665, false, 7726, -1, 7726, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2668, false, -1, 7729, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2671},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2673, false, 7728, -1, 7728, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2676, false, -1, 7731, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2679},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2681, false, 7730, -1, 7730, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2684, false, -1, 7733, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2687},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2689, false, 7732, -1, 7732, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2692, false, -1, 7735, -1, 9360, -1, false, false, false, false, utf8proc_sequences + 2695},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2697, false, 7734, -1, 7734, 9420, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2700, false, -1, 7737, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2703},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2705, false, 7736, -1, 7736, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2708, false, -1, 7739, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2711},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2713, false, 7738, -1, 7738, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2716, false, -1, 7741, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2719},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2721, false, 7740, -1, 7740, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2724, false, -1, 7743, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2727},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2729, false, 7742, -1, 7742, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2732, false, -1, 7745, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2735},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2737, false, 7744, -1, 7744, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2740, false, -1, 7747, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2743},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2745, false, 7746, -1, 7746, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2748, false, -1, 7749, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2751},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2753, false, 7748, -1, 7748, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2756, false, -1, 7751, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2759},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2761, false, 7750, -1, 7750, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2764, false, -1, 7753, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2767},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2769, false, 7752, -1, 7752, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2772, false, -1, 7755, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2775},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2777, false, 7754, -1, 7754, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2780, false, -1, 7757, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2783},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2785, false, 7756, -1, 7756, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2788, false, -1, 7759, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2791},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2793, false, 7758, -1, 7758, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2796, false, -1, 7761, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2799},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2801, false, 7760, -1, 7760, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2804, false, -1, 7763, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2807},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2809, false, 7762, -1, 7762, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2812, false, -1, 7765, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2815},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2817, false, 7764, -1, 7764, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2820, false, -1, 7767, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2823},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2825, false, 7766, -1, 7766, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2828, false, -1, 7769, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2831},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2833, false, 7768, -1, 7768, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2836, false, -1, 7771, -1, 9840, -1, false, false, false, false, utf8proc_sequences + 2839},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2841, false, 7770, -1, 7770, 9900, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2844, false, -1, 7773, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2847},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2849, false, 7772, -1, 7772, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2852, false, -1, 7775, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2855},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2857, false, 7774, -1, 7774, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2860, false, -1, 7777, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2863},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2865, false, 7776, -1, 7776, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2868, false, -1, 7779, -1, 10200, -1, false, false, false, false, utf8proc_sequences + 2871},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2873, false, 7778, -1, 7778, 10260, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2876, false, -1, 7781, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2879},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2881, false, 7780, -1, 7780, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2884, false, -1, 7783, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2887},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2889, false, 7782, -1, 7782, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2892, false, -1, 7785, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2895},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2897, false, 7784, -1, 7784, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2900, false, -1, 7787, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2903},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2905, false, 7786, -1, 7786, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2908, false, -1, 7789, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2911},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2913, false, 7788, -1, 7788, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2916, false, -1, 7791, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2919},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2921, false, 7790, -1, 7790, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2924, false, -1, 7793, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2927},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2929, false, 7792, -1, 7792, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2932, false, -1, 7795, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2935},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2937, false, 7794, -1, 7794, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2940, false, -1, 7797, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2943},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2945, false, 7796, -1, 7796, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2948, false, -1, 7799, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2951},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2953, false, 7798, -1, 7798, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2956, false, -1, 7801, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2959},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2961, false, 7800, -1, 7800, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2964, false, -1, 7803, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2967},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2969, false, 7802, -1, 7802, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2972, false, -1, 7805, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2975},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2977, false, 7804, -1, 7804, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2980, false, -1, 7807, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2983},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2985, false, 7806, -1, 7806, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2988, false, -1, 7809, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2991},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2993, false, 7808, -1, 7808, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2996, false, -1, 7811, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2999},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3001, false, 7810, -1, 7810, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3004, false, -1, 7813, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3007},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3009, false, 7812, -1, 7812, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3012, false, -1, 7815, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3015},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3017, false, 7814, -1, 7814, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3020, false, -1, 7817, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3023},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3025, false, 7816, -1, 7816, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3028, false, -1, 7819, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3031},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3033, false, 7818, -1, 7818, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3036, false, -1, 7821, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3039},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3041, false, 7820, -1, 7820, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3044, false, -1, 7823, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3047},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3049, false, 7822, -1, 7822, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3052, false, -1, 7825, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3055},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3057, false, 7824, -1, 7824, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3060, false, -1, 7827, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3063},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3065, false, 7826, -1, 7826, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3068, false, -1, 7829, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3071},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3073, false, 7828, -1, 7828, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3076, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3076},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3079, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3079},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3082, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3082},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3085, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3085},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 3088, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3088},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3091, false, 7776, -1, 7776, -1, -1, false, false, false, false, utf8proc_sequences + 2863},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3094, false, -1, 7841, -1, 10980, -1, false, false, false, false, utf8proc_sequences + 3097},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3099, false, 7840, -1, 7840, 11040, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3102, false, -1, 7843, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3105},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3107, false, 7842, -1, 7842, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3110, false, -1, 7845, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3113},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3115, false, 7844, -1, 7844, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3118, false, -1, 7847, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3121},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3123, false, 7846, -1, 7846, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3126, false, -1, 7849, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3129},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3131, false, 7848, -1, 7848, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3134, false, -1, 7851, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3137},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3139, false, 7850, -1, 7850, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3142, false, -1, 7853, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3145},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3147, false, 7852, -1, 7852, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3150, false, -1, 7855, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3153},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3155, false, 7854, -1, 7854, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3158, false, -1, 7857, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3161},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3163, false, 7856, -1, 7856, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3166, false, -1, 7859, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3169},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3171, false, 7858, -1, 7858, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3174, false, -1, 7861, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3177},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3179, false, 7860, -1, 7860, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3182, false, -1, 7863, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3185},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3187, false, 7862, -1, 7862, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3190, false, -1, 7865, -1, 11340, -1, false, false, false, false, utf8proc_sequences + 3193},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3195, false, 7864, -1, 7864, 11400, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3198, false, -1, 7867, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3201},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3203, false, 7866, -1, 7866, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3206, false, -1, 7869, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3209},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3211, false, 7868, -1, 7868, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3214, false, -1, 7871, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3217},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3219, false, 7870, -1, 7870, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3222, false, -1, 7873, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3225},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3227, false, 7872, -1, 7872, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3230, false, -1, 7875, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3233},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3235, false, 7874, -1, 7874, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3238, false, -1, 7877, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3241},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3243, false, 7876, -1, 7876, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3246, false, -1, 7879, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3249},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3251, false, 7878, -1, 7878, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3254, false, -1, 7881, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3257},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3259, false, 7880, -1, 7880, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3262, false, -1, 7883, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3265},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3267, false, 7882, -1, 7882, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3270, false, -1, 7885, -1, 11580, -1, false, false, false, false, utf8proc_sequences + 3273},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3275, false, 7884, -1, 7884, 11640, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3278, false, -1, 7887, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3281},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3283, false, 7886, -1, 7886, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3286, false, -1, 7889, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3289},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3291, false, 7888, -1, 7888, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3294, false, -1, 7891, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3297},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3299, false, 7890, -1, 7890, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3302, false, -1, 7893, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3305},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3307, false, 7892, -1, 7892, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3310, false, -1, 7895, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3313},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3315, false, 7894, -1, 7894, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3318, false, -1, 7897, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3321},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3323, false, 7896, -1, 7896, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3326, false, -1, 7899, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3329},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3331, false, 7898, -1, 7898, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3334, false, -1, 7901, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3337},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3339, false, 7900, -1, 7900, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3342, false, -1, 7903, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3345},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3347, false, 7902, -1, 7902, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3350, false, -1, 7905, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3353},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3355, false, 7904, -1, 7904, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3358, false, -1, 7907, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3361},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3363, false, 7906, -1, 7906, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3366, false, -1, 7909, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3369},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3371, false, 7908, -1, 7908, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3374, false, -1, 7911, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3377},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3379, false, 7910, -1, 7910, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3382, false, -1, 7913, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3385},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3387, false, 7912, -1, 7912, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3390, false, -1, 7915, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3393},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3395, false, 7914, -1, 7914, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3398, false, -1, 7917, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3401},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3403, false, 7916, -1, 7916, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3406, false, -1, 7919, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3409},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3411, false, 7918, -1, 7918, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3414, false, -1, 7921, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3417},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3419, false, 7920, -1, 7920, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3422, false, -1, 7923, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3425},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3427, false, 7922, -1, 7922, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3430, false, -1, 7925, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3433},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3435, false, 7924, -1, 7924, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3438, false, -1, 7927, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3441},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3443, false, 7926, -1, 7926, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3446, false, -1, 7929, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3449},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3451, false, 7928, -1, 7928, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3454, false, 7944, -1, 7944, 11940, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3457, false, 7945, -1, 7945, 12000, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3460, false, 7946, -1, 7946, 13560, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3463, false, 7947, -1, 7947, 13620, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3466, false, 7948, -1, 7948, 13680, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3469, false, 7949, -1, 7949, 13740, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3472, false, 7950, -1, 7950, 13800, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3475, false, 7951, -1, 7951, 13860, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3478, false, -1, 7936, -1, 12060, -1, false, false, false, false, utf8proc_sequences + 3481},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3483, false, -1, 7937, -1, 12120, -1, false, false, false, false, utf8proc_sequences + 3486},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3488, false, -1, 7938, -1, 13920, -1, false, false, false, false, utf8proc_sequences + 3491},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3493, false, -1, 7939, -1, 13980, -1, false, false, false, false, utf8proc_sequences + 3496},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3498, false, -1, 7940, -1, 14040, -1, false, false, false, false, utf8proc_sequences + 3501},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3503, false, -1, 7941, -1, 14100, -1, false, false, false, false, utf8proc_sequences + 3506},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3508, false, -1, 7942, -1, 14160, -1, false, false, false, false, utf8proc_sequences + 3511},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3513, false, -1, 7943, -1, 14220, -1, false, false, false, false, utf8proc_sequences + 3516},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3518, false, 7960, -1, 7960, 12180, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3521, false, 7961, -1, 7961, 12240, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3524, false, 7962, -1, 7962, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3527, false, 7963, -1, 7963, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3530, false, 7964, -1, 7964, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3533, false, 7965, -1, 7965, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3536, false, -1, 7952, -1, 12300, -1, false, false, false, false, utf8proc_sequences + 3539},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3541, false, -1, 7953, -1, 12360, -1, false, false, false, false, utf8proc_sequences + 3544},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3546, false, -1, 7954, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3549},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3551, false, -1, 7955, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3554},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3556, false, -1, 7956, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3559},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3561, false, -1, 7957, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3564},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3566, false, 7976, -1, 7976, 12420, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3569, false, 7977, -1, 7977, 12480, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3572, false, 7978, -1, 7978, 14280, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3575, false, 7979, -1, 7979, 14340, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3578, false, 7980, -1, 7980, 14400, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3581, false, 7981, -1, 7981, 14460, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3584, false, 7982, -1, 7982, 14520, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3587, false, 7983, -1, 7983, 14580, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3590, false, -1, 7968, -1, 12540, -1, false, false, false, false, utf8proc_sequences + 3593},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3595, false, -1, 7969, -1, 12600, -1, false, false, false, false, utf8proc_sequences + 3598},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3600, false, -1, 7970, -1, 14640, -1, false, false, false, false, utf8proc_sequences + 3603},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3605, false, -1, 7971, -1, 14700, -1, false, false, false, false, utf8proc_sequences + 3608},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3610, false, -1, 7972, -1, 14760, -1, false, false, false, false, utf8proc_sequences + 3613},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3615, false, -1, 7973, -1, 14820, -1, false, false, false, false, utf8proc_sequences + 3618},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3620, false, -1, 7974, -1, 14880, -1, false, false, false, false, utf8proc_sequences + 3623},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3625, false, -1, 7975, -1, 14940, -1, false, false, false, false, utf8proc_sequences + 3628},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3630, false, 7992, -1, 7992, 12660, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3633, false, 7993, -1, 7993, 12720, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3636, false, 7994, -1, 7994, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3639, false, 7995, -1, 7995, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3642, false, 7996, -1, 7996, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3645, false, 7997, -1, 7997, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3648, false, 7998, -1, 7998, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3651, false, 7999, -1, 7999, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3654, false, -1, 7984, -1, 12780, -1, false, false, false, false, utf8proc_sequences + 3657},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3659, false, -1, 7985, -1, 12840, -1, false, false, false, false, utf8proc_sequences + 3662},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3664, false, -1, 7986, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3667},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3669, false, -1, 7987, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3672},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3674, false, -1, 7988, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3677},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3679, false, -1, 7989, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3682},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3684, false, -1, 7990, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3687},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3689, false, -1, 7991, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3692},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3694, false, 8008, -1, 8008, 12900, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3697, false, 8009, -1, 8009, 12960, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3700, false, 8010, -1, 8010, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3703, false, 8011, -1, 8011, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3706, false, 8012, -1, 8012, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3709, false, 8013, -1, 8013, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3712, false, -1, 8000, -1, 13020, -1, false, false, false, false, utf8proc_sequences + 3715},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3717, false, -1, 8001, -1, 13080, -1, false, false, false, false, utf8proc_sequences + 3720},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3722, false, -1, 8002, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3725},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3727, false, -1, 8003, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3730},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3732, false, -1, 8004, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3735},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3737, false, -1, 8005, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3740},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3742, false, -1, -1, -1, 13140, -1, false, false, false, false, utf8proc_sequences + 3742},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3745, false, 8025, -1, 8025, 13200, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3748, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3751},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3755, false, 8027, -1, 8027, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3758, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3761},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3765, false, 8029, -1, 8029, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3768, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3771},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3775, false, 8031, -1, 8031, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3778, false, -1, 8017, -1, 13260, -1, false, false, false, false, utf8proc_sequences + 3781},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3783, false, -1, 8019, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3786},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3788, false, -1, 8021, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3791},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3793, false, -1, 8023, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3796},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3798, false, 8040, -1, 8040, 13320, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3801, false, 8041, -1, 8041, 13380, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3804, false, 8042, -1, 8042, 15000, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3807, false, 8043, -1, 8043, 15060, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3810, false, 8044, -1, 8044, 15120, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3813, false, 8045, -1, 8045, 15180, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3816, false, 8046, -1, 8046, 15240, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3819, false, 8047, -1, 8047, 15300, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3822, false, -1, 8032, -1, 13440, -1, false, false, false, false, utf8proc_sequences + 3825},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3827, false, -1, 8033, -1, 13500, -1, false, false, false, false, utf8proc_sequences + 3830},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3832, false, -1, 8034, -1, 15360, -1, false, false, false, false, utf8proc_sequences + 3835},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3837, false, -1, 8035, -1, 15420, -1, false, false, false, false, utf8proc_sequences + 3840},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3842, false, -1, 8036, -1, 15480, -1, false, false, false, false, utf8proc_sequences + 3845},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3847, false, -1, 8037, -1, 15540, -1, false, false, false, false, utf8proc_sequences + 3850},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3852, false, -1, 8038, -1, 15600, -1, false, false, false, false, utf8proc_sequences + 3855},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3857, false, -1, 8039, -1, 15660, -1, false, false, false, false, utf8proc_sequences + 3860},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3862, false, 8122, -1, 8122, 15720, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1341, false, 8123, -1, 8123, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3865, false, 8136, -1, 8136, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1348, false, 8137, -1, 8137, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3868, false, 8138, -1, 8138, 15900, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1353, false, 8139, -1, 8139, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3871, false, 8154, -1, 8154, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1358, false, 8155, -1, 8155, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3874, false, 8184, -1, 8184, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1363, false, 8185, -1, 8185, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3877, false, 8170, -1, 8170, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1368, false, 8171, -1, 8171, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3880, false, 8186, -1, 8186, 16320, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1373, false, 8187, -1, 8187, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3883, false, 8072, -1, 8072, -1, -1, false, false, false, false, utf8proc_sequences + 3886},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3889, false, 8073, -1, 8073, -1, -1, false, false, false, false, utf8proc_sequences + 3892},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3895, false, 8074, -1, 8074, -1, -1, false, false, false, false, utf8proc_sequences + 3898},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3901, false, 8075, -1, 8075, -1, -1, false, false, false, false, utf8proc_sequences + 3904},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3907, false, 8076, -1, 8076, -1, -1, false, false, false, false, utf8proc_sequences + 3910},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3913, false, 8077, -1, 8077, -1, -1, false, false, false, false, utf8proc_sequences + 3916},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3919, false, 8078, -1, 8078, -1, -1, false, false, false, false, utf8proc_sequences + 3922},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3925, false, 8079, -1, 8079, -1, -1, false, false, false, false, utf8proc_sequences + 3928},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3931, false, -1, 8064, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3934},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3936, false, -1, 8065, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3939},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3941, false, -1, 8066, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3944},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3946, false, -1, 8067, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3949},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3951, false, -1, 8068, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3954},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3956, false, -1, 8069, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3959},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3961, false, -1, 8070, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3964},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3966, false, -1, 8071, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3969},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3971, false, 8088, -1, 8088, -1, -1, false, false, false, false, utf8proc_sequences + 3974},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3977, false, 8089, -1, 8089, -1, -1, false, false, false, false, utf8proc_sequences + 3980},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3983, false, 8090, -1, 8090, -1, -1, false, false, false, false, utf8proc_sequences + 3986},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3989, false, 8091, -1, 8091, -1, -1, false, false, false, false, utf8proc_sequences + 3992},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3995, false, 8092, -1, 8092, -1, -1, false, false, false, false, utf8proc_sequences + 3998},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4001, false, 8093, -1, 8093, -1, -1, false, false, false, false, utf8proc_sequences + 4004},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4007, false, 8094, -1, 8094, -1, -1, false, false, false, false, utf8proc_sequences + 4010},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4013, false, 8095, -1, 8095, -1, -1, false, false, false, false, utf8proc_sequences + 4016},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4019, false, -1, 8080, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4022},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4024, false, -1, 8081, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4027},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4029, false, -1, 8082, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4032},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4034, false, -1, 8083, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4037},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4039, false, -1, 8084, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4042},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4044, false, -1, 8085, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4047},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4049, false, -1, 8086, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4052},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4054, false, -1, 8087, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4057},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4059, false, 8104, -1, 8104, -1, -1, false, false, false, false, utf8proc_sequences + 4062},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4065, false, 8105, -1, 8105, -1, -1, false, false, false, false, utf8proc_sequences + 4068},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4071, false, 8106, -1, 8106, -1, -1, false, false, false, false, utf8proc_sequences + 4074},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4077, false, 8107, -1, 8107, -1, -1, false, false, false, false, utf8proc_sequences + 4080},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4083, false, 8108, -1, 8108, -1, -1, false, false, false, false, utf8proc_sequences + 4086},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4089, false, 8109, -1, 8109, -1, -1, false, false, false, false, utf8proc_sequences + 4092},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4095, false, 8110, -1, 8110, -1, -1, false, false, false, false, utf8proc_sequences + 4098},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4101, false, 8111, -1, 8111, -1, -1, false, false, false, false, utf8proc_sequences + 4104},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4107, false, -1, 8096, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4110},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4112, false, -1, 8097, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4115},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4117, false, -1, 8098, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4120},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4122, false, -1, 8099, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4125},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4127, false, -1, 8100, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4130},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4132, false, -1, 8101, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4135},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4137, false, -1, 8102, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4140},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4142, false, -1, 8103, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4145},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4147, false, 8120, -1, 8120, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4150, false, 8121, -1, 8121, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4153, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4156},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4159, false, 8124, -1, 8124, -1, -1, false, false, false, false, utf8proc_sequences + 4162},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4165, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4168},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4171, false, -1, -1, -1, 15840, -1, false, false, false, false, utf8proc_sequences + 4171},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4174, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4177},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4181, false, -1, 8112, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4184},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4186, false, -1, 8113, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4189},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4191, false, -1, 8048, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4194},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4196, false, -1, 8049, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4198},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4200, false, -1, 8115, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4203},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4205, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1326, false, 921, -1, 921, -1, -1, false, false, false, false, utf8proc_sequences + 1326},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4205, false, -1, -1, -1, 16080, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4208, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4211, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4214, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4217},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4220, false, 8140, -1, 8140, -1, -1, false, false, false, false, utf8proc_sequences + 4223},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4226, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4229},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4232, false, -1, -1, -1, 16020, -1, false, false, false, false, utf8proc_sequences + 4232},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4235, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4238},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4242, false, -1, 8050, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4245},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4247, false, -1, 8051, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4249},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4251, false, -1, 8052, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4254},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4256, false, -1, 8053, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4258},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4260, false, -1, 8131, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4263},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4265, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4268, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4271, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4274, false, 8152, -1, 8152, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4277, false, 8153, -1, 8153, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4280, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4283},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4287, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1378},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4289, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4289},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4292, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4295},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4299, false, -1, 8144, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4302},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4304, false, -1, 8145, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4307},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4309, false, -1, 8054, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4312},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4314, false, -1, 8055, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4316},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4318, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4321, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4324, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4327, false, 8168, -1, 8168, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4330, false, 8169, -1, 8169, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4333, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4336},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4340, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1451},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4342, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4342},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4345, false, 8172, -1, 8172, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4348, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4348},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4351, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4354},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4358, false, -1, 8160, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4361},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4363, false, -1, 8161, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4366},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4368, false, -1, 8058, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4371},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4373, false, -1, 8059, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4375},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4377, false, -1, 8165, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4380},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4387, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4389, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4392},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4395, false, 8188, -1, 8188, -1, -1, false, false, false, false, utf8proc_sequences + 4398},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4401, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4404},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4407, false, -1, -1, -1, 16440, -1, false, false, false, false, utf8proc_sequences + 4407},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4410, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4413},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4417, false, -1, 8056, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4420},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4422, false, -1, 8057, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4424},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4426, false, -1, 8060, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4429},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4431, false, -1, 8061, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4433},
+ {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4435, false, -1, 8179, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4438},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4442, false, -1, -1, -1, 16140, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, 0, utf8proc_sequences + 4445, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, 0, utf8proc_sequences + 4447, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 52, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, UTF8PROC_DECOMP_TYPE_NOBREAK, utf8proc_sequences + 52, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_BN, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, true, NULL},
+ {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NOBREAK, utf8proc_sequences + 4449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4451, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4456, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4459, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ZL, 0, UTF8PROC_BIDI_CLASS_WS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL},
+ {UTF8PROC_CATEGORY_ZP, 0, UTF8PROC_BIDI_CLASS_B, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL},
+ {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_LRE, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_RLE, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_PDF, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_LRO, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_RLO, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4463, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4466, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4473, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4477, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4480, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_CS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4483, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4489, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4492, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 16, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4513, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4517, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4519, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 26, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4513, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4517, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4519, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 0, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 8, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 28, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 46, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4521, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4528, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4534, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4537, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4541, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4545, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4547, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 12, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 14, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 22, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2402, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4550, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2408, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4553, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4555, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4558, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4562, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4565, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4567, false, -1, 969, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1424},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2396, false, -1, 107, -1, -1, -1, false, false, false, false, utf8proc_sequences + 20},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4569, false, -1, 229, -1, -1, -1, false, false, false, false, utf8proc_sequences + 114},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4571, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 8526, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4573},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 28, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4577, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4579, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4581, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 16, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4583, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1408, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4589, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4591, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 6, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 18, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 8498, -1, 8498, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4593, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4597, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4601, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4605, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4609, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4613, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4617, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4621, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4625, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4629, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4633, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4637, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4641, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2392, false, -1, 8560, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4644},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4646, false, -1, 8561, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4649},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4651, false, -1, 8562, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4655},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4657, false, -1, 8563, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4660},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4662, false, -1, 8564, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4664},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4666, false, -1, 8565, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4669},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4671, false, -1, 8566, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4675},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4677, false, -1, 8567, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4682},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4684, false, -1, 8568, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4687},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4689, false, -1, 8569, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4691},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4693, false, -1, 8570, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4696},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4698, false, -1, 8571, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4702},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2398, false, -1, 8572, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4704},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4532, false, -1, 8573, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4706},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2382, false, -1, 8574, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4708},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2400, false, -1, 8575, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4710},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 16, false, 8544, -1, 8544, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4712, false, 8545, -1, 8545, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4715, false, 8546, -1, 8546, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4719, false, 8547, -1, 8547, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 42, false, 8548, -1, 8548, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4722, false, 8549, -1, 8549, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4725, false, 8550, -1, 8550, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4729, false, 8551, -1, 8551, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4734, false, 8552, -1, 8552, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 46, false, 8553, -1, 8553, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4737, false, 8554, -1, 8554, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4740, false, 8555, -1, 8555, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 22, false, 8556, -1, 8556, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4, false, 8557, -1, 8557, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6, false, 8558, -1, 8558, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 24, false, 8559, -1, 8559, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 8580, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4744},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 8579, -1, 8579, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16500, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16560, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16620, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4746, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4749, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4752, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4755, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4758, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4761, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16680, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16800, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16740, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 16860, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4764, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 16920, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4767, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 16980, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4770, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17040, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4773, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17100, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4776, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4779, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4782, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4786, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4789, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17160, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4793, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17220, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4796, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17280, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4799, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17340, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4802, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17520, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4805, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17460, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4808, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17700, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17760, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4811, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4814, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4817, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4820, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4823, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17820, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17880, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4826, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4829, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17940, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18000, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4832, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4835, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18060, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18120, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18660, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18720, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4838, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4841, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18180, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18240, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4844, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4847, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18300, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18360, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4850, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4853, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18780, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18840, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18420, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18480, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18540, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18600, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4856, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4859, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4862, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4865, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18900, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18960, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 19020, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 19080, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4868, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4871, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4874, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4877, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4880, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4883, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4886, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4889, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4892, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4894, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4896, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4905, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4911, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4917, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4929, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4933, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4937, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4941, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4949, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4957, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4970, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4975, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4990, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4995, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5005, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5010, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5015, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5051, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5055, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5063, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5067, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5075, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5111, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5151, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5159, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5163, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5171, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5175, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5183, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5187, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2376, false, -1, 9424, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5195},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2380, false, -1, 9425, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5197},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4532, false, -1, 9426, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5199},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2382, false, -1, 9427, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5201},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2384, false, -1, 9428, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5203},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4571, false, -1, 9429, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5205},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2388, false, -1, 9430, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5207},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2390, false, -1, 9431, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5209},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2392, false, -1, 9432, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5211},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2394, false, -1, 9433, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5213},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2396, false, -1, 9434, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5215},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2398, false, -1, 9435, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5217},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2400, false, -1, 9436, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5219},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2402, false, -1, 9437, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5221},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2404, false, -1, 9438, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5223},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2408, false, -1, 9439, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5225},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4553, false, -1, 9440, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5227},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2410, false, -1, 9441, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5229},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5231, false, -1, 9442, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5233},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2412, false, -1, 9443, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5235},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2414, false, -1, 9444, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5237},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4662, false, -1, 9445, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5239},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2416, false, -1, 9446, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5241},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4689, false, -1, 9447, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5243},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5245, false, -1, 9448, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5247},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4565, false, -1, 9449, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5249},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 0, false, 9398, -1, 9398, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2, false, 9399, -1, 9399, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4, false, 9400, -1, 9400, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6, false, 9401, -1, 9401, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 8, false, 9402, -1, 9402, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 10, false, 9403, -1, 9403, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 12, false, 9404, -1, 9404, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 14, false, 9405, -1, 9405, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 16, false, 9406, -1, 9406, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 18, false, 9407, -1, 9407, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 20, false, 9408, -1, 9408, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 22, false, 9409, -1, 9409, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 24, false, 9410, -1, 9410, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 26, false, 9411, -1, 9411, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 28, false, 9412, -1, 9412, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 30, false, 9413, -1, 9413, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 32, false, 9414, -1, 9414, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 34, false, 9415, -1, 9415, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 36, false, 9416, -1, 9416, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 38, false, 9417, -1, 9417, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 40, false, 9418, -1, 9418, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 42, false, 9419, -1, 9419, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 44, false, 9420, -1, 9420, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 46, false, 9421, -1, 9421, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 48, false, 9422, -1, 9422, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 50, false, 9423, -1, 9423, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5251, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5256, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 5267, true, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 19140, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11312, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5270},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11313, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5272},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11314, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5274},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11315, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5276},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11316, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5278},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11317, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5280},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11318, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5282},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11319, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5284},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11320, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5286},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11321, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5288},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11322, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5290},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11323, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5292},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11324, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5294},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11325, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5296},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11326, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5298},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11327, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5300},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11328, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5302},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11329, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5304},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11330, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5306},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11331, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5308},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11332, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5310},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11333, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5312},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11334, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5314},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11335, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5316},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11336, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5318},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11337, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5320},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11338, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5322},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11339, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5324},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11340, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5326},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11341, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5328},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11342, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5330},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11343, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5332},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11344, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5334},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11345, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5336},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11346, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5338},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11347, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5340},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11348, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5342},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11349, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5344},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11350, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5346},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11351, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5348},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11352, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5350},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11353, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5352},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11354, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5354},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11355, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5356},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11356, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5358},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11357, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5360},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11358, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5362},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11264, -1, 11264, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11265, -1, 11265, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11266, -1, 11266, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11267, -1, 11267, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11268, -1, 11268, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11269, -1, 11269, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11270, -1, 11270, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11271, -1, 11271, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11272, -1, 11272, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11273, -1, 11273, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11274, -1, 11274, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11275, -1, 11275, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11276, -1, 11276, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11277, -1, 11277, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11278, -1, 11278, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11279, -1, 11279, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11280, -1, 11280, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11281, -1, 11281, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11282, -1, 11282, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11283, -1, 11283, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11284, -1, 11284, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11285, -1, 11285, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11286, -1, 11286, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11287, -1, 11287, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11288, -1, 11288, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11289, -1, 11289, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11290, -1, 11290, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11291, -1, 11291, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11292, -1, 11292, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11293, -1, 11293, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11294, -1, 11294, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11295, -1, 11295, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11296, -1, 11296, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11297, -1, 11297, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11298, -1, 11298, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11299, -1, 11299, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11300, -1, 11300, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11301, -1, 11301, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11302, -1, 11302, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11303, -1, 11303, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11304, -1, 11304, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11305, -1, 11305, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11306, -1, 11306, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11307, -1, 11307, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11308, -1, 11308, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11309, -1, 11309, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11310, -1, 11310, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11361, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5364},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11360, -1, 11360, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 619, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5366},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 7549, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5368},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 637, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5370},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 570, -1, 570, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 574, -1, 574, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11368, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5372},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11367, -1, 11367, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11370, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5374},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11369, -1, 11369, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11372, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5376},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11371, -1, 11371, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11382, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5378},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11381, -1, 11381, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11393, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5380},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11392, -1, 11392, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11395, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5382},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11394, -1, 11394, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11397, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5384},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11396, -1, 11396, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11399, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5386},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11398, -1, 11398, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11401, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5388},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11400, -1, 11400, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11403, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5390},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11402, -1, 11402, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11405, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5392},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11404, -1, 11404, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11407, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5394},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11406, -1, 11406, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11409, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5396},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11408, -1, 11408, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11411, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5398},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11410, -1, 11410, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11413, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5400},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11412, -1, 11412, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11415, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5402},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11414, -1, 11414, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11417, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5404},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11416, -1, 11416, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11419, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5406},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11418, -1, 11418, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11421, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5408},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11420, -1, 11420, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11423, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5410},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11422, -1, 11422, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11425, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5412},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11424, -1, 11424, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11427, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5414},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11426, -1, 11426, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11429, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5416},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11428, -1, 11428, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11431, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5418},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11430, -1, 11430, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11433, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5420},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11432, -1, 11432, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11435, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5422},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11434, -1, 11434, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11437, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5424},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11436, -1, 11436, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11439, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5426},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11438, -1, 11438, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11441, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5428},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11440, -1, 11440, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11443, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5430},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11442, -1, 11442, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11445, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5432},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11444, -1, 11444, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11447, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5434},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11446, -1, 11446, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11449, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5436},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11448, -1, 11448, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11451, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5438},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11450, -1, 11450, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11453, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5440},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11452, -1, 11452, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11455, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5442},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11454, -1, 11454, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11457, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5444},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11456, -1, 11456, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11459, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5446},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11458, -1, 11458, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11461, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5448},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11460, -1, 11460, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11463, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5450},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11462, -1, 11462, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11465, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5452},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11464, -1, 11464, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11467, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5454},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11466, -1, 11466, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11469, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5456},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11468, -1, 11468, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11471, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5458},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11470, -1, 11470, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11473, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5460},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11472, -1, 11472, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11475, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5462},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11474, -1, 11474, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11477, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5464},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11476, -1, 11476, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11479, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5466},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11478, -1, 11478, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11481, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5468},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11480, -1, 11480, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11483, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5470},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11482, -1, 11482, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11485, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5472},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11484, -1, 11484, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11487, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5474},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11486, -1, 11486, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11489, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5476},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11488, -1, 11488, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11491, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5478},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11490, -1, 11490, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4256, -1, 4256, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4257, -1, 4257, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4258, -1, 4258, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4259, -1, 4259, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4260, -1, 4260, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4261, -1, 4261, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4262, -1, 4262, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4263, -1, 4263, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4264, -1, 4264, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4265, -1, 4265, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4266, -1, 4266, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4267, -1, 4267, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4268, -1, 4268, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4269, -1, 4269, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4270, -1, 4270, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4271, -1, 4271, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4272, -1, 4272, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4273, -1, 4273, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4274, -1, 4274, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4275, -1, 4275, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4276, -1, 4276, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4277, -1, 4277, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4278, -1, 4278, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4279, -1, 4279, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4280, -1, 4280, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4281, -1, 4281, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4282, -1, 4282, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4283, -1, 4283, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4284, -1, 4284, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4285, -1, 4285, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4286, -1, 4286, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4287, -1, 4287, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4288, -1, 4288, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4289, -1, 4289, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4290, -1, 4290, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4291, -1, 4291, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4292, -1, 4292, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4293, -1, 4293, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5480, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5484, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5490, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5492, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5496, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5498, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5504, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5506, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5510, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5512, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5514, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5516, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5518, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5520, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5522, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5526, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5528, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5530, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5534, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5536, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5538, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5540, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5542, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5544, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5546, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5548, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5550, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5552, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5554, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5556, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5558, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5562, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5564, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5566, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5568, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5570, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5572, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5574, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5576, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5578, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5580, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5582, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5584, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5586, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5588, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5590, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5592, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5594, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5596, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5598, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5600, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5602, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5604, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5606, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5608, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5610, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5612, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5614, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5616, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5618, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5620, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5622, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5624, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5626, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5628, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5630, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5632, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5634, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5636, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5638, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5640, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5642, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5644, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5646, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5648, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5650, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5652, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5654, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5656, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5658, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5660, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5662, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5664, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5666, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5668, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5670, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5672, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5674, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5676, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5678, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5680, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5682, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5684, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5686, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5688, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5690, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5692, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5694, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5696, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5698, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5700, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5702, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5704, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5706, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5708, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5710, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5712, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5714, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5716, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5718, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5720, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5722, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5724, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5726, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5728, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5730, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5732, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5734, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5736, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5738, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5740, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5742, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5744, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5746, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5748, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5750, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5752, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5754, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5756, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5758, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5760, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5762, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5764, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5766, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5768, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5770, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5772, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5774, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5776, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5778, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5780, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5782, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5784, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5786, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5790, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5794, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5796, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5798, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5802, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5804, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5806, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5808, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5810, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5812, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5814, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5816, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5820, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5822, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5824, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5826, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5828, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5832, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5834, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5836, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5838, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5840, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5842, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5844, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5846, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5848, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5850, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5852, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5854, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5856, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5858, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5860, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5862, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5864, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5866, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5868, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5870, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5872, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5874, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5876, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5878, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5880, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5882, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5884, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5886, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5888, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5890, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5894, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5896, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5898, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5900, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 52, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 218, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 224, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20400, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19200, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19260, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19320, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19380, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5929, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19440, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5932, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19500, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5935, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19560, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5938, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19620, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5941, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19680, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19740, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5947, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19800, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19860, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19920, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19980, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20040, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20100, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5968, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20160, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5971, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5974, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20220, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5977, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20280, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5986, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20340, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5989, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5992, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5995, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 8, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 52, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MN, 8, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 53, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5998, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6001, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20460, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6004, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 6007, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21720, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20520, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6010, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20580, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6013, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20640, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6016, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20700, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6019, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20760, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6022, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20820, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6025, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20880, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6028, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20940, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6031, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21000, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6034, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21060, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6037, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21120, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6040, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21180, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6043, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21240, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6046, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21300, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6049, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21360, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6052, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21420, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6055, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6058, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21480, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6061, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6064, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21540, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6067, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6070, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21600, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6073, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6076, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21660, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6082, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21780, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21840, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21900, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21960, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6085, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6088, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6094, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22020, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6100, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 6103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6106, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6108, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6112, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6114, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6116, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6118, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6120, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6124, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6126, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6130, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6132, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6136, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6138, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6142, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6144, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6148, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6154, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6160, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6162, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6166, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6168, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6172, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6174, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6178, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6180, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6184, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6186, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6190, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6192, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6196, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6198, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6202, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6204, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6208, false, -1, -1, -1, -1, -1, false, true, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6210, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6212, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6214, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6216, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6218, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6220, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6222, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6224, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6226, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6228, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6230, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6232, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6234, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6236, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6238, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6240, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6242, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6244, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6246, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6250, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6252, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6254, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6256, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6258, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6262, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6264, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6266, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6268, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6270, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6274, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6276, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6278, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6280, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6282, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6284, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6286, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6288, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6290, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6292, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5498, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6294, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6296, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6298, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6302, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6304, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6306, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6308, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6310, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6312, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6314, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6318, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6322, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6326, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6330, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6334, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6338, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6342, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6346, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6350, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6354, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6358, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6362, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6366, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6370, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6375, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6395, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6405, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6415, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6430, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6435, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6445, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6453, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6460, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6468, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6480, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6484, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6492, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6496, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6504, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6512, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6516, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6520, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6528, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6536, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6540, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6544, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6548, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6552, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6556, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6564, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6568, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6572, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6576, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6580, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6584, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6588, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6592, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6596, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6600, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6604, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6608, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6614, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6617, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6620, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6623, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6626, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6629, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6632, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6638, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6641, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6644, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6647, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6650, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6106, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6112, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6118, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6138, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6160, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6162, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6653, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6656, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6659, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6662, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6665, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6668, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6671, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6674, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6677, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6680, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6683, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6686, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6689, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6692, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6695, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6701, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6706, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5498, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6294, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6296, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6709, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6711, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6713, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6715, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5632, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5656, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5654, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5634, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5548, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5628, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6717, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6719, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6721, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6723, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6725, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6727, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6729, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6731, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6733, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6737, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6739, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6741, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6743, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6745, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6747, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6749, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6751, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6298, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6302, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6753, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6755, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6757, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6759, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6761, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6763, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6765, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6767, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6769, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6771, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6773, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6776, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6779, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6782, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6785, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6791, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6794, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6797, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6803, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6806, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6809, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6812, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6815, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6821, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6824, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6827, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6833, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6836, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6839, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6842, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6845, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6849, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6853, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6857, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6860, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6864, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6867, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6871, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6873, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6875, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6877, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6879, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6881, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6883, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6885, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6887, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6889, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6891, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6893, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6895, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6897, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6901, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6903, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6905, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6907, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6909, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6911, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6913, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6915, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6917, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6919, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6921, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6925, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6927, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6929, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6931, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6933, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6935, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6937, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6939, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6941, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6943, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6947, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6949, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6951, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6955, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6957, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6970, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6975, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6984, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6989, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6993, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7008, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7012, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7016, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7025, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7030, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7034, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7045, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7055, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7058, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7064, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7081, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7093, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7102, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7106, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7126, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7130, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7138, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7144, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7154, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7168, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7183, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7186, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7189, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7195, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7210, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7216, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7219, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7223, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7227, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7231, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7235, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7244, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7255, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7259, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7268, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7276, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7280, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7286, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7294, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7308, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7313, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7317, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7321, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7325, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7330, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7337, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7342, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7345, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7351, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7355, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7358, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7361, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7364, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7367, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7370, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7373, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7376, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7379, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7389, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7393, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7397, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7405, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7409, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7413, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7417, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7421, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7429, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7433, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7437, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7441, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7445, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7455, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7459, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7462, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7465, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7468, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7491, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7496, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7514, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7517, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7520, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7529, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7535, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7538, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7541, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7544, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7547, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7550, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7554, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7558, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7562, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7566, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7569, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7572, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7578, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7581, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7584, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7590, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7593, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7596, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7600, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7604, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7607, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7615, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7619, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7622, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7626, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7630, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7638, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7642, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7646, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7650, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7654, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7660, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7667, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7670, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7673, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7676, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7679, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7682, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7685, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7688, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7691, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7694, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7697, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7700, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7703, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7706, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7709, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7712, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7715, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7718, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7721, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7726, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7729, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7732, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7740, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7744, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7747, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7750, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7753, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7756, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7759, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7762, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7765, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7768, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7771, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7774, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7778, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7781, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7784, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7795, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7804, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7807, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7810, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7813, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7816, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7820, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7824, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7827, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7833, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7836, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7839, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7842, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7845, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7848, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7851, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7855, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7859, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7863, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7867, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7871, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7875, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7879, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7883, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7887, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7891, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7895, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7903, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7907, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7911, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7915, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7919, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7927, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7931, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7935, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7939, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_CS, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, true, false, false, NULL},
+ {UTF8PROC_CATEGORY_CO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7943, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5802, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7947, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7949, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7951, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7955, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7957, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7967, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7969, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7971, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7973, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7975, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7977, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7979, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7981, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7987, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7989, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7991, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7993, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7995, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7999, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8001, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8005, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8007, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8009, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8011, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8013, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8015, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8019, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8021, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8025, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8027, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8031, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8033, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8037, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5734, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8039, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8043, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8045, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8049, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8051, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8055, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8057, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5880, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8061, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8063, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8067, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8069, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8073, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8075, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8081, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8085, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8093, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8105, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8109, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8111, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8149, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8151, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8153, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5806, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8157, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8159, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8163, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8165, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8169, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8171, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8175, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8177, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8181, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8183, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8187, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8189, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8193, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8195, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8197, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8199, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5522, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8201, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8205, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8207, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8209, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8211, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8213, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8215, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8217, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8219, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8223, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8225, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8227, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8229, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8231, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8233, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8235, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8237, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8241, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8243, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8247, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8249, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8253, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8255, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8257, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8259, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8261, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8265, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8267, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8271, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8273, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8277, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8279, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8281, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8283, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8285, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8287, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8289, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8293, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8295, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8297, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8299, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8301, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8305, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8307, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8309, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8311, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8313, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8315, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8317, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8319, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8321, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8323, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8325, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8327, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8329, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8331, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6711, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8335, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8337, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8339, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8341, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8343, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8345, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8347, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8349, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8351, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8353, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8355, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8357, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8359, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8361, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8363, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8365, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8367, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8369, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8371, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8373, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8375, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5816, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8377, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8379, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8381, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8383, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8387, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8389, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8391, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8393, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8395, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8397, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8399, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5718, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8403, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8405, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8407, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8409, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8411, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8413, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8415, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8417, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8419, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8421, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8423, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8427, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8429, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8431, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8433, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5772, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8435, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5778, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8437, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8439, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8441, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8443, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8445, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8447, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8451, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8453, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8455, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8457, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8459, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8461, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8463, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5732, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8465, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8467, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8469, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8471, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8473, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8475, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8477, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8481, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8483, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8487, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8489, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8491, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8493, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8495, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5574, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8513, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8517, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8519, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8521, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8523, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8525, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8527, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8529, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8531, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8533, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6721, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8535, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8537, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8539, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8541, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6729, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8543, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8545, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8547, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8549, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8551, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8553, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8555, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8557, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8559, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8561, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8563, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8565, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8567, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8569, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8571, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8573, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8577, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8579, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8581, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8583, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8585, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8589, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8591, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8593, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8595, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8597, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8599, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8601, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8603, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8605, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8607, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8609, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8613, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8615, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8617, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8619, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8621, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8623, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8625, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8627, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8629, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8631, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8633, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8637, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8639, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8641, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8643, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8645, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8647, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5640, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8649, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8651, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8653, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8655, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8657, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8659, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8661, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8663, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8665, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8667, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8669, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8671, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8673, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8675, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8677, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8679, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8681, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8683, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8685, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8687, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8689, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8691, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8693, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8695, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8697, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8699, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8701, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8703, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8705, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8707, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8709, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8711, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8713, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8715, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8717, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8719, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8721, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8723, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8725, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8727, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8729, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8731, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8733, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8737, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8739, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8741, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8743, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8745, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8745},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8748, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8748},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8751, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8751},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8754, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8754},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8758, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8758},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8762, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8765},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8765, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8765},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8768, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8768},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8771, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8771},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8774, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8774},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8777, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8777},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8780, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8780},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8783, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MN, 26, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8786, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8789, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4581, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8791, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8793, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8795, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8797, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8799, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8801, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8803, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8806, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8809, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8812, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8815, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8818, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8821, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8824, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8827, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8830, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8833, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8836, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8839, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8842, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8845, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8848, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8851, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8854, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8857, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8860, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8863, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8866, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8869, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8872, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8875, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8878, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8881, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8884, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8887, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8890, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8893, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8896, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8928, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8928, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8930, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8930, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8932, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8932, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8934, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8934, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8936, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8936, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8938, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8938, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8948, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8948, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8952, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8952, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8958, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8958, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8960, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8960, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8964, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8964, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8966, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8966, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8968, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8968, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8970, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8972, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8972, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8974, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8974, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8976, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8976, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8982, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8982, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8988, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8988, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8991, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8991, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8994, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8994, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9008, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9011, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9056, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9068, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9074, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9080, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9086, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9104, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9116, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9149, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9197, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9209, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9212, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9215, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9218, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9224, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9227, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9230, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9233, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9236, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9242, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9254, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9257, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9266, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9278, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9281, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9284, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9287, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9295, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9299, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9307, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9311, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9314, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9317, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9320, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9323, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9326, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9329, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9332, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9335, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9338, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9341, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9344, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9209, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9347, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9350, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9353, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9356, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9242, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9284, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9359, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9362, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9365, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9008, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9011, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9368, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9371, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9374, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9377, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9068, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9074, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9080, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9086, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9104, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9116, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9149, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9197, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9383, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9212, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9215, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9218, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9230, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9233, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9236, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9389, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9266, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9371, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9374, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9377, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9395, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9407, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9411, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9415, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9419, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9428, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9431, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9434, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9437, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9443, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9446, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9455, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9458, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9461, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9467, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9473, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9491, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9419, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9428, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9431, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9434, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9437, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9443, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9446, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9455, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9458, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9461, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9467, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9473, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9491, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9519, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9523, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9527, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9531, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9531, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9535, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9539, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9543, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9547, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9551, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9555, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9555, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9559, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9563, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9563, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9567, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9567, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9571, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9579, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9583, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9583, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9591, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9595, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9595, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9599, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9599, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9603, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9607, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9615, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9615, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9619, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9623, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9627, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9631, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9639, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9643, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9647, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9651, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9655, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9659, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9659, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9663, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9663, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9667, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9667, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9671, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9675, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9679, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9683, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9687, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9691, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9695, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9699, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9703, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9707, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9711, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9715, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9719, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9719, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9723, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9727, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9731, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9739, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9743, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9747, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9751, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9755, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9759, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9763, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9767, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9771, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9775, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9779, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9783, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9787, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9791, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9795, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9799, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9803, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9807, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9811, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9815, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9819, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9823, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9639, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9647, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9827, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9831, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9835, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9839, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9843, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9847, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9843, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9835, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9851, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9855, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9859, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9863, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9867, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9847, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9571, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9871, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9875, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9879, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9883, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9887, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9897, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9907, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9917, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 1333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9967, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9969, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9971, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9973, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9975, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9977, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9979, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9981, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 4517, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 4519, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9987, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9989, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9991, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9993, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9995, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9999, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 4892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 4894, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10001, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10005, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10007, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10009, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10011, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 10013, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 9983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 1333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9969, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9967, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9979, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4517, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4519, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9985, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9987, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9989, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9991, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10015, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10019, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10021, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10023, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10025, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10027, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10031, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10033, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10056, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10068, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10074, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10081, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10081, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10085, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10085, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10093, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10093, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10105, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10105, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10109, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10109, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10111, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10111, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10153, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10153, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9967, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10159, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10015, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10031, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4517, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4519, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10019, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10021, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10163, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 1333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10023, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10025, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9969, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10033, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2376, false, -1, 65345, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10165},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2380, false, -1, 65346, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10167},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4532, false, -1, 65347, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10169},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2382, false, -1, 65348, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10171},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2384, false, -1, 65349, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10173},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4571, false, -1, 65350, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10175},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2388, false, -1, 65351, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10177},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2390, false, -1, 65352, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10179},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2392, false, -1, 65353, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10181},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2394, false, -1, 65354, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10183},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2396, false, -1, 65355, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10185},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2398, false, -1, 65356, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10187},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2400, false, -1, 65357, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10189},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2402, false, -1, 65358, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10191},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2404, false, -1, 65359, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10193},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2408, false, -1, 65360, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10195},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4553, false, -1, 65361, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10197},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2410, false, -1, 65362, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10199},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 5231, false, -1, 65363, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10201},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2412, false, -1, 65364, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10203},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2414, false, -1, 65365, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10205},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4662, false, -1, 65366, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10207},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2416, false, -1, 65367, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10209},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4689, false, -1, 65368, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10211},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 5245, false, -1, 65369, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10213},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4565, false, -1, 65370, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10215},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10009, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10027, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10011, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10217, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4387, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 0, false, 65313, -1, 65313, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2, false, 65314, -1, 65314, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4, false, 65315, -1, 65315, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 6, false, 65316, -1, 65316, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 8, false, 65317, -1, 65317, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10, false, 65318, -1, 65318, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 12, false, 65319, -1, 65319, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 14, false, 65320, -1, 65320, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 16, false, 65321, -1, 65321, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 18, false, 65322, -1, 65322, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 20, false, 65323, -1, 65323, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 22, false, 65324, -1, 65324, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 24, false, 65325, -1, 65325, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 26, false, 65326, -1, 65326, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 28, false, 65327, -1, 65327, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 30, false, 65328, -1, 65328, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 32, false, 65329, -1, 65329, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 34, false, 65330, -1, 65330, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 36, false, 65331, -1, 65331, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 38, false, 65332, -1, 65332, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 40, false, 65333, -1, 65333, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 42, false, 65334, -1, 65334, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 44, false, 65335, -1, 65335, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 46, false, 65336, -1, 65336, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 48, false, 65337, -1, 65337, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 50, false, 65338, -1, 65338, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9985, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10219, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9987, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10223, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10225, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 9963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10001, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10003, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 9961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10227, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10229, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10231, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10233, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10235, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10237, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10241, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10243, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10247, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6871, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6873, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6875, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6877, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6879, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6881, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6883, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6885, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6887, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6889, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6891, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6893, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6895, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6897, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6901, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6903, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6905, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6907, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6909, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6911, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6913, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6915, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6917, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6919, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6921, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6925, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6927, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6929, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6931, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6933, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6935, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6937, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6939, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6941, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6943, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6947, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6949, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6951, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6955, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6957, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10249, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10253, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10255, false, -1, -1, -1, -1, -1, false, true, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10257, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10259, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10261, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10265, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10267, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10271, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10273, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10277, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10279, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10281, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10283, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10285, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10287, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10289, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10293, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10295, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10297, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10299, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10301, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10305, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10307, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10309, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10311, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10313, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10315, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10317, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10319, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10321, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10323, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10325, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10327, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10329, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10331, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10335, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10337, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10339, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10341, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10343, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10345, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10347, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10349, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10351, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10353, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10355, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10357, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10359, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10361, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10363, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10365, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10367, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10369, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10371, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10373, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10375, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10377, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10379, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10381, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10383, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL},
+ {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66600, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10387},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66601, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10389},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66602, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10391},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66603, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10393},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66604, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10395},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66605, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10397},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66606, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10399},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66607, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10401},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66608, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10403},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66609, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10405},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66610, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10407},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66611, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10409},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66612, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10411},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66613, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10413},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66614, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10415},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66615, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10417},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66616, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10419},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66617, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10421},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66618, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10423},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66619, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10425},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66620, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10427},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66621, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10429},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66622, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10431},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66623, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10433},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66624, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10435},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66625, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10437},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66626, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10439},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66627, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10441},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66628, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10443},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66629, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10445},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66630, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10447},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66631, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10449},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66632, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10451},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66633, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10453},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66634, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10455},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66635, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10457},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66636, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10459},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66637, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10461},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66638, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10463},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66639, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10465},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66560, -1, 66560, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66561, -1, 66561, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66562, -1, 66562, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66563, -1, 66563, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66564, -1, 66564, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66565, -1, 66565, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66566, -1, 66566, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66567, -1, 66567, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66568, -1, 66568, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66569, -1, 66569, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66570, -1, 66570, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66571, -1, 66571, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66572, -1, 66572, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66573, -1, 66573, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66574, -1, 66574, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66575, -1, 66575, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66576, -1, 66576, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66577, -1, 66577, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66578, -1, 66578, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66579, -1, 66579, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66580, -1, 66580, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66581, -1, 66581, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66582, -1, 66582, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66583, -1, 66583, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66584, -1, 66584, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66585, -1, 66585, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66586, -1, 66586, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66587, -1, 66587, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66588, -1, 66588, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66589, -1, 66589, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66590, -1, 66590, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66591, -1, 66591, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66592, -1, 66592, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66593, -1, 66593, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66594, -1, 66594, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66595, -1, 66595, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66596, -1, 66596, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66597, -1, 66597, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66598, -1, 66598, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66599, -1, 66599, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22080, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22140, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10467, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10470, false, -1, -1, -1, 22200, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10473, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10476, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10479, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10482, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10485, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 54, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 226, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 55, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 56, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 57, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 58, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 59, false, false, false, true, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22260, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22320, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10488, false, -1, -1, -1, 22380, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10491, false, -1, -1, -1, 22440, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10494, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10497, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10500, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10503, false, -1, -1, -1, -1, -1, true, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2376, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2394, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 5231, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2412, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2414, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4662, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2416, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4689, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 5245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 0, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 20, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 24, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 26, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 30, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 32, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 34, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 36, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 38, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 40, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 42, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 44, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 46, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 48, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 50, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10506, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10510, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10512, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10514, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10516, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10518, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10520, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1504, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10522, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10526, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10528, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10530, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10534, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10536, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10538, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10540, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10542, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10544, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10546, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4567, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10548, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1394, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1326, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 67, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1402, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1406, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1412, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1414, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1416, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1424, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10550, true, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10552, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10554, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10556, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10558, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10562, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10564, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10566, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10568, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10570, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10572, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10574, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10576, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10578, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10580, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10582, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10584, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10586, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10588, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10590, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10592, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10594, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10596, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10598, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10600, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10602, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10604, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10606, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10608, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10610, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10612, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10614, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5518, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10616, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10618, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10620, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10622, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10624, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10626, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10628, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10630, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10632, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10634, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10636, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10638, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10640, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10642, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10644, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10646, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10648, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10650, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10652, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10654, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10656, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10658, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10660, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10662, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10664, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10666, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10668, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10670, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10672, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10674, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10676, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10678, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10680, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10682, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10684, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10686, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10688, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10690, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10692, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10694, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10696, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10698, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10700, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10702, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10704, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10706, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10708, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10710, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10712, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10714, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10716, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10718, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10720, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10722, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10724, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10726, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10728, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10730, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10732, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10734, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10736, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10738, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10740, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10742, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10744, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10746, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10748, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10750, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10752, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10754, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10756, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10758, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10760, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5570, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10762, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10764, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10766, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10768, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10770, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10772, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10774, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10776, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10778, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10780, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10782, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10784, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10786, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10790, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10794, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10796, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10798, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10802, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10804, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10806, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10808, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5594, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10810, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10812, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10814, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10816, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10820, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10822, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10824, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10826, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10828, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10832, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10834, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10836, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10838, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10840, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10842, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10844, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10846, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10848, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10850, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10852, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10854, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10856, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10858, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10860, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10862, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10864, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10866, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10868, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10870, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10872, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10874, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10876, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10878, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10880, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10882, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10884, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10886, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10888, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10890, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10894, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10896, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10898, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10900, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10928, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10930, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10932, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10934, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10936, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10938, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10948, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10952, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10958, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10960, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10964, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10966, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10968, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10970, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10972, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10974, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10976, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10982, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10984, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10986, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10988, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10990, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10992, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10994, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10996, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10998, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11002, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11004, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11008, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11010, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11012, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11016, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11018, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11022, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11024, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11028, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11030, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11034, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11036, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11040, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11042, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11046, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11048, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11052, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11054, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11056, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11058, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11060, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11064, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11066, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11068, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11070, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11072, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11074, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11076, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11078, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11080, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11082, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11084, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11086, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11088, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11090, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11094, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11096, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11100, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11102, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11104, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11106, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11108, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11112, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11114, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11116, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11118, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11120, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11124, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11126, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11130, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11132, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11136, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11138, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11142, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11144, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11148, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11154, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11160, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11162, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11166, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11168, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11172, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11174, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11178, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11180, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11184, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11186, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11190, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11192, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11196, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11198, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11202, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11204, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11208, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11210, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11212, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11214, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11216, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11218, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11220, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11222, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11224, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11226, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11228, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11230, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11232, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11234, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11236, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11238, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11240, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11242, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11244, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11246, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11250, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11252, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11254, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11256, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11258, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11262, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11264, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11266, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11268, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11270, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11274, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11276, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11278, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11280, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11282, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11284, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11286, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11288, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11290, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11292, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11294, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11296, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11298, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11302, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11304, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11306, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11308, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11310, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11312, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11314, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11316, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11318, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11320, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11322, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11324, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11326, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11328, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11330, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11332, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11334, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11336, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11338, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11340, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11342, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11344, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5774, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11346, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11348, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11350, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11352, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11354, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11356, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11358, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11360, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11362, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11364, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11366, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11368, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11370, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11372, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11374, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11376, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11378, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11394, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11402, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11406, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11408, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11412, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11414, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11416, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11424, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11426, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11428, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11430, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11432, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11434, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11436, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11438, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11442, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11444, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11446, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11448, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11450, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11456, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11458, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11460, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11462, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11466, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11468, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11474, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11478, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11480, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11484, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11490, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5884, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11492, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11496, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11498, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+ {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL},
+};
+
+const int32_t utf8proc_combinations[] = {
+ 192, 193, 194, 195, 196, 197, -1,
+ 256, 258, 260, 550, 461, -1, -1, 512,
+ 514, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7680, 7840, -1, -1, -1, -1, -1, 7842,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 262, 264,
+ -1, -1, -1, 199, -1, -1, -1, 266,
+ 268, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 200, 201, 202, 7868, 203, -1, 552,
+ 274, 276, 280, 278, 282, -1, -1, 516,
+ 518, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7864, -1, 7704, 7706, -1, -1, 7866,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 204, 205, 206,
+ 296, 207, -1, -1, 298, 300, 302, 304,
+ 463, -1, -1, 520, 522, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7882, -1, -1,
+ 7724, -1, -1, 7880, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 504, 323, -1, 209, -1, -1, 325,
+ -1, -1, -1, 7748, 327, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7750, 7752, 7754, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 210, 211, 212,
+ 213, 214, -1, -1, 332, 334, 490, 558,
+ 465, 336, 416, 524, 526, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7884, -1, -1,
+ -1, -1, -1, 7886, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 217, 218, 219, 360, 220, 366, -1,
+ 362, 364, 370, -1, 467, 368, 431, 532,
+ 534, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7908, -1, 7798, 7796, -1, 7794, 7910,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7922, 221, 374,
+ 7928, 376, -1, -1, 562, -1, -1, 7822,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7924, -1, -1,
+ -1, -1, -1, 7926, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 224, 225, 226, 227, 228, 229, -1,
+ 257, 259, 261, 551, 462, -1, -1, 513,
+ 515, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7681, 7841, -1, -1, -1, -1, -1, 7843,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 263, 265,
+ -1, -1, -1, 231, -1, -1, -1, 267,
+ 269, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 232, 233, 234, 7869, 235, -1, 553,
+ 275, 277, 281, 279, 283, -1, -1, 517,
+ 519, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7865, -1, 7705, 7707, -1, -1, 7867,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 236, 237, 238,
+ 297, 239, -1, -1, 299, 301, 303, -1,
+ 464, -1, -1, 521, 523, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7883, -1, -1,
+ 7725, -1, -1, 7881, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 505, 324, -1, 241, -1, -1, 326,
+ -1, -1, -1, 7749, 328, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7751, 7753, 7755, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 242, 243, 244,
+ 245, 246, -1, -1, 333, 335, 491, 559,
+ 466, 337, 417, 525, 527, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7885, -1, -1,
+ -1, -1, -1, 7887, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 249, 250, 251, 361, 252, 367, -1,
+ 363, 365, 371, -1, 468, 369, 432, 533,
+ 535, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7909, -1, 7799, 7797, -1, 7795, 7911,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7923, 253, 375,
+ 7929, 255, 7833, -1, 563, -1, -1, 7823,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7925, -1, -1,
+ -1, -1, -1, 7927, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7696,
+ -1, -1, -1, 7690, 270, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7692, 7694, 7698, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7697, -1, -1, -1, 7691,
+ 271, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7693, 7695, 7699,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 500, 284, -1, -1, -1, 290,
+ 7712, 286, -1, 288, 486, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 501, 285,
+ -1, -1, -1, 291, 7713, 287, -1, 289,
+ 487, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 292, -1, 7718, -1, 7720,
+ -1, -1, -1, 7714, 542, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7716, -1, -1, -1, 7722, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 293,
+ -1, 7719, -1, 7721, -1, -1, -1, 7715,
+ 543, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7717, 7830, -1,
+ -1, 7723, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 308, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 309,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 496, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7728, -1, -1, -1, -1, 310,
+ -1, -1, -1, -1, 488, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7730, 7732, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7729, -1,
+ -1, -1, -1, 311, -1, -1, -1, -1,
+ 489, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7731, 7733, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 313, -1, -1, -1, -1, 315,
+ -1, -1, -1, -1, 317, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7734, 7738, 7740, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 314, -1,
+ -1, -1, -1, 316, -1, -1, -1, -1,
+ 318, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7735, 7739, 7741,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 340, -1, -1, -1, -1, 342,
+ -1, -1, -1, 7768, 344, -1, -1, 528,
+ 530, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7770, 7774, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 341, -1,
+ -1, -1, -1, 343, -1, -1, -1, 7769,
+ 345, -1, -1, 529, 531, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7771, 7775, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 346, 348, -1, -1, -1, 350,
+ -1, -1, -1, 7776, 352, -1, -1, -1,
+ -1, 536, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7778, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 347, 349,
+ -1, -1, -1, 351, -1, -1, -1, 7777,
+ 353, -1, -1, -1, -1, 537, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7779, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 354,
+ -1, -1, -1, 7786, 356, -1, -1, -1,
+ -1, 538, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7788, 7790, 7792, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7831, -1, 355, -1, -1, -1, 7787,
+ 357, -1, -1, -1, -1, 539, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7789, 7791, 7793,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7808, 7810, 372, -1, 7812, -1, -1,
+ -1, -1, -1, 7814, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7816, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7809, 7811, 373,
+ -1, 7813, 7832, -1, -1, -1, -1, 7815,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7817, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 377, 7824, -1, -1, -1, -1,
+ -1, -1, -1, 379, 381, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7826, 7828, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 378, 7825,
+ -1, -1, -1, -1, -1, -1, -1, 380,
+ 382, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7827, 7829, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 475, 471, -1, -1, -1, -1, -1,
+ 469, -1, -1, -1, 473, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 476, 472, -1,
+ -1, -1, -1, -1, 470, -1, -1, -1,
+ 474, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 478, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 479, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 480, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 481, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 508, -1, -1, -1, -1, -1,
+ 482, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 509, -1,
+ -1, -1, -1, -1, 483, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 492, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 493, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 494, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 495, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 506, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 507, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 510, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 511, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 554, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 555, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7756, -1, -1, 7758, -1, -1,
+ 556, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7757, -1,
+ -1, 7759, -1, -1, 557, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 560, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 561, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8173, 901, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 8129, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8122, 902, -1,
+ -1, -1, -1, -1, 8121, 8120, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 7944, 7945, -1, 8124,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8136, 904, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7960, 7961, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8138, 905, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 7976, 7977, -1, 8140,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8154, 906, -1, -1, 938, -1, -1,
+ 8153, 8152, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7992, 7993, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8184, 908, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8008, 8009, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8170, 910, -1, -1, 939, -1, -1,
+ 8169, 8168, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8025, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8186, 911, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8040, 8041, -1, 8188,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8146, 912, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 8151, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8048, 940, -1,
+ -1, -1, -1, -1, 8113, 8112, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 7936, 7937, 8118, 8115,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8050, 941, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7952, 7953, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8052, 942, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 7968, 7969, 8134, 8131,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8054, 943, -1, -1, 970, -1, -1,
+ 8145, 8144, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7984, 7985, 8150, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8162, 944, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 8167, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8058, 973, -1, -1, 971, -1, -1,
+ 8161, 8160, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8016, 8017, 8166, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8056, 972, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8000, 8001, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8060, 974, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8032, 8033, 8182, 8179, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 979, -1,
+ -1, 980, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1024, -1, -1, -1, 1025, -1, -1,
+ -1, 1238, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 1027, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 1031, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 1036, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1037, -1, -1, -1, 1252, -1, -1,
+ 1250, 1049, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1264, -1, -1, 1262, 1038, -1, -1,
+ -1, 1266, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1117, -1, -1, -1, 1253, -1, -1,
+ 1251, 1081, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 1104, -1, -1,
+ -1, 1105, -1, -1, -1, 1239, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 1107, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1111, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 1116, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1265, -1, -1, 1263, 1118, -1, -1,
+ -1, 1267, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 1142,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 1143, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 1244, -1, -1,
+ -1, 1217, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1245, -1, -1, -1, 1218, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 1234, -1, -1,
+ -1, 1232, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1235, -1, -1, -1, 1233, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 1242, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1243, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 1246, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1247, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 1254, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1255, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 1258, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1259, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 1260, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1261, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 1268, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1269, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 1272, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1273, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 1570, 1571, 1573, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 1572,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 1574, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 1728,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 1730, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 1747,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 2345, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 2353, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 2356, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 2507, 2508, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 2888, 2891, 2892, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 2964,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 3020, 3018, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 3019, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 3144, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 3264, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 3271, 3272,
+ 3274, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 3275, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 3402, 3404, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 3403, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 3546, 3548, 3550, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 3549,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 4134, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 6918, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 6920,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 6922, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 6924,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 6926, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 6930,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 6971, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 6973,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 6976, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 6977,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 6979, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7682, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7684, 7686, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7683,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7685, 7687, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7688, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7689, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7700, 7702, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7701, 7703, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7708, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7709, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7710, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7711,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7726, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7727, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7736, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 7737, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7742, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7744, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7746, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7743, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7745,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7747, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7760, 7762, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7761, 7763, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7764, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7766, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7765, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7767,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7772, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 7773, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7780, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7781,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7782, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7783,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7784, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7785,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7800, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7801, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7802, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7803, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 7804, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7806, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7805, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7807, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7820, -1, -1,
+ -1, -1, -1, 7818, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7821, -1, -1, -1, -1, -1, 7819,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7835, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7846, 7844, -1,
+ 7850, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7848, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7847, 7845, -1, 7851, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7849,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7852,
+ -1, -1, -1, -1, -1, 7862, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7853, -1, -1, -1, -1,
+ -1, 7863, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7856, 7854, -1,
+ 7860, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7858, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7857, 7855, -1, 7861, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7859,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7872, 7870, -1,
+ 7876, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7874, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7873, 7871, -1, 7877, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7875,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7878,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7879, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7890, 7888, -1,
+ 7894, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7892, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7891, 7889, -1, 7895, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7893,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 7896,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 7897, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7900, 7898, -1,
+ 7904, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7906, -1, -1,
+ -1, -1, -1, 7902, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7901, 7899, -1, 7905, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7907, -1, -1, -1, -1, -1, 7903,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7914, 7912, -1,
+ 7918, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7920, -1, -1,
+ -1, -1, -1, 7916, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7915, 7913, -1, 7919, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7921, -1, -1, -1, -1, -1, 7917,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7938, 7940, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7942, 8064,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7939, 7941, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7943, 8065, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7946, 7948, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7950, 8072,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7947, 7949, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7951, 8073, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7954, 7956, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7955, 7957, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7962, 7964, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7963, 7965, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7970, 7972, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7974, 8080,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7971, 7973, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7975, 8081, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7978, 7980, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7982, 8088,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7979, 7981, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7983, 8089, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7986, 7988, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7990, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7987, 7989, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7991, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 7994, 7996, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 7998, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 7995, 7997, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 7999, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8002, 8004, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8003, 8005, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8010, 8012, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8011, 8013, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8018, 8020, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 8022, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8019, 8021, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 8023, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8027, 8029, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 8031, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8034, 8036, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 8038, 8096, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8035, 8037, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 8039, 8097,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8042, 8044, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 8046, 8104, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8043, 8045, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 8047, 8105,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8066, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8067,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8068, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8069,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8070, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8071,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8074, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8075,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8076, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8077,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8078, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8079,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8082, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8083,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8084, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8085,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8086, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8087,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8090, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8091,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8092, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8093,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8094, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8095,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8098, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8099,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8100, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8101,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8102, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8103,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8106, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8107,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8108, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8109,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8110, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8111,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8114, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8116,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8119, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8130,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8132, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8135,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8141, 8142, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 8143, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8157, 8158, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 8159, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8164, 8165, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8172, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8178, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 8180,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 8183, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8602, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8603, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8622, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8653, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8654, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8655, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8708, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8713, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8716, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8740, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8742, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8769, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8772, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8775, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8777, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8800, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8802, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8813, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8814, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8815, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8816, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8817, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8820, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8821, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8824, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8825, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8832, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8833, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8836, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8837, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8840, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8841, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8876, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8877, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8878, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8879, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8928, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8929, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8930, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8931, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8938, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8939, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8940, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 8941, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 10972, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12364, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12366, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12368, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12370, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12372, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12374, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12376, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12378, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12380, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12382, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12384, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12386, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12389, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12391, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12393, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12400, 12401, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12403, 12404, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12406, 12407, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12409, 12410, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12412, 12413, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12436, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12446, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12460, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12462, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12464, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12466, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12468, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12470, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12472, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12474, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12476, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12478, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12480, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12482, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12485, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12487, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12489, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12496, 12497, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12499, 12500, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12502, 12503, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12505, 12506, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12508, 12509, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12532, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12535, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12536, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12537, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 12538, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 12542, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 119134,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 119135, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 119136, 119137, 119138, 119139, 119140, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 119227, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 119228,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 119229, 119231, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 119230, 119232, -1, -1, -1, };
+
diff --git a/utils/utils.c b/utils/utils.c
index 8cb1987d4..6199a8451 100644
--- a/utils/utils.c
+++ b/utils/utils.c
@@ -35,34 +35,10 @@
#include "utils/config.h"
#include "utils/messages.h"
#include "utils/utf8.h"
+#include "utils/time.h"
#include "utils/utils.h"
-char * strip(char * const s)
-{
- size_t i;
- for (i = strlen(s);
- i != 0 && (s[i - 1] == ' ' || s[i - 1] == '\n' ||
- s[i - 1] == '\r' || s[i - 1] == '\t');
- i--)
- ;
- s[i] = 0;
- return s + strspn(s, " \t\r\n");
-}
-
-int whitespace(const char * str)
-{
- unsigned int i;
- for (i = 0; i < strlen(str); i++)
- if (!isspace(str[i]))
- return 0;
- return 1;
-}
-
-/**
- * returns a string without its underscores
- * \param replacespace true to insert a space where there was an underscore
- */
-
+/* exported interface documented in utils/utils.h */
char *remove_underscores(const char *s, bool replacespace)
{
size_t i, ii, len;
@@ -81,15 +57,8 @@ char *remove_underscores(const char *s, bool replacespace)
return ret;
}
-/**
- * Replace consecutive whitespace with a single space.
- *
- * @todo determine if squash_whitespace utf-8 safe and that it needs to be
- *
- * \param s source string
- * \return heap allocated result, or NULL on memory exhaustion
- */
+/* exported interface documented in utils/utils.h */
char *squash_whitespace(const char *s)
{
char *c;
@@ -116,14 +85,7 @@ char *squash_whitespace(const char *s)
}
-/**
- * Converts NUL terminated UTF-8 encoded string s containing zero or more
- * spaces (char 32) or TABs (char 9) to non-breaking spaces
- * (0xC2 + 0xA0 in UTF-8 encoding).
- *
- * Caller needs to free() result. Returns NULL in case of error. No
- * checking is done on validness of the UTF-8 input string.
- */
+/* exported interface documented in utils/utils.h */
char *cnv_space2nbsp(const char *s)
{
const char *srcP;
@@ -146,10 +108,8 @@ char *cnv_space2nbsp(const char *s)
return d;
}
-/**
- * Check if a directory exists.
- */
+/* exported interface documented in utils/utils.h */
bool is_dir(const char *path)
{
struct stat s;
@@ -161,12 +121,92 @@ bool is_dir(const char *path)
}
-/**
- * Compile a regular expression, handling errors.
- *
- * Parameters as for regcomp(), see man regex.
- */
+/* exported interface documented in utils/utils.h */
+nserror vsnstrjoin(char **str, size_t *size, char sep, size_t nelm, va_list ap)
+{
+ const char *elm[16];
+ size_t elm_len[16];
+ size_t elm_idx;
+ char *fname;
+ size_t fname_len = 0;
+ char *curp;
+
+ /* check the parameters are all sensible */
+ if ((nelm == 0) || (nelm > 16)) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if ((*str != NULL) && (size == NULL)) {
+ /* if the caller is providing the buffer they must say
+ * how much space is available.
+ */
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ /* calculate how much storage we need for the complete path
+ * with all the elements.
+ */
+ for (elm_idx = 0; elm_idx < nelm; elm_idx++) {
+ elm[elm_idx] = va_arg(ap, const char *);
+ /* check the argument is not NULL */
+ if (elm[elm_idx] == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ elm_len[elm_idx] = strlen(elm[elm_idx]);
+ fname_len += elm_len[elm_idx];
+ }
+ fname_len += nelm; /* allow for separators and terminator */
+
+ /* ensure there is enough space */
+ fname = *str;
+ if (fname != NULL) {
+ if (fname_len > *size) {
+ return NSERROR_NOSPACE;
+ }
+ } else {
+ fname = malloc(fname_len);
+ if (fname == NULL) {
+ return NSERROR_NOMEM;
+ }
+ }
+
+ /* copy the elements in with apropriate separator */
+ curp = fname;
+ for (elm_idx = 0; elm_idx < nelm; elm_idx++) {
+ memmove(curp, elm[elm_idx], elm_len[elm_idx]);
+ curp += elm_len[elm_idx];
+ /* ensure string are separated */
+ if (curp[-1] != sep) {
+ *curp = sep;
+ curp++;
+ }
+ }
+ curp[-1] = 0; /* NULL terminate */
+
+ assert((curp - fname) <= (int)fname_len);
+
+ *str = fname;
+ if (size != NULL) {
+ *size = fname_len;
+ }
+
+ return NSERROR_OK;
+}
+
+/* exported interface documented in utils/utils.h */
+nserror snstrjoin(char **str, size_t *size, char sep, size_t nelm, ...)
+{
+ va_list ap;
+ nserror ret;
+
+ va_start(ap, nelm);
+ ret = vsnstrjoin(str, size, sep, nelm, ap);
+ va_end(ap);
+ return ret;
+}
+
+
+/* exported interface documented in utils/utils.h */
void regcomp_wrapper(regex_t *preg, const char *regex, int cflags)
{
int r;
@@ -179,24 +219,20 @@ void regcomp_wrapper(regex_t *preg, const char *regex, int cflags)
}
}
-/** We can have a fairly good estimate of how long the buffer needs to
- * be. The unsigned long can store a value representing a maximum size
- * of around 4 GB. Therefore the greatest space required is to
- * represent 1023MB. Currently that would be represented as "1023MB" so 12
- * including a null terminator.
- * Ideally we would be able to know this value for sure, in the mean
- * time the following should suffice.
- **/
-
-#define BYTESIZE_BUFFER_SIZE 20
-
/**
- * Does a simple conversion which assumes the user speaks English. The buffer
- * returned is one of three static ones so may change each time this call is
- * made. Don't store the buffer for later use. It's done this way for
- * convenience and to fight possible memory leaks, it is not necessarily pretty.
- **/
+ * The size of buffers within human_friendly_bytesize.
+ *
+ * We can have a fairly good estimate of how long the buffer needs to
+ * be. The unsigned long can store a value representing a maximum
+ * size of around 4 GB. Therefore the greatest space required is to
+ * represent 1023MB. Currently that would be represented as "1023MB"
+ * so 12 including a null terminator. Ideally we would be able to
+ * know this value for sure, in the mean time the following should
+ * suffice.
+ */
+#define BYTESIZE_BUFFER_SIZE 20
+/* exported interface documented in utils/utils.h */
char *human_friendly_bytesize(unsigned long bsize) {
static char buffer1[BYTESIZE_BUFFER_SIZE];
static char buffer2[BYTESIZE_BUFFER_SIZE];
@@ -229,17 +265,13 @@ char *human_friendly_bytesize(unsigned long bsize) {
unit = gigabytes;
}
- sprintf(curbuffer, "%3.2f%s", bytesize, messages_get(units[unit]));
+ snprintf(curbuffer, BYTESIZE_BUFFER_SIZE, "%3.2f%s", bytesize, messages_get(units[unit]));
return curbuffer;
}
-/**
- * Create an RFC 1123 compliant date string from a Unix timestamp
- *
- * \param t The timestamp to consider
- * \return Pointer to buffer containing string - invalidated by next call.
- */
+
+/* exported interface documented in utils/utils.h */
const char *rfc1123_date(time_t t)
{
static char ret[30];
@@ -257,14 +289,8 @@ const char *rfc1123_date(time_t t)
return ret;
}
-/**
- * Returns a number of centiseconds, that increases in real time, for the
- * purposes of measuring how long something takes in wall-clock terms. It uses
- * gettimeofday() for this. Should the call to gettimeofday() fail, it returns
- * zero.
- *
- * \return number of centiseconds that increases monotonically
- */
+
+/* exported interface documented in utils/utils.h */
unsigned int wallclock(void)
{
struct timeval tv;
@@ -540,3 +566,58 @@ int inet_pton(int af, const char *src, void *dst)
#endif
+
+/* exported function documented in utils/time.h */
+int nsc_sntimet(char *str, size_t size, time_t *timep)
+{
+#ifndef HAVE_STRFTIME
+ long long val;
+ val = (long long)*timep;
+
+ return snprintf(str, size, "%lld", val);
+#else
+ struct tm *ltm;
+
+ ltm = localtime(timep);
+ if (ltm == NULL) {
+ return -1;
+ }
+
+ return strftime(str, size, "%s", ltm);
+#endif
+}
+
+nserror nsc_snptimet(char *str, size_t size, time_t *timep)
+{
+ time_t time_out;
+
+#ifndef HAVE_STRPTIME
+
+ if (size < 1) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ time_out = (time_t)strtoll(str, NULL, 10);
+
+ if (time_out == 0) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+#else
+ struct tm ltm;
+
+ if (size < 1) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ if (strptime(str, "%s", &ltm) == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ time_out = mktime(&ltm);
+
+#endif
+ *timep = time_out;
+
+ return NSERROR_OK;
+}
diff --git a/utils/utils.h b/utils/utils.h
index f2241ae07..80298a4a7 100644
--- a/utils/utils.h
+++ b/utils/utils.h
@@ -17,6 +17,12 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+/**
+ * \file utils/utils.h
+ * \brief Interface to a number of general purpose functionality.
+ * \todo Many of these functions and macros should have their own headers.
+ */
+
#ifndef _NETSURF_UTILS_UTILS_H_
#define _NETSURF_UTILS_UTILS_H_
@@ -28,6 +34,9 @@
#include <sys/time.h>
#include <regex.h>
#include <assert.h>
+#include <stdarg.h>
+
+#include "utils/errors.h"
struct dirent;
@@ -60,10 +69,13 @@ struct dirent;
#define PRId64 "lld"
#endif
+/* Windows does not have POSIX formating codes or mkdir so work around that */
#if defined(_WIN32)
#define SSIZET_FMT "Iu"
+#define nsmkdir(dir, mode) mkdir((dir))
#else
#define SSIZET_FMT "zd"
+#define nsmkdir(dir, mode) mkdir((dir), (mode))
#endif
#if defined(__GNUC__) && (__GNUC__ < 3)
@@ -83,33 +95,11 @@ struct dirent;
/**
* Calculate length of constant C string.
*
- * \param x a constant C string.
- * \return the length of C string without its terminating NUL accounted.
+ * \param x a constant C string.
+ * \return The length of C string without its terminator.
*/
#define SLEN(x) (sizeof((x)) - 1)
-enum query_response {
- QUERY_CONTINUE,
- QUERY_YES,
- QUERY_NO,
- QUERY_ESCAPE
-};
-
-typedef int query_id;
-
-#define QUERY_INVALID ((query_id)-1)
-
-typedef struct
-{
- void (*confirm)(query_id id, enum query_response res, void *pw);
- void (*cancel)(query_id, enum query_response res, void *pw);
-} query_callback;
-
-#ifdef HAVE_MKDIR
-#define nsmkdir(dir, mode) mkdir((dir), (mode))
-#else
-#define nsmkdir(dir, mode) mkdir((dir))
-#endif
#ifndef timeradd
#define timeradd(a, aa, result) \
@@ -137,57 +127,138 @@ typedef struct
-char * strip(char * const s);
-int whitespace(const char * str);
+/**
+ * Replace consecutive whitespace with a single space.
+ *
+ * @todo determine if squash_whitespace utf-8 safe and that it needs to be
+ *
+ * \param s source string
+ * \return heap allocated result, or NULL on memory exhaustion
+ */
char * squash_whitespace(const char * s);
+
+/**
+ * returns a string without its underscores
+ * \param replacespace true to insert a space where there was an underscore
+ */
char *remove_underscores(const char *s, bool replacespace);
+
+/**
+ * Converts NUL terminated UTF-8 encoded string s containing zero or more
+ * spaces (char 32) or TABs (char 9) to non-breaking spaces
+ * (0xC2 + 0xA0 in UTF-8 encoding).
+ *
+ * Caller needs to free() result. Returns NULL in case of error. No
+ * checking is done on validness of the UTF-8 input string.
+ */
char *cnv_space2nbsp(const char *s);
+
+/**
+ * Check if a directory exists.
+ */
bool is_dir(const char *path);
+
+/**
+ * Compile a regular expression, handling errors.
+ *
+ * Parameters as for regcomp(), see man regex.
+ */
void regcomp_wrapper(regex_t *preg, const char *regex, int cflags);
+
+/**
+ * Create a human redable representation of a size in bytes.
+ *
+ * Does a simple conversion which assumes the user speaks English.
+ * The buffer returned is one of three static ones so may change each
+ * time this call is made. Don't store the buffer for later use.
+ * It's done this way for convenience and to fight possible memory
+ * leaks, it is not necessarily pretty.
+ *
+ * @todo This implementation is strange doe sit need
+ * reconsidering?
+ *
+ * @param bsize The size in bytes.
+ * @return A human readable string representing the size.
+ */
char *human_friendly_bytesize(unsigned long bytesize);
-const char *rfc1123_date(time_t t);
-unsigned int wallclock(void);
+/**
+ * Create an RFC 1123 compliant date string from a Unix timestamp
+ *
+ * \param t The timestamp to consider
+ * \return Pointer to buffer containing string - invalidated by next call.
+ */
+const char *rfc1123_date(time_t t);
/**
- * Comparison function for sorting directories.
+ * Returns a number of centiseconds, that increases in real time, for the
+ * purposes of measuring how long something takes in wall-clock terms.
*
- * Correctly orders non zero-padded numerical parts.
- * ie. produces "file1, file2, file10" rather than "file1, file10, file2".
+ * The implementation uses gettimeofday() for this. Should the call
+ * to gettimeofday() fail, it returns zero.
*
- * d1 first directory entry
- * d2 second directory entry
+ * \return number of centiseconds that increases monotonically
*/
-int dir_sort_alpha(const struct dirent **d1, const struct dirent **d2);
+unsigned int wallclock(void);
/**
- * Return a hex digit for the given numerical value.
+ * Generate a string from one or more component elemnts separated with
+ * a single value.
+ *
+ * This is similar in intent to the perl join function creating a
+ * single delimited string from an array of several.
*
- * \return character in range 0-9a-f
+ * @note If a string is allocated it must be freed by the caller.
+ *
+ * @param[in,out] str pointer to string pointer if this is NULL enough
+ * storage will be allocated for the complete path.
+ * @param[in,out] size The size of the space available if \a str not
+ * NULL on input and if not NULL set to the total
+ * output length on output.
+ * @param[in] sep The character to separete the elemnts with.
+ * @param[in] nemb The number of elements up to a maximum of 16.
+ * @param[in] ap The elements of the path as string pointers.
+ * @return NSERROR_OK and the complete path is written to str or error
+ * code on faliure.
*/
-inline static char digit2lowcase_hex(unsigned char digit) {
- assert(digit < 16);
- return "0123456789abcdef"[digit];
-}
+nserror vsnstrjoin(char **str, size_t *size, char sep, size_t nelm, va_list ap);
/**
- * Return a hex digit for the given numerical value.
+ * Generate a string from one or more component elemnts separated with
+ * a single value.
+ *
+ * This is similar in intent to the perl join function creating a
+ * single delimited string from an array of several.
*
- * \return character in range 0-9A-F
+ * @note If a string is allocated it must be freed by the caller.
+ *
+ * @param[in,out] str pointer to string pointer if this is NULL enough
+ * storage will be allocated for the complete path.
+ * @param[in,out] size The size of the space available if \a str not
+ * NULL on input and if not NULL set to the total
+ * output length on output.
+ * @param[in] sep The character to separete the elemnts with.
+ * @param[in] nemb The number of elements up to a maximum of 16.
+ * @param[in] ... The elements of the path as string pointers.
+ * @return NSERROR_OK and the complete path is written to str or error
+ * code on faliure.
*/
-inline static char digit2uppercase_hex(unsigned char digit) {
- assert(digit < 16);
- return "0123456789ABCDEF"[digit];
-}
+nserror snstrjoin(char **str, size_t *size, char sep, size_t nelm, ...);
+/**
+ * Comparison function for sorting directories.
+ *
+ * Correctly orders non zero-padded numerical parts.
+ * ie. produces "file1, file2, file10" rather than "file1, file10, file2".
+ *
+ * d1 first directory entry
+ * d2 second directory entry
+ */
+int dir_sort_alpha(const struct dirent **d1, const struct dirent **d2);
/* Platform specific functions */
-void die(const char * const error);
+void die(const char * const error) __attribute__ ((noreturn));
void warn_user(const char *warning, const char *detail);
-query_id query_user(const char *query, const char *detail,
- const query_callback *cb, void *pw, const char *yes, const char *no);
-void query_close(query_id);
void PDF_Password(char **owner_pass, char **user_pass, char *path);
-char *filename_from_path(char *path);
-bool path_add_part(char *path, int length, const char *newpart);
+
#endif
diff --git a/utils/utsname.h b/utils/utsname.h
index cc267c6d3..b4c0a79d9 100644
--- a/utils/utsname.h
+++ b/utils/utsname.h
@@ -16,22 +16,34 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+/**
+ * \file utils/utsname.h
+ * \brief Interface to uts API to get name and information about current kernel.
+ */
+
#ifndef _NETSURF_UTILS_UTSNAME_H_
#define _NETSURF_UTILS_UTSNAME_H_
#ifdef HAVE_UTSNAME
#include <sys/utsname.h>
#else
-/* from posix spec */
+/** system information filled in by uname derived from posix spec. */
struct utsname {
- char sysname[65]; /* Operating system name (e.g., "Linux") */
- char nodename[65]; /* Name within "some implementation-defined
- network" */
- char release[65]; /* OS release (e.g., "2.6.28") */
- char version[65]; /* OS version */
- char machine[65]; /* Hardware identifier */
+ char sysname[65]; /**< Operating system name (e.g., "Linux") */
+ char nodename[65]; /**< Name within "some implementation-defined
+ * network"
+ */
+ char release[65]; /**< OS release (e.g., "2.6.28") */
+ char version[65]; /**< OS version */
+ char machine[65]; /**< Hardware identifier */
};
+/**
+ * Get the system information.
+ *
+ * @param buf the buffer to fill with teh information.
+ * @return 0 on sucess or -1 and errno set on faliure.
+ */
int uname(struct utsname *buf);
#endif
diff --git a/utils/warning-blame.sh b/utils/warning-blame.sh
deleted file mode 100755
index c07afb0c2..000000000
--- a/utils/warning-blame.sh
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/bin/sh
-
-# Copyright 2007 Vincent Sanders <vince@debian.org>
-# All rights reserved.
-
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. Neither the name of the Author nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-
-
-# where to store the processed list of warnings
-WARNING_LIST=/tmp/warning-list
-
-if [ $# -gt 1 ]; then
- if [ -f $1 ]; then
- cp $1 ${WARNING_LIST}
- else
- echo "Need a valid warning file"
- exit 1
- fi
-else
- make clean 2>&1 >/dev/null
- make 2>&1 |grep "warning:" | sort | uniq > ${WARNING_LIST}
-fi
-
-for blamefile in $(cat ${WARNING_LIST} | cut -f 1 -d ':' | sort | uniq ); do
- if [ -f ${blamefile} ]; then
- svn blame ${blamefile} >/tmp/blame
-
- cat ${WARNING_LIST} | grep "^${blamefile}" >/tmp/blame-warnings
-
- while read warning; do
- echo ${warning}
-
- lineno=$(echo ${warning} | cut -f 2 -d ':' ; )
-
- cat /tmp/blame | head -n ${lineno} | tail -n 1
-
- done < /tmp/blame-warnings
- rm /tmp/blame-warnings
- else
- echo "Unable to find ${blamefile}"
- fi
-done
diff --git a/windows/Makefile.defaults b/windows/Makefile.defaults
index 68fb7af66..85472ba11 100644
--- a/windows/Makefile.defaults
+++ b/windows/Makefile.defaults
@@ -2,23 +2,20 @@
# windows-specific options
# ----------------------------------------------------------------------------
- # Enable NetSurf's use of librosprite for displaying RISC OS Sprites
- # Valid options: YES, NO, AUTO
- NETSURF_USE_ROSPRITE := NO
+# Enable NetSurf's use of librosprite for displaying RISC OS Sprites
+# Valid options: YES, NO, AUTO
+NETSURF_USE_ROSPRITE := NO
- # Enable NetSurf's use of libsvgtiny for displaying SVGs
- # Valid options: YES, NO
- NETSURF_USE_NSSVG := NO
+# Enable NetSurf's use of libsvgtiny for displaying SVGs
+# Valid options: YES, NO
+NETSURF_USE_NSSVG := NO
- # Force using glibc internal iconv implementation instead of external libiconv
- # Valid options: YES, NO
- NETSURF_USE_LIBICONV_PLUG := NO
+# Force using glibc internal iconv implementation instead of external libiconv
+# Valid options: YES, NO
+NETSURF_USE_LIBICONV_PLUG := NO
- # mng support does not currently build on windows
- NETSURF_USE_MNG := NO
+# no pdf support
+NETSURF_USE_HARU_PDF := NO
- # no pdf support
- NETSURF_USE_HARU_PDF := NO
-
- # Optimisation levels
- CFLAGS += -O2
+# Optimisation levels
+CFLAGS += -O2
diff --git a/windows/Makefile.target b/windows/Makefile.target
index 1cdb4a61a..a4aaba1e4 100644
--- a/windows/Makefile.target
+++ b/windows/Makefile.target
@@ -16,7 +16,6 @@ $(eval $(call feature_enabled,BMP,-DWITH_BMP,-lnsbmp,BMP (libnsbmp)))
$(eval $(call feature_enabled,GIF,-DWITH_GIF,-lnsgif,GIF (libnsgif)))
$(eval $(call feature_enabled,PNG,-DWITH_PNG,-lpng,PNG (libpng) ))
$(eval $(call feature_enabled,NSSVG,-DWITH_NS_SVG,-lsvgtiny,SVG (libsvgtiny)))
-$(eval $(call feature_enabled,MNG,,-llcms -ljpeg,PNG/JNG/MNG (libmng)))
ifneq ($(PKG_CONFIG),)
$(eval $(call pkg_config_find_and_add,zlib,ZLib))
@@ -31,8 +30,7 @@ else
LDFLAGS += -lhubbub -lcss -lparserutils -lwapcaplet -lcurl -lz
endif
-LDFLAGS += -lssl -lcrypto -lregex -liconv \
- -lgdi32 -lcomctl32 -lws2_32 -lmsimg32 -mwindows
+LDFLAGS += -lssl -lcrypto -lregex -lgdi32 -lcomctl32 -lws2_32 -lmsimg32 -mwindows
CFLAGS += -U__STRICT_ANSI__ -mwin32
# only windows versions after XP are supported
@@ -44,7 +42,7 @@ CFLAGS += '-D_WIN32_IE=0x0501'
#installed resource path
CFLAGS += '-DNETSURF_WINDOWS_RESPATH="$(NETSURF_WINDOWS_RESPATH)"'
-WSCFLAGS := -std=c99 $(WARNFLAGS) -DCURL_STATICLIB -DCARES_STATICLIB -g
+WSCFLAGS := -std=c99 -DCURL_STATICLIB -DCARES_STATICLIB -g
CFLAGS += $(WSCFLAGS)
LDFLAGS += $(WSCFLAGS)
@@ -66,7 +64,7 @@ S_RESOURCES := windows_resource.o
# S_WINDOWS are sources purely for the windows build
S_WINDOWS := main.c window.c gui.c drawable.c misc.c plot.c findfile.c \
font.c bitmap.c about.c prefs.c download.c filetype.c \
- localhistory.c login.c schedule.c thumbnail.c windbg.c
+ localhistory.c schedule.c thumbnail.c windbg.c
S_WINDOWS := $(addprefix windows/,$(S_WINDOWS))
# This is the final source build list
diff --git a/windows/download.c b/windows/download.c
index 635e3b604..2045864f5 100644
--- a/windows/download.c
+++ b/windows/download.c
@@ -26,14 +26,17 @@
#include "content/fetch.h"
#include "desktop/gui.h"
-#include "utils/schedule.h"
+#include "desktop/download.h"
#include "utils/log.h"
#include "utils/messages.h"
#include "utils/url.h"
+#include "utils/nsurl.h"
#include "utils/utils.h"
+
#include "windows/download.h"
#include "windows/gui.h"
#include "windows/resourceid.h"
+#include "windows/schedule.h"
static bool downloading = false;
static struct gui_download_window *download1;
@@ -45,7 +48,7 @@ static void nsws_download_update_label(void *p);
static void nsws_download_update_progress(void *p);
static void nsws_download_clear_data(struct gui_download_window *w);
-struct gui_download_window *
+static struct gui_download_window *
gui_download_window_create(download_context *ctx, struct gui_window *gui)
{
if (downloading) {
@@ -62,21 +65,25 @@ gui_download_window_create(download_context *ctx, struct gui_window *gui)
}
int total_size = download_context_get_total_length(ctx);
char *domain, *filename, *destination;
- const char *url=download_context_get_url(ctx);
+ nsurl *url = download_context_get_url(ctx);
bool unknown_size = (total_size == 0);
const char *size = (unknown_size) ?
messages_get("UnknownSize") :
human_friendly_bytesize(total_size);
- if (url_nice(url, &filename, false) != URL_FUNC_OK)
+ if (url_nice(nsurl_access(url), &filename, false) != NSERROR_OK)
filename = strdup(messages_get("UnknownFile"));
if (filename == NULL) {
warn_user(messages_get("NoMemory"), 0);
free(w);
return NULL;
}
- if (url_host(url, &domain) != URL_FUNC_OK)
+
+ if (nsurl_has_component(url, NSURL_HOST)) {
+ domain = strdup(lwc_string_data(nsurl_get_component(url, NSURL_HOST)));
+ } else {
domain = strdup(messages_get("UnknownHost"));
+ }
if (domain == NULL) {
warn_user(messages_get("NoMemory"), 0);
free(filename);
@@ -181,7 +188,7 @@ void nsws_download_update_label(void *p)
{
struct gui_download_window *w = p;
if (w->hwnd == NULL) {
- schedule_remove(nsws_download_update_label, p);
+ win32_schedule(-1, nsws_download_update_label, p);
return;
}
HWND sub = GetDlgItem(w->hwnd, IDC_DOWNLOAD_LABEL);
@@ -221,21 +228,23 @@ void nsws_download_update_label(void *p)
w->time_left = NULL;
}
SendMessage(sub, WM_SETTEXT, (WPARAM)0, (LPARAM)label);
- if (w->progress < 10000)
- schedule(50, nsws_download_update_label, p);
+ if (w->progress < 10000) {
+ win32_schedule(500, nsws_download_update_label, p);
+ }
}
void nsws_download_update_progress(void *p)
{
struct gui_download_window *w = p;
if (w->hwnd == NULL) {
- schedule_remove(nsws_download_update_progress, p);
+ win32_schedule(-1, nsws_download_update_progress, p);
return;
}
HWND sub = GetDlgItem(w->hwnd, IDC_DOWNLOAD_PROGRESS);
SendMessage(sub, PBM_SETPOS, (WPARAM)(w->progress / 100), 0);
- if (w->progress < 10000)
- schedule(50, nsws_download_update_progress, p);
+ if (w->progress < 10000) {
+ win32_schedule(500, nsws_download_update_progress, p);
+ }
}
void nsws_download_clear_data(struct gui_download_window *w)
@@ -254,12 +263,13 @@ void nsws_download_clear_data(struct gui_download_window *w)
free(w->total_size);
if (w->file != NULL)
fclose(w->file);
- schedule_remove(nsws_download_update_progress, (void *)w);
- schedule_remove(nsws_download_update_label, (void *)w);
+ win32_schedule(-1, nsws_download_update_progress, (void *)w);
+ win32_schedule(-1, nsws_download_update_label, (void *)w);
}
-nserror gui_download_window_data(struct gui_download_window *w, const char *data,
+static nserror
+gui_download_window_data(struct gui_download_window *w, const char *data,
unsigned int size)
{
if ((w == NULL) || (w->file == NULL))
@@ -279,13 +289,13 @@ nserror gui_download_window_data(struct gui_download_window *w, const char *data
return NSERROR_OK;
}
-void gui_download_window_error(struct gui_download_window *w,
+static void gui_download_window_error(struct gui_download_window *w,
const char *error_msg)
{
LOG(("error %s", error_msg));
}
-void gui_download_window_done(struct gui_download_window *w)
+static void gui_download_window_done(struct gui_download_window *w)
{
if (w == NULL)
return;
@@ -295,3 +305,12 @@ void gui_download_window_done(struct gui_download_window *w)
nsws_download_clear_data(w);
}
+static struct gui_download_table download_table = {
+ .create = gui_download_window_create,
+ .data = gui_download_window_data,
+ .error = gui_download_window_error,
+ .done = gui_download_window_done,
+};
+
+struct gui_download_table *win32_download_table = &download_table;
+
diff --git a/windows/download.h b/windows/download.h
index 777777da5..974f1ecd2 100644
--- a/windows/download.h
+++ b/windows/download.h
@@ -23,6 +23,8 @@
#include <windows.h>
#include "desktop/gui.h"
+extern struct gui_download_table *win32_download_table;
+
typedef enum {
DOWNLOAD_NONE,
DOWNLOAD_WORKING,
diff --git a/windows/drawable.c b/windows/drawable.c
index 8e35d306c..cbbbaa379 100644
--- a/windows/drawable.c
+++ b/windows/drawable.c
@@ -23,7 +23,7 @@
#include <windows.h>
#include <windowsx.h>
-#include "desktop/browser_private.h"
+#include "desktop/browser.h"
#include "desktop/textinput.h"
#include "utils/errors.h"
#include "utils/log.h"
@@ -37,6 +37,8 @@
static const char windowclassname_drawable[] = "nswsdrawablewindow";
+void gui_window_set_scroll(struct gui_window *w, int sx, int sy);
+
/**
* Handle wheel scroll messages.
*/
@@ -71,6 +73,7 @@ nsws_drawable_wheel(struct gui_window *gw, HWND hwnd, WPARAM wparam)
static LRESULT
nsws_drawable_vscroll(struct gui_window *gw, HWND hwnd, WPARAM wparam)
{
+ int width, height;
SCROLLINFO si;
int mem;
@@ -118,10 +121,10 @@ nsws_drawable_vscroll(struct gui_window *gw, HWND hwnd, WPARAM wparam)
}
si.fMask = SIF_POS;
- if ((gw->bw != NULL) && (gw->bw->current_content != NULL)) {
- si.nPos = min(si.nPos,
- content_get_height(gw->bw->current_content) *
- gw->bw->scale - gw->height);
+ if ((gw->bw != NULL) &&
+ (browser_window_get_extents(gw->bw, true,
+ &width, &height) == NSERROR_OK)) {
+ si.nPos = min(si.nPos, height - gw->height);
}
si.nPos = max(si.nPos, 0);
@@ -142,6 +145,7 @@ nsws_drawable_vscroll(struct gui_window *gw, HWND hwnd, WPARAM wparam)
static LRESULT
nsws_drawable_hscroll(struct gui_window *gw, HWND hwnd, WPARAM wparam)
{
+ int width, height;
SCROLLINFO si;
int mem;
@@ -182,10 +186,10 @@ nsws_drawable_hscroll(struct gui_window *gw, HWND hwnd, WPARAM wparam)
si.fMask = SIF_POS;
- if ((gw->bw != NULL) && (gw->bw->current_content != NULL)) {
- si.nPos = min(si.nPos,
- content_get_width(gw->bw->current_content) *
- gw->bw->scale - gw->width);
+ if ((gw->bw != NULL) &&
+ (browser_window_get_extents(gw->bw, true,
+ &width, &height) == NSERROR_OK)) {
+ si.nPos = min(si.nPos, width - gw->width);
}
si.nPos = max(si.nPos, 0);
SetScrollInfo(hwnd, SB_HORZ, &si, TRUE);
@@ -324,8 +328,8 @@ nsws_drawable_paint(struct gui_window *gw, HWND hwnd)
clip.y1 = ps.rcPaint.bottom;
browser_window_redraw(gw->bw,
- -gw->scrollx / gw->bw->scale,
- -gw->scrolly / gw->bw->scale,
+ -gw->scrollx / gw->scale,
+ -gw->scrolly / gw->scale,
&clip, &ctx);
}
@@ -370,18 +374,18 @@ nsws_drawable_mouseup(struct gui_window *gw,
if ((gw->mouse->state & click) != 0) {
LOG(("mouse click bw %p, state 0x%x, x %f, y %f",gw->bw,
gw->mouse->state,
- (x + gw->scrollx) / gw->bw->scale,
- (y + gw->scrolly) / gw->bw->scale));
+ (x + gw->scrollx) / gw->scale,
+ (y + gw->scrolly) / gw->scale));
browser_window_mouse_click(gw->bw,
gw->mouse->state,
- (x + gw->scrollx) / gw->bw->scale,
- (y + gw->scrolly) / gw->bw->scale);
+ (x + gw->scrollx) / gw->scale,
+ (y + gw->scrolly) / gw->scale);
} else {
browser_window_mouse_track(gw->bw,
0,
- (x + gw->scrollx) / gw->bw->scale,
- (y + gw->scrolly) / gw->bw->scale);
+ (x + gw->scrollx) / gw->scale,
+ (y + gw->scrolly) / gw->scale);
}
gw->mouse->state = 0;
@@ -412,17 +416,17 @@ nsws_drawable_mousedown(struct gui_window *gw,
if ((GetKeyState(VK_MENU) & 0x8000) == 0x8000)
gw->mouse->state |= BROWSER_MOUSE_MOD_3;
- gw->mouse->pressed_x = (x + gw->scrollx) / gw->bw->scale;
- gw->mouse->pressed_y = (y + gw->scrolly) / gw->bw->scale;
+ gw->mouse->pressed_x = (x + gw->scrollx) / gw->scale;
+ gw->mouse->pressed_y = (y + gw->scrolly) / gw->scale;
LOG(("mouse click bw %p, state %x, x %f, y %f", gw->bw,
gw->mouse->state,
- (x + gw->scrollx) / gw->bw->scale,
- (y + gw->scrolly) / gw->bw->scale));
+ (x + gw->scrollx) / gw->scale,
+ (y + gw->scrolly) / gw->scale));
browser_window_mouse_click(gw->bw, gw->mouse->state,
- (x + gw->scrollx) / gw->bw->scale ,
- (y + gw->scrolly) / gw->bw->scale);
+ (x + gw->scrollx) / gw->scale,
+ (y + gw->scrolly) / gw->scale);
return 0;
}
@@ -441,8 +445,8 @@ nsws_drawable_mousemove(struct gui_window *gw, int x, int y)
return 0;
/* scale co-ordinates */
- x = (x + gw->scrollx) / gw->bw->scale;
- y = (y + gw->scrolly) / gw->bw->scale;
+ x = (x + gw->scrollx) / gw->scale;
+ y = (y + gw->scrolly) / gw->scale;
/* if mouse button held down and pointer moved more than
* minimum distance drag is happening */
diff --git a/windows/filetype.c b/windows/filetype.c
index 7ad862b8b..996e0755e 100644
--- a/windows/filetype.c
+++ b/windows/filetype.c
@@ -22,6 +22,8 @@
#include "utils/log.h"
#include "utils/utils.h"
+#include "windows/filetype.h"
+
/**
* filetype -- determine the MIME type of a local file
*/
@@ -49,9 +51,3 @@ const char *fetch_filetype(const char *unix_path)
return "image/x-ms-bmp";
return "text/html";
}
-
-
-char *fetch_mimetype(const char *ro_path)
-{
- return strdup("text/plain");
-}
diff --git a/windows/filetype.h b/windows/filetype.h
new file mode 100644
index 000000000..084e97493
--- /dev/null
+++ b/windows/filetype.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _NETSURF_WINDOWS_FILETYPE_H_
+#define _NETSURF_WINDOWS_FILETYPE_H_
+
+const char *fetch_filetype(const char *unix_path);
+
+#endif
diff --git a/windows/findfile.c b/windows/findfile.c
index a91125c59..aed43b0bf 100644
--- a/windows/findfile.c
+++ b/windows/findfile.c
@@ -30,8 +30,8 @@
#include <curl/curl.h>
-#include "utils/url.h"
#include "utils/log.h"
+#include "utils/url.h"
#include "utils/utils.h"
#include "utils/filepath.h"
@@ -82,61 +82,6 @@ static char *realpath(const char *path, char *resolved_path)
return strncpy(resolved_path, path, PATH_MAX);
}
-char *path_to_url(const char *path)
-{
- char *url;
- char *sidx;
-
- if (path == NULL)
- return NULL;
-
- url = malloc(strlen(path) + FILE_SCHEME_PREFIX_LEN + 3);
-
- if (url == NULL)
- return NULL;
-
- strcpy(url, FILE_SCHEME_PREFIX);
- if (*path == '/') {
- /* unix style path start, so try wine Z: */
- strcat(url, "Z:");
- }
- strcat(url, path);
-
- sidx = strrchr(url, '\\');
- while (sidx != NULL) {
- *sidx = '/';
- sidx = strrchr(url, '\\');
- }
-
- return url;
-}
-
-
-char *url_to_path(const char *url)
-{
- char *url_path = curl_unescape(url, 0);
- char *path;
- char *sidx;
-
- if ((url_path[FILE_SCHEME_PREFIX_LEN + 1] == ':') ||
- (url_path[FILE_SCHEME_PREFIX_LEN + 1] == '|')) {
- /* url_path contains a drive: prefix */
- path = strdup(url_path + FILE_SCHEME_PREFIX_LEN);
-
- /* swap / for \ */
- sidx = strrchr(path, '/');
- while (sidx != NULL) {
- *sidx = '\\';
- sidx = strrchr(path, '/');
- }
- } else {
- /* return the absolute path including leading / */
- path = strdup(url_path + (FILE_SCHEME_PREFIX_LEN - 1));
- }
- curl_free(url_path);
-
- return path;
-}
/**
* Locate a shared resource file by searching known places in order.
@@ -148,7 +93,7 @@ char *url_to_path(const char *url)
*
* Search order is: ~/.netsurf/, $NETSURFRES/ (where NETSURFRES is an
* environment variable), then the path specified in
- NETSURF_WINDOWS_RESPATH in the Makefile then .\res\ [windows paths]
+ * NETSURF_WINDOWS_RESPATH in the Makefile then .\res\ [windows paths]
*/
char *nsws_find_resource(char *buf, const char *filename, const char *def)
diff --git a/windows/findfile.h b/windows/findfile.h
index 5f8c7290c..808adc8ef 100644
--- a/windows/findfile.h
+++ b/windows/findfile.h
@@ -23,5 +23,4 @@ extern char *nsws_find_resource(char *buf, const char *filename, const char *def
char **nsws_init_resource(const char *resource_path);
-
#endif /* _NETSURF_WINDOWS_FINDFILE_H_ */
diff --git a/windows/font.c b/windows/font.c
index c99cec7cf..09adeeda7 100644
--- a/windows/font.c
+++ b/windows/font.c
@@ -35,7 +35,7 @@
#include "windows/gui.h"
#include "windows/plot.h"
-utf8_convert_ret utf8_to_font_encoding(const struct font_desc* font,
+nserror utf8_to_font_encoding(const struct font_desc* font,
const char *string,
size_t len,
char **result)
@@ -43,14 +43,14 @@ utf8_convert_ret utf8_to_font_encoding(const struct font_desc* font,
return utf8_to_enc(string, font->encoding, len, result);
}
-utf8_convert_ret utf8_to_local_encoding(const char *string,
+static nserror utf8_to_local_encoding(const char *string,
size_t len,
char **result)
{
return utf8_to_enc(string, "UCS-2", len, result);
}
-utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len,
+static nserror utf8_from_local_encoding(const char *string, size_t len,
char **result)
{
assert(string && result);
@@ -60,9 +60,9 @@ utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len,
*result = strndup(string, len);
if (!(*result))
- return UTF8_CONVERT_NOMEM;
+ return NSERROR_NOMEM;
- return UTF8_CONVERT_OK;
+ return NSERROR_OK;
}
HFONT get_font(const plot_font_style_t *style)
@@ -234,3 +234,10 @@ const struct font_functions nsfont = {
nsfont_position_in_string,
nsfont_split
};
+
+static struct gui_utf8_table utf8_table = {
+ .utf8_to_local = utf8_to_local_encoding,
+ .local_to_utf8 = utf8_from_local_encoding,
+};
+
+struct gui_utf8_table *win32_utf8_table = &utf8_table;
diff --git a/windows/font.h b/windows/font.h
index 4bd100f6a..45428fede 100644
--- a/windows/font.h
+++ b/windows/font.h
@@ -29,7 +29,7 @@ struct font_desc {
const char *encoding;
};
-extern utf8_convert_ret utf8_to_font_encoding(const struct font_desc* font,
+extern nserror utf8_to_font_encoding(const struct font_desc* font,
const char *string,
size_t len,
char **result);
diff --git a/windows/gui.c b/windows/gui.c
index 767f6812e..19a31c1be 100644
--- a/windows/gui.c
+++ b/windows/gui.c
@@ -32,8 +32,8 @@
#include "content/urldb.h"
#include "content/fetch.h"
#include "css/utils.h"
-#include "desktop/browser_private.h"
-#include "desktop/local_history.h"
+#include "desktop/browser_history.h"
+#include "desktop/browser.h"
#include "desktop/mouse.h"
#include "desktop/netsurf.h"
#include "utils/nsoption.h"
@@ -43,6 +43,9 @@
#include "utils/log.h"
#include "utils/messages.h"
#include "utils/utils.h"
+#include "utils/file.h"
+#include "utils/corestrings.h"
+#include "utils/url.h"
#include "windows/window.h"
#include "windows/about.h"
@@ -56,6 +59,7 @@
#include "windows/schedule.h"
#include "windows/findfile.h"
#include "windows/windbg.h"
+#include "windows/filetype.h"
HINSTANCE hInstance; /** win32 application instance handle. */
@@ -73,7 +77,26 @@ static const char windowclassname_main[] = "nswsmainwindow";
static struct nsws_pointers nsws_pointer;
-void gui_poll(bool active)
+void gui_window_set_scroll(struct gui_window *w, int sx, int sy);
+static bool gui_window_get_scroll(struct gui_window *w, int *sx, int *sy);
+
+static void nsws_set_scale(struct gui_window *gw, float scale)
+{
+ assert(gw != NULL);
+
+ if (gw->scale == scale)
+ return;
+
+ gw->scale = scale;
+
+ if (gw->bw == NULL)
+ return;
+
+ browser_window_set_scale(gw->bw, scale, true);
+}
+
+
+static void win32_poll(bool active)
{
MSG Msg; /* message from system */
BOOL bRet; /* message fetch result */
@@ -83,10 +106,6 @@ void gui_poll(bool active)
/* run the scheduler and discover how long to wait for the next event */
timeout = schedule_run();
- /* if active set timeout so message is not waited for */
- if (active)
- timeout = 0;
-
if (timeout == 0) {
bRet = PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE);
} else {
@@ -104,7 +123,6 @@ void gui_poll(bool active)
}
}
-
if (bRet > 0) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
@@ -128,8 +146,7 @@ nsws_window_go(HWND hwnd, const char *urltxt)
browser_window_navigate(gw->bw,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -168,7 +185,7 @@ nsws_window_urlbar_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
hFont = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0);
if (hFont != NULL) {
LOG(("Destroyed font object"));
- DeleteObject(hFont);
+ DeleteObject(hFont);
}
@@ -338,8 +355,8 @@ static void nsws_window_update_forward_back(struct gui_window *w)
if (w->bw == NULL)
return;
- bool forward = history_forward_available(w->bw->history);
- bool back = history_back_available(w->bw->history);
+ bool forward = browser_window_history_forward_available(w->bw);
+ bool back = browser_window_history_back_available(w->bw);
if (w->mainmenu != NULL) {
EnableMenuItem(w->mainmenu, IDM_NAV_FORWARD,
@@ -528,7 +545,7 @@ get_imagelist(int resid, int bsize, int bcnt)
LOG(("resource id %d, bzize %d, bcnt %d",resid, bsize, bcnt));
hImageList = ImageList_Create(bsize, bsize, ILC_COLOR24 | ILC_MASK, 0, bcnt);
- if (hImageList == NULL)
+ if (hImageList == NULL)
return NULL;
hScrBM = LoadImage(hInstance, MAKEINTRESOURCE(resid),
@@ -536,7 +553,7 @@ get_imagelist(int resid, int bsize, int bcnt)
if (hScrBM == NULL) {
win_perror("LoadImage");
- return NULL;
+ return NULL;
}
if (ImageList_AddMasked(hImageList, hScrBM, 0xcccccc) == -1) {
@@ -648,17 +665,17 @@ nsws_window_create_toolbar(struct gui_window *gw, HWND hWndParent)
/* Create the standard image list and assign to toolbar. */
hImageList = get_imagelist(IDR_TOOLBAR_BITMAP, gw->toolbuttonsize, gw->toolbuttonc);
- if (hImageList != NULL)
+ if (hImageList != NULL)
SendMessage(hWndToolbar, TB_SETIMAGELIST, 0, (LPARAM)hImageList);
/* Create the disabled image list and assign to toolbar. */
hImageList = get_imagelist(IDR_TOOLBAR_BITMAP_GREY, gw->toolbuttonsize, gw->toolbuttonc);
- if (hImageList != NULL)
+ if (hImageList != NULL)
SendMessage(hWndToolbar, TB_SETDISABLEDIMAGELIST, 0, (LPARAM)hImageList);
/* Create the hot image list and assign to toolbar. */
hImageList = get_imagelist(IDR_TOOLBAR_BITMAP_HOT, gw->toolbuttonsize, gw->toolbuttonc);
- if (hImageList != NULL)
+ if (hImageList != NULL)
SendMessage(hWndToolbar, TB_SETHOTIMAGELIST, 0, (LPARAM)hImageList);
/* Add buttons. */
@@ -716,6 +733,18 @@ nsws_window_resize(struct gui_window *gw,
return 0;
}
+/**
+ * redraw the whole window
+ */
+static void gui_window_redraw_window(struct gui_window *gw)
+{
+ /* LOG(("gw:%p", gw)); */
+ if (gw == NULL)
+ return;
+
+ RedrawWindow(gw->drawingarea, NULL, NULL, RDW_INVALIDATE | RDW_NOERASE);
+}
+
static LRESULT
nsws_window_command(HWND hwnd,
@@ -745,7 +774,7 @@ nsws_window_command(HWND hwnd,
break;
case IDM_FILE_OPEN_WINDOW:
- browser_window_create(BROWSER_WINDOW_VERIFIABLE,
+ browser_window_create(BW_CREATE_NONE,
NULL,
NULL,
gw->bw,
@@ -835,16 +864,16 @@ nsws_window_command(HWND hwnd,
case IDM_NAV_BACK:
if ((gw->bw != NULL) &&
- (history_back_available(gw->bw->history))) {
- history_back(gw->bw, gw->bw->history);
+ (browser_window_history_back_available(gw->bw))) {
+ browser_window_history_back(gw->bw, false);
}
nsws_window_update_forward_back(gw);
break;
case IDM_NAV_FORWARD:
if ((gw->bw != NULL) &&
- (history_forward_available(gw->bw->history))) {
- history_forward(gw->bw, gw->bw->history);
+ (browser_window_history_forward_available(gw->bw))) {
+ browser_window_history_forward(gw->bw, false);
}
nsws_window_update_forward_back(gw);
break;
@@ -859,8 +888,7 @@ nsws_window_command(HWND hwnd,
browser_window_navigate(gw->bw,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -888,8 +916,7 @@ nsws_window_command(HWND hwnd,
int x, y;
gui_window_get_scroll(gw, &x, &y);
if (gw->bw != NULL) {
- browser_window_set_scale(gw->bw, gw->bw->scale * 1.1, true);
- browser_window_reformat(gw->bw, false, gw->width, gw->height);
+ nsws_set_scale(gw, gw->scale * 1.1);
}
gui_window_redraw_window(gw);
gui_window_set_scroll(gw, x, y);
@@ -900,9 +927,7 @@ nsws_window_command(HWND hwnd,
int x, y;
gui_window_get_scroll(gw, &x, &y);
if (gw->bw != NULL) {
- browser_window_set_scale(gw->bw,
- gw->bw->scale * 0.9, true);
- browser_window_reformat(gw->bw, false, gw->width, gw->height);
+ nsws_set_scale(gw, gw->scale * 0.9);
}
gui_window_redraw_window(gw);
gui_window_set_scroll(gw, x, y);
@@ -913,8 +938,7 @@ nsws_window_command(HWND hwnd,
int x, y;
gui_window_get_scroll(gw, &x, &y);
if (gw->bw != NULL) {
- browser_window_set_scale(gw->bw, 1.0, true);
- browser_window_reformat(gw->bw, false, gw->width, gw->height);
+ nsws_set_scale(gw, 1.0);
}
gui_window_redraw_window(gw);
gui_window_set_scroll(gw, x, y);
@@ -1028,8 +1052,7 @@ nsws_window_command(HWND hwnd,
browser_window_navigate(gw->bw,
url,
NULL,
- BROWSER_WINDOW_HISTORY |
- BROWSER_WINDOW_VERIFIABLE,
+ BW_NAVIGATE_HISTORY,
NULL,
NULL,
NULL);
@@ -1063,7 +1086,7 @@ nsws_window_event_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
if (msg == WM_CREATE) {
/* To cause all the component child windows to be
* re-sized correctly a WM_SIZE message of the actual
- * created size must be sent.
+ * created size must be sent.
*
* The message must be posted here because the actual
* size values of the component windows are not known
@@ -1213,10 +1236,10 @@ static HWND nsws_window_create(struct gui_window *gw)
* create a new gui_window to contain a browser_window
* \param bw the browser_window to connect to the new gui_window
*/
-struct gui_window *
-gui_create_browser_window(struct browser_window *bw,
- struct browser_window *clone,
- bool new_tab)
+static struct gui_window *
+gui_window_create(struct browser_window *bw,
+ struct gui_window *existing,
+ gui_window_create_flags flags)
{
struct gui_window *gw;
@@ -1233,6 +1256,7 @@ gui_create_browser_window(struct browser_window *bw,
gw->width = 800;
gw->height = 600;
+ gw->scale = 1.0;
gw->toolbuttonsize = 24;
gw->requestscrollx = 0;
gw->requestscrolly = 0;
@@ -1392,7 +1416,7 @@ struct browser_window *gui_window_browser_window(struct gui_window *w)
/**
* window cleanup code
*/
-void gui_window_destroy(struct gui_window *w)
+static void gui_window_destroy(struct gui_window *w)
{
if (w == NULL)
return;
@@ -1415,7 +1439,7 @@ void gui_window_destroy(struct gui_window *w)
* set window title
* \param title the [url]
*/
-void gui_window_set_title(struct gui_window *w, const char *title)
+static void gui_window_set_title(struct gui_window *w, const char *title)
{
if (w == NULL)
return;
@@ -1432,19 +1456,7 @@ void gui_window_set_title(struct gui_window *w, const char *title)
free(fulltitle);
}
-/**
- * redraw the whole window
- */
-void gui_window_redraw_window(struct gui_window *gw)
-{
- /* LOG(("gw:%p", gw)); */
- if (gw == NULL)
- return;
-
- RedrawWindow(gw->drawingarea, NULL, NULL, RDW_INVALIDATE | RDW_NOERASE);
-}
-
-void gui_window_update_box(struct gui_window *gw, const struct rect *rect)
+static void gui_window_update_box(struct gui_window *gw, const struct rect *rect)
{
/* LOG(("gw:%p %f,%f %f,%f", gw, data->redraw.x, data->redraw.y, data->redraw.width, data->redraw.height)); */
@@ -1453,8 +1465,8 @@ void gui_window_update_box(struct gui_window *gw, const struct rect *rect)
RECT redrawrect;
- redrawrect.left = (long)rect->x0 - (gw->scrollx / gw->bw->scale);
- redrawrect.top = (long)rect->y0 - (gw->scrolly / gw->bw->scale);
+ redrawrect.left = (long)rect->x0 - (gw->scrollx / gw->scale);
+ redrawrect.top = (long)rect->y0 - (gw->scrolly / gw->scale);
redrawrect.right =(long)rect->x1;
redrawrect.bottom = (long)rect->y1;
@@ -1462,7 +1474,7 @@ void gui_window_update_box(struct gui_window *gw, const struct rect *rect)
}
-bool gui_window_get_scroll(struct gui_window *w, int *sx, int *sy)
+static bool gui_window_get_scroll(struct gui_window *w, int *sx, int *sy)
{
LOG(("get scroll"));
if (w == NULL)
@@ -1481,16 +1493,18 @@ bool gui_window_get_scroll(struct gui_window *w, int *sx, int *sy)
void gui_window_set_scroll(struct gui_window *w, int sx, int sy)
{
SCROLLINFO si;
+ nserror err;
+ int height;
+ int width;
POINT p;
- if ((w == NULL) ||
- (w->bw == NULL) ||
- (w->bw->current_content == NULL))
+ if ((w == NULL) || (w->bw == NULL))
return;
- /* limit scale range */
- if (abs(w->bw->scale - 0.0) < 0.00001)
- w->bw->scale = 1.0;
+ err = browser_window_get_extents(w->bw, true, &width, &height);
+ if (err != NSERROR_OK) {
+ return;
+ }
w->requestscrollx = sx - w->scrollx;
w->requestscrolly = sy - w->scrolly;
@@ -1499,10 +1513,10 @@ void gui_window_set_scroll(struct gui_window *w, int sx, int sy)
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
si.nMin = 0;
- si.nMax = (content_get_height(w->bw->current_content) * w->bw->scale) - 1;
+ si.nMax = height - 1;
si.nPage = w->height;
si.nPos = max(w->scrolly + w->requestscrolly, 0);
- si.nPos = min(si.nPos, content_get_height(w->bw->current_content) * w->bw->scale - w->height);
+ si.nPos = min(si.nPos, height - w->height);
SetScrollInfo(w->drawingarea, SB_VERT, &si, TRUE);
LOG(("SetScrollInfo VERT min:%d max:%d page:%d pos:%d", si.nMin, si.nMax, si.nPage, si.nPos));
@@ -1510,10 +1524,10 @@ void gui_window_set_scroll(struct gui_window *w, int sx, int sy)
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
si.nMin = 0;
- si.nMax = (content_get_width(w->bw->current_content) * w->bw->scale) -1;
+ si.nMax = width -1;
si.nPage = w->width;
si.nPos = max(w->scrollx + w->requestscrollx, 0);
- si.nPos = min(si.nPos, content_get_width(w->bw->current_content) * w->bw->scale - w->width);
+ si.nPos = min(si.nPos, width - w->width);
SetScrollInfo(w->drawingarea, SB_HORZ, &si, TRUE);
LOG(("SetScrollInfo HORZ min:%d max:%d page:%d pos:%d", si.nMin, si.nMax, si.nPage, si.nPos));
@@ -1536,13 +1550,7 @@ void gui_window_set_scroll(struct gui_window *w, int sx, int sy)
}
-void gui_window_scroll_visible(struct gui_window *w, int x0, int y0,
- int x1, int y1)
-{
- LOG(("scroll visible (%p, %d, %d, %d, %d)", w, x0, y0, x1, y1));
-}
-
-void gui_window_get_dimensions(struct gui_window *w, int *width, int *height,
+static void gui_window_get_dimensions(struct gui_window *w, int *width, int *height,
bool scaled)
{
if (w == NULL)
@@ -1554,7 +1562,7 @@ void gui_window_get_dimensions(struct gui_window *w, int *width, int *height,
*height = w->height;
}
-void gui_window_update_extent(struct gui_window *w)
+static void gui_window_update_extent(struct gui_window *w)
{
}
@@ -1562,7 +1570,7 @@ void gui_window_update_extent(struct gui_window *w)
/**
* set the status bar message
*/
-void gui_window_set_status(struct gui_window *w, const char *text)
+static void gui_window_set_status(struct gui_window *w, const char *text)
{
if (w == NULL)
return;
@@ -1572,7 +1580,7 @@ void gui_window_set_status(struct gui_window *w, const char *text)
/**
* set the pointer shape
*/
-void gui_window_set_pointer(struct gui_window *w, gui_pointer_shape shape)
+static void gui_window_set_pointer(struct gui_window *w, gui_pointer_shape shape)
{
if (w == NULL)
return;
@@ -1643,11 +1651,7 @@ struct nsws_pointers *nsws_get_pointers(void)
return &nsws_pointer;
}
-void gui_window_hide_pointer(struct gui_window *w)
-{
-}
-
-void gui_window_set_url(struct gui_window *w, const char *url)
+static void gui_window_set_url(struct gui_window *w, const char *url)
{
if (w == NULL)
return;
@@ -1655,7 +1659,7 @@ void gui_window_set_url(struct gui_window *w, const char *url)
}
-void gui_window_start_throbber(struct gui_window *w)
+static void gui_window_start_throbber(struct gui_window *w)
{
if (w == NULL)
return;
@@ -1680,7 +1684,7 @@ void gui_window_start_throbber(struct gui_window *w)
Animate_Play(w->throbber, 0, -1, -1);
}
-void gui_window_stop_throbber(struct gui_window *w)
+static void gui_window_stop_throbber(struct gui_window *w)
{
if (w == NULL)
return;
@@ -1708,83 +1712,34 @@ void gui_window_stop_throbber(struct gui_window *w)
/**
* place caret in window
*/
-void gui_window_place_caret(struct gui_window *w, int x, int y, int height,
- const struct rect *clip)
+static void gui_window_place_caret(struct gui_window *w, int x, int y,
+ int height, const struct rect *clip)
{
if (w == NULL)
return;
- CreateCaret(w->drawingarea, (HBITMAP)NULL, 1, height * w->bw->scale);
- SetCaretPos(x * w->bw->scale - w->scrollx,
- y * w->bw->scale - w->scrolly);
+ CreateCaret(w->drawingarea, (HBITMAP)NULL, 1, height * w->scale);
+ SetCaretPos(x * w->scale - w->scrollx,
+ y * w->scale - w->scrolly);
ShowCaret(w->drawingarea);
}
/**
* clear window caret
*/
-void
-gui_window_remove_caret(struct gui_window *w)
+static void gui_window_remove_caret(struct gui_window *w)
{
if (w == NULL)
return;
HideCaret(w->drawingarea);
}
-void
-gui_window_set_icon(struct gui_window *g, hlcache_handle *icon)
-{
-}
-
-void
-gui_window_set_search_ico(hlcache_handle *ico)
-{
-}
-
-void gui_window_new_content(struct gui_window *w)
-{
-}
-
-bool gui_window_scroll_start(struct gui_window *w)
-{
- return true;
-}
-
-bool gui_window_drag_start(struct gui_window *g, gui_drag_type type,
- const struct rect *rect)
-{
- return true;
-}
-
-void gui_window_save_link(struct gui_window *g, const char *url,
- const char *title)
-{
-}
-
-void gui_drag_save_object(gui_save_type type, hlcache_handle *c,
- struct gui_window *w)
-{
-}
-
-
-void gui_drag_save_selection(struct gui_window *g, const char *selection)
-{
-}
-
-void gui_start_selection(struct gui_window *w)
-{
-}
-
-void gui_clear_selection(struct gui_window *w)
-{
-}
-
/**
* Core asks front end for clipboard contents.
*
* \param buffer UTF-8 text, allocated by front end, ownership yeilded to core
* \param length Byte length of UTF-8 text in buffer
*/
-void gui_get_clipboard(char **buffer, size_t *length)
+static void gui_get_clipboard(char **buffer, size_t *length)
{
/* TODO: Implement this */
HANDLE clipboard_handle;
@@ -1806,7 +1761,7 @@ void gui_get_clipboard(char **buffer, size_t *length)
* \param styles Array of styles given to text runs, owned by core, or NULL
* \param n_styles Number of text run styles in array
*/
-void gui_set_clipboard(const char *buffer, size_t length,
+static void gui_set_clipboard(const char *buffer, size_t length,
nsclipboard_styles styles[], int n_styles)
{
/* TODO: Implement this */
@@ -1832,23 +1787,10 @@ void gui_set_clipboard(const char *buffer, size_t length,
}
-void gui_create_form_select_menu(struct browser_window *bw,
- struct form_control *control)
-{
-}
-
-
-void gui_cert_verify(nsurl *url, const struct ssl_cert_info *certs,
- unsigned long num,
- nserror (*cb)(bool proceed, void *pw), void *cbpw)
-{
- cb(false, cbpw);
-}
-
/**
* Create the main window class.
*/
-nserror
+nserror
nsws_create_main_class(HINSTANCE hinstance) {
nserror ret = NSERROR_OK;
WNDCLASSEX w;
@@ -1876,3 +1818,316 @@ nsws_create_main_class(HINSTANCE hinstance) {
return ret;
}
+
+/**
+ * callback from core to reformat a window.
+ */
+static void win32_window_reformat(struct gui_window *gw)
+{
+ if (gw != NULL) {
+ browser_window_reformat(gw->bw, false, gw->width, gw->height);
+ }
+}
+
+/**
+ * Generate a windows path from one or more component elemnts.
+ *
+ * If a string is allocated it must be freed by the caller.
+ *
+ * @param[in,out] str pointer to string pointer if this is NULL enough
+ * storage will be allocated for the complete path.
+ * @param[in,out] size The size of the space available if \a str not
+ * NULL on input and if not NULL set to the total
+ * output length on output.
+ * @param[in] nemb The number of elements.
+ * @param[in] ... The elements of the path as string pointers.
+ * @return NSERROR_OK and the complete path is written to str
+ * or error code on faliure.
+ */
+static nserror windows_mkpath(char **str, size_t *size, size_t nelm, va_list ap)
+{
+ return vsnstrjoin(str, size, '\\', nelm, ap);
+}
+
+/**
+ * Get the basename of a file using windows path handling.
+ *
+ * This gets the last element of a path and returns it.
+ *
+ * @param[in] path The path to extract the name from.
+ * @param[in,out] str Pointer to string pointer if this is NULL enough
+ * storage will be allocated for the path element.
+ * @param[in,out] size The size of the space available if \a
+ * str not NULL on input and set to the total
+ * output length on output.
+ * @return NSERROR_OK and the complete path is written to str
+ * or error code on faliure.
+ */
+static nserror windows_basename(const char *path, char **str, size_t *size)
+{
+ const char *leafname;
+ char *fname;
+
+ if (path == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ leafname = strrchr(path, '\\');
+ if (!leafname) {
+ leafname = path;
+ } else {
+ leafname += 1;
+ }
+
+ fname = strdup(leafname);
+ if (fname == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ *str = fname;
+ if (size != NULL) {
+ *size = strlen(fname);
+ }
+ return NSERROR_OK;
+}
+
+/**
+ * Create a path from a nsurl using windows file handling.
+ *
+ * @parm[in] url The url to encode.
+ * @param[out] path_out A string containing the result path which should
+ * be freed by the caller.
+ * @return NSERROR_OK and the path is written to \a path or error code
+ * on faliure.
+ */
+static nserror windows_nsurl_to_path(struct nsurl *url, char **path_out)
+{
+ lwc_string *urlpath;
+ char *path;
+ bool match;
+ lwc_string *scheme;
+ nserror res;
+
+ if ((url == NULL) || (path_out == NULL)) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ scheme = nsurl_get_component(url, NSURL_SCHEME);
+
+ if (lwc_string_caseless_isequal(scheme, corestring_lwc_file,
+ &match) != lwc_error_ok)
+ {
+ return NSERROR_BAD_PARAMETER;
+ }
+ lwc_string_unref(scheme);
+ if (match == false) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ urlpath = nsurl_get_component(url, NSURL_PATH);
+ if (urlpath == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ res = url_unescape(lwc_string_data(urlpath), &path);
+ lwc_string_unref(urlpath);
+ if (res != NSERROR_OK) {
+ return res;
+ }
+
+ /* if there is a drive: prefix treat path as DOS filename */
+ if ((path[2] == ':') || (path[2] == '|')) {
+ char *sidx; /* slash index */
+
+ /* move the string down to remove leading / note the
+ * strlen is *not* copying too much data as we are
+ * moving the null too!
+ */
+ memmove(path, path + 1, strlen(path));
+
+ /* swap / for \ */
+ sidx = strrchr(path, '/');
+ while (sidx != NULL) {
+ *sidx = '\\';
+ sidx = strrchr(path, '/');
+ }
+ }
+ /* if the path does not have a drive letter we return the
+ * complete path.
+ */
+ /** @todo Need to check returning the unaltered path in this
+ * case is correct
+ */
+
+ *path_out = path;
+
+ return NSERROR_OK;
+}
+
+/**
+ * Create a nsurl from a path using windows file handling.
+ *
+ * Perform the necessary operations on a path to generate a nsurl.
+ *
+ * @param[in] path The path to convert.
+ * @param[out] url_out pointer to recive the nsurl, The returned url
+ * should be unreferenced by the caller.
+ * @return NSERROR_OK and the url is placed in \a url or error code on
+ * faliure.
+ */
+static nserror windows_path_to_nsurl(const char *path, struct nsurl **url_out)
+{
+ nserror ret;
+ int urllen;
+ char *urlstr;
+ char *sidx; /* slash index */
+
+ if ((path == NULL) || (url_out == NULL) || (*path == 0)) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ /* build url as a string for nsurl constructor */
+ urllen = strlen(path) + FILE_SCHEME_PREFIX_LEN + 5;
+ urlstr = malloc(urllen);
+ if (urlstr == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ /** @todo check if this should be url escaping the path. */
+ if (*path == '/') {
+ /* unix style path start, so try wine Z: */
+ snprintf(urlstr, urllen, "%sZ%%3A%s", FILE_SCHEME_PREFIX, path);
+ } else {
+ snprintf(urlstr, urllen, "%s%s", FILE_SCHEME_PREFIX, path);
+ }
+
+ sidx = strrchr(urlstr, '\\');
+ while (sidx != NULL) {
+ *sidx = '/';
+ sidx = strrchr(urlstr, '\\');
+ }
+
+ ret = nsurl_create(urlstr, url_out);
+ free(urlstr);
+
+ return ret;
+}
+
+/**
+ * Ensure that all directory elements needed to store a filename exist.
+ *
+ * @param fname The filename to ensure the path to exists.
+ * @return NSERROR_OK on success or error code on failure.
+ */
+static nserror windows_mkdir_all(const char *fname)
+{
+ char *dname;
+ char *sep;
+ struct stat sb;
+
+ dname = strdup(fname);
+
+ sep = strrchr(dname, '\\');
+ if (sep == NULL) {
+ /* no directory separator path is just filename so its ok */
+ free(dname);
+ return NSERROR_OK;
+ }
+
+ *sep = 0; /* null terminate directory path */
+
+ if (stat(dname, &sb) == 0) {
+ free(dname);
+ if (S_ISDIR(sb.st_mode)) {
+ /* path to file exists and is a directory */
+ return NSERROR_OK;
+ }
+ return NSERROR_NOT_DIRECTORY;
+ }
+ *sep = '\\'; /* restore separator */
+
+ sep = dname;
+ while (*sep == '\\') {
+ sep++;
+ }
+ while ((sep = strchr(sep, '\\')) != NULL) {
+ *sep = 0;
+ if (stat(dname, &sb) != 0) {
+ if (nsmkdir(dname, S_IRWXU) != 0) {
+ /* could not create path element */
+ free(dname);
+ return NSERROR_NOT_FOUND;
+ }
+ } else {
+ if (! S_ISDIR(sb.st_mode)) {
+ /* path element not a directory */
+ free(dname);
+ return NSERROR_NOT_DIRECTORY;
+ }
+ }
+ *sep = '\\'; /* restore separator */
+ /* skip directory separators */
+ while (*sep == '\\') {
+ sep++;
+ }
+ }
+
+ free(dname);
+ return NSERROR_OK;
+}
+
+/* windows file handling */
+static struct gui_file_table file_table = {
+ .mkpath = windows_mkpath,
+ .basename = windows_basename,
+ .nsurl_to_path = windows_nsurl_to_path,
+ .path_to_nsurl = windows_path_to_nsurl,
+ .mkdir_all = windows_mkdir_all,
+};
+
+struct gui_file_table *win32_file_table = &file_table;
+
+static struct gui_window_table window_table = {
+ .create = gui_window_create,
+ .destroy = gui_window_destroy,
+ .redraw = gui_window_redraw_window,
+ .update = gui_window_update_box,
+ .get_scroll = gui_window_get_scroll,
+ .set_scroll = gui_window_set_scroll,
+ .get_dimensions = gui_window_get_dimensions,
+ .update_extent = gui_window_update_extent,
+ .reformat = win32_window_reformat,
+
+ .set_title = gui_window_set_title,
+ .set_url = gui_window_set_url,
+ .set_status = gui_window_set_status,
+ .set_pointer = gui_window_set_pointer,
+ .place_caret = gui_window_place_caret,
+ .remove_caret = gui_window_remove_caret,
+ .start_throbber = gui_window_start_throbber,
+ .stop_throbber = gui_window_stop_throbber,
+};
+
+struct gui_window_table *win32_window_table = &window_table;
+
+
+static struct gui_clipboard_table clipboard_table = {
+ .get = gui_get_clipboard,
+ .set = gui_set_clipboard,
+};
+
+struct gui_clipboard_table *win32_clipboard_table = &clipboard_table;
+
+
+static struct gui_fetch_table fetch_table = {
+ .filetype = fetch_filetype,
+};
+struct gui_fetch_table *win32_fetch_table = &fetch_table;
+
+
+static struct gui_browser_table browser_table = {
+ .poll = win32_poll,
+ .schedule = win32_schedule,
+};
+
+struct gui_browser_table *win32_browser_table = &browser_table;
diff --git a/windows/gui.h b/windows/gui.h
index 9bcba592e..82ae83642 100644
--- a/windows/gui.h
+++ b/windows/gui.h
@@ -24,6 +24,13 @@
#include "desktop/gui.h"
#include "windows/localhistory.h"
+struct gui_file_table *win32_file_table;
+extern struct gui_window_table *win32_window_table;
+extern struct gui_clipboard_table *win32_clipboard_table;
+extern struct gui_fetch_table *win32_fetch_table;
+extern struct gui_browser_table *win32_browser_table;
+extern struct gui_utf8_table *win32_utf8_table;
+
extern HINSTANCE hInstance;
/* bounding box */
diff --git a/windows/localhistory.c b/windows/localhistory.c
index 0b298719f..fb582b4aa 100644
--- a/windows/localhistory.c
+++ b/windows/localhistory.c
@@ -22,8 +22,7 @@
#include <windowsx.h>
#include <commctrl.h>
-#include "desktop/browser_private.h"
-#include "desktop/local_history.h"
+#include "desktop/browser_history.h"
#include "desktop/plotters.h"
#include "utils/utils.h"
#include "utils/log.h"
@@ -56,7 +55,7 @@ static void nsws_localhistory_scroll_check(struct nsws_localhistory *l, struct g
if ((gw->bw == NULL) || (l->hwnd == NULL))
return;
- history_size(gw->bw->history, &(l->width), &(l->height));
+ browser_window_history_size(gw->bw, &(l->width), &(l->height));
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
@@ -97,7 +96,7 @@ static void nsws_localhistory_up(struct nsws_localhistory *l, struct gui_window
tmp_hdc = plot_hdc;
plot_hdc = GetDC(l->hwnd);
- history_redraw(gw->bw->history, &ctx);
+ browser_window_history_redraw(gw->bw, &ctx);
ReleaseDC(l->hwnd, plot_hdc);
@@ -167,8 +166,7 @@ nsws_localhistory_event_callback(HWND hwnd, UINT msg,
x = GET_X_LPARAM(lparam);
y = GET_Y_LPARAM(lparam);
- if (history_click(gw->bw,
- gw->bw->history,
+ if (browser_window_history_click(gw->bw,
gw->localhistory->hscroll + x,
gw->localhistory->vscroll + y,
false)) {
@@ -180,8 +178,6 @@ nsws_localhistory_event_callback(HWND hwnd, UINT msg,
case WM_MOUSEMOVE:
x = GET_X_LPARAM(lparam);
y = GET_Y_LPARAM(lparam);
-/* if (gw->bw != NULL)
- history_hover(gw->bw->history, x, y, (void *)hwnd);*/
return DefWindowProc(hwnd, msg, wparam, lparam);
break;
@@ -287,7 +283,7 @@ nsws_localhistory_event_callback(HWND hwnd, UINT msg,
tmp_hdc = plot_hdc;
plot_hdc = hdc;
- history_redraw_rectangle(gw->bw->history,
+ browser_window_history_redraw_rectangle(gw->bw,
gw->localhistory->hscroll + ps.rcPaint.left,
gw->localhistory->vscroll + ps.rcPaint.top,
gw->localhistory->hscroll + (ps.rcPaint.right - ps.rcPaint.left),
@@ -347,8 +343,8 @@ struct nsws_localhistory *nsws_window_create_localhistory(struct gui_window *gw)
localhistory->width = 0;
localhistory->height = 0;
- if ((gw->bw != NULL) && (gw->bw->history != NULL)) {
- history_size(gw->bw->history,
+ if (gw->bw != NULL) {
+ browser_window_history_size(gw->bw,
&(localhistory->width),
&(localhistory->height));
}
diff --git a/windows/main.c b/windows/main.c
index 69a152d9b..20f9f041a 100644
--- a/windows/main.c
+++ b/windows/main.c
@@ -26,45 +26,34 @@
#include "desktop/gui.h"
#include "utils/nsoption.h"
#include "desktop/browser.h"
+#include "desktop/netsurf.h"
#include "utils/utils.h"
#include "utils/log.h"
#include "utils/messages.h"
-#include "utils/url.h"
#include "utils/filepath.h"
+#include "utils/file.h"
+#include "utils/nsurl.h"
#include "content/fetchers/resource.h"
#include "windows/findfile.h"
#include "windows/drawable.h"
#include "windows/gui.h"
+#include "windows/download.h"
static char **respaths; /** resource search path vector. */
char *options_file_location;
-nsurl *gui_get_resource_url(const char *path)
+static nsurl *gui_get_resource_url(const char *path)
{
char buf[PATH_MAX];
- char *raw;
nsurl *url = NULL;
- raw = path_to_url(filepath_sfind(respaths, buf, path));
- if (raw != NULL) {
- nsurl_create(raw, &url);
- free(raw);
- }
+ netsurf_path_to_nsurl(filepath_sfind(respaths, buf, path), &url);
return url;
}
-void gui_launch_url(const char *url)
-{
-}
-
-void gui_quit(void)
-{
- LOG(("gui_quit"));
-}
-
/**
* Ensures output logging stream is available
*/
@@ -96,6 +85,8 @@ static nserror set_defaults(struct nsoption_s *defaults)
return NSERROR_OK;
}
+
+
/**
* Entry point from operating system
**/
@@ -110,7 +101,21 @@ WinMain(HINSTANCE hInstance, HINSTANCE hLastInstance, LPSTR lpcli, int ncmd)
nserror ret;
const char *addr;
nsurl *url;
- nserror error;
+ struct netsurf_table win32_table = {
+ .browser = win32_browser_table,
+ .window = win32_window_table,
+ .clipboard = win32_clipboard_table,
+ .download = win32_download_table,
+ .fetch = win32_fetch_table,
+ .file = win32_file_table,
+ .utf8 = win32_utf8_table,
+ };
+ win32_fetch_table->get_resource_url = gui_get_resource_url;
+
+ ret = netsurf_register(&win32_table);
+ if (ret != NSERROR_OK) {
+ die("NetSurf operation table registration failed");
+ }
if (SLEN(lpcli) > 0) {
argvw = CommandLineToArgvW(GetCommandLineW(), &argc);
@@ -157,7 +162,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hLastInstance, LPSTR lpcli, int ncmd)
/* common initialisation */
messages = filepath_find(respaths, "messages");
- ret = netsurf_init(messages);
+ ret = netsurf_init(messages, NULL);
free(messages);
if (ret != NSERROR_OK) {
free(options_file_location);
@@ -184,10 +189,9 @@ WinMain(HINSTANCE hInstance, HINSTANCE hLastInstance, LPSTR lpcli, int ncmd)
LOG(("calling browser_window_create"));
- error = nsurl_create(addr, &url);
- if (error == NSERROR_OK) {
- error = browser_window_create(BROWSER_WINDOW_VERIFIABLE |
- BROWSER_WINDOW_HISTORY,
+ ret = nsurl_create(addr, &url);
+ if (ret == NSERROR_OK) {
+ ret = browser_window_create(BW_CREATE_HISTORY,
url,
NULL,
NULL,
@@ -195,8 +199,8 @@ WinMain(HINSTANCE hInstance, HINSTANCE hLastInstance, LPSTR lpcli, int ncmd)
nsurl_unref(url);
}
- if (error != NSERROR_OK) {
- warn_user(messages_get_errorcode(error), 0);
+ if (ret != NSERROR_OK) {
+ warn_user(messages_get_errorcode(ret), 0);
} else {
netsurf_main_loop();
}
diff --git a/windows/misc.c b/windows/misc.c
index d820a5bca..3bf06f852 100644
--- a/windows/misc.c
+++ b/windows/misc.c
@@ -27,7 +27,6 @@
#include "utils/messages.h"
#include "utils/utils.h"
-#include "utils/url.h"
void warn_user(const char *warning, const char *detail)
{
@@ -43,41 +42,3 @@ void die(const char *error)
exit(1);
}
-/**
- * Return the filename part of a full path
- *
- * \param path full path and filename
- * \return filename (will be freed with free())
- */
-
-char *filename_from_path(char *path)
-{
- char *leafname;
-
- leafname = strrchr(path, '\\');
- if (!leafname)
- leafname = path;
- else
- leafname += 1;
-
- return strdup(leafname);
-}
-
-/**
- * Add a path component/filename to an existing path
- *
- * \param path buffer containing path + free space
- * \param length length of buffer "path"
- * \param newpart string containing path component to add to path
- * \return true on success
- */
-
-bool path_add_part(char *path, int length, const char *newpart)
-{
- if(path[strlen(path) - 1] != '\\')
- strncat(path, "\\", length);
-
- strncat(path, newpart, length);
-
- return true;
-}
diff --git a/windows/schedule.c b/windows/schedule.c
index 3181c55e8..4aac981ef 100644
--- a/windows/schedule.c
+++ b/windows/schedule.c
@@ -19,11 +19,17 @@
#include <sys/time.h>
#include <time.h>
-#include "utils/schedule.h"
-#include "windows/schedule.h"
-
#include "utils/log.h"
#include "utils/utils.h"
+#include "utils/errors.h"
+
+#include "windows/schedule.h"
+
+#ifdef DEBUG_SCHEDULER
+#define SRLOG(x) LOG(x)
+#else
+#define SRLOG(x)
+#endif
/* linked list of scheduled callbacks */
static struct nscallback *schedule_list = NULL;
@@ -41,39 +47,6 @@ struct nscallback
/**
- * Schedule a callback.
- *
- * \param tival interval before the callback should be made / cs
- * \param callback callback function
- * \param p user parameter, passed to callback function
- *
- * The callback function will be called as soon as possible after t cs have
- * passed.
- */
-void schedule(int cs_ival, void (*callback)(void *p), void *p)
-{
- struct nscallback *nscb;
- struct timeval tv;
-
- tv.tv_sec = cs_ival / 100; /* cs to seconds */
- tv.tv_usec = (cs_ival % 100) * 10000; /* remainder to microseconds */
-
- nscb = calloc(1, sizeof(struct nscallback));
-
- LOG(("adding callback %p for %p(%p) at %d cs", nscb, callback, p, cs_ival));
-
- gettimeofday(&nscb->tv, NULL);
- timeradd(&nscb->tv, &tv, &nscb->tv);
-
- nscb->callback = callback;
- nscb->p = p;
-
- /* add to list front */
- nscb->next = schedule_list;
- schedule_list = nscb;
-}
-
-/**
* Unschedule a callback.
*
* \param callback callback function
@@ -82,16 +55,18 @@ void schedule(int cs_ival, void (*callback)(void *p), void *p)
* All scheduled callbacks matching both callback and p are removed.
*/
-void schedule_remove(void (*callback)(void *p), void *p)
+static nserror schedule_remove(void (*callback)(void *p), void *p)
{
struct nscallback *cur_nscb;
struct nscallback *prev_nscb;
struct nscallback *unlnk_nscb;
- if (schedule_list == NULL)
- return;
+ /* check there is something on the list to remove */
+ if (schedule_list == NULL) {
+ return NSERROR_OK;
+ }
- LOG(("removing %p, %p", callback, p));
+ SRLOG(("removing %p, %p", callback, p));
cur_nscb = schedule_list;
prev_nscb = NULL;
@@ -101,7 +76,7 @@ void schedule_remove(void (*callback)(void *p), void *p)
(cur_nscb->p == p)) {
/* item to remove */
- LOG(("callback entry %p removing %p(%p)",
+ SRLOG(("callback entry %p removing %p(%p)",
cur_nscb, cur_nscb->callback, cur_nscb->p));
/* remove callback */
@@ -120,8 +95,44 @@ void schedule_remove(void (*callback)(void *p), void *p)
cur_nscb = prev_nscb->next;
}
}
+ return NSERROR_OK;
}
+/* exported interface documented in windows/schedule.h */
+nserror win32_schedule(int ival, void (*callback)(void *p), void *p)
+{
+ struct nscallback *nscb;
+ struct timeval tv;
+ nserror ret;
+
+ ret = schedule_remove(callback, p);
+ if ((ival < 0) || (ret != NSERROR_OK)) {
+ return ret;
+ }
+
+ tv.tv_sec = ival / 1000; /* miliseconds to seconds */
+ tv.tv_usec = (ival % 1000) * 1000; /* remainder to microseconds */
+
+ nscb = calloc(1, sizeof(struct nscallback));
+ if (nscb == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ SRLOG(("adding callback %p for %p(%p) at %d cs",
+ nscb, callback, p, ival));
+
+ gettimeofday(&nscb->tv, NULL);
+ timeradd(&nscb->tv, &tv, &nscb->tv);
+
+ nscb->callback = callback;
+ nscb->p = p;
+
+ /* add to list front */
+ nscb->next = schedule_list;
+ schedule_list = nscb;
+
+ return NSERROR_OK;
+}
/* exported interface documented in schedule.h */
int
@@ -157,7 +168,7 @@ schedule_run(void)
prev_nscb->next = unlnk_nscb->next;
}
- LOG(("callback entry %p running %p(%p)",
+ SRLOG(("callback entry %p running %p(%p)",
unlnk_nscb, unlnk_nscb->callback, unlnk_nscb->p));
/* call callback */
unlnk_nscb->callback(unlnk_nscb->p);
@@ -190,9 +201,9 @@ schedule_run(void)
/* make returned time relative to now */
timersub(&nexttime, &tv, &rettime);
-#if defined(DEBUG_SCHEDULER)
- LOG(("returning time to next event as %ldms",(rettime.tv_sec * 1000) + (rettime.tv_usec / 1000)));
-#endif
+ SRLOG(("returning time to next event as %ldms",
+ (rettime.tv_sec * 1000) + (rettime.tv_usec / 1000)));
+
/* return next event time in milliseconds (24days max wait) */
return (rettime.tv_sec * 1000) + (rettime.tv_usec / 1000);
}
diff --git a/windows/schedule.h b/windows/schedule.h
index e6a5d10d0..6d47b2db6 100644
--- a/windows/schedule.h
+++ b/windows/schedule.h
@@ -16,8 +16,20 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef FRAMEBUFFER_SCHEDULE_H
-#define FRAMEBUFFER_SCHEDULE_H
+#ifndef WINDOWS_SCHEDULE_H
+#define WINDOWS_SCHEDULE_H
+
+/**
+ * Schedule a callback.
+ *
+ * \param ival interval before the callback should be made in ms
+ * \param callback callback function
+ * \param p user parameter, passed to callback function
+ *
+ * The callback function will be called as soon as possible after t ms have
+ * passed.
+ */
+nserror win32_schedule(int ival, void (*callback)(void *p), void *p);
/**
* Process scheduled callbacks up to current time.