From 93e32295cfd3fd2586f8ceebe5aba5607ccc17c0 Mon Sep 17 00:00:00 2001 From: John Ellis Date: Mon, 3 Apr 2000 18:24:05 +0000 Subject: [PATCH] Initial revision --- .cvsignore | 22 + AUTHORS | 1 + BUGS | 2 + ChangeLog | 375 ++++ HACKING | 14 + Makefile.am | 15 + NEWS | 0 README | 118 ++ TODO | 40 + acconfig.h | 9 + autogen.sh | 115 ++ configure.in | 55 + gqview.desktop | 7 + gqview.png | Bin 0 -> 2883 bytes gqview.spec.in | 53 + po/.cvsignore | 9 + po/ChangeLog | 0 po/POTFILES.in | 16 + po/de.po | 852 +++++++++ po/ja.po | 855 +++++++++ po/pt_BR.po | 798 ++++++++ po/ru.po | 837 ++++++++ src/.cvsignore | 4 + src/Makefile.am | 39 + src/config.c | 704 +++++++ src/dnd.c | 441 +++++ src/filelist.c | 1074 +++++++++++ src/fileops.c | 133 ++ src/globals.c | 120 ++ src/gqview.h | 354 ++++ src/icons/.cvsignore | 2 + src/icons/Makefile.am | 12 + src/icons/icon_config.xpm | 28 + src/icons/icon_float.xpm | 28 + src/icons/icon_home.xpm | 30 + src/icons/icon_reload.xpm | 27 + src/icons/icon_thumb.xpm | 26 + src/icons/icon_zoom_fit.xpm | 26 + src/icons/icon_zoom_in.xpm | 29 + src/icons/icon_zoom_norm.xpm | 26 + src/icons/icon_zoom_out.xpm | 29 + src/icons/img_unknown.xpm | 159 ++ src/image.c | 773 ++++++++ src/image.h | 40 + src/img-main.c | 361 ++++ src/img-view.c | 300 +++ src/intl.h | 22 + src/logo.h | 3507 ++++++++++++++++++++++++++++++++++ src/main.c | 436 +++++ src/menu.c | 671 +++++++ src/pathsel.c | 294 +++ src/rcfile.c | 434 +++++ src/slideshow.c | 240 +++ src/tabcomp.c | 629 ++++++ src/tabcomp.xpm | 15 + src/thumb.c | 371 ++++ src/utildlg.c | 226 +++ src/utildlg.h | 44 + src/utilops.c | 961 ++++++++++ src/window.c | 501 +++++ 60 files changed, 17309 insertions(+) create mode 100644 .cvsignore create mode 100644 AUTHORS create mode 100644 BUGS create mode 100644 ChangeLog create mode 100644 HACKING create mode 100644 Makefile.am create mode 100644 NEWS create mode 100644 README create mode 100644 TODO create mode 100644 acconfig.h create mode 100755 autogen.sh create mode 100644 configure.in create mode 100644 gqview.desktop create mode 100644 gqview.png create mode 100644 gqview.spec.in create mode 100644 po/.cvsignore create mode 100644 po/ChangeLog create mode 100644 po/POTFILES.in create mode 100644 po/de.po create mode 100644 po/ja.po create mode 100644 po/pt_BR.po create mode 100644 po/ru.po create mode 100644 src/.cvsignore create mode 100644 src/Makefile.am create mode 100644 src/config.c create mode 100644 src/dnd.c create mode 100644 src/filelist.c create mode 100644 src/fileops.c create mode 100644 src/globals.c create mode 100644 src/gqview.h create mode 100644 src/icons/.cvsignore create mode 100644 src/icons/Makefile.am create mode 100644 src/icons/icon_config.xpm create mode 100644 src/icons/icon_float.xpm create mode 100644 src/icons/icon_home.xpm create mode 100644 src/icons/icon_reload.xpm create mode 100644 src/icons/icon_thumb.xpm create mode 100644 src/icons/icon_zoom_fit.xpm create mode 100644 src/icons/icon_zoom_in.xpm create mode 100644 src/icons/icon_zoom_norm.xpm create mode 100644 src/icons/icon_zoom_out.xpm create mode 100644 src/icons/img_unknown.xpm create mode 100644 src/image.c create mode 100644 src/image.h create mode 100644 src/img-main.c create mode 100644 src/img-view.c create mode 100644 src/intl.h create mode 100644 src/logo.h create mode 100644 src/main.c create mode 100644 src/menu.c create mode 100644 src/pathsel.c create mode 100644 src/rcfile.c create mode 100644 src/slideshow.c create mode 100644 src/tabcomp.c create mode 100644 src/tabcomp.xpm create mode 100644 src/thumb.c create mode 100644 src/utildlg.c create mode 100644 src/utildlg.h create mode 100644 src/utilops.c create mode 100644 src/window.c diff --git a/.cvsignore b/.cvsignore new file mode 100644 index 00000000..e73b3226 --- /dev/null +++ b/.cvsignore @@ -0,0 +1,22 @@ +Makefile +Makefile.in +aclocal.m4 +config.cache +config.guess +config.h +config.h.in +config.log +config.status +config.sub +configure +configure.scan +missing +mkinstalldirs +COPYING +install-sh +stamp-h +stamp-h.in +INSTALL +gqview.spec +intl +ABOUT-NLS diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 00000000..ceae3fa1 --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +johne@bellatlantic.net diff --git a/BUGS b/BUGS new file mode 100644 index 00000000..38417008 --- /dev/null +++ b/BUGS @@ -0,0 +1,2 @@ + >drag and drop bug with GTK+-1.2.3, endless loops, see TODO for more. + diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 00000000..1366bb09 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,375 @@ +Thu Mar 16 17:04:24 2000 John Ellis + + * pathsel.c, tabcomp.c: Fix memory leaks. + +Fri Oct 1 17:17:21 1999 John Ellis + + * po/ru.po: Added Russian translation + from Oleg Andrjushenko + * po/pt_BR.po: Added Brazilian Portuguese translation + from Vitor Fernandes + * po/ja/po: Added Japanese translation + from Shingo Akagaki + * configure.in: Updated ALL_LINGUAS. + +Mon Sep 6 06:25:38 1999 John Ellis + + * image.c, img-main.c, img-view.c, window.c: Remove warnings for + gtk+-1.2.5-pre1. I think there are still realize issues with that + version of GTK+, however. + +Wed Aug 18 21:03:05 1999 John Ellis + + * filelist.c: Fix reversal of calculating column width of the files + list for icons vs. no icons. + * pathsel.c, utilops.c: Set teh clist columns to autosize, so that + horizontal scrollbar is accurate (and usually not there ;) + +Wed Aug 18 20:35:07 1999 John Ellis + + * gqview.h, tabcomp.c, utilops.c: Move and copy dialogs now have a + history. This was done by adding a combo widget option to the tab + completion routines. + +Wed Aug 18 17:37:48 1999 John Ellis + + * config.c: Fix 'fall back to 48x48 icon size' bug. + +Mon Aug 16 13:25:29 1999 John Ellis + + * po/de.po: Added german translation + by mawarkus@t-online.de (Matthias Warkus) + * configure.in (ALL_LINGUAS): Added de. + +Mon Aug 16 12:44:56 1999 John Ellis + + * utilops.c: Make it easier for translators. + +Mon Aug 16 12:09:53 1999 John Ellis + + * thumb.c: Regenerate thumbnails whent the preferred size changes. + +Mon Aug 16 11:56:29 1999 John Ellis + + * config.c, globals.c, gqview.h, main.c, rcfile.c: Removed the + 'save settings on exit' option and always save one exit, this was + leading to confusion as to why settings are not always saved. + * menus.: Removed the save settings menu line, no longer needed. + +Tue Aug 10 07:03:44 1999 John Ellis + + * main.c(main): Use gtk_set_locale(); + * window.c: Use gqview instead of main for wmhints. + +Tue Aug 10 06:55:48 1999 John Ellis + + * filelist.c: Update the file count when files are removed. + * dnd.c: When a drag and drop results in a GDK_ACTION_MOVE, refresh + the lists to account for possibly deleted files. + +Fri Jul 23 17:09:02 1999 John Ellis + + * window.c: Fix hang bug when dragging a file after starting with tools + floating, then unfloating the window. (don't use gtk_widget_reparent + for this). + * dnd.c: Properly add "\r\n" to the end of all files for URI types, now + all drags to Gimp 1.1.6 works. + +Tue Jul 20 20:37:03 1999 John Ellis + + * configure.in, Makefile.am: Added localedir definition. + * src/main.c: Added locale and i18n initialization. + +Tue Jul 20 20:03:18 1999 John Ellis + + * configure.in, Makefile.am, autogen.sh: Add gettext calls, simplify + gtk/imlib checks. + * po/POTFILES.in: Created for gettext. + * src/intl.h, gqmpeg.h, *.c: Added intl stuff, marked strings for + translation. + +Sat Jul 10 15:12:13 1999 John Ellis + + * all files: Moved to autoconf and automake. + +Sat Jul 3 08:23:59 1999 John Ellis + + * gqview.h, README, gqview.spec: Release 0.7.0 + +Fri Jul 2 13:00:21 1999 John Ellis + + * img-view.c: Added a 'close window' option to pop up dialog. + +Fri Jul 2 09:11:02 1999 John Ellis + + * main.c (main): Fix so that window does not expand to image size when + strting up with an image (from command line). + * img-view.c (view_window_new): Follow the limit window size option, + if enabled. + +Thu Jul 1 20:13:31 1999 John Ellis + + * main.c: Setup random seed, for better random slideshows. + +Sun Jun 27 15:17:10 1999 John Ellis + + * img-main.c: Use black background for full screen. + * menu.c: Keep keyboard grab when full screen menu closes. + +Sun Jun 27 14:07:05 1999 John Ellis + + * img-main.c: Keyboard now works with full screen. + * main.c: Drop out of full screen before exiting. + +Sun Jun 27 06:57:22 1999 John Ellis + + * image.c: Fix image snapping to uppper left when resizing window. + * main.c: Increase progressive scrolling rate. + +Fri Jun 25 15:22:32 1999 John Ellis + + * config.c, globals.c, gqview.h, img-view.c, main.c, rcfile.c: Added + progressive key scrolling option. + +Fri Jun 25 14:06:12 1999 John Ellis + + * image.c, img-main.c, gqview.h: A few api changes with regard to image + auto-sizing and zooming. + * dnd.c: Made image dnd more generic to work with separate views. + * img-view.c: Added dnd and keyboard support. + +Fri Jun 25 11:00:38 1999 John Ellis + + * image.c, img-view.c, window.c: Fixups for window resizing and initial + size setting. + +Fri Jun 18 13:42:35 1999 John Ellis + + * dnd.c, filelist.c, gqview.h, menu.c: Dragging and right clicking on + file list no longer displays image, but correctly, only displays + action/popup menu. + * globals.c, gqview.h, img-main.c, main.c, menu.c, window.c: Add full + screen option. + +Fri Jun 18 04:24:51 1999 John Ellis + + * image.[ch], img-main.c, gqview.h: Beginnings of adding capability to + view images in a new window. ImageWindow functions are now completely + generic (save one spot). + +Wed Jun 16 03:47:36 1999 John Ellis + + * slideshow.c, filelist.c: Make slideshow work correctly. + * config.c, rcfile.c: Add saving and adjustment of slide show options. + +Wed Jun 16 00:46:09 1999 John Ellis + + * slideshow.c, globals.c, gqview.h: Begin slideshow ability. + * menu.c: Add 'Toggle slideshow' so view menu, may not stay here. + * filelist.c: Made a few functions needed for slideshow public. + +Tue Jun 15 19:21:26 1999 John Ellis + + * filelist.c, pathsel.c, tabcomp.c: Small speed improvements in + handling (creating) GLists. + +Sat Jun 12 23:17:34 1999 John Ellis + + * rcfile.c (load_options): Fix memory leak, patch submitted by + F. Petitjean + +Thu May 27 14:32:22 1999 John Ellis + + * gqmpeg.h, README, gqmpeg.spec: Release 0.6.1 + +Thu May 27 13:10:02 1999 John Ellis + + * filelist.c: Generate thumbnails for visible files first. Thumbnails + are now kept when renaming. + +Thu May 27 11:54:09 1999 John Ellis + + * pathsel.c: Merge improvements from gqmpeg version. + * tabcomp.c, tabcomp.xpm: ditto. + * utildlg.c: ditto. + * config.c, utilops.c, window.c: Use newer features of above. + +Thu May 27 11:44:00 1999 John Ellis + + * filelist.c, image.c, gqmpeg.h: Properly update the image window when + viewed files are moved, renamed, or deleted. + +Thu May 27 11:01:31 1999 John Ellis + + * main.c (main): Push correct visual and colormap to fix 8 but psuedo + color displays. + +Sun May 23 09:21:50 1999 John Ellis + + * Makefile: Added static build target, some cleanup. + +Sat Apr 10 19:01:33 1999 John Ellis + + * window.c(toolwindow_create): Use gtk_window_set_policy on toolwindow + so it can be resized smaller. + +0.6.0 (3-5-98) + > Major rewrite (60-70%), now requires gtk+-1.2.0 + > Multiple file selection. + > Drag and drop. + > Better keyboard support. + > xvpics thumbnail support (read only), optional. + - Add command line options to force show and hide of tools. + * Fix tab completion bug. + * Fix gtk 1.2.0 related bugs. + +0.5.1 (12-8-98) + - Should compile now without editing the Makefile with any gtk through 1.1.5 + * Fix file highlight bug when user tab completes to currently displayed dir. + * Fix for FreeBSD. + +0.5.0 (11-11-98) + > Add path entry window with tab completion. + > Add tab completion to all areas where a path can be typed. + > Add option to save window positions. + - Pressing '+' zooms image. Previously only '=' was bound, causing problems + for some keyboard layouts. + - Add border to floating tools window for better appearance on some WM's. + +0.4.3 (10-09-98) + * Fix bug when 'fit window to image' is on, tools float/hide, and the next + image selected has the same dimensions, it would not display. + * More fixes dealing with 'fit window to image' + +0.4.2 (10-07-98) + > Add 'fit window to image' option when tools float or hide. + > Add copy and move dialogs. + > Add option to hide the tools completely. + > Save settings on exit option added, and option to restore tool state. + - Pressing the [ESC] key will now stop loading of thumbnails. + - [CTRL] - M is now moves files, purging old thumbnails is now [CTRL] - T. + - Add save button to config dialog. + - New configuration tab: image, moved relevent options there. + +0.4.1 (9-11-98) + > Scrollbars removed, now you can pan the image by pressing and dragging the + mouse on the image. The arrow keys will pan too (use [Ctrl] to pan faster) + > The file selection area and status line can be 'floated' into a separate + window, this allows the image window to display more of the image. + > The file delete confirmation dialog can now be disabled in the options + window. + > The beginnings of keyboard support ( see the keyboard chart, above ) + - Now if a thumbnail is older than it's parent image, the thumbnail is + recreated, so that changed images have their thumbnail properly updated. + - While loading thumbnails GQview is now responsive to commands, slowly, but + it works. You can now load images, delete files, etc. while the thumbnails + are being generated. The thumbnail generation can be interrupted too by + simply turning them off. + * The code that determines the user's HOME directory has been rewritten, now + hopefully users of nis will be happy. If the directory is not found or + cannot be determined, GQview exits semi-gracefully. + * Fixed some bugs here and there. + +0.4.0 (8-15-98) + > Thumbnail caching added ($HOME/.gqview_thmb). + - patch from Joshua Thomas Green applied for those that want to compile + with GTK 1.1.x (the development version), just uncomment one line in the + Makefile. + - patch from Joel Young applied to the .spec file of the RPM version. + +0.3.4 (7-30-98) + * Fixed problem loading files into external editors when a space was in the + pathname. + +0.3.3 (5-15-98) + - Changes to file listing code for speed improvement in large directories. + * Fixed a bug that would cause a thumbnail's height or width to be zero when + an image has a large aspect ratio. + * Fixed some memory leaks in the file listing code. + - Other small changes including source re-organization. + - Added a pixmap file to use as an icon (gqview.xpm). + +0.3.2 (5-7-98) + * Fixed a bug which made the first editor slot useless from config dialog. + +0.3.1 (5-4-98) + - Changed filelist code to properly implement Glist. + - Moved definitions of variables and #includes to better places. + +0.3.0 (4-24-98) + > New feature! Thumbnails displayed in the file list(us 't' to toggle). + > Thumbnails size can be selected (General Options). + > Rewrite (again) of the file list (to support adding/removing entries + without re-reading the entire directory listing, [still need to convert + the directory list, however]). + - minor display layout changes (to accomodate the progress bar). + - if a file format cannot be determined, a generic 'unknown image' picture + is displayed. + - added display for the number of files listed. + - added '-debug' command line option for debug output (preliminary) + +0.2.1 (4-8-98) + > Added a handle, now the file lists are sizeable. + - renamed menu item Exit to Quit. + - Added missing file includes that were exposed with GTK+ 0.99.10 release. + +0.2.0 (3-19-98) + > External editors can be specified in the configuration window (max 8). + Under the "external editors" tab. + - Popup menu for filelist (delete, rename, and edit). + - Filelist highlight now follows currently viewed image. + - A few minor fixes. + +0.1.1 (3-3-98) + > Updated code to compile with GTK+-0.99.4 + (will not work with previous versions of GTK) + - Command line no longer requires a complete path to a file if it is in + the current working directory. (or must be relative to it) + - When moving to the next (or previous) image, the file list + scrolls to include the current image's name. + +0.1.0 (2-28-98) + > Added menu bar. + > Added keyboard shorcuts. + > Configuration can be saved (to .gqviewrc in user's home dir) + > Command line support. (specify startup directory or file to view) + > Can set startup directory in options window (can be disabled) + > Added custom filtering options to support more formats + (Imlib supports almost anything your system can read using + ImageMagick or Netpbm, if available). + > File operations: create directory, rename file, delete file. + > clicking mouse on image: + button one: next image + button two: previous image + button three: popup menu (zoom, file operations, edit image) + > Added option to load image into The Gimp. + - Fixed a bug in the history list truncating routine. (GQview would crash) + - Other minor improvements and fixes. + +0.0.3 (2-18-98) + > Source code clean up! The source code has been organized + and is now readable (some code still needs organizing, but + at least now the code can be followed). + > Makefile rewritten, it may still need editing for some systems. + The '-g' gcc option was removed for the released code, this makes + the binary about 1/3 smaller (it removes some debugging facilities) + - Fixed the transparency problem. This removes the garbage displayed + where an image is transparent, unfortunately for now it is set to purple. + +0.0.2 (2-14-98) + > Rewrote directory and file list handling, the lists + can now be of any length. + > Lists are now sorted. + > History list no longer expands out of control as the + directory path gets longer, entries are truncated at + 32 characters and '/...' is prepended. + > Added configuration window, including: + - show or hide dot files + - select default zoom mode for new image + - disable file filtering + - choose file types to filter + - about tab for version and contact info + +0.0.1 (2-10-98) + > No history, first release! + diff --git a/HACKING b/HACKING new file mode 100644 index 00000000..5ffd6d64 --- /dev/null +++ b/HACKING @@ -0,0 +1,14 @@ +A brief overview for those that wish to work with the source. + +The Makefiles and configure script are generated by the autogen.sh script, usually +only distributed with snapshot releases. Running autogen.sh requires automake +and autoconf. GNU gettext may also be needed by autogen.sh. + +CVS commits _require_ a ChangeLog entry, commits without a ChangeLog will be reverted. + +Translators create a translation by creating the appropriate .po file in the /po +directory. Please see the gettext info pages for an overview and instructions. +Basically: Add your language code to the ALL_LINGUAS= line in configure.in, +then get started translating the strings in your ??.po file. +Note: The strings for debug output is intentionally not marked for translation. + diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 00000000..8a6e380a --- /dev/null +++ b/Makefile.am @@ -0,0 +1,15 @@ +## Process this file with automake to produce Makefile.in. + +SUBDIRS = src intl po +DIST_SUBDIRS = src intl po + +EXTRA_DIST = gqview.desktop gqview.png gqview.spec BUGS ChangeLog + +if HAVE_GNOME +desktopdir = $(GNOME_DATADIR)/gnome/apps/Graphics +desktop_DATA = gqview.desktop + +icondir = $(GNOME_DATADIR)/pixmaps +icon_DATA = gqview.png +endif + diff --git a/NEWS b/NEWS new file mode 100644 index 00000000..e69de29b diff --git a/README b/README new file mode 100644 index 00000000..4e5c3c9b --- /dev/null +++ b/README @@ -0,0 +1,118 @@ +################################################################### +## GQview 0.7.0 (07/03/99) ## +## This software is Copyright (C) 1999 by John Ellis. ## +## Use this software at your own risk. I am not responsible for ## +## anything this software may do to your computer. ## +## This software falls under the GNU Public License. Please read ## +## the COPYING file for more information ## +################################################################### + +Author: John Ellis +e-mail: gqview@email.com +homepage: gqview.netpedia.net + www.geocities.com/SiliconValley/Haven/5235/ (mirror always up to date) + +======== Requirements + + GTK+-1.2.0: ftp://ftp.gtk.org/pub/gtk + Imlib 1.9: ftp://ftp.labs.redhat.com/pub/imlib + +======== Notes and changes for this release + + Changes: + > Now use autoconf/make, resulting in a configure script. + > Now supports i18n, added translations: de ja pt_BR ru + > Remove 'save settings on exit', they are now always saved. + > Copy/move dialogs now include drop down history. + - Icons now update when size is configured. + - When dragging files, and the action was a move, refresh the filelist. + * Icons sizes are now properly remembered when the config dialog is opened + then closed without re-selecting the size. + + Notes: + known bug: When starting up with tools floating, then unfloat the tools and + attempt to do drag and drop, BOOM! endless loop of errors on + GTK+-1.2.3 (hint: could use a little help figuring this out) + +======== Installation + + Compilation: ./configure ; make + General install: make install + GNOME install: make gnome-install is deprecated!, configure finds gnome for + you now. + Removal: make uninstall + +======== Description / Features + + GQview is a graphics file viewer. Basic features: + - Single click image viewing / navigation. + - Zoom functions. + - Thumbnails, with optional caching and .xvpics support. + - Multiple file selection for move, copy, delete, rename, drag and drop. + - Drag and drop. + - Slideshow. + - Full screen. + - Ability to open images in external editors (configurable). + +======== Documentation (brief) + + Keyboard commands: + [PageDown] next image + [PageUp] previous image + [Home] first image in list + [End] last image in list + [Tab] tab completion in path entry window + [Escape], cancel completion in path entry window + [Escape] stop generating thumbnails + + Keyboard commands valid when image has focus (image has black rectangle) + arrow keys pan image + [Shift] - arrow keys pan image faster + [Space] next image + [Backspace] previous image + + File menu related: + [Ctrl] - N New directory + [Ctrl] - C Copy file + [Ctrl] - M Move file + [Ctrl] - R Rename file + [Ctrl] - D, [Delete] Delete file + [Ctrl] - Q, Q Exit + + Edit menu related: + [Ctrl] - 1 .. 8 run external editor + [Ctrl] - O configure Options + [Ctrl] - S Save options + [Ctrl] - T Maintain thumbnails + + View menu related: + +, = zoom in + - zoom out + Z zoom to original size + X zoom to fit + T toggle thumbnail display + R refresh list + F (Un)float file selection area + H (Un)hide file selection area + [Ctrl] = F Toggle full screen + S Toggle slide show + +======== Thanks go to the following for fixes, additions, and patches: + + Oleg Andrjushenko + for Russian translation + + Vitor Fernandes + for Brazilian Portuguese translation + + Shingo Akagaki a + for Japanese translation + + Matthias Warkus + for German translation. + + Diederen Damien + for .xvpics thumbnail reading support. + +======== + diff --git a/TODO b/TODO new file mode 100644 index 00000000..6e6d3280 --- /dev/null +++ b/TODO @@ -0,0 +1,40 @@ +TODO key: d = done, w = work in progress, ? = possibly fixed, * = wt? - how? + +d>try gtk_container_remove instead of reparent, to try to fix dragging hang. +d>After dragging files, check if they are now gone (moved). + >Remember previous directory used in move/copy dialogs. + +Major: +---------------------------------------------- +d>Fix window resizing to start-up size when window is made smaller, then an + image is changed, or widget is 'operated'. +d>Fix hang (endless gtk loop on drags in GTK+ 1.2.3) bah, in gdb its a pain, + breaking it within the error causes a stuck pointer grab :-/ + HOW TO REPEAT: + enable 'save tool state' + set the tools to float + exit + restart + unfloat tools + try to do drag and drop -> BOOM! + UPDATE: I dunno, this still looks like a gtk bug? + +Minor: +---------------------------------------------- + >add a read-ahead buffer for next image, note that this will not be threaded. + >add command line option to invoke full screen and slideshow on startup + >make *'s const, where appropriate () + >make Escape cancel dialogs. + + >add progress dialog when moving/copying/deleting multiple files. + >.xbm file format not listed by default? .pnm, more? + + >ability to specify view window background color + >show wait cursor during image load + +Wishlist?: +---------------------------------------------- + >image list, like playlist in sound players + >add vert drag bar + >make *.jpg on command line show only jpg files, for ex. + diff --git a/acconfig.h b/acconfig.h new file mode 100644 index 00000000..83c904d2 --- /dev/null +++ b/acconfig.h @@ -0,0 +1,9 @@ +#undef ENABLE_NLS +#undef HAVE_CATGETS +#undef HAVE_GETTEXT +#undef HAVE_LC_MESSAGES +#undef HAVE_STPCPY + +#undef PACKAGE +#undef VERSION + diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 00000000..4b1ca7cf --- /dev/null +++ b/autogen.sh @@ -0,0 +1,115 @@ +#!/bin/sh +# Run this to generate all the initial makefiles, etc. + +#this was originally taken from the gnome macros/autogen.sh scripts + +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. + +(test -f $srcdir/configure.in \ + && test -f $srcdir/src/main.c \ + && test -f $srcdir/src/gqview.h) || { + echo -n "**Error**: Directory "\`$srcdir\'" does not look like the" + echo " top-level gqview directory" + exit 1 +} + +DIE=0 + +(autoconf --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`autoconf' installed." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + DIE=1 +} + +grep "^AM_GNU_GETTEXT" $srcdir/configure.in >/dev/null && { + grep "sed.*POTFILES" $srcdir/configure.in >/dev/null || \ + (gettext --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`gettext' installed." + echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + } +} + +# if no automake, don't bother testing for aclocal +test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: Missing \`aclocal'. The version of \`automake'" + echo "installed doesn't appear recent enough." + echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 +} + +if test "$DIE" -eq 1; then + exit 1 +fi + +if test -z "$*"; then + echo "**Warning**: I am going to run \`configure' with no arguments." + echo "If you wish to pass any to it, please specify them on the" + echo \`$0\'" command line." + echo +fi + +case $CC in +xlc ) + am_opt=--include-deps;; +esac + +for coin in `find $srcdir -name configure.in -print` +do + dr=`dirname $coin` + if test -f $dr/NO-AUTO-GEN; then + echo skipping $dr -- flagged as no auto-gen + else + echo processing $dr + macrodirs=`sed -n -e 's,AM_ACLOCAL_INCLUDE(\(.*\)),\1,gp' < $coin` + ( cd $dr + aclocalinclude="$ACLOCAL_FLAGS" + for k in $macrodirs; do + if test -d $k; then + aclocalinclude="$aclocalinclude -I $k" + ##else + ## echo "**Warning**: No such directory \`$k'. Ignored." + fi + done + if grep "^AM_GNU_GETTEXT" configure.in >/dev/null; then + if grep "sed.*POTFILES" configure.in >/dev/null; then + : do nothing -- we still have an old unmodified configure.in + else + echo "Creating $dr/aclocal.m4 ..." + test -r $dr/aclocal.m4 || touch $dr/aclocal.m4 + echo "Running gettextize... Ignore non-fatal messages." + echo "no" | gettextize --force --copy + echo "Making $dr/aclocal.m4 writable ..." + test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4 + fi + fi + echo "Running aclocal $aclocalinclude ..." + aclocal $aclocalinclude + if grep "^AM_CONFIG_HEADER" configure.in >/dev/null; then + echo "Running autoheader..." + autoheader + fi + echo "Running automake --gnu $am_opt ..." + automake --add-missing --gnu $am_opt + echo "Running autoconf ..." + autoconf + ) + fi +done + +conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c + +if test x$NOCONFIGURE = x; then + echo Running $srcdir/configure $conf_flags "$@" ... + $srcdir/configure $conf_flags "$@" \ + && echo Now type \`make\' to compile $PKG_NAME +else + echo Skipping configure process. +fi diff --git a/configure.in b/configure.in new file mode 100644 index 00000000..c932ecfc --- /dev/null +++ b/configure.in @@ -0,0 +1,55 @@ +AC_INIT(src/main.c) +AM_CONFIG_HEADER(config.h) + +AM_INIT_AUTOMAKE(gqview, 0.7.0f) + +AM_MAINTAINER_MODE + +AC_ISC_POSIX +AC_PROG_CC +AC_STDC_HEADERS +AC_ARG_PROGRAM + +dnl reasonable guesses for where stuff is installed +if test "x$prefix" = "xNONE"; then + prefix="/usr/local" +else + prefix=$prefix +fi + +AM_PATH_GTK(1.2.0,,AC_MSG_ERROR(GTK+ >= 1.2.0 not installed.)) +AM_PATH_GDK_IMLIB(1.9,,AC_MSG_ERROR(Imlib >= 1.9 not installed.)) + +dnl CHECK_GNOME + AC_PATH_PROG(GNOME_CONFIG,gnome-config,no) + AM_CONDITIONAL(HAVE_GNOME, test $GNOME_CONFIG != no) + if test "$GNOME_CONFIG" = no; then + AC_MSG_RESULT(GNOME icon and menu entry will NOT be installed) + else + AC_MSG_RESULT(will install a GNOME icon and menu entry) + AC_SUBST(GNOME_DATADIR) + GNOME_DATADIR="`$GNOME_CONFIG --datadir`" + fi + +dnl utility conditional +AM_CONDITIONAL(FALSE, test "x" = "y") + +dnl locale location for po +localedir='${prefix}/share/locale' +AC_SUBST(localedir) + +ALL_LINGUAS="de ja pt_BR ru" +AM_GNU_GETTEXT + +AC_SUBST(CFLAGS) +AC_SUBST(CPPFLAGS) +AC_SUBST(LDFLAGS) + +AC_OUTPUT([ +Makefile +intl/Makefile +po/Makefile.in +gqview.spec +src/Makefile +src/icons/Makefile +]) diff --git a/gqview.desktop b/gqview.desktop new file mode 100644 index 00000000..015ded62 --- /dev/null +++ b/gqview.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Name=GQview +Comment=Image Viewer +Exec=gqview +Icon=gqview.png +Terminal=0 +Type=Application diff --git a/gqview.png b/gqview.png new file mode 100644 index 0000000000000000000000000000000000000000..88801e0c139115fcdcf71245ea8d07a52e28c83d GIT binary patch literal 2883 zcmV-J3%vA+P)@thue zdS<$(yWgv-{i9wVb2;`Bo_=ao)qC~o*Wcgut$KnVKner^78RmHWQYz?<%W)srJ9iv zIx0U?LPw|)x>WrQ=5}?7pwbPo=#YdV5s@$?LJ|>mhC~iAi_|0_4F()CL`j4|38X|y zly8F)D3G8*3#3CkltY2GD2uk$Mo?)Rv_ToPAuuQdNQV~jYcwPv0f9vqh)Ot35gg1Q zLSzIHB7_hZK?ET-L_~;)C`3n?5Er5%T!abHz8hjnm=F~bl?XkqB~*wCQ6*GJ5FsrF z6(J*pK^jDai?9Y$gh`5)Km!;kA#zY&8~mEMpYZ2g+gWW03_(O-NYu0gLl8oaDM)GQYu-5%&ygR_F;K0g z{B@3zN@I|d*Rx?M^EvQQCYF5-We{0pegQTSGNd@l1tE(LAxBn_5-ndrTSOL-Tf}5zFRc~;C;+7g9^%Gn??$+83*{?tJFGKnHzH$-V_{($6 z+V$o8F6I&wdy=P2I)XftkdoeS)Plq_^%@_!_fsQl&!h?>l_!}aHBEAg5{*R~3!-uO z#HQX)KX`d#>@F3*+4|_4%-Z=6|31oCttYuSQwxWbu{H~WKl>Wf*XDvEi6Y57$tmil zAkwomTxH^S(dktG+xiFwo9<%^GL8QZ8J%?)uy)mr6XdXR(CIBFR~jIZ{(3 zrYX==q`5%TEU5y?iQ=-eW)4E9Ij>ncrfRTJ7D-%OrJR!wYfJ_tOC*Y<@+7CJ%Tkx4 zNK-z3Z(S%85o%$+InP;hv566KG5s(I3v*4DZl+wU0J$vuA!mc9zV6~w|l>El|n^;@H;SH7P@F0d~)Ap)V}Df!5{Bg$!3dk z<>y@-|Afps>cskgMn|}5L?O?c_nj# z@D$T$$Q39736hPpwXh~hhl$Cn{||xhM%W@_P_LCi*m#e$C`oNe($*Dku~m)8sFuCY zFPTjw>sdZeQG+(~gG-i0IHVIwiwI?K7XBhzt@(=14X)alx89|+hs0Ktcq_MBdI4*e zi>c+ET38`L>Pq4fZ~azFEsc$=!A4o66Rw;XBcy?v#Q4^2wdQm9xrwJ5@SdQRYnhEh z{Vm*TwRWj{cB|IRJOj;7JQb&QLRKnTHOeq_HU~RzSowD!SoQQXsmYOCWngaE^qqTo{_!ZJhPOIS~KdsJH&VQ$f03fU3D(mSl~}SpH)m2 z(cT<<4?*m7R)7EF|GegCpSM$ZJ{Yd|s z)$8l;`_Lg3VUZ_a4KLlYY{RDdV=tDr_qDuxOZvs9jYZ$FyTLiRrdw^>Dc5$(-yet- zy7|`GTl#YE?kOEVp8D|4sn7IHJTcg6(OnsH?RD8B$D23zOyBt*$M!v+$j{bGAL^aU z5|?&2{d(W{nX$0qD<=-koE;9OVf&|6J->InHt|dhM{O$uhiqLD+}Pjf7v8c%Z`q-p zP&@lwdj^YY&+v=qPY(|VPYyQxeSh|b?YYj3*}fyYZF|-szq$L^qq~oI@OE53^7aig z7O8!$xNLnBaO~)`&oN)PYol-o%c}>c&khxV*Y;1>CZ6S);Pk2R*ukjfiNe)8(pPUw zKDAejopRs*h8P-A5FI)YSmY;eogE$42ll5vfA=IXIJm4cWBd9~JLKg(IVXfCM$a8+ zJvEYi=DCiTe#Cr;YT4iQpRfG&)^_3e>9>cZ1$<=1Zn&(gZsX?kvxE6^Xy8!SYzqz_ z;N^qr(oF(*X@A0@Zt2f=X3XdBKD&Q^>Wa zxJ_ErB|Q!p9oAmgmkuQV>9!T$dZcZ5xUPJ}LI15oKN{?G2;e=mAMQJPegDdJmp56|-+s3J${kI+`o_jb zghh>w2;jqg!JYkaa_U?WpLn-tIQU}XvYtXm#&l-vL%UD9GNK6a_+Z8%fd}qB^3mI_ z@+S>|TDJxrL5Y38nmGAdZqs{OuD-6VKCPbo&Z!snPWW&eI$rqwQ`0x}XWoBn$JURx ze7SGznZ2cQ`q68;^_~50bi{W9hjPe{jD7WZ^2x!b`bOTrBiGRA_B_&+ovE|v?(V|< zU%mKG!}awIuCdYd-@Z9JlLBB80`WIjqeDy{it`CZe5zl=c$&M?U;4>f2mktk2~TB4 zM|4!(8YjveV-dzv9T(bfpG^&|gA%+BX|-Vm%AZq*F;Sc+7HQ-62Durz?}@_djme&C zleuYe_+W)A1~upRKJV4C!8oBiv=x55W&{liB9D;vgcXB3KgKgY!u_{p%ZCKPg)pAQ z>nn5jQd&k3VoKOjd}8lHY=n)l)*DONm>$YX-Sfxq7EJtYz*U!mJ2VslaIr#Rf&45}Ib2wSO%$J3I)ueptRb@T+l@mT!i9C-RT)yHl*;P3s8qD- zlRnh_#{>XU+JD3dT#TJ8*Wxnck>$@i6}qDhTGSMI-xcu!-XWAlNt8oMw2eP1`Hx3_ h5nXPJ8gm7Z{y!cd929m8#3TR!002ovPDHLkV1m!wkCXra literal 0 HcmV?d00001 diff --git a/gqview.spec.in b/gqview.spec.in new file mode 100644 index 00000000..fa10f4a4 --- /dev/null +++ b/gqview.spec.in @@ -0,0 +1,53 @@ +%define ver @VERSION@ +%define rel 1 +%define prefix /usr + +Summary: Graphics file browser utility. +Name: gqview +Version: %ver +Release: %rel +Copyright: GPL +Group: Applications/Multimedia +Source: http://gqview.netpedia.net/gqview-%{ver}.tar.gz +BuildRoot: /var/tmp/%{name}-%{version}-root + +URL: http://gqview.netpedia.net/index.html + +Requires: gtk+ >= 1.2 +Requires: imlib >= 1.9 + +%description +GQview is a browser for graphics files. +Offering single click viewing of your graphics files. +Includes thumbnail view, zoom and filtering features. +And external editor support. + +%prep +%setup + +%build +if [ ! -f configure ]; then + CFLAGS="$MYCFLAGS" ./autogen.sh $MYARCH_FLAGS --prefix=%prefix +else + CFLAGS="$MYCFLAGS" ./configure $MYARCH_FLAGS --prefix=%prefix +fi + +make + +%install +rm -rf $RPM_BUILD_ROOT + +make GNOME_DATADIR=$RPM_BUILD_ROOT%{prefix}/share prefix=$RPM_BUILD_ROOT%{prefix} install + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-, root, root) + +%doc README COPYING TODO +%{prefix}/bin/gqview +@HAVE_GNOME_TRUE@%{prefix}/share/gnome/apps/Graphics/gqview.desktop +@HAVE_GNOME_TRUE@%{prefix}/share/pixmaps/gqview.png + + diff --git a/po/.cvsignore b/po/.cvsignore new file mode 100644 index 00000000..22293000 --- /dev/null +++ b/po/.cvsignore @@ -0,0 +1,9 @@ +Makefile +Makefile.in +Makefile.in.in +POTFILES +cat-id-tbl.c +gqview.pot +stamp-cat-id +*.gmo +gqview.pot diff --git a/po/ChangeLog b/po/ChangeLog new file mode 100644 index 00000000..e69de29b diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 00000000..c7d1d08a --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,16 @@ +./src/config.c +./src/dnd.c +./src/filelist.c +./src/fileops.c +./src/image.c +./src/img-main.c +./src/img-view.c +./src/main.c +./src/menu.c +./src/pathsel.c +./src/rcfile.c +./src/tabcomp.c +./src/thumb.c +./src/utildlg.c +./src/utilops.c +./src/window.c diff --git a/po/de.po b/po/de.po new file mode 100644 index 00000000..81782189 --- /dev/null +++ b/po/de.po @@ -0,0 +1,852 @@ +# gqmpeg de.po file. +# Copyright (C) 1999 John Ellis. +# Matthias Warkus , 1999. +# +msgid "" +msgstr "" +"Project-Id-Version: gqmpeg-0.6.3a\n" +"POT-Creation-Date: 1999-08-21 14:22-0400\n" +"PO-Revision-Date: 1999-08-15 23:47+02:00\n" +"Last-Translator: Matthias Warkus \n" +"Language-Team: Me and my monkey \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/config.c:303 +msgid "GQview configuration" +msgstr "GQview-Konfiguration" + +#: src/config.c:315 +msgid "Ok" +msgstr "OK" + +#: src/config.c:320 +msgid "Apply" +msgstr "" + +#: src/config.c:325 src/utildlg.c:140 src/utilops.c:414 src/utilops.c:722 +#: src/utilops.c:851 src/utilops.c:949 +msgid "Cancel" +msgstr "Abbrechen" + +#: src/config.c:339 +msgid "General" +msgstr "Allgemein" + +#: src/config.c:347 +msgid "Initial directory" +msgstr "Anfängliches Verzeichnis" + +#: src/config.c:357 +msgid "On startup, change to this directory:" +msgstr "Beim Start in dieses Verzeichnis wechseln:" + +#: src/config.c:369 +msgid "Use current" +msgstr "Aktuelle benutzen" + +#: src/config.c:375 +msgid "Confirm file delete" +msgstr "Dateilöschung bestätigen" + +#: src/config.c:377 +msgid "Remember tool state (float/hidden)" +msgstr "An Werkzeugstatus erinnern (schwebend/verborgen)" + +#: src/config.c:379 +msgid "Remember window positions" +msgstr "An Fensterpositionen erinnern" + +#: src/config.c:381 +msgid "Slide show" +msgstr "Diavorführung" + +#: src/config.c:394 +msgid "Delay before image change (seconds):" +msgstr "Verzögerung vor Bildwechsel (Sekunden):" + +#: src/config.c:407 +msgid "Random" +msgstr "Zufall" + +#: src/config.c:409 +msgid "Repeat" +msgstr "Wiederholung" + +#: src/config.c:416 +msgid "Image" +msgstr "Bild" + +#: src/config.c:424 +msgid "When new image is selected:" +msgstr "Wenn neues Bild ausgewählt wird:" + +#: src/config.c:434 +msgid "Zoom to original size" +msgstr "Zu Ausgangsgröße zoomen" + +#: src/config.c:440 src/img-view.c:283 src/menu.c:458 src/menu.c:531 +#: src/menu.c:571 src/menu.c:661 +msgid "Fit image to window" +msgstr "Bild in Fenster einpassen" + +#: src/config.c:446 +msgid "Leave Zoom at previous setting" +msgstr "Zoom bei vorheriger Einstellung belassen" + +#: src/config.c:453 +msgid "Fit window to image when tools are hidden/floating" +msgstr "Bild in Fenster einpassen wenn Werkzeuge verborgen sind / schweben" + +#: src/config.c:460 +msgid "Limit size when auto-sizing window" +msgstr "Größe begrenzen bei der automatischen Fenstergrößenanpassung" + +#: src/config.c:470 src/menu.c:462 +msgid "Thumbnails" +msgstr "Indexbilder" + +#: src/config.c:486 +msgid "Size:" +msgstr "Größe:" + +#: src/config.c:515 +msgid "Cache thumbnails" +msgstr "Indexbilder cachen" + +#: src/config.c:517 +msgid "Use xvpics thumbnails when found (read only)" +msgstr "xvpics-Indexbilder benutzen, wenn gefunden (nur Lesezugriff)" + +#: src/config.c:520 +msgid "Progressive keyboard scrolling" +msgstr "Gleichmäßiges Tastaturrollen" + +#: src/config.c:527 +msgid "Filtering" +msgstr "Filtern" + +#: src/config.c:536 +msgid "Show entries that begin with a dot" +msgstr "Einträge zeigen, die mit einem Punkt beginnen" + +#: src/config.c:538 +msgid "Disable File Filtering" +msgstr "Dateifiltern abschalten" + +#: src/config.c:540 +msgid "Include files of type:" +msgstr "Dateien dieses Typ einschließen:" + +#: src/config.c:590 +msgid "Custom file types:" +msgstr "Selbstdefinierte Dateitypen::" + +#: src/config.c:603 +msgid "format: [.foo;.bar]" +msgstr "Format: [.foo;.bar]" + +#: src/config.c:612 +msgid "External Editors" +msgstr "Externe Editoren:" + +#: src/config.c:624 +msgid "#" +msgstr "Nr. " + +#: src/config.c:627 +msgid "Menu name" +msgstr "Menüname" + +#: src/config.c:630 +msgid "Command Line" +msgstr "Kommandozeile" + +#: src/config.c:660 src/menu.c:484 +msgid "About" +msgstr "Info" + +#: src/config.c:676 +#, c-format +msgid "" +"GQview %s\n" +"\n" +"Copyright (c) 1999 by John Ellis\n" +"http://gqview.netpedia.net\n" +"gqview@email.com\n" +"\n" +"Released under the GNU Public License" +msgstr "" +"QGview %s\n" +"\n" +"Copyright (C) 1999 by John Ellis\n" +"http://gqview.netpedia.net\n" +"gqview@email.com\n" +"\n" +"Freigegeben unter der GNU General Public License" + +#: src/filelist.c:51 +msgid " Slideshow" +msgstr " Diavorführung" + +#: src/filelist.c:55 +#, c-format +msgid "%d files (%d)%s" +msgstr "%d Dateien (%d)%s" + +#: src/filelist.c:57 +#, c-format +msgid "%d files%s" +msgstr "%d Dateien%s" + +#: src/filelist.c:960 +msgid "Loading thumbs..." +msgstr "Lade Indexbilder..." + +#: src/image.c:65 +#, c-format +msgid "( ? x ? ) %d bytes" +msgstr "( ? x ? ) %d Bytes" + +#: src/image.c:67 +#, c-format +msgid "( %d x %d ) %d bytes" +msgstr "( %d x %d ) %d Bytes" + +#: src/img-main.c:230 +msgid "GQview full screen" +msgstr "GQview Vollbild" + +#: src/img-view.c:280 src/menu.c:455 src/menu.c:528 src/menu.c:568 +#: src/menu.c:657 +msgid "Zoom in" +msgstr "Einzoomen" + +#: src/img-view.c:281 src/menu.c:456 src/menu.c:529 src/menu.c:569 +#: src/menu.c:659 +msgid "Zoom out" +msgstr "Wegzoomen" + +#: src/img-view.c:282 src/menu.c:457 src/menu.c:530 src/menu.c:570 +msgid "Zoom 1:1" +msgstr "Zoom 1:1" + +#. edit menu +#: src/img-view.c:286 src/menu.c:442 src/menu.c:503 src/menu.c:534 +#: src/menu.c:574 +msgid "Edit" +msgstr "Bearbeiten" + +#: src/img-view.c:291 src/menu.c:431 src/menu.c:510 src/menu.c:541 +#: src/menu.c:579 +msgid "Copy..." +msgstr "Kopieren..." + +#: src/img-view.c:292 src/menu.c:432 src/menu.c:511 src/menu.c:542 +#: src/menu.c:580 +msgid "Move..." +msgstr "Verschieben..." + +#: src/img-view.c:293 src/menu.c:433 src/menu.c:512 src/menu.c:543 +#: src/menu.c:581 +msgid "Rename..." +msgstr "Umbenennen.." + +#: src/img-view.c:294 src/menu.c:434 src/menu.c:513 src/menu.c:544 +#: src/menu.c:582 +msgid "Delete..." +msgstr "Löschen..." + +#: src/img-view.c:297 +msgid "Close window" +msgstr "Fenster schließen" + +#: src/main.c:90 src/main.c:119 +#, c-format +msgid "GQview running: %s\n" +msgstr "GQview läuft: %s\n" + +#: src/main.c:316 +msgid "" +"Usage: gqview [options] [path]\n" +"\n" +msgstr "" +"Verwendung: gqview [optionen] [pfad]\n" +"\n" + +#: src/main.c:317 +msgid "valid options are:\n" +msgstr "Gültige Optionen sind:\n" + +#: src/main.c:318 +msgid " +t, +tools force show of tools\n" +msgstr " +t, +tools Anzeige der Werkzeuge erzwingen\n" + +#: src/main.c:319 +msgid " -t, -tools force hide of tools\n" +msgstr " -t, -tools Verbergen der Werkzeuge erzwingen\n" + +#: src/main.c:320 +msgid " -debug turn on debug output\n" +msgstr " -debug Diagnoseausgabe einschalten\n" + +#: src/main.c:321 +msgid "" +" -help this message\n" +"\n" +msgstr "" +" -help Diese Meldung\n" +"\n" + +#: src/main.c:326 +#, c-format +msgid "" +"invalid or ignored: %s\n" +"Use -help for options\n" +msgstr "" +"Ungültig oder ignoriert: %s\n" +"Benutzen Sie -help für Optionen\n" + +#: src/main.c:353 +msgid "The Gimp" +msgstr "The Gimp" + +#: src/main.c:356 +msgid "Electric Eyes" +msgstr "Electric Eyes" + +#: src/main.c:359 +msgid "XV" +msgstr "XV" + +#: src/main.c:362 +msgid "Xpaint" +msgstr "Xpaint" + +#: src/menu.c:364 +#, c-format +msgid "in %s..." +msgstr "in %s..." + +#: src/menu.c:366 +msgid "in (unknown)..." +msgstr "in (unbekannt)..." + +#: src/menu.c:385 +msgid "Options..." +msgstr "Optionen..." + +#: src/menu.c:387 +msgid "Remove old thumbnails" +msgstr "Alte Indexbilder entfernen" + +#. file menu +#: src/menu.c:425 +msgid "File" +msgstr "Datei" + +#: src/menu.c:429 +msgid "Create Dir..." +msgstr "Verzeichnis anlegen..." + +#: src/menu.c:436 +msgid "Exit" +msgstr "Beenden" + +#. view menu +#: src/menu.c:451 +msgid "View" +msgstr "Ansicht" + +#: src/menu.c:461 src/menu.c:547 +msgid "Full screen" +msgstr "Vollbild" + +#: src/menu.c:469 +msgid "Refresh Lists" +msgstr "Listen auffrischen" + +#: src/menu.c:470 +msgid "(Un)Float file list" +msgstr "Dateiliste schweben lassen / einfangen" + +#: src/menu.c:471 src/menu.c:546 +msgid "(Un)Hide file list" +msgstr "Dateiliste verbergen / hervorholen" + +#: src/menu.c:474 +msgid "Toggle slideshow" +msgstr "Diavorführung an/aus" + +#. help menu +#: src/menu.c:480 +msgid "Help" +msgstr "Hilfe" + +#: src/menu.c:507 src/menu.c:538 +msgid "View in new window" +msgstr "In neuem Fenster anzeigen" + +#: src/menu.c:515 +msgid "Refresh" +msgstr "Auffrischen" + +#: src/menu.c:585 +msgid "Exit full screen" +msgstr "Vollbild verlassen" + +#: src/menu.c:644 +msgid "Create thumbnails" +msgstr "Indexbilder erzeugen" + +#: src/menu.c:653 +msgid "Change to home directory" +msgstr "Ins Heimverzeichnis wechseln" + +#: src/menu.c:655 +msgid "Refresh file list" +msgstr "Dateiliste auffrischen" + +#: src/menu.c:663 +msgid "Set zoom 1:1" +msgstr "Zoom auf 1:1 setzen" + +#: src/menu.c:665 +msgid "Configure options" +msgstr "Optionen konfigurieren" + +#: src/menu.c:667 +msgid "Float Controls" +msgstr "Kontrollen schweben lassen" + +#: src/rcfile.c:132 +#, c-format +msgid "error saving config file: %s\n" +msgstr "Fehler beim Speichern von Konfigurationsdatei: %s\n" + +#: src/thumb.c:127 src/thumb.c:151 +#, c-format +msgid "create dir failed: %s\n" +msgstr "Anlegen von Verzeichnis fehlgeschlagen: %s\n" + +#: src/thumb.c:233 +#, c-format +msgid "Unable to delete dir: %s\n" +msgstr "Kann Verzeichnis nicht löschen: %s\n" + +#: src/thumb.c:249 +#, c-format +msgid "failed to delete:%s\n" +msgstr "Kann nicht löschen: %s\n" + +#: src/utildlg.c:67 +msgid " Ok " +msgstr " OK " + +#: src/utilops.c:162 +#, fuzzy, c-format +msgid "" +"Overwrite file:\n" +" %s\n" +" with:\b %s" +msgstr "Datei überschreiben:\n" + +#: src/utilops.c:163 src/utilops.c:262 src/utilops.c:621 src/utilops.c:803 +msgid "Overwrite file" +msgstr "Datei überschreiben" + +#: src/utilops.c:164 +msgid "Skip" +msgstr "Überspringen" + +#: src/utilops.c:165 +msgid "Yes to all" +msgstr "Ja zu allen" + +#: src/utilops.c:166 +msgid "Yes" +msgstr "Ja" + +#: src/utilops.c:200 src/utilops.c:288 +#, fuzzy +msgid "Error copying file" +msgstr "Fehler beim Umbenennen von Datei" + +#: src/utilops.c:201 +#, c-format +msgid "" +"Unable to copy file:\n" +"%sto:\n" +"%s\n" +" during multiple file copy." +msgstr "" + +#: src/utilops.c:205 src/utilops.c:293 +#, fuzzy +msgid "Error moving file" +msgstr "Fehler beim Umbenennen von Datei" + +#: src/utilops.c:206 +#, fuzzy, c-format +msgid "" +"Unable to move file:\n" +"%sto:\n" +"%s\n" +" during multiple file move." +msgstr "" +"\n" +" während Verschieben mehrerer Dateien." + +#: src/utilops.c:209 src/utilops.c:486 +msgid "Continue" +msgstr "Fortsetzen" + +#: src/utilops.c:261 +#, fuzzy, c-format +msgid "" +"Overwrite file:\n" +"%s\n" +" with:\n" +"%s" +msgstr "Datei überschreiben:\n" + +#: src/utilops.c:263 src/utilops.c:622 src/utilops.c:804 +msgid "Overwrite" +msgstr "Überschreiben" + +#: src/utilops.c:289 +#, fuzzy, c-format +msgid "" +"Unable to copy file:\n" +"%s\n" +"to:\n" +"%s" +msgstr "Kann Datei nicht löschen:\n" + +#: src/utilops.c:294 +#, fuzzy, c-format +msgid "" +"Unable to move file:\n" +"%s\n" +"to:\n" +"%s" +msgstr "Kann Datei nicht umbenennen:\n" + +#: src/utilops.c:337 +msgid "Invalid destination" +msgstr "Ungültiges Ziel" + +#: src/utilops.c:337 +msgid "" +"When operating with multiple files, please select\n" +" a directory, not file." +msgstr "" +"Beim Umgang mit mehreren Dateien, bitte ein\n" +" Verzeichnis, keine Datei wählen." + +#: src/utilops.c:339 +msgid "Invalid directory" +msgstr "Ungültiges Verzeichnis" + +#: src/utilops.c:339 +msgid "Please select an existing directory" +msgstr "Bitte wählen Sie ein existierendes Verzeichnis" + +#: src/utilops.c:397 +msgid "GQview - copy" +msgstr "GQview - Kopieren" + +#: src/utilops.c:398 +msgid "Copy" +msgstr "Kopieren" + +#: src/utilops.c:400 +#, c-format +msgid "" +"Copy file:\n" +"%s\n" +"to:" +msgstr "" + +#: src/utilops.c:402 +#, fuzzy, c-format +msgid "" +"Copy multiple files from:\n" +"%s\n" +"to:" +msgstr " mehrere Dateien von:\n" + +#: src/utilops.c:406 +msgid "GQview - move" +msgstr "GQview - Verschieben" + +#: src/utilops.c:407 +msgid "Move" +msgstr "Verschieben" + +#: src/utilops.c:409 +#, c-format +msgid "" +"Move file:\n" +"%s\n" +"to:" +msgstr "" + +#: src/utilops.c:411 +#, fuzzy, c-format +msgid "" +"Move multiple files from:\n" +"%s\n" +"to:" +msgstr " mehrere Dateien von:\n" + +#: src/utilops.c:484 +#, fuzzy, c-format +msgid "" +"Unable to delete file:\n" +" %s\n" +" Continue multiple delete operation?" +msgstr "" +"\n" +"Mehrfaches Löschen fortsetzen?" + +#: src/utilops.c:485 src/utilops.c:491 +msgid "Delete failed" +msgstr "Löschen fehlgeschlagen" + +#: src/utilops.c:490 src/utilops.c:535 +#, fuzzy, c-format +msgid "" +"Unable to delete file:\n" +"%s" +msgstr "Kann Datei nicht löschen:\n" + +#: src/utilops.c:520 +msgid "Delete files" +msgstr "Dateien löschen" + +#: src/utilops.c:520 +msgid "About to delete multiple files..." +msgstr "Werde mehrere Dateien löschen..." + +#: src/utilops.c:521 src/utilops.c:566 +msgid "Delete" +msgstr "Löschen" + +#: src/utilops.c:536 +msgid "File deletion failed" +msgstr "Dateilöschen fehlgeschlagen" + +#: src/utilops.c:564 +#, fuzzy, c-format +msgid "" +"About to delete the file:\n" +" %s" +msgstr "Werde Datei löschen:\n" + +#: src/utilops.c:565 +msgid "Delete file" +msgstr "Datei löschen" + +#: src/utilops.c:620 +#, fuzzy, c-format +msgid "" +"Overwrite file:\n" +"%s\n" +"by renaming:\n" +"%s" +msgstr "Datei überschreiben:\n" + +#: src/utilops.c:631 +#, fuzzy, c-format +msgid "" +"Unable to rename file:\n" +"%s\n" +" to:\n" +"%s" +msgstr "Kann Datei nicht umbenennen:\n" + +#: src/utilops.c:632 src/utilops.c:813 +msgid "Error renaming file" +msgstr "Fehler beim Umbenennen von Datei" + +#: src/utilops.c:722 src/utilops.c:851 +msgid "GQview - rename" +msgstr "GQview - Umbenennen" + +#: src/utilops.c:722 +msgid "Rename multiple files:" +msgstr "Mehrere Dateien umbenennen:" + +#: src/utilops.c:722 src/utilops.c:851 +msgid "Rename" +msgstr "Umbenennen" + +#: src/utilops.c:758 +msgid "Rename:" +msgstr "Umbenennen:" + +#: src/utilops.c:767 +msgid "to:" +msgstr "in:" + +#: src/utilops.c:802 +#, fuzzy, c-format +msgid "" +"Overwrite file:\n" +"%s\n" +"with:\n" +"%s" +msgstr "Datei überschreiben:\n" + +#: src/utilops.c:812 +#, fuzzy, c-format +msgid "" +"Unable to rename file:\n" +"%s\n" +"to:\n" +"%s" +msgstr "Kann Datei nicht umbenennen:\n" + +#: src/utilops.c:850 +#, fuzzy, c-format +msgid "" +"Rename file:\n" +"%s\n" +"to:" +msgstr "Datei umbenennen:\n" + +#: src/utilops.c:894 +#, fuzzy, c-format +msgid "" +"The path:\n" +"%s\n" +"already exists as a file." +msgstr "" +"\n" +" existiert bereits als Datei." + +#: src/utilops.c:895 +msgid "Could not create directory" +msgstr "Konnte Verzeichnis nicht anlegen" + +#: src/utilops.c:900 +#, fuzzy, c-format +msgid "" +"The directory:\n" +"%s\n" +"already exists." +msgstr "" +"\n" +" existiert bereits" + +#: src/utilops.c:901 +msgid "Directory exists" +msgstr "Verzeichnis existiert" + +#: src/utilops.c:908 +#, fuzzy, c-format +msgid "" +"Unable to create directory:\n" +"%s" +msgstr "Kann Verzeichnis nicht anlegen:\n" + +#: src/utilops.c:909 +msgid "Error creating directory" +msgstr "Fehler beim Anlegen von Verzeichnis" + +#: src/utilops.c:948 +#, fuzzy, c-format +msgid "" +"Create directory in:\n" +"%s\n" +"named:" +msgstr "Verzeichnis anlegen in:\n" + +#: src/utilops.c:949 +msgid "GQview - new directory" +msgstr "GQview - Neues Verzeichnis" + +#: src/utilops.c:949 +msgid "Create" +msgstr "Erzeugen" + +#: src/window.c:151 +msgid "GQview Tools" +msgstr "GQview-Werkzeuge" + +#~ msgid "Save" +#~ msgstr "Speichern" + +#~ msgid "Save settings on exit" +#~ msgstr "Einstellungen beim Beenden speichern" + +#~ msgid "Save options" +#~ msgstr "Optionen speichern..." + +#~ msgid "copy" +#~ msgstr "Kopieren" + +#~ msgid "move" +#~ msgstr "Verschieben" + +#~ msgid "" +#~ "\n" +#~ " with:\n" +#~ msgstr "" +#~ "\n" +#~ " mit:\n" + +#~ msgid "Error " +#~ msgstr "Fehler " + +#~ msgid "ing file" +#~ msgstr "von Datei" + +#~ msgid "Unable to " +#~ msgstr "Kann nicht " + +#~ msgid " file:\n" +#~ msgstr " Datei:\n" + +#~ msgid "" +#~ "\n" +#~ " to:\n" +#~ msgstr "" +#~ "\n" +#~ " nach:\n" + +#~ msgid "" +#~ "\n" +#~ "to:" +#~ msgstr "" +#~ "\n" +#~ "nach:" + +#~ msgid "" +#~ "\n" +#~ " by renaming:\n" +#~ msgstr "" +#~ "\n" +#~ " beim Umbenennen:\n" + +#~ msgid "" +#~ "\n" +#~ " to:" +#~ msgstr "" +#~ "\n" +#~ " in:" + +#~ msgid "The path:\n" +#~ msgstr "Der Pfad:\n" + +#~ msgid "The directory:\n" +#~ msgstr "Das Verzeichnis:\n" + +#~ msgid "" +#~ "\n" +#~ " named:" +#~ msgstr "" +#~ "\n" +#~ " genannt:" diff --git a/po/ja.po b/po/ja.po new file mode 100644 index 00000000..177b879d --- /dev/null +++ b/po/ja.po @@ -0,0 +1,855 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 1999-09-27 03:05+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" + +#: config.c:295 +msgid "GQview configuration" +msgstr "GQview¤ÎÀßÄê" + +#: config.c:307 +msgid "Ok" +msgstr "Ok" + +#: config.c:312 +msgid "Save" +msgstr "¥»¡¼¥Ö" + +#: config.c:317 utildlg.c:140 utilops.c:401 utilops.c:697 utilops.c:923 +msgid "Cancel" +msgstr "¥­¥ã¥ó¥»¥ë" + +#: config.c:331 +msgid "General" +msgstr "°ìÈÌ" + +#: config.c:339 +msgid "Initial directory" +msgstr "½é´ü¥Ç¥£¥ì¥¯¥È¥ê:" + +#: config.c:349 +msgid "On startup, change to this directory:" +msgstr "µ¯Æ°»þ¤Ë¤³¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ø°ÜÆ°¤¹¤ë" + +#: config.c:361 +msgid "Use current" +msgstr "¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê" + +#: config.c:367 +msgid "Confirm file delete" +msgstr "ºï½ü»þ¤Ë³Îǧ" + +#: config.c:369 +msgid "Save settings on exit" +msgstr "½ªÎ»»þ¤ËÀßÄê¤òÊݸ¤¹¤ë" + +#: config.c:371 +msgid "Remember tool state (float/hidden)" +msgstr "¥Ä¡¼¥ë¥Ð¡¼¤Î¾õÂÖ¤òÊÝ»ý(float¤äÈóɽ¼¨)" + +#: config.c:373 +msgid "Remember window positions" +msgstr "¥¦¥£¥ó¥É¥¦°ÌÃÖ¤òÊÝ»ý" + +#: config.c:375 +msgid "Slide show" +msgstr "¥¹¥é¥¤¥É¥·¥ç¥¦:" + +#: config.c:388 +msgid "Delay before image change (seconds):" +msgstr "¼¡¤Î¥¤¥á¡¼¥¸¤Þ¤Ç¤ÎÉÿô" + +#: config.c:401 +msgid "Random" +msgstr "¥é¥ó¥À¥à" + +#: config.c:403 +msgid "Repeat" +msgstr "·«¤êÊÖ¤¹" + +#: config.c:410 +msgid "Image" +msgstr "¥¤¥á¡¼¥¸" + +#: config.c:418 +msgid "When new image is selected:" +msgstr "¤¢¤¿¤é¤·¤¤¥¤¥á¡¼¥¸¤¬ÁªÂò¤µ¤ì¤¿¤È¤­:" + +#: config.c:428 +msgid "Zoom to original size" +msgstr "¥ª¥ê¥¸¥Ê¥ë¤Î¥µ¥¤¥º¤Ø³ÈÂç" + +#: config.c:434 img-view.c:283 menu.c:464 menu.c:537 menu.c:578 menu.c:668 +msgid "Fit image to window" +msgstr "¥¦¥£¥ó¥É¥¦¤Ë¥Õ¥£¥Ã¥È¤µ¤»¤ë" + +#: config.c:440 +msgid "Leave Zoom at previous setting" +msgstr "ľÁ°¤Î¥º¡¼¥à¤ÎÀßÄê¤ò˺¤ì¤ë" + +#: config.c:447 +msgid "Fit window to image when tools are hidden/floating" +msgstr "¥Ä¡¼¥ë¥Ð¡¼¤Î¾õÂÖÊѹ¹»þ¤Ë¥¤¥á¡¼¥¸¤ò¥¦¥£¥ó¥É¥¦¤Ë¥Õ¥£¥Ã¥È¤µ¤»¤ë" + +#: config.c:454 +msgid "Limit size when auto-sizing window" +msgstr "¥¦¥£¥ó¥É¥¦¤Î¼«Æ°Ä´Àá¤Î¸Â³¦" + +#: config.c:464 menu.c:468 +msgid "Thumbnails" +msgstr "¥µ¥à¥Í¥¤¥ë:" + +#: config.c:480 +msgid "Size:" +msgstr "¥µ¥¤¥º" + +#: config.c:484 +msgid "48x48" +msgstr "" + +#: config.c:490 +msgid "64x64" +msgstr "" + +#: config.c:496 +msgid "85x64" +msgstr "" + +#: config.c:502 +msgid "100x100" +msgstr "" + +#: config.c:509 +msgid "Cache thumbnails" +msgstr "¥µ¥à¥Í¥¤¥ë¤ò¥­¥ã¥Ã¥·¥å¤¹¤ë" + +#: config.c:511 +msgid "Use xvpics thumbnails when found (read only)" +msgstr "xvpics¤¬¤¢¤ë»þ¤Ë»ÈÍѤ¹¤ë(Æɤ߹þ¤ß¤Î¤ß)" + +#: config.c:514 +msgid "Progressive keyboard scrolling" +msgstr "¥­¡¼¥Ü¡¼¥É¤Ë¤è¤ë¥¹¥¯¥í¡¼¥ë" + +#: config.c:521 +msgid "Filtering" +msgstr "¥Õ¥£¥ë¥¿¥ê¥ó¥°" + +#: config.c:530 +msgid "Show entries that begin with a dot" +msgstr "¥É¥Ã¥È¥Õ¥¡¥¤¥ë¤âɽ¼¨¤¹¤ë" + +#: config.c:532 +msgid "Disable File Filtering" +msgstr "¥Õ¥£¥ë¥¿¥ê¥ó¥°¤·¤Ê¤¤" + +#: config.c:534 +msgid "Include files of type:" +msgstr "ɽ¼¨¤¹¤ë³ÈÄ¥»Ò:" + +#: config.c:552 +msgid "JPG / JPEG" +msgstr "" + +#: config.c:554 +msgid "XPM" +msgstr "" + +#: config.c:556 +msgid "TIF / TIFF" +msgstr "" + +#: config.c:563 +msgid "GIF" +msgstr "" + +#: config.c:565 +msgid "PNG" +msgstr "" + +#: config.c:567 +msgid "PPM" +msgstr "" + +#: config.c:574 +msgid "PGM" +msgstr "" + +#: config.c:576 +msgid "PCX" +msgstr "" + +#: config.c:578 +msgid "BMP" +msgstr "" + +#: config.c:584 +msgid "Custom file types:" +msgstr "¥«¥¹¥¿¥à¥¿¥¤¥×" + +#: config.c:597 +msgid "format: [.foo;.bar]" +msgstr "½ñ¼°: [.foo;.bar]" + +#: config.c:606 +msgid "External Editors" +msgstr "³°Éô¥¨¥Ç¥£¥¿" + +#: config.c:618 +msgid "#" +msgstr "" + +#: config.c:621 +msgid "Menu name" +msgstr "ɽ¼¨Ì¾" + +#: config.c:624 +msgid "Command Line" +msgstr "¥³¥Þ¥ó¥É" + +#: config.c:654 menu.c:490 +msgid "About" +msgstr "" + +#: config.c:670 +#, c-format +msgid "" +"GQview %d.%d.%d\n" +"\n" +"Copyright (c) 1999 by John Ellis\n" +"http://gqview.netpedia.net\n" +"gqview@email.com\n" +"\n" +"Released under the GNU Public License" +msgstr "" + +#: dnd.c:130 +#, c-format +msgid "dropped: %s\n" +msgstr "" + +#: filelist.c:51 +msgid " Slideshow" +msgstr "¥¹¥é¥¤¥É¥·¥ç¥¦" + +#: filelist.c:55 +#, c-format +msgid "%d files (%d)%s" +msgstr "" + +#: filelist.c:57 +#, c-format +msgid "%d files%s" +msgstr "" + +#: filelist.c:221 +#, c-format +msgid "s = %d\n" +msgstr "" + +#: filelist.c:225 +#, c-format +msgid "files selected = %d\n" +msgstr "" + +#: filelist.c:466 +#, c-format +msgid "row = %d, closest is %d\n" +msgstr "" + +#: filelist.c:959 +msgid "Loading thumbs..." +msgstr "" + +#: image.c:50 +#, c-format +msgid "%d :%s%d" +msgstr "" + +#: image.c:65 +#, c-format +msgid "( ? x ? ) %d bytes" +msgstr "" + +#: image.c:67 +#, c-format +msgid "( %d x %d ) %d bytes" +msgstr "" + +#: image.c:127 +#, c-format +msgid "auto sized to %d x %d\n" +msgstr "" + +#: image.c:282 +#, c-format +msgid "recalc %d x %d @ %f\n" +msgstr "" + +#: image.c:411 +#, c-format +msgid "redrawn %d x %d\n" +msgstr "" + +#: image.c:417 +msgid "redraw cancelled\n" +msgstr "" + +#: image.c:494 +#, c-format +msgid "sized %d x %d (%d x %d)\n" +msgstr "" + +#: image.c:700 +msgid "GQview - " +msgstr "" + +#: img-main.c:230 +msgid "GQview full screen" +msgstr "GQview ¥Õ¥ë¥¹¥¯¥ê¡¼¥ó" + +#: img-view.c:153 window.c:82 window.c:418 +msgid "GQview" +msgstr "" + +#: img-view.c:280 menu.c:461 menu.c:534 menu.c:574 menu.c:664 +msgid "Zoom in" +msgstr "³ÈÂç" + +#: img-view.c:281 menu.c:462 menu.c:535 menu.c:576 menu.c:666 +msgid "Zoom out" +msgstr "½Ì¾®" + +#: img-view.c:282 menu.c:463 menu.c:536 menu.c:577 +msgid "Zoom 1:1" +msgstr "¸µ¤Î¥µ¥¤¥º" + +#: img-view.c:286 menu.c:448 menu.c:509 menu.c:540 menu.c:581 +msgid "Edit" +msgstr "ÊÔ½¸" + +#: img-view.c:291 menu.c:437 menu.c:516 menu.c:547 menu.c:586 +msgid "Copy..." +msgstr "¥³¥Ô¡¼..." + +#: img-view.c:292 menu.c:438 menu.c:517 menu.c:548 menu.c:587 +msgid "Move..." +msgstr "°ÜÆ°..." + +#: img-view.c:293 menu.c:439 menu.c:518 menu.c:549 menu.c:588 +msgid "Rename..." +msgstr "̾Á°¤ÎÊѹ¹..." + +#: img-view.c:294 menu.c:440 menu.c:519 menu.c:550 menu.c:589 +msgid "Delete..." +msgstr "ºï½ü..." + +#: img-view.c:297 +msgid "Close window" +msgstr "¥¦¥£¥ó¥É¥¦¤òÊĤ¸¤ë" + +#: main.c:89 +#, c-format +msgid "%s \"%s\" &" +msgstr "" + +#: main.c:90 main.c:119 +#, c-format +msgid "GQview running: %s\n" +msgstr "" + +#: main.c:300 +msgid "debugging output enabled\n" +msgstr "" + +#: main.c:315 +#, c-format +msgid "GQview version %d.%d.%d\n" +msgstr "" + +#: main.c:316 +msgid "" +"Usage: gqview [options] [path]\n" +"\n" +msgstr "" +"»È¤¤Êý: gqview [¥ª¥×¥·¥ç¥ó] [¥Ñ¥¹]\n" +"\n" + +#: main.c:317 +msgid "valid options are:\n" +msgstr "¥ª¥×¥·¥ç¥ó:\n" + +#: main.c:318 +msgid " +t, +tools force show of tools\n" +msgstr " +t, +tools ¥Ä¡¼¥ë¥Ð¡¼¤òɽ¼¨\n" + +#: main.c:319 +msgid " -t, -tools force hide of tools\n" +msgstr " -t, -tools ¥Ä¡¼¥ë¥Ð¡¼¤òÈóɽ¼¨\n" + +#: main.c:320 +msgid " -debug turn on debug output\n" +msgstr " -debug ¥Ç¥Ð¥Ã¥°ÍѤνÐÎϤòÍ­¸ú¤Ë¤¹¤ë\n" + +#: main.c:321 +msgid "" +" -help this message\n" +"\n" +msgstr "" +" -help ¤³¤Î¥á¥Ã¥»¡¼¥¸¤òɽ¼¨\n" +"\n" + +#: main.c:326 +#, c-format +msgid "" +"invalid or ignored: %s\n" +"Use -help for options\n" +msgstr "" +"%s¤ÏÉÔÌÀ¤Ç¤¹¡£\n" +"¾Ü¤·¤¯¤Ï `gqview -help` ¤ò¼Â¹Ô¤·¤Æ¤¯¤À¤µ¤¤¡£\n" + +#: main.c:353 +msgid "The Gimp" +msgstr "" + +#: main.c:356 +msgid "Electric Eyes" +msgstr "" + +#: main.c:359 +msgid "XV" +msgstr "" + +#: main.c:362 +msgid "Xpaint" +msgstr "" + +#: menu.c:369 +#, c-format +msgid "in %s..." +msgstr "" + +#: menu.c:371 +msgid "in (unknown)..." +msgstr "" + +#: menu.c:390 +msgid "Options..." +msgstr "¥ª¥×¥·¥ç¥ó..." + +#: menu.c:391 +msgid "Save options" +msgstr "ÀßÄê¤òÊݸ" + +#: menu.c:393 +msgid "Remove old thumbnails" +msgstr "¸Å¤¤¥µ¥à¥Í¥¤¥ë¤òÇË´þ" + +#: menu.c:431 +msgid "File" +msgstr "¥Õ¥¡¥¤¥ë" + +#: menu.c:435 +msgid "Create Dir..." +msgstr "¥Ç¥£¥ì¥¯¥È¥êºîÀ®..." + +#: menu.c:442 +msgid "Exit" +msgstr "½ªÎ»" + +#: menu.c:457 +msgid "View" +msgstr "¥Ó¥å¡¼" + +#: menu.c:467 menu.c:553 +msgid "Full screen" +msgstr "¥Õ¥ë¥¹¥¯¥ê¡¼¥ó" + +#: menu.c:469 +msgid "activate" +msgstr "" + +#: menu.c:475 +msgid "Refresh Lists" +msgstr "¥ê¥¹¥È¤Î¹¹¿·" + +#: menu.c:476 +msgid "(Un)Float file list" +msgstr "¥Õ¥¡¥¤¥ë¥ê¥¹¥È¤ò(Èó)¥Õ¥í¡¼¥È¤Ë¤¹¤ë" + +#: menu.c:477 menu.c:552 +msgid "(Un)Hide file list" +msgstr "¥Õ¥¡¥¤¥ë¥ê¥¹¥È¤ò(Èó)ɽ¼¨¤Ë¤¹¤ë" + +#: menu.c:480 +msgid "Toggle slideshow" +msgstr "¥¹¥é¥¤¥É¥·¥ç¥¦" + +#: menu.c:486 +msgid "Help" +msgstr "¥Ø¥ë¥×" + +#: menu.c:513 menu.c:544 +msgid "View in new window" +msgstr "¿·¤·¤¤¥¦¥£¥ó¥É¥¦¤Ç¤ß¤ë" + +#: menu.c:521 +msgid "Refresh" +msgstr "¹¹¿·" + +#: menu.c:592 +msgid "Exit full screen" +msgstr "¥Õ¥ë¥¹¥¯¥ê¡¼¥ó¤ò¤ä¤á¤ë" + +#: menu.c:651 +msgid "Create thumbnails" +msgstr "¥µ¥à¥Í¥¤¥ëºîÀ®" + +#: menu.c:660 +msgid "Change to home directory" +msgstr "¥Û¡¼¥à¥Ç¥£¥ì¥¯¥È¥ê¤Ø°ÜÆ°" + +#: menu.c:662 +msgid "Refresh file list" +msgstr "¥Õ¥¡¥¤¥ë¥ê¥¹¥È¤Î¹¹¿·" + +#: menu.c:670 +msgid "Set zoom 1:1" +msgstr "¸µ¤Î¥µ¥¤¥º¤Ë¤¹¤ë" + +#: menu.c:672 +msgid "Configure options" +msgstr "¥ª¥×¥·¥ç¥óÀßÄê" + +#: menu.c:674 +msgid "Float Controls" +msgstr "¥³¥ó¥È¥í¡¼¥ë¤ò¥Õ¥í¡¼¥È¾õÂ֤ˤ¹¤ë" + +#: tabcomp.c:388 +msgid "Tab completion error: entry != NULL\n" +msgstr "" + +#: thumb.c:32 +#, c-format +msgid "Gen thumbnail:%s\n" +msgstr "¥µ¥à¥Í¥¤¥ëºîÀ®:%s\n" + +#: thumb.c:40 +msgid "XV thumbnail found, loaded\n" +msgstr "XV¤Î¥µ¥à¥Í¥¤¥ë¤ò¸«¤Ä¤±¤¿¤Î¤Ç¡¢Æɤ߹þ¤ß¤Þ¤·¤¿\n" + +#: thumb.c:54 +#, c-format +msgid "Found in cache:%s\n" +msgstr "¥­¥ã¥Ã¥·¥å¤ò¸«¤Ä¤±¤Þ¤·¤¿:%s\n" + +#: thumb.c:116 +#, c-format +msgid "creating thumbnail dir:%s\n" +msgstr "%s¥Ç¥£¥ì¥¯¥È¥ê¤Î¥µ¥à¥Í¥¤¥ë¤òºîÀ®¤·¤Æ¤¤¤Þ¤¹¡£\n" + +#: thumb.c:118 thumb.c:142 +#, c-format +msgid "create dir failed: %s\n" +msgstr "%s¥Ç¥£¥ì¥¯¥È¥ê¤Ç¼ºÇÔ¤·¤Þ¤·¤¿¡£\n" + +#: thumb.c:140 +#, c-format +msgid "creating sub dir:%s\n" +msgstr "¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê%s¤Î¥µ¥à¥Í¥¤¥ë¤òºîÀ®¤·¤Æ¤¤¤Þ¤¹¡£\n" + +#: thumb.c:151 +#, c-format +msgid "Saving thumb: %s\n" +msgstr "¥µ¥à¥Í¥¤¥ë%s¤òÊݸ¤·¤Þ¤·¤¿¡£\n" + +#: thumb.c:186 +#, c-format +msgid "maintainance check: %s\n" +msgstr "%s¤ò¥á¥ó¥Æ¥Ê¥ó¥¹¤Î¤¿¤á¥Á¥§¥Ã¥¯¤·¤Æ¤¤¤Þ¤¹¡£\n" + +#: thumb.c:222 +#, c-format +msgid "Deleting thumb dir: %s\n" +msgstr "%s¥Ç¥£¥ì¥¯¥È¥ê¤Î¥µ¥à¥Í¥¤¥ë¤òºï½ü¤·¤Æ¤¤¤Þ¤¹¡£\n" + +#: thumb.c:224 +#, c-format +msgid "Unable to delete dir: %s\n" +msgstr "%s¥Ç¥£¥ì¥¯¥È¥ê¤Çºï½ü¤Ë¼ºÇÔ¡£\n" + +#: thumb.c:238 +#, c-format +msgid "Deleting thumb: %s\n" +msgstr "¥µ¥à¥Í¥¤¥ë%s¤òºï½ü¤·¤Æ¤¤¤Þ¤¹¡£\n" + +#: thumb.c:240 +#, c-format +msgid "failed to delete:%s\n" +msgstr "%s¤Îºï½ü¤Ë¼ºÇÔ\n" + +#: utildlg.c:67 +msgid " Ok " +msgstr "" + +#: utilops.c:112 utilops.c:231 +msgid "copy" +msgstr "¥³¥Ô¡¼" + +#: utilops.c:114 utilops.c:233 +msgid "move" +msgstr "°ÜÆ°" + +#: utilops.c:168 utilops.c:262 utilops.c:595 utilops.c:776 +msgid "Overwrite file:\n" +msgstr "¥Õ¥¡¥¤¥ë¤Î¾å½ñ¤­:\n" + +#: utilops.c:168 utilops.c:262 utilops.c:776 +msgid "" +"\n" +" with:\n" +msgstr "" +"\n" +"¤ò...\n" + +#: utilops.c:169 utilops.c:263 utilops.c:596 utilops.c:777 +msgid "Overwrite file" +msgstr "¥Õ¥¡¥¤¥ë¤Î¾å½ñ¤­" + +#: utilops.c:170 +msgid "Skip" +msgstr "¥¹¥­¥Ã¥×" + +#: utilops.c:171 +msgid "Yes to all" +msgstr "¤¹¤Ù¤Æ¤Ï¤¤" + +#: utilops.c:172 +msgid "Yes" +msgstr "¤Ï¤¤" + +#: utilops.c:202 utilops.c:285 +msgid "Error " +msgstr "¥¨¥é¡¼" + +#: utilops.c:202 +msgid "ing file" +msgstr "" + +#: utilops.c:203 utilops.c:286 +msgid "Unable to " +msgstr "" + +#: utilops.c:203 utilops.c:286 utilops.c:397 +msgid " file:\n" +msgstr "" + +#: utilops.c:203 utilops.c:286 utilops.c:606 utilops.c:786 +msgid "" +"\n" +" to:\n" +msgstr "" + +#: utilops.c:203 +msgid "" +"\n" +" during multiple file move." +msgstr "" + +#: utilops.c:205 utilops.c:461 +msgid "Continue" +msgstr "" + +#: utilops.c:264 utilops.c:597 utilops.c:778 +msgid "Overwrite" +msgstr "" + +#: utilops.c:328 +msgid "Invalid destination" +msgstr "" + +#: utilops.c:328 +msgid "" +"When operating with multiple files, please select\n" +" a directory, not file." +msgstr "" + +#: utilops.c:330 +msgid "Invalid directory" +msgstr "" + +#: utilops.c:330 +msgid "Please select an existing directory" +msgstr "" + +#: utilops.c:387 +msgid "GQview - copy" +msgstr "" + +#: utilops.c:388 +msgid "Copy" +msgstr "" + +#: utilops.c:392 +msgid "GQview - move" +msgstr "" + +#: utilops.c:393 +msgid "Move" +msgstr "" + +#: utilops.c:397 utilops.c:399 +msgid "" +"\n" +"to:" +msgstr "" + +#: utilops.c:399 +msgid " multiple files from:\n" +msgstr "" + +#: utilops.c:459 utilops.c:465 utilops.c:510 +msgid "Unable to delete file:\n" +msgstr "" + +#: utilops.c:459 +msgid "" +"\n" +"Continue multiple delete operation?" +msgstr "" + +#: utilops.c:460 utilops.c:466 +msgid "Delete failed" +msgstr "" + +#: utilops.c:495 +msgid "Delete files" +msgstr "" + +#: utilops.c:495 +msgid "About to delete multiple files..." +msgstr "" + +#: utilops.c:496 utilops.c:541 +msgid "Delete" +msgstr "" + +#: utilops.c:511 +msgid "File deletion failed" +msgstr "" + +#: utilops.c:539 +msgid "About to delete the file:\n" +msgstr "" + +#: utilops.c:540 +msgid "Delete file" +msgstr "" + +#: utilops.c:595 +msgid "" +"\n" +" by renaming:\n" +msgstr "" + +#: utilops.c:606 utilops.c:786 +msgid "Unable to rename file:\n" +msgstr "" + +#: utilops.c:607 utilops.c:787 +msgid "Error renaming file" +msgstr "" + +#: utilops.c:624 +#, c-format +msgid "r=%d n=%d\n" +msgstr "" + +#: utilops.c:640 +#, c-format +msgid "closed by #%d\n" +msgstr "" + +#: utilops.c:697 utilops.c:825 +msgid "GQview - rename" +msgstr "" + +#: utilops.c:697 +msgid "Rename multiple files:" +msgstr "" + +#: utilops.c:697 +msgid "Rename" +msgstr "" + +#: utilops.c:732 +msgid "Rename:" +msgstr "" + +#: utilops.c:741 +msgid "to:" +msgstr "" + +#: utilops.c:824 +msgid "Rename file:\n" +msgstr "" + +#: utilops.c:824 +msgid "" +"\n" +" to:" +msgstr "" + +#: utilops.c:868 +msgid "The path:\n" +msgstr "" + +#: utilops.c:868 +msgid "" +"\n" +" already exists as a file." +msgstr "" + +#: utilops.c:874 +msgid "The directory:\n" +msgstr "" + +#: utilops.c:874 +msgid "" +"\n" +" already exists." +msgstr "" + +#: utilops.c:882 +msgid "Unable to create directory:\n" +msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤ÎºîÀ®¤¬¤Ç¤­¤Þ¤»¤ó¡£\n" + +#: utilops.c:922 +msgid "Create directory in:\n" +msgstr "¥Ç¥£¥ì¥¯¥È¥êºîÀ®\n" + +#: utilops.c:922 +msgid "" +"\n" +" named:" +msgstr "" + +#: utilops.c:923 +msgid "GQview - new directory" +msgstr "GQview - ¿·µ¬¥Ç¥£¥ì¥¯¥È¥ê" + +#: utilops.c:923 +msgid "Create" +msgstr "ºîÀ®" + diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100644 index 00000000..56ac6955 --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,798 @@ +# gqview pt_BR.po file. +# Copyright (C) 1999 Vitor Fernandes. +# Vitor Fernandes , 1999. +# +msgid "" +msgstr "" +"Project-Id-Version: gqview-0.7.0c\n" +"POT-Creation-Date: 1999-09-15 15:22-0300\n" +"PO-Revision-Date: 1999-09-15 16:47-0300\n" +"Last-Translator: Vitor Fernandes \n" +"Language-Team: Vitor Fernandes \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=3Diso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + + +#: src/config.c:303 +msgid "GQview configuration" +msgstr "Configura=E7=E3o do GQview" + +#: src/config.c:315 +msgid "Ok" +msgstr "Ok" + +#: src/config.c:320 +msgid "Apply" +msgstr "Aplicar" + +#: src/config.c:325 src/utildlg.c:140 src/utilops.c:414 src/utilops.c:722 +#: src/utilops.c:851 src/utilops.c:949 +msgid "Cancel" +msgstr "Cancelar" + +#: src/config.c:339 +msgid "General" +msgstr "Geral" + +#: src/config.c:347 +msgid "Initial directory" +msgstr "Diret=F3rio inicial" + +#: src/config.c:357 +msgid "On startup, change to this directory:" +msgstr "Na abertura, mude para esse diret=F3rio:" + +#: src/config.c:369 +msgid "Use current" +msgstr "Use o atual" + +#: src/config.c:375 +msgid "Confirm file delete" +msgstr "Confirmar exclus=E3o de arquivo" + +#: src/config.c:377 +msgid "Remember tool state (float/hidden)" +msgstr "Lembrar estado da ferramenta (flutuante/escondida)" + +#: src/config.c:379 +msgid "Remember window positions" +msgstr "Lembrar posi=E7=F5es da janela" + +#: src/config.c:381 +msgid "Slide show" +msgstr "Show de slides" + +#: src/config.c:394 +msgid "Delay before image change (seconds):" +msgstr "Demora antes de mudar imagem (segundos):" + +#: src/config.c:407 +msgid "Random" +msgstr "Aleat=F3rio" + +#: src/config.c:409 +msgid "Repeat" +msgstr "Repetir" + +#: src/config.c:416 +msgid "Image" +msgstr "Imagem" + +#: src/config.c:424 +msgid "When new image is selected:" +msgstr "Quando nova imagem =E9 selecionada:" + +#: src/config.c:434 +msgid "Zoom to original size" +msgstr "Zoom para o tamanho original" + +#: src/config.c:440 src/img-view.c:283 src/menu.c:458 src/menu.c:531 +#: src/menu.c:571 src/menu.c:661 +msgid "Fit image to window" +msgstr "Ajustar imagem =E0 janela" + +#: src/config.c:446 +msgid "Leave Zoom at previous setting" +msgstr "Deixar o Zoom na configura=E7=E3o anterior" + +#: src/config.c:453 +msgid "Fit window to image when tools are hidden/floating" +msgstr "Ajustar janela =E0 imagem quando as ferramentas estiverem escondidas/flutuando" + +#: src/config.c:460 +msgid "Limit size when auto-sizing window" +msgstr "Limitar tamanho quando auto-dimensionando janela" + +#: src/config.c:470 src/menu.c:462 +msgid "Thumbnails" +msgstr "Miniaturas" + +#: src/config.c:486 +msgid "Size:" +msgstr "Tamanho:" + +#: src/config.c:515 +msgid "Cache thumbnails" +msgstr "Manter miniaturas" + +#: src/config.c:517 +msgid "Use xvpics thumbnails when found (read only)" +msgstr "Usar miniaturas xvpics quando encontradas (somente leitura)" + +#: src/config.c:520 +msgid "Progressive keyboard scrolling" +msgstr "Rolagem de teclado progressiva" + +#: src/config.c:527 +msgid "Filtering" +msgstr "Filtragem" + +#: src/config.c:536 +msgid "Show entries that begin with a dot" +msgstr "Exibir entradas que iniciam com um ponto" + +#: src/config.c:538 +msgid "Disable File Filtering" +msgstr "Desativar Filtragem de Arquivos" + +#: src/config.c:540 +msgid "Include files of type:" +msgstr "Incluir arquivos do tipo:" + +#: src/config.c:590 +msgid "Custom file types:" +msgstr "Tipos de arquivos personalizados:" + +#: src/config.c:603 +msgid "format: [.foo;.bar]" +msgstr "formato: [.foo;.bar]" + +#: src/config.c:612 +msgid "External Editors" +msgstr "Editores Externos" + +#: src/config.c:624 +msgid "#" +msgstr "#" + +#: src/config.c:627 +msgid "Menu name" +msgstr "Nome no menu" + +#: src/config.c:630 +msgid "Command Line" +msgstr "Linha do comando" + +#: src/config.c:660 src/menu.c:484 +msgid "About" +msgstr "Sobre" + +#: src/config.c:676 +msgid "" +"GQview %s\n" +"\n" +"Copyright (c) 1999 by John Ellis\n" +"http://gqview.netpedia.net\n" +"gqview@email.com\n" +"\n" +"Released under the GNU Public License" +msgstr "" +"GQview %s\n" +"\n" +"Copyright (c) 1999 por John Ellis\n" +"http://gqview.netpedia.net\n" +"gqview@email.com\n" +"\n" +"Lan=E7ado sob a Licensa P=FAblica Geral GNU" + +#: src/filelist.c:51 +msgid " Slideshow" +msgstr "Show de Slides" + +#: src/filelist.c:55 +msgid "%d files (%d)%s" +msgstr "%d arquivos (%d)%s" + +#: src/filelist.c:57 +msgid "%d files%s" +msgstr "%d arquivos%s" + +#: src/filelist.c:960 +msgid "Loading thumbs..." +msgstr "Carregando mini..." + +#: src/image.c:65 +msgid "( ? x ? ) %d bytes" +msgstr "" + +#: src/image.c:67 +msgid "( %d x %d ) %d bytes" +msgstr "" + +#: src/img-main.c:230 +msgid "GQview full screen" +msgstr "GQview tela cheia" + +#: src/img-view.c:280 src/menu.c:455 src/menu.c:528 src/menu.c:568 +#: src/menu.c:657 +msgid "Zoom in" +msgstr "Mais Zoom" + +#: src/img-view.c:281 src/menu.c:456 src/menu.c:529 src/menu.c:569 src/menu.c:659 +msgid "Zoom out" +msgstr "Menos Zoom" + +#: src/img-view.c:282 src/menu.c:457 src/menu.c:530 src/menu.c:570 +msgid "Zoom 1:1" +msgstr "" + +#. edit menu +#: src/img-view.c:286 src/menu.c:442 src/menu.c:503 src/menu.c:534 src/menu.c:574 +msgid "Edit" +msgstr "Editar" + +#: src/img-view.c:291 src/menu.c:431 src/menu.c:510 src/menu.c:541 src/menu.c:579 +msgid "Copy..." +msgstr "Copiar..." + +#: src/img-view.c:292 src/menu.c:432 src/menu.c:511 src/menu.c:542 src/menu.c:580 +msgid "Move..." +msgstr "Mover..." + +#: src/img-view.c:293 src/menu.c:433 src/menu.c:512 src/menu.c:543 src/menu.c:581 +msgid "Rename..." +msgstr "Renomear..." + +#: src/img-view.c:294 src/menu.c:434 src/menu.c:513 src/menu.c:544 src/menu.c:582 +msgid "Delete..." +msgstr "Excluir..." + +#: src/img-view.c:297 +msgid "Close window" +msgstr "Fechar janela" + +#: src/main.c:90 src/main.c:119 +msgid "GQview running: %s\n" +msgstr "GQview rodando: %s\n" + +#: src/main.c:316 +msgid "" +"Usage: gqview [options] [path]\n" +"\n" +msgstr "" +"Uso: gqview [op=E7=F5es] [caminho]\n" +"\n" + +#: src/main.c:317 +msgid "valid options are:\n" +msgstr "op=E7=F5es v=E1lidas s=E3o:\n" + +#: src/main.c:318 +msgid " +t, +tools force show of tools\n" +msgstr " +t, +tools for=E7a a exibir as ferramentas\n" + +#: src/main.c:319 +msgid " -t, -tools force hide of tools\n" +msgstr " -t, -tools for=E7a a olcultar as ferramentas\n" + +#: src/main.c:320 +msgid " -debug turn on debug output\n" +msgstr " -debug ativa sa=EDda de debug\n" + +#: src/main.c:321 +msgid "" +" -help this message\n" +"\n" +msgstr "" +" -help essa mensagem\n" +"\n" +#: src/main.c:326 +msgid "" +"invalid or ignored: %s\n" +"Use -help for options\n" +msgstr "" +"inv=E1lido ou ignorado: %s\n" +"Use -help para op=E7=F5es\n" +#: src/main.c:353 +msgid "The Gimp" +msgstr "" + +#: src/main.c:356 +msgid "Electric Eyes" +msgstr "" + +#: src/main.c:359 +msgid "XV" +msgstr "" + +#: src/main.c:362 +msgid "Xpaint" +msgstr "" + +#: src/menu.c:364 +msgid "in %s..." +msgstr "em %s..." + +#: src/menu.c:366 +msgid "in (unknown)..." +msgstr "em (desconhecido)..." + +#: src/menu.c:385 +msgid "Options..." +msgstr "Op=E7=F5es..." + +#: src/menu.c:387 +msgid "Remove old thumbnails" +msgstr "Remover miniaturas velhas" + +#. file menu +#: src/menu.c:425 +msgid "File" +msgstr "Arquivo" + +#: src/menu.c:429 +msgid "Create Dir..." +msgstr "Criar diret=F3rio..." + +#: src/menu.c:436 +msgid "Exit" +msgstr "Sair" + +#. view menu +#: src/menu.c:451 +msgid "View" +msgstr "Ver" + +#: src/menu.c:461 src/menu.c:547 +msgid "Full screen" +msgstr "Tela cheia" + +#: src/menu.c:469 +msgid "Refresh Lists" +msgstr "Atualizar Listas" + +#: src/menu.c:470 +msgid "(Un)Float file list" +msgstr "(Des)Flutuar lista de arquivos" + +#: src/menu.c:471 src/menu.c:546 +msgid "(Un)Hide file list" +msgstr "(Des)Esconder lista de arquivos" + +#: src/menu.c:474 +msgid "Toggle slideshow" +msgstr "Alternar show de slides" + +#: src/menu.c:480 +msgid "Help" +msgstr "Ajuda" + +#: src/menu.c:507 src/menu.c:538 +msgid "View in new window" +msgstr "Ver em nova janela" + +#: src/menu.c:515 +msgid "Refresh" +msgstr "Atualizar" + +#: src/menu.c:585 +msgid "Exit full screen" +msgstr "Sair da tela cheia" + +#: src/menu.c:644 +msgid "Create thumbnails" +msgstr "Criar miniaturas" + +#: src/menu.c:653 +msgid "Change to home directory" +msgstr "Mudar para diret=F3rio pessoal" + +#: src/menu.c:655 +msgid "Refresh file list" +msgstr "Atualizar lista de arquivos" + +#: src/menu.c:663 +msgid "Set zoom 1:1" +msgstr "Deixar zoom em 1:1" + +#: src/menu.c:665 +msgid "Configure options" +msgstr "Configurar op=E7=F5es" + +#: src/menu.c:667 +msgid "Float Controls" +msgstr "Controles Flutuantes" + +#: src/rcfile.c:132 +msgid "error saving config file: %s\n" +msgstr "erro salvando arquivo de configura=E7=E3o: %s\n" + +#: src/thumb.c:127 src/thumb.c:151 +msgid "create dir failed: %s\n" +msgstr "falha ao criar diret=F3rio: %s\n" + +#: src/thumb.c:233 +msgid "Unable to delete dir: %s\n" +msgstr "Incapaz de excluir diret=F3rio: %s\n" + +#: src/thumb.c:249 +msgid "failed to delete:%s\n" +msgstr "falha ao excluir: %s\n" + +#: src/utildlg.c:67 +msgid " Ok " +msgstr " OK " + +#: src/utilops.c:162 +msgid "" +"Overwrite file:\n" +" %s\n" +" with:\b %s" +msgstr "" +"Sobescrever arquivo:\n" +" %s\n" +" com:\b %s" + +#: src/utilops.c:163 src/utilops.c:262 src/utilops.c:621 src/utilops.c:803 +msgid "Overwrite file" +msgstr "Sobescrever arquivo" + +#: src/utilops.c:164 +msgid "Skip" +msgstr "Saltar" + +#: src/utilops.c:165 +msgid "Yes to all" +msgstr "Sim para todos" + +#: src/utilops.c:166 +msgid "Yes" +msgstr "Sim" + +#: src/utilops.c:200 src/utilops.c:288 +msgid "Error copying file" +msgstr "Erro copiando arquivo" + +#: src/utilops.c:201 +msgid "" +"Unable to copy file:\n" +"%sto:\n" +"%s\n" +" during multiple file copy." +msgstr "" +"Incapaz de copiar arquivo:\n" +"%sto:\n" +"%s\n" +" durante c=F3pia m=FAltipla de arquivos." + +#: src/utilops.c:205 src/utilops.c:293 +msgid "Error moving file" +msgstr "Erro movendo arquivo" + +#: src/utilops.c:206 +msgid "" +"Unable to move file:\n" +"%sto:\n" +"%s\n" +" during multiple file move." +msgstr "" +"Incapaz de mover arquivo:\n" +"%sto:\n" +"%s\n" +" durante movimento m=FAltiplo de arquivos." + +#: src/utilops.c:209 src/utilops.c:486 +msgid "Continue" +msgstr "Continuar" + +#: src/utilops.c:261 +msgid "" +"Overwrite file:\n" +"%s\n" +" with:\n" +"%s" +msgstr "" +"Sobescrever arquivo:\n" +"%s\n" +" com:\n" +"%s" + +#: src/utilops.c:263 src/utilops.c:622 src/utilops.c:804 +msgid "Overwrite" +msgstr "Sobescrever" + +#: src/utilops.c:289 +msgid "" +"Unable to copy file:\n" +"%s\n" +"to:\n" +"%s" +msgstr "" +"Incapaz de copiar arquivo:\n" +"%s\n" +"para:\n" +"%s" + +#: src/utilops.c:294 +msgid "" +"Unable to move file:\n" +"%s\n" +"to:\n" +"%s" +msgstr "" +"Incapaz de mover arquivo:\n" +"%s\n" +"para:\n" +"%s" + +#: src/utilops.c:337 +msgid "Invalid destination" +msgstr "Destino inv=E1lido" + +#: src/utilops.c:337 +msgid "" +"When operating with multiple files, please select\n" +" a directory, not file." +msgstr "" +"Quando operando com v=E1rios arquivos, por favor selecione\n" +" um diret=F3rio, n=E3o arquivo." + +#: src/utilops.c:339 +msgid "Invalid directory" +msgstr "Diret=F3rio inv=E1lido" + +#: src/utilops.c:339 +msgid "Please select an existing directory" +msgstr "Por favor selecione um diret=F3rio existente" + +#: src/utilops.c:397 +msgid "GQview - copy" +msgstr "GQview - copiar" + +#: src/utilops.c:398 +msgid "Copy" +msgstr "Copiar" + +#: src/utilops.c:400 +msgid "" +"Copy file:\n" +"%s\n" +"to:" +msgstr "" +"Copiar arquivo:\n" +"%s\n" +"para:" + +#: src/utilops.c:402 +msgid "" +"Copy multiple files from:\n" +"%s\n" +"to:" +msgstr "" +"Copiar m=FAltiplos arquivos de:\n" +"%s\n" +"para:" + +#: src/utilops.c:406 +msgid "GQview - move" +msgstr "GQview - mover" + +#: src/utilops.c:407 +msgid "Move" +msgstr "Mover" + +#: src/utilops.c:409 +msgid "" +"Move file:\n" +"%s\n" +"to:" +msgstr "" +"Mover arquivo:\n" +"%s\n" +"para:" + +#: src/utilops.c:411 +msgid "" +"Move multiple files from:\n" +"%s\n" +"to:" +msgstr "" +"Mover m=FAltiplos arquivos de:\n" +"%s\n" +"para:" + +#: src/utilops.c:484 +msgid "" +"Unable to delete file:\n" +" %s\n" +" Continue multiple delete operation?" +msgstr "" +"Incapaz de excluir arquivo:\n" +" %s\n" +" Continuar opera=E7=E3o de exclus=E3o multipla ?" + +#: src/utilops.c:485 src/utilops.c:491 +msgid "Delete failed" +msgstr "Falha ao excluir" + +#: src/utilops.c:490 src/utilops.c:535 +msgid "" +"Unable to delete file:\n" +"%s" +msgstr "" +"Incapaz de excluir arquivo:\n" +"%s" + +#: src/utilops.c:520 +msgid "Delete files" +msgstr "Excluir arquivos" + +#: src/utilops.c:520 +msgid "About to delete multiple files..." +msgstr "Prestes a excluir m=FAltiplos arquivos..." + +#: src/utilops.c:521 src/utilops.c:566 +msgid "Delete" +msgstr "Excluir" + +#: src/utilops.c:536 +msgid "File deletion failed" +msgstr "Exclus=E3o de arquivos falhou" + +#: src/utilops.c:564 +msgid "" +"About to delete the file:\n" +" %s" +msgstr "" +"Prestes a excluir o arquivo:\n" +" %s" + +#: src/utilops.c:565 +msgid "Delete file" +msgstr "Excluir arquivo" + +#: src/utilops.c:620 +msgid "" +"Overwrite file:\n" +"%s\n" +"by renaming:\n" +"%s" +msgstr "" +"Sobescrever arquivo:\n" +"%s\n" +"renomeando:\n" +"%s" + +#: src/utilops.c:631 +msgid "" +"Unable to rename file:\n" +"%s\n" +" to:\n" +"%s" +msgstr "" +"Incapaz de renomear arquivo:\n" +"%s\n" +" para:\n" +"%s" + +#: src/utilops.c:632 src/utilops.c:813 +msgid "Error renaming file" +msgstr "Erro renomeando arquivo" + +#: src/utilops.c:722 src/utilops.c:851 +msgid "GQview - rename" +msgstr "GQview - renomear" + +#: src/utilops.c:722 +msgid "Rename multiple files:" +msgstr "Renomear m=FAltiplos arquivos:" + +#: src/utilops.c:722 src/utilops.c:851 +msgid "Rename" +msgstr "Renomear" + +#: src/utilops.c:758 +msgid "Rename:" +msgstr "Renomear:" + +#: src/utilops.c:767 +msgid "to:" +msgstr "para:" + +#: src/utilops.c:802 +msgid "" +"Overwrite file:\n" +"%s\n" +"with:\n" +"%s" +msgstr "" +"Sobescrever arquivo:\n" +"%s\n" +"com:\n" +"%s" + +#: src/utilops.c:812 +msgid "" +"Unable to rename file:\n" +"%s\n" +"to:\n" +"%s" +msgstr "" +"Incapaz de renomear arquivo:\n" +"%s\n" +"para:\n" +"%s" + +#: src/utilops.c:850 +msgid "" +"Rename file:\n" +"%s\n" +"to:" +msgstr "" +"Renomear arquivo:\n" +"%s\n" +"para:" + +#: src/utilops.c:894 +msgid "" +"The path:\n" +"%s\n" +"already exists as a file." +msgstr "" +"O caminho:\n" +"%s\n" +"j=E1 existe como um arquivo." + +#: src/utilops.c:895 +msgid "Could not create directory" +msgstr "N=E3o pude criar diret=F3rio" + +#: src/utilops.c:900 +msgid "" +"The directory:\n" +"%s\n" +"already exists." +msgstr "" +"O diret=F3rio:\n" +"%s\n" +"j=E1 existe." + +#: src/utilops.c:901 +msgid "Directory exists" +msgstr "Diret=F3rio existe" + +#: src/utilops.c:908 +msgid "" +"Unable to create directory:\n" +"%s" +msgstr "" +"Incapaz de criar diret=F3rio:\n" +"%s" + +#: src/utilops.c:909 +msgid "Error creating directory" +msgstr "Erro criando diret=F3rio" + +#: src/utilops.c:948 +msgid "" +"Create directory in:\n" +"%s\n" +"named:" +msgstr "" +"Criar diret=F3rio em:\n" +"%s\n" +"chamado:" + +#: src/utilops.c:949 +msgid "GQview - new directory" +msgstr "GQview - novo diret=F3rio" + +#: src/utilops.c:949 +msgid "Create" +msgstr "Criar" + +#: src/window.c:151 +msgid "GQview Tools" +msgstr "GQview Ferramentas" + diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 00000000..d58934a5 --- /dev/null +++ b/po/ru.po @@ -0,0 +1,837 @@ +# gqview ru.po file. Russian locale definition for gqview. +# Copyright (C) 1999 Free Software Foundation, Inc. +# Oleg Andrjushenko , 1999. +# +msgid "" +msgstr "" +"Project-Id-Version: gqview-0.7.0d\n" +"POT-Creation-Date: 1999-09-09 09:09+0300\n" +"PO-Revision-Date: 1999-09-09 09:09+0300\n" +"Last-Translator: Oleg Andrjushenko \n" +"Language-Team: It`s me \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=koi8-r\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/config.c:303 +msgid "GQview configuration" +msgstr "ëÏÎÆÉÇÕÒÁÃÉÑ GQview" + +#: src/config.c:315 +msgid "Ok" +msgstr "Ok" + +#: src/config.c:320 +msgid "Apply" +msgstr "ðÒÉÍÅÎÉÔØ" + +#: src/config.c:325 src/utildlg.c:140 src/utilops.c:414 src/utilops.c:722 +#: src/utilops.c:851 src/utilops.c:949 +msgid "Cancel" +msgstr "ïÔÍÅÎÁ" + +#: src/config.c:339 +msgid "General" +msgstr "ïÂÝÉÅ" + +#: src/config.c:347 +msgid "Initial directory" +msgstr "éÓÈÏÄÎÙÊ ËÁÔÁÌÏÇ" + +#: src/config.c:357 +msgid "On startup, change to this directory:" +msgstr "ðÒÉ ÓÔÁÒÔÅ, ÉÚÍÅÎÉÔØ ÎÁ ËÁÔÁÌÏÇ:" + +#: src/config.c:369 +msgid "Use current" +msgstr "éÓÐÏÌØÚÏ×ÁÔØ ÔÅËÕÝÉÊ" + +#: src/config.c:375 +msgid "Confirm file delete" +msgstr "ðÏÄÔ×ÅÒÖÄÁÔØ ÕÄÁÌÅÎÉÅ ÆÁÊÌÏ×" + +#: src/config.c:377 +msgid "Remember tool state (float/hidden)" +msgstr "ðÏÍÎÉÔØ ÒÁÓÐÏÌÏÖÅÎÉÅ ÉÎÓÔÒÕÍÅÎÔÏ× (Ó×ÏÂÏÄÎÏÅ/ÐÒÉËÒÅÐÌÅÎÎÏÅ)" + +#: src/config.c:379 +msgid "Remember window positions" +msgstr "ðÏÍÎÉÔØ ÒÁÓÐÏÌÏÖÅÎÉÅ ÏËÎÁ" + +#: src/config.c:381 +msgid "Slide show" +msgstr "ðÒÏÓÍÏÔÒ ÓÌÁÊÄÏ×" + +#: src/config.c:394 +msgid "Delay before image change (seconds):" +msgstr "ðÁÕÚÁ ÐÅÒÅÄ ÓÍÅÎÏÊ ËÁÒÔÉÎËÉ (ÓÅËÕÎÙ):" + +#: src/config.c:407 +msgid "Random" +msgstr "óÌÕÞÁÊÎÏ" + +#: src/config.c:409 +msgid "Repeat" +msgstr "ðÏ×ÔÏÒÑÔØ × ÃÉËÌÅ" + +#: src/config.c:416 +msgid "Image" +msgstr "éÚÏÂÒÁÖÅÎÉÅ" + +#: src/config.c:424 +msgid "When new image is selected:" +msgstr "ðÒÉ ×ÙÂÏÒÅ ÎÏ×ÏÇÏ ÉÚÏÂÒÁÖÅÎÉÑ:" + +#: src/config.c:434 +msgid "Zoom to original size" +msgstr "íÁÛÔÁÂÉÒÏ×ÁÔØ Ë ÒÁÚÍÅÒÕ ÏÒÉÇÉÎÁÌÁ" + +#: src/config.c:440 src/img-view.c:283 src/menu.c:458 src/menu.c:531 +#: src/menu.c:571 src/menu.c:661 +msgid "Fit image to window" +msgstr "ë ÒÁÚÍÅÒÕ ÏËÎÁ" + +#: src/config.c:446 +msgid "Leave Zoom at previous setting" +msgstr "éÓÐÏÌØÚÏ×ÁÔØ ÐÏÓÌÅÄÎÉÊ ÚÁÄÁÎÎÙÊ ÍÁÛÔÁÂ" + +#: src/config.c:453 +msgid "Fit window to image when tools are hidden/floating" +msgstr "" +"ðÏÄÂÉÒÁÔØ ÒÁÚÍÅÒÙ ÏËÎÁ Ë ÉÚÏÂÒÁÖÅÎÉÀ \n" +"ËÏÇÄÁ ÉÎÓÔÒÕÍÅÎÔÙ ÐÒÉËÒÅÐÌÅÎÎÙ/Ó×ÏÂÏÄÎÙ" + +#: src/config.c:460 +msgid "Limit size when auto-sizing window" +msgstr "ïÇÒÁÎÉÞÉÔØ ÒÁÚÍÅÒ auto-ÒÁÚÍÅÒÎÏÇÏ ÏËÎÁ" + +#: src/config.c:470 src/menu.c:462 +msgid "Thumbnails" +msgstr "üËÓËÉÚÙ" + +#: src/config.c:486 +msgid "Size:" +msgstr "òÁÚÍÅÒ:" + +#: src/config.c:515 +msgid "Cache thumbnails" +msgstr "ëÜÛÉÒÏ×ÁÔØ ÜËÓËÉÚÙ" + +#: src/config.c:517 +msgid "Use xvpics thumbnails when found (read only)" +msgstr "éÓÐÏÌØÚÏ×ÁÔØ ÜËÓËÉÚÙ ÏÔ xvpics, ÅÓÌÉ ÎÁÊÄÅÎÙ (ÔÏÌØËÏ ÞÔÅÎÉÅ)" + +#: src/config.c:520 +msgid "Progressive keyboard scrolling" +msgstr "" + +#: src/config.c:527 +msgid "Filtering" +msgstr "æÉÌØÔÒÁÃÉÑ" + +#: src/config.c:536 +msgid "Show entries that begin with a dot" +msgstr "ðÏËÁÚÙ×ÁÔØ ÆÁÊÌÙ ÎÁÞÉÎÁÀÝÉÅÓÑ Ó ÔÏÞËÉ" + +#: src/config.c:538 +msgid "Disable File Filtering" +msgstr "úÁÐÒÅÔÉÔØ æÉÌØÔÒÁÃÉÀ æÁÊÌÁ" + +#: src/config.c:540 +msgid "Include files of type:" +msgstr "÷ËÌÀÞÁÔØ ÆÁÊÌÙ ÔÉÐÁ:" + +#: src/config.c:590 +msgid "Custom file types:" +msgstr "É/ÉÌÉ Ó×ÏÊ ÔÉÐ ÆÁÊÌÁ:" + +#: src/config.c:603 +msgid "format: [.foo;.bar]" +msgstr "ÆÏÒÍÁÔ: [.foo;.bar]" + +#: src/config.c:612 +msgid "External Editors" +msgstr "÷ÎÅÛÎÉÅ òÅÄÁËÔÏÒÙ" + +#: src/config.c:624 +msgid "#" +msgstr "" + +#: src/config.c:627 +msgid "Menu name" +msgstr "éÍÑ × ÍÅÎÀ" + +#: src/config.c:630 +msgid "Command Line" +msgstr "ëÏÍÍÁÎÄÎÁÑ ÓÔÒÏËÁ" + +#: src/config.c:660 src/menu.c:484 +msgid "About" +msgstr "ï ÐÒÏÇÒÁÍÍÅ..." + +#: src/config.c:676 +#, c-format +msgid "" +"GQview %s\n" +"\n" +"Copyright (c) 1999 by John Ellis\n" +"http://gqview.netpedia.net\n" +"gqview@email.com\n" +"\n" +"Released under the GNU Public License" +msgstr "" + +#: src/filelist.c:51 +msgid " Slideshow" +msgstr " ðÒÏÓÍÏÔÒ ÓÌÁÊÄÏ×..." + +#: src/filelist.c:55 +#, c-format +msgid "%d files (%d)%s" +msgstr "%d ÆÁÊÌÏ× (%d)%s" + +#: src/filelist.c:57 +#, c-format +msgid "%d files%s" +msgstr "%d ÆÁÊÌÏ×%s" + +#: src/filelist.c:960 +msgid "Loading thumbs..." +msgstr "úÁÇÒÕÚËÁ ÜËÓËÉÚÏ×" + +#: src/image.c:65 +#, c-format +msgid "( ? x ? ) %d bytes" +msgstr "( ? x ? ) %d ÂÁÊÔ" + +#: src/image.c:67 +#, c-format +msgid "( %d x %d ) %d bytes" +msgstr "( %d x %d ) %d ÂÁÊÔ" + +#: src/img-main.c:231 +msgid "GQview full screen" +msgstr "GQview ÎÁ ×ÅÓØ ÜËÒÁÎ" + +#: src/img-view.c:280 src/menu.c:455 src/menu.c:528 src/menu.c:568 +#: src/menu.c:657 +msgid "Zoom in" +msgstr "íÁÓÛÔÁ +" + +#: src/img-view.c:281 src/menu.c:456 src/menu.c:529 src/menu.c:569 +#: src/menu.c:659 +msgid "Zoom out" +msgstr "íÁÓÛÔÁ -" + +#: src/img-view.c:282 src/menu.c:457 src/menu.c:530 src/menu.c:570 +msgid "Zoom 1:1" +msgstr "íÁÓÛÔÁ 1:1" + +#. edit menu +#: src/img-view.c:286 src/menu.c:442 src/menu.c:503 src/menu.c:534 +#: src/menu.c:574 +msgid "Edit" +msgstr "ðÒÁ×ËÁ" + +#: src/img-view.c:291 src/menu.c:431 src/menu.c:510 src/menu.c:541 +#: src/menu.c:579 +msgid "Copy..." +msgstr "ëÏÐÉÒÏ×ÁÔØ..." + +#: src/img-view.c:292 src/menu.c:432 src/menu.c:511 src/menu.c:542 +#: src/menu.c:580 +msgid "Move..." +msgstr "ðÅÒÅÍÅÓÔÉÔØ..." + +#: src/img-view.c:293 src/menu.c:433 src/menu.c:512 src/menu.c:543 +#: src/menu.c:581 +msgid "Rename..." +msgstr "ðÅÒÅÉÍÅÎÏ×ÁÔØ..." + +#: src/img-view.c:294 src/menu.c:434 src/menu.c:513 src/menu.c:544 +#: src/menu.c:582 +msgid "Delete..." +msgstr "õÄÁÌÉÔØ..." + +#: src/img-view.c:297 +msgid "Close window" +msgstr "úÁËÒÙÔØ ÏËÎÏ" + +#: src/main.c:90 src/main.c:119 +#, c-format +msgid "GQview running: %s\n" +msgstr "GQview ×ÙÐÏÌÎÑÅÔ: %s\n" + +#: src/main.c:316 +msgid "" +"Usage: gqview [options] [path]\n" +"\n" +msgstr "" +"éÓÐÏÌØÚÏ×ÁÎÉÅ: gqview [ÐÁÒÁÍÅÔÒÙ] [ÐÕÔØ]\n" +"\n" + +#: src/main.c:317 +msgid "valid options are:\n" +msgstr "ÄÏÐÕÓÔÉÍÙÅ ÐÁÒÁÍÅÔÒÙ:\n" + +#: src/main.c:318 +msgid " +t, +tools force show of tools\n" +msgstr " +t, +tools ÐÏËÁÚÙ×ÁÔØ ÏËÎÏ ÉÎÓÔÒÕÍÅÎÔÏ×\n" + +#: src/main.c:319 +msgid " -t, -tools force hide of tools\n" +msgstr " -t, -tools ÓÐÒÑÔÁÔØ ÏËÎÏ ÉÎÓÔÒÕÍÅÎÔÏ×\n" + +#: src/main.c:320 +msgid " -debug turn on debug output\n" +msgstr " -debug ×Ù×ÏÄÉÔØ ÏÔÌÁÄÏÞÎÕÀ ÉÎÆÏÒÍÁÃÉÀ\n" + +#: src/main.c:321 +msgid "" +" -help this message\n" +"\n" +msgstr "" +" -help ÐÏËÁÚÁÔØ üôï ÓÏÏÂÝÅÎÉÅ\n" +"\n" + +#: src/main.c:326 +#, c-format +msgid "" +"invalid or ignored: %s\n" +"Use -help for options\n" +msgstr "" +"ÎÅ×ÅÒÎÙÊ ÐÁÒÁÍÅÔÒ: %s\n" +"îÁÂÅÒÉÔÅ gqview -help ÄÌÑ ÓÐÒÁ×ËÉ.\n" + +#: src/main.c:353 +msgid "The Gimp" +msgstr "" + +#: src/main.c:356 +msgid "Electric Eyes" +msgstr "" + +#: src/main.c:359 +msgid "XV" +msgstr "" + +#: src/main.c:362 +msgid "Xpaint" +msgstr "" + +#: src/menu.c:364 +#, c-format +msgid "in %s..." +msgstr "× %s..." + +#: src/menu.c:366 +msgid "in (unknown)..." +msgstr "× (ÎÅÉÚ×ÅÓÔÎÏ)..." + +#: src/menu.c:385 +msgid "Options..." +msgstr "ëÏÎÆÉÇÕÒÁÃÉÑ..." + +#: src/menu.c:387 +msgid "Remove old thumbnails" +msgstr "õÄÁÌÉÔØ ÓÔÁÒÙÅ ÜËÓËÉÚÙ" + +#. file menu +#: src/menu.c:425 +msgid "File" +msgstr "æÁÊÌ" + +#: src/menu.c:429 +msgid "Create Dir..." +msgstr "óÏÚÄÁÔØ ËÁÔÁÌÏÇ..." + +#: src/menu.c:436 +msgid "Exit" +msgstr "÷ÙÈÏÄ" + +#. view menu +#: src/menu.c:451 +msgid "View" +msgstr "ðÒÏÓÍÏÔÒ" + +#: src/menu.c:461 src/menu.c:547 +msgid "Full screen" +msgstr "îÁ ×ÅÓØ ÜËÒÁÎ" + +#: src/menu.c:469 +msgid "Refresh Lists" +msgstr "ïÂÎÏ×ÉÔØ ÓÐÉÓÏË ÆÁÊÌÏ×" + +#: src/menu.c:470 +msgid "(Un)Float file list" +msgstr "(îÅ)ïÓ×ÏÂÏÄÉÔØ ÉÎÓÔÒÕÍÅÎÔÙ" + +#: src/menu.c:471 src/menu.c:546 +msgid "(Un)Hide file list" +msgstr "îÅÔ/äÁ ÉÎÓÔÒÕÍÅÎÔÁÍ" + +#: src/menu.c:474 +msgid "Toggle slideshow" +msgstr "÷ËÌ/÷ÙËÌ. ÐÒÏÓÍÏÔÒ ÓÌÁÊÄÏ×" + +#. help menu +#: src/menu.c:480 +msgid "Help" +msgstr "ðÏÍÏÝØ" + +#: src/menu.c:507 src/menu.c:538 +msgid "View in new window" +msgstr "ðÒÏÓÍÏÔÒ × ÎÏ×ÏÍ ÏËÎÅ" + +#: src/menu.c:515 +msgid "Refresh" +msgstr "ïÂÎÏ×ÉÔØ" + +#: src/menu.c:585 +msgid "Exit full screen" +msgstr "÷ÙÊÔÉ ÉÚ ÐÏÌÎÏÇÏ ÜËÒÁÎÁ" + +#: src/menu.c:644 +msgid "Create thumbnails" +msgstr "óÏÚÄÁÔØ ÜËÓËÉÚÙ" + +#: src/menu.c:653 +msgid "Change to home directory" +msgstr "ðÅÒÅÊÔÉ × ÄÏÍÁÛÎÉÊ ËÁÔÁÌÏÇ" + +#: src/menu.c:655 +msgid "Refresh file list" +msgstr "ïÂÎÏ×ÉÔØ ÓÐÉÓÏË ÆÁÊÌÏ×" + +#: src/menu.c:663 +msgid "Set zoom 1:1" +msgstr "íÁÓÛÔÁ 1:1" + +#: src/menu.c:665 +msgid "Configure options" +msgstr "ëÏÎÆÉÇÕÒÁÃÉÑ" + +#: src/menu.c:667 +msgid "Float Controls" +msgstr "ÐÒÉËÒÅÐÉÔØ/Ó×ÏÂÏÄÉÔØ ÉÎÓÔÒÕÍÅÎÔÙ" + +#: src/rcfile.c:132 +#, c-format +msgid "error saving config file: %s\n" +msgstr "ÏÛÉÂËÁ ÚÁÐÉÓÉ ÆÁÊÌÁ ËÏÎÆÉÇÕÒÁÃÉÉ: %s\n" + +#: src/thumb.c:127 src/thumb.c:151 +#, c-format +msgid "create dir failed: %s\n" +msgstr "ÓÏÚÄÁÔØ ËÁÔÁÌÏÇ ÎÅÕÄÁÌÏÓØ: %s\n" + +#: src/thumb.c:233 +#, c-format +msgid "Unable to delete dir: %s\n" +msgstr "îÅÍÏÇÕ ÕÄÁÌÉÔØ ËÁÔÁÌÏÇ: %s\n" + +#: src/thumb.c:249 +#, c-format +msgid "failed to delete:%s\n" +msgstr "ÎÅÕÄÁÌÏÓØ ÕÄÁÌÉÔØ:%s\n" + +#: src/utildlg.c:67 +msgid " Ok " +msgstr " Ok " + +#: src/utilops.c:162 +#, c-format +msgid "" +"Overwrite file:\n" +" %s\n" +" with:\b %s" +msgstr "" +"æÁÊÌ Ó ÔÁËÉÍ ÉÍÅÎÅÍ ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ !\n" +"ðÅÒÅÚÁÐÉÓÁÔØ ÆÁÊÌ ?:\n" +" %s\n" +" ÆÁÊÌÏÍ:\b %s" + +#: src/utilops.c:163 src/utilops.c:262 src/utilops.c:621 src/utilops.c:803 +msgid "Overwrite file" +msgstr "ðÅÒÅÚÁÐÉÓÁÔØ ÆÁÊÌ" + +#: src/utilops.c:164 +msgid "Skip" +msgstr "ðÒÏÐÕÓÔÉÔØ" + +#: src/utilops.c:165 +msgid "Yes to all" +msgstr "äÁ ÄÌÑ ×ÓÅÈ" + +#: src/utilops.c:166 +msgid "Yes" +msgstr "äÁ" + +#: src/utilops.c:200 src/utilops.c:288 +msgid "Error copying file" +msgstr "ïÛÉÂËÁ ËÏÐÉÒÏ×ÁÎÉÑ ÆÁÊÌÁ" + +#: src/utilops.c:201 +#, c-format +msgid "" +"Unable to copy file:\n" +"%sto:\n" +"%s\n" +" during multiple file copy." +msgstr "" +"îÅÍÏÇÕ ÓËÏÐÉÒÏ×ÁÔØ ÆÁÊÌ:\n" +"%s ×:\n" +"%s\n" +" during multiple file copy." + +#: src/utilops.c:205 src/utilops.c:293 +msgid "Error moving file" +msgstr "ïÛÉÂËÁ ÐÅÒÅÍÅÝÅÎÉÑ ÆÁÊÌÁ" + +#: src/utilops.c:206 +#, c-format +msgid "" +"Unable to move file:\n" +"%sto:\n" +"%s\n" +" during multiple file move." +msgstr "" +"îÅÍÏÇÕ ÐÅÒÅÍÅÓÔÉÔØ ÆÁÊÌ:\n" +"%s ×:\n" +"%s\n" +" during multiple file move." + +#: src/utilops.c:209 src/utilops.c:486 +msgid "Continue" +msgstr "ðÒÏÄÏÌÖÉÔØ" + +#: src/utilops.c:261 +#, c-format +msgid "" +"Overwrite file:\n" +"%s\n" +" with:\n" +"%s" +msgstr "" +"æÁÊÌ Ó ÔÁËÉÍ ÉÍÅÎÅÍ ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ !\n" +"ðÒÅÚÁÐÉÓÁÔØ ÆÁÊÌ ?:\n" +"%s\n" +" ÆÁÊÌÏÍ:\n" +"%s" + +#: src/utilops.c:263 src/utilops.c:622 src/utilops.c:804 +msgid "Overwrite" +msgstr "ðÅÒÅÐÉÓÁÔØ" + +#: src/utilops.c:289 +#, c-format +msgid "" +"Unable to copy file:\n" +"%s\n" +"to:\n" +"%s" +msgstr "" +"îÅÍÏÇÕ ÓËÏÐÉÒÏ×ÁÔØ ÆÁÊÌ:\n" +"%s\n" +"×:\n" +"%s" + +#: src/utilops.c:294 +#, c-format +msgid "" +"Unable to move file:\n" +"%s\n" +"to:\n" +"%s" +msgstr "" +"îÅÍÏÇÕ ÐÅÒÅÍÅÓÔÉÔØ ÆÁÊÌ:\n" +"%s\n" +"×:\n" +"%s" + +#: src/utilops.c:337 +msgid "Invalid destination" +msgstr "îÅÐÒÁ×ÉÌØÎÏÅ ÎÁÚÎÁÞÅÎÉÅ" + +#: src/utilops.c:337 +msgid "" +"When operating with multiple files, please select\n" +" a directory, not file." +msgstr "" +"ëÏÇÄÁ ÏÐÅÒÁÃÉÑ ÐÒÏÉÚ×ÏÄÉÔÓÑ ÎÁÄ ÎÅÓËÏÌØËÉÍÉ ÆÁÊÌÁÍÉ,\n" +" ÐÏÖÁÌÕÊÓÔÁ ÚÁÄÁÊÔÅ ËÁÔÁÌÏÇ, ÎÅ ÆÁÊÌ." + +#: src/utilops.c:339 +msgid "Invalid directory" +msgstr "îÅÐÒÁ×ÉÌØÎÙÊ ËÁÔÁÌÏÇ" + +#: src/utilops.c:339 +msgid "Please select an existing directory" +msgstr "ðÏÖÁÌÕÊÓÔÁ ×ÙÂÅÒÉÔÅ ÓÕÝÅÓÔ×ÕÀÝÉÊ ËÁÔÁÌÏÇ" + +#: src/utilops.c:397 +msgid "GQview - copy" +msgstr "GQview - ËÏÐÉÒÏ×ÁÎÉÅ" + +#: src/utilops.c:398 +msgid "Copy" +msgstr "ëÏÐÉÒÏ×ÁÔØ" + +#: src/utilops.c:400 +#, c-format +msgid "" +"Copy file:\n" +"%s\n" +"to:" +msgstr "" +"ëÏÐÉÒÏ×ÁÔØ ÆÁÊÌ:\n" +"%s\n" +"×:" + +#: src/utilops.c:402 +#, c-format +msgid "" +"Copy multiple files from:\n" +"%s\n" +"to:" +msgstr "" +"ëÏÐÉÒÏ×ÁÔØ ×ÙÄÅÌÅÎÎÙÅ ÆÁÊÌÙ ÉÚ:\n" +"%s\n" +"×:" + +#: src/utilops.c:406 +msgid "GQview - move" +msgstr "GQview - ÐÅÒÅÍÅÓÔÉÔØ" + +#: src/utilops.c:407 +msgid "Move" +msgstr "ðÅÒÅÍÅÓÔÉÔØ" + +#: src/utilops.c:409 +#, c-format +msgid "" +"Move file:\n" +"%s\n" +"to:" +msgstr "" +"ðÅÒÅÍÅÓÔÉÔØ ÆÁÊÌ:\n" +"%s\n" +"×:" + +#: src/utilops.c:411 +#, c-format +msgid "" +"Move multiple files from:\n" +"%s\n" +"to:" +msgstr "" +"ðÅÒÅÍÅÓÔÉÔØ ×ÙÄÅÌÅÎÎÙÅ ÆÁÊÌÙ ÉÚ:\n" +"%s\n" +"×:" + +#: src/utilops.c:484 +#, c-format +msgid "" +"Unable to delete file:\n" +" %s\n" +" Continue multiple delete operation?" +msgstr "" +"îÅ×ÏÚÍÏÖÎÏ ÕÄÁÌÉÔØ ÆÁÊÌ:\n" +" %s\n" +" ðÒÏÄÏÌÖÁÔØ ÏÐÅÒÁÃÉÀ ÕÄÁÌÅÎÉÑ ÄÌÑ ÏÓÔÁ×ÛÉÈÓÑ ÆÁÊÌÏ× ?" + +#: src/utilops.c:485 src/utilops.c:491 +msgid "Delete failed" +msgstr "õÄÁÌÉÔØ ÎÅÕÄÁÌÏÓØ" + +#: src/utilops.c:490 src/utilops.c:535 +#, c-format +msgid "" +"Unable to delete file:\n" +"%s" +msgstr "" +"îÅÍÏÇÕ ÕÄÁÌÉÔØ ÆÁÊÌ:\n" +"%s" + +#: src/utilops.c:520 +msgid "Delete files" +msgstr "õÄÁÌÉÔØ ÆÁÊÌÙ" + +#: src/utilops.c:520 +msgid "About to delete multiple files..." +msgstr "÷Ù ÈÏÔÉÔÅ ÕÄÁÌÉÔØ ÏÔÍÅÞÅÎÎÙÅ ÆÁÊÌÙ ?" + +#: src/utilops.c:521 src/utilops.c:566 +msgid "Delete" +msgstr "õÄÁÌÉÔØ" + +#: src/utilops.c:536 +msgid "File deletion failed" +msgstr "õÄÁÌÅÎÉÅ ÆÁÊÌÁ ÎÅÕÄÁÌÏÓØ" + +#: src/utilops.c:564 +#, c-format +msgid "" +"About to delete the file:\n" +" %s" +msgstr "" +"èÏÔÉÔÅ ÕÄÁÌÉÔØ ÆÁÊÌ ?:\n" +" %s" + +#: src/utilops.c:565 +msgid "Delete file" +msgstr "õÄÁÌÉÔØ ÆÁÊÌ" + +#: src/utilops.c:620 +#, c-format +msgid "" +"Overwrite file:\n" +"%s\n" +"by renaming:\n" +"%s" +msgstr "" +"ðÅÒÅÚÁÐÉÓÁÔØ ÆÁÊÌ:\n" +"%s\n" +"ÐÅÒÅÉÍÅÎÏ×Á×:\n" +"%s" + +#: src/utilops.c:631 +#, c-format +msgid "" +"Unable to rename file:\n" +"%s\n" +" to:\n" +"%s" +msgstr "" +"îÅÍÏÇÕ ÐÅÒÅÉÍÅÎÏ×ÁÔØ ÆÁÊÌ:\n" +"%s\n" +" ×:\n" +"%s" + +#: src/utilops.c:632 src/utilops.c:813 +msgid "Error renaming file" +msgstr "ïÛÉÂËÁ ÐÅÒÅÉÍÅÎÏ×ÁÎÉÑ ÆÁÊÌÁ" + +#: src/utilops.c:722 src/utilops.c:851 +msgid "GQview - rename" +msgstr "GQview - ÐÅÒÅÉÍÅÎÏ×ÁÔØ" + +#: src/utilops.c:722 +msgid "Rename multiple files:" +msgstr "ðÅÒÅÉÍÅÎÏ×ÁÔØ ×ÙÄÅÌÅÎÎÙÅ ÆÁÊÌÙ:" + +#: src/utilops.c:722 src/utilops.c:851 +msgid "Rename" +msgstr "ðÅÒÅÉÍÅÎÏ×ÁÔØ" + +#: src/utilops.c:758 +msgid "Rename:" +msgstr "ðÅÒÅÉÍÅÎÏ×ÁÔØ:" + +#: src/utilops.c:767 +msgid "to:" +msgstr "×:" + +#: src/utilops.c:802 +#, c-format +msgid "" +"Overwrite file:\n" +"%s\n" +"with:\n" +"%s" +msgstr "" +"æÁÊÌ ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ !\n" +"ðÅÒÅÚÁÐÉÓÁÔØ ÆÁÊÌ ?:\n" +"%s\n" +"ÆÁÊÌÏÍ:\n" +"%s" + +#: src/utilops.c:812 +#, c-format +msgid "" +"Unable to rename file:\n" +"%s\n" +"to:\n" +"%s" +msgstr "" +"îÅÍÏÇÕ ÐÅÒÅÉÍÅÎÏ×ÁÔØ ÆÁÊÌ:\n" +"%s\n" +" ×:\n" +"%s" + +#: src/utilops.c:850 +#, c-format +msgid "" +"Rename file:\n" +"%s\n" +"to:" +msgstr "" +"ðÅÒÅÉÍÅÎÏ×ÁÔØ ÆÁÊÌ:\n" +"%s\n" +"×:" + +#: src/utilops.c:894 +#, c-format +msgid "" +"The path:\n" +"%s\n" +"already exists as a file." +msgstr "" +"ðÕÔØ:\n" +"%s\n" +"ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ ËÁË ÆÁÊÌ." + +#: src/utilops.c:895 +msgid "Could not create directory" +msgstr "îÅÍÏÇÕ ÓÏÚÄÁÔØ ËÁÔÁÌÏÇ" + +#: src/utilops.c:900 +#, c-format +msgid "" +"The directory:\n" +"%s\n" +"already exists." +msgstr "" +"ëÁÔÁÌÏÇ:\n" +"%s\n" +"ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ." + +#: src/utilops.c:901 +msgid "Directory exists" +msgstr "ëÁÔÁÌÏÇ ÓÕÝÅÓÔ×ÕÅÔ" + +#: src/utilops.c:908 +#, c-format +msgid "" +"Unable to create directory:\n" +"%s" +msgstr "" +"îÅÍÏÇÕ ÓÏÚÄÁÔØ ËÁÔÁÌÏÇ:\n" +"%s" + +#: src/utilops.c:909 +msgid "Error creating directory" +msgstr "ïÛÉÂËÁ ÓÏÚÄÁÎÉÑ ËÁÔÁÌÏÇÁ" + +#: src/utilops.c:948 +#, c-format +msgid "" +"Create directory in:\n" +"%s\n" +"named:" +msgstr "" +"óÏÚÄÁÔØ ËÁÔÁÌÏÇ ×:\n" +"%s\n" +"Ó ÉÍÅÎÅÍ:" + +#: src/utilops.c:949 +msgid "GQview - new directory" +msgstr "GQview - ÎÏ×ÙÊ ËÁÔÁÌÏÇ" + +#: src/utilops.c:949 +msgid "Create" +msgstr "óÏÚÄÁÔØ" + +#: src/window.c:151 +msgid "GQview Tools" +msgstr "GQview éÎÓÔÒÕÍÅÎÔÙ" diff --git a/src/.cvsignore b/src/.cvsignore new file mode 100644 index 00000000..1f1b8f75 --- /dev/null +++ b/src/.cvsignore @@ -0,0 +1,4 @@ +.deps +Makefile.in +Makefile +gqview diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 00000000..7cf5d43b --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,39 @@ +SUBDIRS = icons +DIST_SUBDIRS = icons + +INCLUDES = -I$(srcdir) -I$(builddir) \ + -I$(top_srcdir) -I$(top_builddir) \ + -DLOCALEDIR=\""$(localedir)"\" \ + -I$(includedir) $(GTK_CFLAGS) $(GDK_IMLIB_CFLAGS) + +bin_PROGRAMS = gqview + +gqview_SOURCES = \ + config.c \ + dnd.c \ + filelist.c \ + fileops.c \ + globals.c \ + gqview.h \ + image.c \ + image.h \ + img-main.c \ + img-view.c \ + intl.h \ + logo.h \ + main.c \ + menu.c \ + pathsel.c \ + rcfile.c \ + slideshow.c \ + tabcomp.c \ + thumb.c \ + utildlg.c \ + utildlg.h \ + utilops.c \ + window.c + +gqview_LDADD = $(GTK_LIBS) $(GDK_IMLIB_LIBS) + +EXTRA_DIST = tabcomp.xpm + diff --git a/src/config.c b/src/config.c new file mode 100644 index 00000000..420a3061 --- /dev/null +++ b/src/config.c @@ -0,0 +1,704 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" + +/* config memory values */ +static gint startup_path_enable_c; +static gint confirm_delete_c; +static gint restore_tool_c; +static gint save_window_positions_c; +static gint zoom_mode_c; +static gint fit_window_c; +static gint limit_window_size_c; +static gint max_window_size_c; +static gint progressive_key_scrolling_c; +static gint thumb_max_width_c; +static gint thumb_max_height_c; +static gint enable_thumb_caching_c; +static gint use_xvpics_thumbnails_c; +static gint show_dot_files_c; +static gint file_filter_disable_c; +static gint filter_include_jpg_c; +static gint filter_include_xpm_c; +static gint filter_include_tif_c; +static gint filter_include_gif_c; +static gint filter_include_png_c; +static gint filter_include_ppm_c; +static gint filter_include_pgm_c; +static gint filter_include_pcx_c; +static gint filter_include_bmp_c; +static gint slideshow_delay_c; +static gint slideshow_random_c; +static gint slideshow_repeat_c; + +static GtkWidget *configwindow = NULL; +static GtkWidget *startup_path_entry; +static GtkWidget *custom_filter_entry; +static GtkWidget *editor_name_entry[8]; +static GtkWidget *editor_command_entry[8]; + +static void startup_path_set_current(GtkWidget *widget, gpointer data); +static void slideshow_delay_cb(GtkObject *adj, gpointer data); +static void zoom_mode_original_cb(GtkWidget *widget, gpointer data); +static void zoom_mode_fit_cb(GtkWidget *widget, gpointer data); +static void zoom_mode_none_cb(GtkWidget *widget, gpointer data); +static void max_window_size_cb(GtkObject *adj, gpointer data); +static void thumb_size_48_selected(GtkWidget *w, gpointer data); +static void thumb_size_64_selected(GtkWidget *w, gpointer data); +static void thumb_size_85_selected(GtkWidget *w, gpointer data); +static void thumb_size_100_selected(GtkWidget *w, gpointer data); + +static void config_window_apply(); +static void config_window_close_cb(GtkWidget *widget, gpointer data); +static void config_window_destroy(GtkWidget *w, GdkEvent *event, gpointer data); +static void config_window_ok_cb(GtkWidget *widget, gpointer data); +static void config_window_save_cb(GtkWidget *widget, gpointer data); + +static void check_button_cb(GtkWidget *widget, gpointer data); +static void add_check_button(gint option, gint *option_c, gchar *text, GtkWidget *box); +static void config_window_create(gint start_tab); + +/* + *----------------------------------------------------------------------------- + * option widget callbacks (private) + *----------------------------------------------------------------------------- + */ + +static void startup_path_set_current(GtkWidget *widget, gpointer data) +{ + gtk_entry_set_text(GTK_ENTRY(startup_path_entry), current_path); +} + +static void slideshow_delay_cb(GtkObject *adj, gpointer data) +{ + slideshow_delay_c = (gint)GTK_ADJUSTMENT(adj)->value; +} + +static void zoom_mode_original_cb(GtkWidget *widget, gpointer data) +{ + if (GTK_TOGGLE_BUTTON (widget)->active) + zoom_mode_c = ZOOM_RESET_ORIGINAL; +} + +static void zoom_mode_fit_cb(GtkWidget *widget, gpointer data) +{ + if (GTK_TOGGLE_BUTTON (widget)->active) + zoom_mode_c = ZOOM_RESET_FIT_WINDOW; +} + +static void zoom_mode_none_cb(GtkWidget *widget, gpointer data) +{ + if (GTK_TOGGLE_BUTTON (widget)->active) + zoom_mode_c = ZOOM_RESET_NONE; +} + +static void max_window_size_cb(GtkObject *adj, gpointer data) +{ + max_window_size_c = (gint)GTK_ADJUSTMENT(adj)->value; +} + +static void thumb_size_48_selected(GtkWidget *w, gpointer data) +{ + if (GTK_TOGGLE_BUTTON (w)->active) + { + thumb_max_width_c = 48; + thumb_max_height_c = 48; + } +} + +static void thumb_size_64_selected(GtkWidget *w, gpointer data) +{ + if (GTK_TOGGLE_BUTTON (w)->active) + { + thumb_max_width_c = 64; + thumb_max_height_c = 64; + } +} + +static void thumb_size_85_selected(GtkWidget *w, gpointer data) +{ + if (GTK_TOGGLE_BUTTON (w)->active) + { + thumb_max_width_c = 85; + thumb_max_height_c = 64; + } +} + +static void thumb_size_100_selected(GtkWidget *w, gpointer data) +{ + if (GTK_TOGGLE_BUTTON (w)->active) + { + thumb_max_width_c = 100; + thumb_max_height_c = 100; + } +} + +/* + *----------------------------------------------------------------------------- + * sync progam to config window routine (private) + *----------------------------------------------------------------------------- + */ + +static void config_window_apply() +{ + gchar *buf; + gint i; + gint refresh = FALSE; + + for(i=0; i<8; i++) + { + g_free(editor_name[i]); + editor_name[i] = NULL; + buf = gtk_entry_get_text(GTK_ENTRY(editor_name_entry[i])); + if (buf && strlen(buf) > 0) editor_name[i] = g_strdup(buf); + + g_free(editor_command[i]); + editor_command[i] = NULL; + buf = gtk_entry_get_text(GTK_ENTRY(editor_command_entry[i])); + if (buf && strlen(buf) > 0) editor_command[i] = g_strdup(buf); + } + update_edit_menus(mainwindow_accel_grp); + + g_free(startup_path); + startup_path = NULL; + buf = gtk_entry_get_text(GTK_ENTRY(startup_path_entry)); + if (buf && strlen(buf) > 0) startup_path = remove_trailing_slash(buf); + + buf = gtk_entry_get_text(GTK_ENTRY(custom_filter_entry)); + if ((buf && strlen(buf) > 0) != (custom_filter != NULL)) refresh = TRUE; + if ((buf && strlen(buf) > 0 && custom_filter) && strcmp(buf, custom_filter) != 0) refresh = TRUE; + g_free(custom_filter); + custom_filter = NULL; + if (buf && strlen(buf) > 0) custom_filter = g_strdup(buf); + + if (show_dot_files != show_dot_files_c) refresh = TRUE; + if (file_filter_disable != file_filter_disable_c) refresh = TRUE; + if (filter_include_jpg != filter_include_jpg_c) refresh = TRUE; + if (filter_include_xpm != filter_include_xpm_c) refresh = TRUE; + if (filter_include_tif != filter_include_tif_c) refresh = TRUE; + if (filter_include_gif != filter_include_gif_c) refresh = TRUE; + if (filter_include_png != filter_include_png_c) refresh = TRUE; + if (filter_include_ppm != filter_include_ppm_c) refresh = TRUE; + if (filter_include_pgm != filter_include_pgm_c) refresh = TRUE; + if (filter_include_pcx != filter_include_pcx_c) refresh = TRUE; + if (filter_include_bmp != filter_include_bmp_c) refresh = TRUE; + + startup_path_enable = startup_path_enable_c; + confirm_delete = confirm_delete_c; + restore_tool = restore_tool_c; + save_window_positions = save_window_positions_c; + zoom_mode = zoom_mode_c; + fit_window = fit_window_c; + limit_window_size = limit_window_size_c; + max_window_size = max_window_size_c; + progressive_key_scrolling = progressive_key_scrolling_c; + thumb_max_width = thumb_max_width_c; + thumb_max_height = thumb_max_height_c; + enable_thumb_caching = enable_thumb_caching_c; + use_xvpics_thumbnails = use_xvpics_thumbnails_c; + show_dot_files = show_dot_files_c; + file_filter_disable = file_filter_disable_c; + filter_include_jpg = filter_include_jpg_c; + filter_include_xpm = filter_include_xpm_c; + filter_include_tif = filter_include_tif_c; + filter_include_gif = filter_include_gif_c; + filter_include_png = filter_include_png_c; + filter_include_ppm = filter_include_ppm_c; + filter_include_pgm = filter_include_pgm_c; + filter_include_pcx = filter_include_pcx_c; + filter_include_bmp = filter_include_bmp_c; + + slideshow_random = slideshow_random_c; + slideshow_repeat = slideshow_repeat_c; + slideshow_delay = slideshow_delay_c; + + if (refresh) + { + rebuild_file_filter(); + filelist_refresh(); + } +} + +/* + *----------------------------------------------------------------------------- + * config window main button callbacks (private) + *----------------------------------------------------------------------------- + */ + +static void config_window_close_cb(GtkWidget *widget, gpointer data) +{ + gtk_widget_destroy(configwindow); + configwindow = NULL; +} + +static void config_window_destroy(GtkWidget *w, GdkEvent *event, gpointer data) +{ + config_window_close_cb(NULL, NULL); +} + +static void config_window_ok_cb(GtkWidget *widget, gpointer data) +{ + config_window_apply(); + config_window_close_cb(NULL, NULL); +} + +static void config_window_apply_cb(GtkWidget *widget, gpointer data) +{ + config_window_apply(); +} + +/* + *----------------------------------------------------------------------------- + * config window setup (private) + *----------------------------------------------------------------------------- + */ + +static void check_button_cb(GtkWidget *widget, gpointer data) +{ + gint *value_ptr = data; + *value_ptr = GTK_TOGGLE_BUTTON (widget)->active; +} + +static void add_check_button(gint option, gint *option_c, gchar *text, GtkWidget *box) +{ + GtkWidget *button; + *option_c = option; + button = gtk_check_button_new_with_label (text); + gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0); + gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(button), option); + gtk_signal_connect (GTK_OBJECT(button),"clicked",(GtkSignalFunc) check_button_cb, option_c); + gtk_widget_show(button); +} + +static void config_window_create(gint start_tab) +{ + GtkWidget *win_vbox; + GtkWidget *hbox; + GtkWidget *notebook; + GtkWidget *frame; + GtkWidget *label; + GtkWidget *vbox; + GtkWidget *vbox1; + GtkWidget *vbox2; + GtkWidget *button; + GtkWidget *tabcomp; + GtkWidget *radiobuttongroup; + GtkWidget *table; + GtkObject *adj; + GtkWidget *spin; + GdkImlibImage* im; + GdkPixmap *pixmap; + gchar buf[255]; + gint i; + + configwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_signal_connect (GTK_OBJECT (configwindow), "delete_event",(GtkSignalFunc) config_window_destroy, NULL); + gtk_window_set_policy (GTK_WINDOW (configwindow), FALSE, FALSE, FALSE); + gtk_window_set_title (GTK_WINDOW (configwindow), _("GQview configuration")); + gtk_window_set_wmclass(GTK_WINDOW (configwindow), "config", "GQview"); + gtk_container_border_width (GTK_CONTAINER (configwindow), 5); + + win_vbox = gtk_vbox_new(FALSE, 5); + gtk_container_add(GTK_CONTAINER(configwindow), win_vbox); + gtk_widget_show(win_vbox); + + hbox = gtk_hbox_new (TRUE, 0); + gtk_box_pack_end(GTK_BOX(win_vbox), hbox, FALSE, FALSE, 0); + gtk_widget_show(hbox); + + button = gtk_button_new_with_label(_("Ok")); + gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) config_window_ok_cb, NULL); + gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 20); + gtk_widget_show(button); + + button = gtk_button_new_with_label(_("Apply")); + gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) config_window_apply_cb, NULL); + gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 20); + gtk_widget_show(button); + + button = gtk_button_new_with_label(_("Cancel")); + gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) config_window_close_cb, NULL); + gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 20); + gtk_widget_show(button); + + notebook = gtk_notebook_new(); + gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP); + gtk_box_pack_start (GTK_BOX(win_vbox), notebook, TRUE, TRUE, 0); + + /* general options tab */ + + frame = gtk_frame_new(NULL); + gtk_container_border_width (GTK_CONTAINER (frame), 5); + gtk_widget_show(frame); + label = gtk_label_new(_("General")); + gtk_notebook_append_page (GTK_NOTEBOOK(notebook), frame, label); + + vbox = gtk_vbox_new (FALSE, 0); + gtk_container_border_width (GTK_CONTAINER (vbox), 5); + gtk_container_add (GTK_CONTAINER(frame),vbox); + gtk_widget_show(vbox); + + frame = gtk_frame_new(_("Initial directory")); + gtk_container_border_width (GTK_CONTAINER (frame), 5); + gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); + gtk_widget_show(frame); + + vbox1 = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER(frame),vbox1); + gtk_widget_show(vbox1); + + add_check_button(startup_path_enable, &startup_path_enable_c, + _("On startup, change to this directory:"), vbox1); + + hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox1), hbox, FALSE, FALSE, 0); + gtk_widget_show(hbox); + + gtk_widget_realize(configwindow); + + tabcomp = tab_completion_new(&startup_path_entry, configwindow, startup_path, NULL, NULL); + gtk_box_pack_start(GTK_BOX(hbox), tabcomp, TRUE, TRUE, 0); + gtk_widget_show(tabcomp); + + button = gtk_button_new_with_label (_("Use current")); + gtk_signal_connect (GTK_OBJECT(button),"clicked",(GtkSignalFunc) startup_path_set_current, NULL); + gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); + gtk_widget_show(button); + + add_check_button(confirm_delete, &confirm_delete_c, + _("Confirm file delete"), vbox); + add_check_button(restore_tool, &restore_tool_c, + _("Remember tool state (float/hidden)"), vbox); + add_check_button(save_window_positions, &save_window_positions_c, + _("Remember window positions"), vbox); + + frame = gtk_frame_new(_("Slide show")); + gtk_container_border_width (GTK_CONTAINER (frame), 5); + gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); + gtk_widget_show(frame); + + vbox1 = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER(frame),vbox1); + gtk_widget_show(vbox1); + + hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox1), hbox, FALSE, FALSE, 0); + gtk_widget_show(hbox); + + label = gtk_label_new(_("Delay before image change (seconds):")); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + gtk_widget_show(label); + + slideshow_delay_c = slideshow_delay; + adj = gtk_adjustment_new((float)slideshow_delay_c, 1.0, 1200.0, 1, 1, 1); + spin = gtk_spin_button_new( GTK_ADJUSTMENT(adj), 1, 0 ); + gtk_box_pack_start( GTK_BOX(hbox), spin, FALSE, FALSE, 5); + gtk_signal_connect( GTK_OBJECT(adj),"value_changed",GTK_SIGNAL_FUNC(slideshow_delay_cb), NULL); + gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON(spin),GTK_UPDATE_ALWAYS ); + gtk_widget_show(spin); + + add_check_button(slideshow_random, &slideshow_random_c, + _("Random"), vbox1); + add_check_button(slideshow_repeat, &slideshow_repeat_c, + _("Repeat"), vbox1); + + /* image tab */ + + frame = gtk_frame_new(NULL); + gtk_container_border_width (GTK_CONTAINER (frame), 5); + gtk_widget_show(frame); + label = gtk_label_new(_("Image")); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame, label); + + vbox = gtk_vbox_new (FALSE, 0); + gtk_container_border_width (GTK_CONTAINER (vbox), 5); + gtk_container_add (GTK_CONTAINER(frame),vbox); + gtk_widget_show(vbox); + + frame = gtk_frame_new(_("When new image is selected:")); + gtk_container_border_width (GTK_CONTAINER (frame), 5); + gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); + gtk_widget_show(frame); + + vbox1 = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER(frame),vbox1); + gtk_widget_show(vbox1); + + zoom_mode_c = zoom_mode; + radiobuttongroup = gtk_radio_button_new_with_label (NULL, _("Zoom to original size")); + if (zoom_mode == ZOOM_RESET_ORIGINAL) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(radiobuttongroup), 1); + gtk_signal_connect (GTK_OBJECT(radiobuttongroup),"clicked",(GtkSignalFunc) zoom_mode_original_cb, NULL); + gtk_box_pack_start(GTK_BOX(vbox1), radiobuttongroup, FALSE, FALSE, 0); + gtk_widget_show(radiobuttongroup); + + button = gtk_radio_button_new_with_label (gtk_radio_button_group(GTK_RADIO_BUTTON(radiobuttongroup)),_("Fit image to window")); + if (zoom_mode == ZOOM_RESET_FIT_WINDOW) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(button), 1); + gtk_signal_connect (GTK_OBJECT(button),"clicked",(GtkSignalFunc) zoom_mode_fit_cb, NULL); + gtk_box_pack_start(GTK_BOX(vbox1), button, FALSE, FALSE, 0); + gtk_widget_show(button); + + button = gtk_radio_button_new_with_label (gtk_radio_button_group(GTK_RADIO_BUTTON(radiobuttongroup)),_("Leave Zoom at previous setting")); + if (zoom_mode == ZOOM_RESET_NONE) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(button), 1); + gtk_signal_connect (GTK_OBJECT(button),"clicked",(GtkSignalFunc) zoom_mode_none_cb, NULL); + gtk_box_pack_start(GTK_BOX(vbox1), button, FALSE, FALSE, 0); + gtk_widget_show(button); + + add_check_button(fit_window, &fit_window_c, + _("Fit window to image when tools are hidden/floating"), vbox); + + hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + gtk_widget_show(hbox); + + add_check_button(limit_window_size, &limit_window_size_c, + _("Limit size when auto-sizing window"), hbox); + + max_window_size_c = max_window_size; + adj = gtk_adjustment_new((float)max_window_size_c, 10.0, 150.0, 1, 1, 1); + spin = gtk_spin_button_new( GTK_ADJUSTMENT(adj), 1, 0 ); + gtk_box_pack_start( GTK_BOX(hbox), spin, FALSE, FALSE, 5); + gtk_signal_connect( GTK_OBJECT(adj),"value_changed",GTK_SIGNAL_FUNC(max_window_size_cb), NULL); + gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON(spin),GTK_UPDATE_ALWAYS ); + gtk_widget_show(spin); + + frame = gtk_frame_new(_("Thumbnails")); + gtk_container_border_width (GTK_CONTAINER (frame), 5); + gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); + gtk_widget_show(frame); + + vbox1 = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER(frame),vbox1); + gtk_widget_show(vbox1); + + hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox1), hbox, FALSE, FALSE, 0); + gtk_widget_show(hbox); + + thumb_max_width_c = thumb_max_width; + thumb_max_height_c = thumb_max_height; + + label = gtk_label_new(_("Size:")); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); + gtk_widget_show(label); + + radiobuttongroup = gtk_radio_button_new_with_label (NULL,"48x48"); + gtk_box_pack_start(GTK_BOX(hbox), radiobuttongroup, FALSE, FALSE, 0); + if (thumb_max_width_c == 48 && thumb_max_height_c == 48) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(radiobuttongroup), 1); + gtk_signal_connect (GTK_OBJECT(radiobuttongroup),"clicked",(GtkSignalFunc) thumb_size_48_selected, NULL); + gtk_widget_show(radiobuttongroup); + + button = gtk_radio_button_new_with_label (gtk_radio_button_group(GTK_RADIO_BUTTON(radiobuttongroup)),"64x64"); + gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); + if (thumb_max_width_c == 64 && thumb_max_height_c == 64) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(button), 1); + gtk_signal_connect (GTK_OBJECT(button),"clicked",(GtkSignalFunc) thumb_size_64_selected, NULL); + gtk_widget_show(button); + + button = gtk_radio_button_new_with_label (gtk_radio_button_group(GTK_RADIO_BUTTON(radiobuttongroup)),"85x64"); + gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); + if (thumb_max_width_c == 85 && thumb_max_height_c == 64) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(button), 1); + gtk_signal_connect (GTK_OBJECT(button),"clicked",(GtkSignalFunc) thumb_size_85_selected, NULL); + gtk_widget_show(button); + + button = gtk_radio_button_new_with_label (gtk_radio_button_group(GTK_RADIO_BUTTON(radiobuttongroup)),"100x100"); + gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); + if (thumb_max_width_c == 100 && thumb_max_height_c == 100) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(button), 1); + gtk_signal_connect (GTK_OBJECT(button),"clicked",(GtkSignalFunc) thumb_size_100_selected, NULL); + gtk_widget_show(button); + + add_check_button(enable_thumb_caching, &enable_thumb_caching_c, + _("Cache thumbnails"), vbox1); + add_check_button(use_xvpics_thumbnails, &use_xvpics_thumbnails_c, + _("Use xvpics thumbnails when found (read only)"), vbox1); + + add_check_button(progressive_key_scrolling, &progressive_key_scrolling_c, + _("Progressive keyboard scrolling"), vbox); + + /* filtering tab */ + + frame = gtk_frame_new(NULL); + gtk_container_border_width (GTK_CONTAINER (frame), 5); + gtk_widget_show(frame); + label = gtk_label_new(_("Filtering")); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame, label); + + vbox = gtk_vbox_new (FALSE, 0); + gtk_container_border_width (GTK_CONTAINER (vbox), 5); + gtk_container_add (GTK_CONTAINER(frame),vbox); + gtk_widget_show(vbox); + + add_check_button(show_dot_files, &show_dot_files_c, + _("Show entries that begin with a dot"), vbox); + add_check_button(file_filter_disable, &file_filter_disable_c, + _("Disable File Filtering"), vbox); + + frame = gtk_frame_new(_("Include files of type:")); + gtk_container_border_width (GTK_CONTAINER (frame), 5); + gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); + gtk_widget_show(frame); + + vbox1 = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER(frame),vbox1); + gtk_widget_show(vbox1); + + hbox = gtk_hbox_new (TRUE, 0); + gtk_box_pack_start (GTK_BOX(vbox1), hbox, FALSE, FALSE, 0); + gtk_widget_show(hbox); + + vbox2 = gtk_vbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX(hbox), vbox2,FALSE, FALSE, 0); + gtk_widget_show(vbox2); + + add_check_button(filter_include_jpg, &filter_include_jpg_c, + "JPG / JPEG", vbox2); + add_check_button(filter_include_xpm, &filter_include_xpm_c, + "XPM", vbox2); + add_check_button(filter_include_tif, &filter_include_tif_c, + "TIF / TIFF", vbox2); + + vbox2 = gtk_vbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX(hbox), vbox2,FALSE, FALSE, 0); + gtk_widget_show(vbox2); + + add_check_button(filter_include_gif, &filter_include_gif_c, + "GIF", vbox2); + add_check_button(filter_include_png, &filter_include_png_c, + "PNG", vbox2); + add_check_button(filter_include_ppm, &filter_include_ppm_c, + "PPM", vbox2); + + vbox2 = gtk_vbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX(hbox), vbox2,FALSE, FALSE, 0); + gtk_widget_show(vbox2); + + add_check_button(filter_include_pgm, &filter_include_pgm_c, + "PGM", vbox2); + add_check_button(filter_include_pcx, &filter_include_pcx_c, + "PCX", vbox2); + add_check_button(filter_include_bmp, &filter_include_bmp_c, + "BMP", vbox2); + + hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX(vbox1), hbox, FALSE, FALSE, 0); + gtk_widget_show(hbox); + + label = gtk_label_new(_("Custom file types:")); + gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0); + gtk_widget_show(label); + + custom_filter_entry = gtk_entry_new(); + if (custom_filter) gtk_entry_set_text(GTK_ENTRY(custom_filter_entry), custom_filter); + gtk_box_pack_start(GTK_BOX(vbox1),custom_filter_entry,FALSE,FALSE,0); + gtk_widget_show(custom_filter_entry); + + hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX(vbox1), hbox, FALSE, FALSE, 0); + gtk_widget_show(hbox); + + label = gtk_label_new(_("format: [.foo;.bar]")); + gtk_box_pack_end(GTK_BOX(hbox),label,FALSE,FALSE,5); + gtk_widget_show(label); + + /* editor entry tab */ + + frame = gtk_frame_new(NULL); + gtk_container_border_width (GTK_CONTAINER (frame), 5); + gtk_widget_show(frame); + label = gtk_label_new(_("External Editors")); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame, label); + + vbox = gtk_vbox_new(FALSE,0); + gtk_container_border_width (GTK_CONTAINER (vbox), 5); + gtk_container_add (GTK_CONTAINER(frame),vbox); + gtk_widget_show(vbox); + + table=gtk_table_new(3,9,FALSE); + gtk_container_add (GTK_CONTAINER(vbox),table); + gtk_widget_show(table); + + label = gtk_label_new(_("#")); + gtk_table_attach_defaults(GTK_TABLE (table),label, 0, 1, 0, 1); + gtk_widget_show(label); + label = gtk_label_new(_("Menu name")); + gtk_table_attach_defaults(GTK_TABLE (table),label, 1, 2, 0, 1); + gtk_widget_show(label); + label = gtk_label_new(_("Command Line")); + gtk_table_attach_defaults(GTK_TABLE (table),label, 2, 3, 0, 1); + gtk_widget_show(label); + + for (i=0; i<8; i++) + { + sprintf(buf,"%d",i+1); + label = gtk_label_new(buf); + gtk_table_attach_defaults(GTK_TABLE (table),label, 0, 1, i+1, i+2); + gtk_widget_show(label); + + editor_name_entry[i] = gtk_entry_new_with_max_length(32); + gtk_widget_set_usize(editor_name_entry[i],80,-1); + if (editor_name[i]) gtk_entry_set_text(GTK_ENTRY(editor_name_entry[i]),editor_name[i]); + gtk_table_attach_defaults(GTK_TABLE (table),editor_name_entry[i],1,2,i+1,i+2); + gtk_widget_show(editor_name_entry[i]); + + editor_command_entry[i] = gtk_entry_new_with_max_length(255); + gtk_widget_set_usize(editor_command_entry[i],160,-1); + tab_completion_add_to_entry(editor_command_entry[i], NULL, NULL); + if (editor_command[i]) gtk_entry_set_text(GTK_ENTRY(editor_command_entry[i]), editor_command[i]); + gtk_table_attach_defaults(GTK_TABLE (table),editor_command_entry[i],2,3,i+1,i+2); + gtk_widget_show(editor_command_entry[i]); + } + + /* about tab */ + + frame = gtk_frame_new(NULL); + gtk_container_border_width (GTK_CONTAINER (frame), 5); + gtk_widget_show(frame); + label = gtk_label_new(_("About")); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame, label); + + vbox = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER(frame),vbox); + gtk_widget_show(vbox); + + im = gdk_imlib_create_image_from_data((char *)logo, NULL, logo_width, logo_height); + gdk_imlib_render(im, logo_width, logo_height); + pixmap = gdk_imlib_move_image(im); + gdk_imlib_destroy_image(im); + + button=gtk_pixmap_new(pixmap, NULL); + gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0); + gtk_widget_show (button); + + sprintf(buf, _("GQview %s\n\nCopyright (c) 1999 by John Ellis\nhttp://gqview.netpedia.net\ngqview@email.com\n\nReleased under the GNU Public License"), VERSION); + label = gtk_label_new(buf); + gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + + gtk_notebook_set_page (GTK_NOTEBOOK(notebook), start_tab); + gtk_widget_show(notebook); + + gtk_widget_show(configwindow); +} + +/* + *----------------------------------------------------------------------------- + * config/about window show (public) + *----------------------------------------------------------------------------- + */ + +void show_config_window() +{ + if (configwindow) return; + config_window_create(0); +} + +void show_about_window() +{ + if (configwindow) return; + config_window_create(4); +} + diff --git a/src/dnd.c b/src/dnd.c new file mode 100644 index 00000000..b26c29ee --- /dev/null +++ b/src/dnd.c @@ -0,0 +1,441 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" +#include "image.h" + +enum { + TARGET_URI_LIST, + TARGET_TEXT_PLAIN +}; + +static GtkTargetEntry file_drag_types[] = { + { "text/uri-list", 0, TARGET_URI_LIST }, + { "text/plain", 0, TARGET_TEXT_PLAIN } +}; +static gint n_file_drag_types = 2; + +static GtkTargetEntry file_drop_types[] = { + { "text/uri-list", 0, TARGET_URI_LIST } +}; +static gint n_file_drop_types = 1; + +static GList *get_uri_file_list(gchar *data); + +static void image_get_dnd_data(GtkWidget *widget, GdkDragContext *context, + gint x, gint y, + GtkSelectionData *selection_data, guint info, + guint time, gpointer data); +static void image_set_dnd_data(GtkWidget *widget, GdkDragContext *context, + GtkSelectionData *selection_data, guint info, + guint time, gpointer data); +static void image_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data); + +static void file_list_set_dnd_data(GtkWidget *widget, GdkDragContext *context, + GtkSelectionData *selection_data, guint info, + guint time, gpointer data); +static void file_list_drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer data); +static void file_list_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data); + +static void dir_list_set_dnd_data(GtkWidget *widget, GdkDragContext *context, + GtkSelectionData *selection_data, guint info, + guint time, gpointer data); +static void dir_clist_set_highlight(gint set); +static void dir_list_drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer data); +static void dir_list_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data); + +static GList *get_uri_file_list(gchar *data) +{ + GList *list = NULL; + gint b, e; + + b = e = 0; + + while (data[b] != '\0') + { + while (data[e] != '\r' && data[e] != '\n' && data[e] != '\0') e++; + if (!strncmp(data + b, "file:", 5)) + { + b += 5; + list = g_list_append(list, g_strndup(data + b, e - b)); + } + while (data[e] == '\r' || data[e] == '\n') e++; + b = e; + } + + return list; +} + +/* + *----------------------------------------------------------------------------- + * image drag and drop routines + *----------------------------------------------------------------------------- + */ + +static void image_get_dnd_data(GtkWidget *widget, GdkDragContext *context, + gint x, gint y, + GtkSelectionData *selection_data, guint info, + guint time, gpointer data) +{ + ImageWindow *imd = data; + + if (info == TARGET_URI_LIST) + { + GList *list = get_uri_file_list(selection_data->data); + if (list) + { + gchar *path; + + path = list->data; + + if (imd == normal_image) + { + if (isfile(path)) + { + gint row; + gchar *dir = remove_level_from_path(path); + if (strcmp(dir, current_path) != 0) + filelist_change_to(dir); + g_free(dir); + + row = find_file_in_list(path); + if (row == -1) + image_change_to(path); + else + file_image_change_to(row); + } + else if (isdir(path)) + { + filelist_change_to(path); + image_change_to(NULL); + } + } + else + { + if (isfile(path)) + { + image_area_set_image(imd, path, get_default_zoom(imd)); + } + } + + if (debug) + { + GList *work = list; + while (work) + { + printf("dropped: %s\n", (gchar *)(work->data)); + work = work->next; + } + } + + g_list_foreach(list, (GFunc)g_free, NULL); + g_list_free(list); + } + } +} + +static void image_set_dnd_data(GtkWidget *widget, GdkDragContext *context, + GtkSelectionData *selection_data, guint info, + guint time, gpointer data) +{ + ImageWindow *imd = data; + gchar *path = image_area_get_path(imd); + + if (path) + { + gchar *text = NULL; + switch (info) + { + case TARGET_URI_LIST: + text = g_strconcat("file:", path, "\r\n", NULL); + break; + case TARGET_TEXT_PLAIN: + text = g_strdup(path); + break; + } + if (text) + { + gtk_selection_data_set (selection_data, selection_data->target, + 8, text, strlen(text)); + g_free(text); + } + } + else + { + gtk_selection_data_set (selection_data, selection_data->target, + 8, NULL, 0); + } +} + +static void image_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data) +{ + ImageWindow *imd = data; + if (context->action == GDK_ACTION_MOVE) + { + gint row = find_file_in_list(image_area_get_path(imd)); + if (row < 0) return; + if (image_get_path() && strcmp(image_get_path(), image_area_get_path(imd)) == 0) + { + if (row < file_count() - 1) + { + file_next_image(); + } + else + { + file_prev_image(); + } + } + filelist_refresh(); + } +} + +void image_dnd_init(ImageWindow *imd) +{ + gtk_drag_source_set(imd->viewport, GDK_BUTTON2_MASK, + file_drag_types, n_file_drag_types, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK); + gtk_signal_connect(GTK_OBJECT(imd->viewport), "drag_data_get", + image_set_dnd_data, imd); + gtk_signal_connect(GTK_OBJECT(imd->viewport), "drag_end", + image_drag_end, imd); + + gtk_drag_dest_set(imd->viewport, + GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP, + file_drop_types, n_file_drop_types, + GDK_ACTION_COPY); + gtk_signal_connect(GTK_OBJECT(imd->viewport), "drag_data_received", + image_get_dnd_data, imd); +} + +/* + *----------------------------------------------------------------------------- + * file list drag and drop routines (private) + *----------------------------------------------------------------------------- + */ + +static void file_list_set_dnd_data(GtkWidget *widget, GdkDragContext *context, + GtkSelectionData *selection_data, guint info, + guint time, gpointer data) +{ + gchar *uri_text = NULL; + gchar *leader = "file:"; + gchar *sep = "\r\n"; + gint total; + gint leader_l; + gint sep_l = strlen(sep); + gchar *ptr; + + switch (info) + { + case TARGET_URI_LIST: + leader_l = strlen(leader); + break; + case TARGET_TEXT_PLAIN: + leader_l = 0; + break; + default: + return; + break; + } + + if (file_clicked_is_selected()) + { + GList *list; + GList *work; + + list = file_get_selected_list(); + if (!list) return; + work = list; + total = 0; + + /* compute length */ + + while (work) + { + gchar *name = work->data; + total += leader_l + strlen(name) + sep_l; + work = work->next; + } + + /* create list */ + uri_text = g_malloc(total + 1); + ptr = uri_text; + + work = list; + while (work) + { + gchar *name = work->data; + if (leader_l > 0) + { + strcpy(ptr, leader); + ptr += leader_l; + } + strcpy(ptr, name); + ptr += strlen(name); + strcpy(ptr, sep); + ptr += sep_l; + work = work->next; + } + ptr[0] = '\0'; + free_selected_list(list); + } + else + { + gchar *path = file_clicked_get_path(); + if (!path) return; + switch (info) + { + case TARGET_URI_LIST: + uri_text = g_strconcat("file:", path, "\r\n", NULL); + break; + case TARGET_TEXT_PLAIN: + uri_text = g_strdup(path); + break; + } + total = strlen(uri_text); + g_free(path); + } + + if (debug) printf(uri_text); + + gtk_selection_data_set (selection_data, selection_data->target, + 8, uri_text, total); + g_free(uri_text); + + file_clist_highlight_unset(); +} + +static void file_list_drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer data) +{ + file_clist_highlight_set(); +} + +static void file_list_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data) +{ + file_clist_highlight_unset(); + + if (context->action == GDK_ACTION_MOVE) + { + filelist_refresh(); + } +} + +/* + *----------------------------------------------------------------------------- + * directory list drag and drop routines (private) + *----------------------------------------------------------------------------- + */ + +static void dir_list_set_dnd_data(GtkWidget *widget, GdkDragContext *context, + GtkSelectionData *selection_data, guint info, + guint time, gpointer data) +{ + gint row = GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(dir_clist))); + + if (row >= 0) + { + gchar *name = gtk_clist_get_row_data(GTK_CLIST(dir_clist), row); + gchar *new_path; + gchar *text = NULL; + + if (strcmp(name, ".") == 0) + new_path = g_strdup(current_path); + else if (strcmp(name, "..") == 0) + new_path = remove_level_from_path(current_path); + else + { + if (strcmp(current_path, "/") == 0) + new_path = g_strconcat(current_path, name, NULL); + else + new_path = g_strconcat(current_path, "/", name, NULL); + } + + + switch (info) + { + case TARGET_URI_LIST: + text = g_strconcat("file:", new_path, "\r\n", NULL); + break; + case TARGET_TEXT_PLAIN: + text = g_strdup(new_path); + break; + } + if (text) + { + gtk_selection_data_set (selection_data, selection_data->target, + 8, text, strlen(text)); + g_free(text); + } + g_free(new_path); + } +} + +static void dir_clist_set_highlight(gint set) +{ + gint row = GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(dir_clist))); + if (set) + { + gtk_clist_set_background(GTK_CLIST(dir_clist), row, + >K_WIDGET (dir_clist)->style->bg[GTK_STATE_SELECTED]); + gtk_clist_set_foreground(GTK_CLIST(dir_clist), row, + >K_WIDGET (dir_clist)->style->fg[GTK_STATE_SELECTED]); + } + else + { + gtk_clist_set_background(GTK_CLIST(dir_clist), row, NULL); + gtk_clist_set_foreground(GTK_CLIST(dir_clist), row, NULL); + } +} + +static void dir_list_drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer data) +{ + dir_clist_set_highlight(TRUE); +} + +static void dir_list_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data) +{ + dir_clist_set_highlight(FALSE); + + if (context->action == GDK_ACTION_MOVE) + { + filelist_refresh(); + } +} + +/* + *----------------------------------------------------------------------------- + * drag and drop initialization (public) + *----------------------------------------------------------------------------- + */ + +void init_dnd() +{ + /* dir clist */ + gtk_drag_source_set(dir_clist, GDK_BUTTON2_MASK, + file_drag_types, n_file_drag_types, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK); + gtk_signal_connect(GTK_OBJECT(dir_clist), "drag_begin", + dir_list_drag_begin, NULL); + gtk_signal_connect(GTK_OBJECT(dir_clist), "drag_data_get", + dir_list_set_dnd_data, NULL); + gtk_signal_connect(GTK_OBJECT(dir_clist), "drag_end", + dir_list_drag_end, NULL); + + /* file clist */ + gtk_drag_source_set(file_clist, GDK_BUTTON2_MASK, + file_drag_types, n_file_drag_types, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK); + gtk_signal_connect(GTK_OBJECT(file_clist), "drag_begin", + file_list_drag_begin, NULL); + gtk_signal_connect(GTK_OBJECT(file_clist), "drag_data_get", + file_list_set_dnd_data, NULL); + gtk_signal_connect(GTK_OBJECT(file_clist), "drag_end", + file_list_drag_end, NULL); + + /* image */ + image_dnd_init(main_image); +} + + diff --git a/src/filelist.c b/src/filelist.c new file mode 100644 index 00000000..a203f39e --- /dev/null +++ b/src/filelist.c @@ -0,0 +1,1074 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" + +static gint filelist_click_row = -1; + +static void update_progressbar(gfloat val); + +static gint file_is_hidden(gchar *name); +static gint file_is_in_filter(gchar *name); +static void add_to_filter(gchar *text, gint add); + +static gint sort_list_cb(void *a, void *b); +static void filelist_read(gchar *path); + +static gint file_find_closest_unaccounted(gint row, gint count, GList *ignore_list); + +static void history_menu_select_cb(GtkWidget *widget, gpointer data); +static gchar *truncate_hist_text(gchar *t, gint l); +static void filelist_set_history(gchar *path); + +/* + *----------------------------------------------------------------------------- + * file status information (private) + *----------------------------------------------------------------------------- + */ + +static void update_progressbar(gfloat val) +{ + gtk_progress_bar_update (GTK_PROGRESS_BAR(info_progress_bar), val); +} + +void update_status_label(gchar *text) +{ + gchar *buf; + gint count; + gchar *ss = ""; + + if (text) + { + gtk_label_set(GTK_LABEL(info_status), text); + return; + } + + if (slideshow_is_running()) ss = _(" Slideshow"); + + count = file_selection_count(); + if (count > 0) + buf = g_strdup_printf(_("%d files (%d)%s"), file_count(), count, ss); + else + buf = g_strdup_printf(_("%d files%s"), file_count(), ss); + + gtk_label_set(GTK_LABEL(info_status), buf); + g_free(buf); +} + +/* + *----------------------------------------------------------------------------- + * file filtering + *----------------------------------------------------------------------------- + */ + +static gint file_is_hidden(gchar *name) +{ + if (name[0] != '.') return FALSE; + if (name[1] == '\0' || (name[1] == '.' && name[2] == '\0')) return FALSE; + return TRUE; +} + +static gint file_is_in_filter(gchar *name) +{ + GList *work; + if (!filename_filter || file_filter_disable) return TRUE; + + work = filename_filter; + while (work) + { + gchar *filter = work->data; + gint lf = strlen(filter); + gint ln = strlen(name); + if (ln >= lf) + { + if (strncasecmp(name + ln - lf, filter, lf) == 0) return TRUE; + } + work = work->next; + } + + return FALSE; +} + +static void add_to_filter(gchar *text, gint add) +{ + if (add) filename_filter = g_list_append(filename_filter, g_strdup(text)); +} + +void rebuild_file_filter() +{ + if (filename_filter) + { + g_list_foreach(filename_filter,(GFunc)g_free,NULL); + g_list_free(filename_filter); + filename_filter = NULL; + } + + add_to_filter(".jpg", filter_include_jpg); + add_to_filter(".jpeg", filter_include_jpg); + add_to_filter(".xpm", filter_include_xpm); + add_to_filter(".tif", filter_include_tif); + add_to_filter(".tiff", filter_include_tif); + add_to_filter(".gif", filter_include_gif); + add_to_filter(".png", filter_include_png); + add_to_filter(".ppm", filter_include_ppm); + add_to_filter(".pgm", filter_include_pgm); + add_to_filter(".pcx", filter_include_pcx); + add_to_filter(".bmp", filter_include_bmp); + + if (custom_filter) + { + gchar *buf = g_strdup(custom_filter); + gchar *pos_ptr_b; + gchar *pos_ptr_e = custom_filter; + while(pos_ptr_e[0] != '\0') + { + pos_ptr_b = pos_ptr_e; + while (pos_ptr_e[0] != ';' && pos_ptr_e[0] != '\0') pos_ptr_e++; + if (pos_ptr_e[0] == ';') + { + pos_ptr_e[0] = '\0'; + pos_ptr_e++; + } + add_to_filter(pos_ptr_b, TRUE); + } + g_free(buf); + } +} + +/* + *----------------------------------------------------------------------------- + * load file list (private) + *----------------------------------------------------------------------------- + */ + +static gint sort_list_cb(void *a, void *b) +{ + return strcmp((gchar *)a, (gchar *)b); +} + +static void filelist_read(gchar *path) +{ + DIR *dp; + struct dirent *dir; + struct stat ent_sbuf; + + if((dp = opendir(path))==NULL) + { + /* dir not found */ + return; + } + + g_list_foreach(dir_list,(GFunc)g_free,NULL); + g_list_free(dir_list); + dir_list = NULL; + + g_list_foreach(file_list,(GFunc)g_free,NULL); + g_list_free(file_list); + file_list = NULL; + + while ((dir = readdir(dp)) != NULL) + { + /* skips removed files */ + if (dir->d_ino > 0) + { + gchar *name = dir->d_name; + if (show_dot_files || !file_is_hidden(name)) + { + gchar *filepath = g_strconcat(path, "/", name, NULL); + if (stat(filepath,&ent_sbuf) >= 0 && S_ISDIR(ent_sbuf.st_mode)) + { + dir_list = g_list_prepend(dir_list, g_strdup(name)); + } + else + { + if (file_is_in_filter(name)) + file_list = g_list_prepend(file_list, g_strdup(name)); + } + g_free(filepath); + } + } + } + + closedir(dp); + + dir_list = g_list_sort(dir_list, (GCompareFunc) sort_list_cb); + file_list = g_list_sort(file_list, (GCompareFunc) sort_list_cb); +} + +/* + *----------------------------------------------------------------------------- + * file list utilities to retrieve information (public) + *----------------------------------------------------------------------------- + */ + +gint file_count() +{ + return g_list_length(file_list); +} + +gint file_selection_count() +{ + gint count = 0; + GList *work = GTK_CLIST(file_clist)->selection; + while(work) + { + count++; + if (debug) printf("s = %d\n", GPOINTER_TO_INT(work->data)); + work = work->next; + } + + if (debug) printf("files selected = %d\n", count); + + return count; +} + +gint find_file_in_list(gchar *path) +{ + GList *work = file_list; + gchar *buf; + gchar *name; + gint count = -1; + + if (!path) return -1; + + buf = remove_level_from_path(path); + if (strcmp(buf, current_path) != 0) + { + g_free(buf); + return -1; + } + g_free(buf); + + name = filename_from_path(path); + while(work) + { + count++; + if (strcmp(name, work->data) == 0) return count; + work = work->next; + } + + return -1; +} + +gchar *file_get_path(gint row) +{ + gchar *path = NULL; + gchar *name = gtk_clist_get_row_data(GTK_CLIST(file_clist), row); + + if (name) path = g_strconcat(current_path, "/", name, NULL); + + return path; +} + +gint file_is_selected(gint row) +{ + GList *work = GTK_CLIST(file_clist)->selection; + + while(work) + { + if (GPOINTER_TO_INT(work->data) == row) return TRUE; + work = work->next; + } + + return FALSE; +} + +/* + *----------------------------------------------------------------------------- + * utilities to retrieve list of selected files (public) + *----------------------------------------------------------------------------- + */ + +GList *file_get_selected_list() +{ + GList *list = NULL; + GList *work = GTK_CLIST(file_clist)->selection; + + while(work) + { + gchar *name = gtk_clist_get_row_data(GTK_CLIST(file_clist), + GPOINTER_TO_INT(work->data)); + list = g_list_prepend(list, g_strconcat(current_path, "/", name, NULL)); + work = work->next; + } + + list = g_list_reverse(list); + + return list; +} + +void free_selected_list(GList *list) +{ + g_list_foreach(list, (GFunc)g_free, NULL); + g_list_free(list); +} + +gint file_clicked_is_selected() +{ + return file_is_selected(filelist_click_row); +} + +gchar *file_clicked_get_path() +{ + return file_get_path(filelist_click_row); +} + +/* + *----------------------------------------------------------------------------- + * image change routines + *----------------------------------------------------------------------------- + */ + +void file_image_change_to(gint row) +{ + gtk_clist_unselect_all(GTK_CLIST(file_clist)); + gtk_clist_select_row(GTK_CLIST(file_clist), row, -1); + if (gtk_clist_row_is_visible(GTK_CLIST(file_clist), row) != GTK_VISIBILITY_FULL) + { + gtk_clist_moveto(GTK_CLIST(file_clist), row, -1, 0.5, 0.0); + } +} + +void file_next_image() +{ + gint current = find_file_in_list(image_get_path()); + gint total = file_count(); + + if (current >= 0) + { + if (current < total - 1) + { + file_image_change_to(current + 1); + } + } + else + { + file_image_change_to(0); + } +} + +void file_prev_image() +{ + gint current = find_file_in_list(image_get_path()); + + if (current >= 0) + { + if (current > 0) + { + file_image_change_to(current - 1); + } + } + else + { + file_image_change_to(file_count() - 1); + } +} + +void file_first_image() +{ + gint current = find_file_in_list(image_get_path()); + if (current != 0 && file_count() > 0) + { + file_image_change_to(0); + } +} + +void file_last_image() +{ + gint current = find_file_in_list(image_get_path()); + gint count = file_count(); + if (current != count - 1 && count > 0) + { + file_image_change_to(count - 1); + } +} + +/* + *----------------------------------------------------------------------------- + * file delete/rename update routines + *----------------------------------------------------------------------------- + */ + +static gint file_find_closest_unaccounted(gint row, gint count, GList *ignore_list) +{ + GList *list = NULL; + GList *work; + gint rev = row - 1; + row ++; + + work = ignore_list; + while(work) + { + gint f = find_file_in_list(work->data); + if (f >= 0) list = g_list_append(list, GINT_TO_POINTER(f)); + work = work->next; + } + + while(list) + { + gint c = TRUE; + work = list; + while(work && c) + { + gpointer p = work->data; + work = work->next; + if (row == GPOINTER_TO_INT(p)) + { + row++; + c = FALSE; + } + if (rev == GPOINTER_TO_INT(p)) + { + rev--; + c = FALSE; + } + if (!c) list = g_list_remove(list, p); + } + if (c && list) + { + g_list_free(list); + list = NULL; + } + } + if (row > count - 1) + { + if (rev < 0) + return -1; + else + return rev; + } + else + { + return row; + } +} + +void file_is_gone(gchar *path, GList *ignore_list) +{ + GList *list; + gchar *name; + gint row; + gint new_row = -1; + row = find_file_in_list(path); + if (row < 0) return; + + if (file_is_selected(row) /* && file_selection_count() == 1 */) + { + gint n = file_count(); + if (ignore_list) + { + new_row = file_find_closest_unaccounted(row, n, ignore_list); + if (debug) printf("row = %d, closest is %d\n", row, new_row); + } + else + { + if (row + 1 < n) + { + new_row = row + 1; + } + else if (row > 0) + { + new_row = row - 1; + } + } + gtk_clist_unselect_all(GTK_CLIST(file_clist)); + if (new_row >= 0) + { + gtk_clist_select_row(GTK_CLIST(file_clist), new_row, -1); + file_image_change_to(new_row); + } + else + { + image_change_to(NULL); + } + } + + gtk_clist_remove(GTK_CLIST(file_clist), row); + list = g_list_nth(file_list, row); + name = list->data; + file_list = g_list_remove(file_list, name); + g_free(name); + update_status_label(NULL); +} + +void file_is_renamed(gchar *source, gchar *dest) +{ + gint row; + gchar *source_base; + gchar *dest_base; + + if (image_get_path() && !strcmp(source, image_get_path())) + { + image_set_path(dest); + } + + row = find_file_in_list(source); + if (row < 0) return; + + source_base = remove_level_from_path(source); + dest_base = remove_level_from_path(dest); + + if (strcmp(source_base, dest_base) == 0) + { + gchar *name; + gint n; + GList *work = g_list_nth(file_list, row); + name = work->data; + file_list = g_list_remove(file_list, name); + g_free(name); + name = g_strdup(filename_from_path(dest)); + file_list = g_list_insert_sorted(file_list, name, (GCompareFunc) sort_list_cb); + n = g_list_index(file_list, name); + + if (gtk_clist_get_cell_type(GTK_CLIST(file_clist), row, 0) != GTK_CELL_PIXTEXT) + { + gtk_clist_set_text (GTK_CLIST(file_clist), row, 0, name); + } + else + { + guint8 spacing = 0; + GdkPixmap *pixmap = NULL; + GdkBitmap *mask = NULL; + gtk_clist_get_pixtext(GTK_CLIST(file_clist), row, 0, + NULL, &spacing, &pixmap, &mask); + gtk_clist_set_pixtext(GTK_CLIST(file_clist), row, 0, + name, spacing, pixmap, mask); + } + + gtk_clist_set_row_data(GTK_CLIST(file_clist), row, name); + gtk_clist_row_move(GTK_CLIST(file_clist), row, n); + } + else + { + GList *work = g_list_nth(file_list, row); + gchar *name = work->data; + file_list = g_list_remove(file_list, name); + gtk_clist_remove(GTK_CLIST(file_clist), row); + g_free(name); + update_status_label(NULL); + } + + g_free(source_base); + g_free(dest_base); + +} + +/* + *----------------------------------------------------------------------------- + * directory list callbacks + *----------------------------------------------------------------------------- + */ + +void dir_select_cb(GtkWidget *widget, gint row, gint col, + GdkEvent *event, gpointer data) +{ + gchar *name; + gchar *new_path; + name = gtk_clist_get_row_data (GTK_CLIST(dir_clist), row); + if (strcmp(name, ".") == 0) + { + new_path = g_strdup(current_path); + } + else if (strcmp(name, "..") == 0) + { + new_path = remove_level_from_path(current_path); + } + else + { + if (strcmp(current_path, "/") == 0) + new_path = g_strconcat(current_path, name, NULL); + else + new_path = g_strconcat(current_path, "/", name, NULL); + } + filelist_change_to(new_path); + g_free(new_path); +} + +void dir_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data) +{ + gint row = -1; + gint col = -1; + + gtk_clist_get_selection_info (GTK_CLIST (widget), bevent->x, bevent->y, &row, &col); + + if (bevent->button == 2) + { + gtk_object_set_user_data(GTK_OBJECT(dir_clist), GINT_TO_POINTER(row)); + } +} + +/* + *----------------------------------------------------------------------------- + * file list callbacks + *----------------------------------------------------------------------------- + */ + +void file_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data) +{ + gint row = -1; + gint col = -1; + + gtk_clist_get_selection_info (GTK_CLIST (widget), bevent->x, bevent->y, &row, &col); + if (row == -1 || col == -1) + { + filelist_click_row = -1; + return; + } + + filelist_click_row = row; + + if (bevent->button == 3) + { + file_clist_highlight_set(); + gtk_menu_popup (GTK_MENU(menu_file_popup), NULL, NULL, NULL, NULL, + bevent->button, bevent->time); + } +} + +void file_select_cb(GtkWidget *widget, gint row, gint col, + GdkEvent *event, gpointer data) +{ + gchar *name; + gchar *path; + + if (file_selection_count() != 1) + { + update_status_label(NULL); + return; + } + + name = gtk_clist_get_row_data(GTK_CLIST(file_clist), row); + path = g_strconcat(current_path, "/", name, NULL); + image_change_to(path); + update_status_label(NULL); + g_free(path); +} + +void file_unselect_cb(GtkWidget *widget, gint row, gint col, + GdkEvent *event, gpointer data) +{ +#if 0 + gchar *name; + gchar *path; + + name = gtk_clist_get_row_data(GTK_CLIST(file_clist), row); + path = g_strconcat(current_path, "/", name, NULL); + + if (strcmp(path, image_get_path()) == 0) + { + if (file_selection_count() > 0 && !file_is_selected(find_file_in_list(image_get_path())) ) + { + gint new_row = GPOINTER_TO_INT(GTK_CLIST(file_clist)->selection->data); + gchar *new_name = gtk_clist_get_row_data(GTK_CLIST(file_clist), new_row); + gchar *new_path = g_strconcat(current_path, "/", new_name, NULL); + image_change_to(new_path); + g_free(new_path); + } + } + g_free(path); +#endif + update_status_label(NULL); +} + +/* + *----------------------------------------------------------------------------- + * file list highlight utils + *----------------------------------------------------------------------------- + */ + +void file_clist_highlight_set() +{ + if (file_clicked_is_selected()) return; + + gtk_clist_set_background(GTK_CLIST(file_clist), filelist_click_row, + >K_WIDGET (file_clist)->style->bg[GTK_STATE_PRELIGHT]); + gtk_clist_set_foreground(GTK_CLIST(file_clist), filelist_click_row, + >K_WIDGET (file_clist)->style->fg[GTK_STATE_PRELIGHT]); +} + +void file_clist_highlight_unset() +{ + if (file_clicked_is_selected()) return; + + gtk_clist_set_background(GTK_CLIST(file_clist), filelist_click_row, NULL); + gtk_clist_set_foreground(GTK_CLIST(file_clist), filelist_click_row, NULL); +} + +/* + *----------------------------------------------------------------------------- + * path entry and history menu + *----------------------------------------------------------------------------- + */ + +void path_entry_cb(gchar *newdir, gpointer data) +{ + gchar *new_path = g_strdup(newdir); + parse_out_relatives(new_path); + if (isdir(new_path)) + filelist_change_to(new_path); + else if (isfile(new_path)) + { + gchar *path = remove_level_from_path(new_path); + filelist_change_to(path); + g_free(path); + image_change_to(new_path); + } + g_free(new_path); +} + +static void history_menu_select_cb(GtkWidget *widget, gpointer data) +{ + gchar *new_path = data; + filelist_change_to(new_path); +} + +static gchar *truncate_hist_text(gchar *t, gint l) +{ + gchar *tp; + gchar *tbuf; + if (l >= strlen(t)) return g_strdup(t); + tp = t + strlen(t) - l; + while (tp[0] != '/' && tp < t + strlen(t)) tp++; + /* this checks to see if directory name is longer than l, if so + * reset the length of name to l, it's better to have a partial + * name than no name at all. + */ + if (tp >= t + strlen(t)) tp = t + strlen(t) - l; + tbuf = g_strconcat("/...", tp, NULL); + return tbuf; +} + +static void filelist_set_history(gchar *path) +{ + static GList *history_list = NULL; + gchar *buf; + gchar *buf_ptr; + GtkWidget *menu; + GtkWidget *item; + + if (!path) return; + + gtk_entry_set_text(GTK_ENTRY(path_entry), current_path); + + if (history_list) + { + g_list_foreach(history_list, (GFunc)g_free, NULL); + g_list_free(history_list); + history_list = NULL; + } + + menu = gtk_menu_new(); + + buf = g_strdup(path); + buf_ptr = buf + strlen(buf) - 1 ; + while (buf_ptr > buf) + { + gchar *full_path; + gchar *truncated; + truncated = truncate_hist_text(buf, 32); + + full_path = g_strdup(buf); + history_list = g_list_append(history_list, full_path); + + item = gtk_menu_item_new_with_label (truncated); + gtk_signal_connect (GTK_OBJECT (item), "activate", + (GtkSignalFunc) history_menu_select_cb, full_path); + + gtk_menu_append (GTK_MENU (menu), item); + gtk_widget_show (item); + + g_free(truncated); + + while (buf_ptr[0] != '/' && buf_ptr > buf) buf_ptr--; + buf_ptr[0] = '\0'; + } + g_free(buf); + + item = gtk_menu_item_new_with_label ("/"); + + gtk_signal_connect (GTK_OBJECT (item), "activate", + (GtkSignalFunc) history_menu_select_cb, "/"); + + gtk_menu_append (GTK_MENU (menu), item); + gtk_widget_show (item); + + gtk_option_menu_set_menu(GTK_OPTION_MENU(history_menu), menu); +} + +/* + *----------------------------------------------------------------------------- + * list update routines (public) + *----------------------------------------------------------------------------- + */ + +static gint thumbs_running = 0; + +void interrupt_thumbs() +{ + if (thumbs_running > 0) thumbs_running ++; +} + +void filelist_populate_clist() +{ + GList *work; + gint width; + gint tmp_width; + gint row; + gchar *image_name = NULL; + gchar *buf; + + gint row_p = 0; + gchar *text; + guint8 spacing; + GdkPixmap *nopixmap; + GdkBitmap *nomask; + + interrupt_thumbs(); + + filelist_set_history(current_path); + + gtk_clist_freeze (GTK_CLIST (dir_clist)); + gtk_clist_clear (GTK_CLIST (dir_clist)); + + width = 0; + work = dir_list; + while(work) + { + gchar *buf[2]; + buf[0] = work->data; + buf[1] = NULL; + row = gtk_clist_append(GTK_CLIST(dir_clist), buf); + gtk_clist_set_row_data (GTK_CLIST(dir_clist), row, work->data); + tmp_width = gdk_string_width(dir_clist->style->font, buf[0]); + if (tmp_width > width) width = tmp_width; + work = work->next; + } + + gtk_clist_set_column_width(GTK_CLIST(dir_clist), 0, width); + gtk_clist_thaw(GTK_CLIST (dir_clist)); + + buf = remove_level_from_path(image_get_path()); + if (buf && strcmp(buf, current_path) == 0) + { + image_name = image_get_name(); + } + g_free(buf); + + gtk_clist_freeze (GTK_CLIST (file_clist)); + + if (!thumbnails_enabled) + { + gtk_clist_set_row_height (GTK_CLIST(file_clist), + GTK_WIDGET(file_clist)->style->font->ascent + + GTK_WIDGET(file_clist)->style->font->descent + 1); + } + else + { + gtk_clist_set_row_height (GTK_CLIST(file_clist), thumb_max_height + 2); + maintain_thumbnail_dir(current_path, FALSE); + } + + width = 0; + work = file_list; + + while(work) + { + gint has_pixmap; + gint match; + gchar *name = work->data; + gint done = FALSE; + + while (!done) + { + if (GTK_CLIST(file_clist)->rows > row_p) + { + if (gtk_clist_get_cell_type(GTK_CLIST(file_clist),row_p, 0) == GTK_CELL_PIXTEXT) + { + gtk_clist_get_pixtext(GTK_CLIST(file_clist), row_p, 0, &text, &spacing, &nopixmap, &nomask); + has_pixmap = TRUE; + } + else + { + gtk_clist_get_text(GTK_CLIST(file_clist), row_p, 0, &text); + has_pixmap = FALSE; + } + match = strcmp(name, text); + } + else + { + match = -1; + } + + if (match < 0) + { + gchar *buf[2]; + buf[0] = name; + buf[1] = NULL; + row = gtk_clist_insert(GTK_CLIST(file_clist), row_p, buf); + gtk_clist_set_row_data (GTK_CLIST(file_clist), row, name); + if (thumbnails_enabled) + gtk_clist_set_shift(GTK_CLIST(file_clist), row, 0, 0, 5 + thumb_max_width); + done = TRUE; + if (image_name && strcmp(name, image_name) == 0) + gtk_clist_select_row(GTK_CLIST(file_clist), row, 0); + } + else if (match > 0) + { + gtk_clist_remove(GTK_CLIST(file_clist), row_p); + } + else + { + if (thumbnails_enabled && !has_pixmap) + gtk_clist_set_shift(GTK_CLIST(file_clist), row_p, 0, 0, 5 + thumb_max_width); + if (!thumbnails_enabled/* && has_pixmap*/) + { + gtk_clist_set_text(GTK_CLIST(file_clist), row_p, 0, name); + gtk_clist_set_shift(GTK_CLIST(file_clist), row_p, 0, 0, 0); + } + gtk_clist_set_row_data (GTK_CLIST(file_clist), row_p, name); + done = TRUE; + } + } + row_p++; + + if (thumbnails_enabled) + tmp_width = gdk_string_width(file_clist->style->font, name) + thumb_max_width + 5; + else + tmp_width = gdk_string_width(file_clist->style->font, name); + if (tmp_width > width) width = tmp_width; + work = work->next; + } + + while (GTK_CLIST(file_clist)->rows > row_p) + gtk_clist_remove(GTK_CLIST(file_clist), row_p); + + gtk_clist_set_column_width(GTK_CLIST(file_clist), 0, width); + gtk_clist_thaw(GTK_CLIST (file_clist)); + + if (thumbnails_enabled) + { + GList *done_list = NULL; + gint past_run; + gint finished = FALSE; + gint j; + gint count = 0; + update_status_label(_("Loading thumbs...")); + + for (j = 0; j < GTK_CLIST(file_clist)->rows; j++) + { + done_list = g_list_prepend(done_list, GINT_TO_POINTER(FALSE)); + } + + /* load thumbs */ + + while (!finished && done_list) + { + gint p = -1; + gint r = -1; + gint c = -1; + gtk_clist_get_selection_info (GTK_CLIST(file_clist), 1, 1, &r, &c); + if (r != -1) + { + work = g_list_nth(done_list, r); + while (work) + { + if (gtk_clist_row_is_visible(GTK_CLIST(file_clist), r)) + { + if (!GPOINTER_TO_INT(work->data)) + { + work->data = GINT_TO_POINTER(TRUE); + p = r; + work = NULL; + } + else + { + r++; + work = work->next; + } + } + else + { + work = NULL; + } + } + } + if (p == -1) + { + work = done_list; + r = 0; + while(work && p == -1) + { + if (!GPOINTER_TO_INT(work->data)) + { + p = r; + work->data = GINT_TO_POINTER(TRUE); + } + else + { + r++; + work = work->next; + if (!work) finished = TRUE; + } + } + } + + count++; + + if (!finished && gtk_clist_get_cell_type(GTK_CLIST(file_clist), p, 0) != GTK_CELL_PIXTEXT) + { + GdkPixmap *pixmap = NULL; + GdkBitmap *mask = NULL; + gchar *name; + gchar *path; + + thumbs_running ++; + past_run = thumbs_running; + while(gtk_events_pending()) gtk_main_iteration(); + if (thumbs_running > past_run) + { + thumbs_running -= 2; + update_progressbar(0.0); + update_status_label(NULL); + g_list_free(done_list); + return; + } + thumbs_running --; + + name = gtk_clist_get_row_data(GTK_CLIST(file_clist), p); + path = g_strconcat (current_path, "/", name, NULL); + spacing = create_thumbnail(path, &pixmap, &mask); + g_free(path); + gtk_clist_set_pixtext (GTK_CLIST(file_clist), p, 0, name, spacing + 5, pixmap, mask); + gtk_clist_set_shift(GTK_CLIST(file_clist), p, 0, 0, 0); + + update_progressbar((gfloat)(count) / GTK_CLIST(file_clist)->rows); + } + } + update_progressbar(0.0); + g_list_free(done_list); + } + + update_status_label(NULL); +} + +void filelist_refresh() +{ + filelist_read(current_path); + filelist_populate_clist(); + filelist_click_row = -1; +} + +void filelist_change_to(gchar *path) +{ + if (!isdir(path)) return; + + g_free(current_path); + current_path = g_strdup(path); + + filelist_refresh(); +} diff --git a/src/fileops.c b/src/fileops.c new file mode 100644 index 00000000..8b6ba3c4 --- /dev/null +++ b/src/fileops.c @@ -0,0 +1,133 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" + +/* + *----------------------------------------------------------------------------- + * generic file information and manipulation routines (public) + *----------------------------------------------------------------------------- + */ + +/* first we try the HOME environment var, if that doesn't work, we try getpwuid(). */ +gchar *homedir() +{ + gchar *home = getenv("HOME"); + if(home) + return home; + else + { + struct passwd *pw = getpwuid(getuid()); + if (pw) + return pw->pw_dir; + else + return NULL ; /* now we've got a problem */ + } +} + +int isfile(char *s) +{ + struct stat st; + + if ((!s)||(!*s)) return 0; + if (stat(s,&st)<0) return 0; + if (S_ISREG(st.st_mode)) return 1; + return 0; +} + +int isdir(char *s) +{ + struct stat st; + + if ((!s)||(!*s)) return 0; + if (stat(s,&st)<0) return 0; + if (S_ISDIR(st.st_mode)) return 1; + return 0; +} + +int filesize(char *s) +{ + struct stat st; + + if ((!s)||(!*s)) return 0; + if (stat(s,&st)<0) return 0; + return (int)st.st_size; +} + +time_t filetime(gchar *s) +{ + struct stat st; + + if ((!s)||(!*s)) return 0; + if (stat(s,&st)<0) return 0; + return st.st_mtime; +} + +int copy_file(char *s, char *t) +{ + FILE *fi, *fo; + char buf[4096]; + int b; + + fi = fopen(s, "rb"); + if (!fi) + { + return FALSE; + } + + fo = fopen(t, "wb"); + if (!fo) + { + fclose(fi); + return FALSE; + } + + while((b = fread(buf, sizeof(char), 4096, fi)) && b != 0) + { + if (fwrite(buf, sizeof(char), b, fo) != b) + { + fclose(fi); + fclose(fo); + return FALSE; + } + } + + fclose(fi); + fclose(fo); + return TRUE; +} + +int move_file(char *s, char *t) +{ + if (rename (s, t) < 0) + { + /* this may have failed because moving a file across filesystems + was attempted, so try copy and delete instead */ + if (copy_file(s, t)) + { + if (unlink (s) < 0) + { + /* err, now we can't delete the source file so return FALSE */ + return FALSE; + } + } + else + return FALSE; + } + + return TRUE; +} + +gchar *get_current_dir() +{ + char buf[512]; + getcwd(buf, 510); + return g_strdup(buf); +} + + diff --git a/src/globals.c b/src/globals.c new file mode 100644 index 00000000..a41cdb08 --- /dev/null +++ b/src/globals.c @@ -0,0 +1,120 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" +#include "logo.h" + +/* image */ +ImageWindow *main_image = NULL; + +/* main window */ +GtkWidget *mainwindow; +GtkWidget *mainwindow_hbox; +GtkWidget *mainwindow_vbox; +GtkAccelGroup *mainwindow_accel_grp; + +GtkWidget *info_box = NULL; +GtkWidget *info_progress_bar; +GtkWidget *info_status; +GtkWidget *info_details; +GtkWidget *info_zoom; + +/* full screen */ +ImageWindow *normal_image = NULL; +ImageWindow *full_screen_image = NULL; +GtkWidget *full_screen_window = NULL; + +/* tools floating window */ +GtkWidget *toolwindow = NULL; + +/* tools */ +GtkWidget *tool_vbox; + +GtkWidget *path_entry; +GtkWidget *history_menu; + +GtkWidget *dir_clist; +GtkWidget *file_clist; + +GtkWidget *menu_file; +GtkWidget *menu_edit; +GtkWidget *menu_view; +GtkWidget *menu_help; +GtkWidget *menu_file_popup; +GtkWidget *menu_filelist_edit; +GtkWidget *menu_image_popup; +GtkWidget *menu_image_edit; +GtkWidget *menu_window_full; +GtkWidget *menu_window_full_edit; +GtkWidget *menu_window_view; +GtkWidget *menu_window_view_edit; + +GtkWidget *thumb_button; +GtkWidget *thumb_menu_item; + +/* lists */ +GList *dir_list = NULL; +GList *file_list = NULL; +gchar *current_path = NULL; + +GList *filename_filter = NULL; + +/* -- options -- */ +gint main_window_w = 400; +gint main_window_h = 350; +gint main_window_x = 0; +gint main_window_y = 0; + +gint float_window_w = 150; +gint float_window_h = 350; +gint float_window_x = 0; +gint float_window_y = 0; + +gint save_window_positions = FALSE; +gint tools_float = FALSE; +gint tools_hidden = FALSE; +gint progressive_key_scrolling = FALSE; + +gint startup_path_enable = FALSE; +gchar *startup_path = NULL; +gint confirm_delete = TRUE; +gint restore_tool = FALSE; +gint zoom_mode = ZOOM_RESET_ORIGINAL; +gint fit_window = FALSE; +gint limit_window_size = FALSE; +gint max_window_size = 100; +gint thumb_max_width = 64; +gint thumb_max_height = 64; +gint enable_thumb_caching = FALSE; +gint use_xvpics_thumbnails = TRUE; +gint show_dot_files = FALSE; +gint file_filter_disable = FALSE; +gint filter_include_jpg = TRUE; +gint filter_include_xpm = TRUE; +gint filter_include_tif = TRUE; +gint filter_include_gif = TRUE; +gint filter_include_png = TRUE; +gint filter_include_ppm = TRUE; +gint filter_include_pgm = TRUE; +gint filter_include_pcx = TRUE; +gint filter_include_bmp = TRUE; +gchar *custom_filter = NULL; +gchar *editor_name[8]; +gchar *editor_command[8]; + +gint thumbnails_enabled = FALSE; + +gint slideshow_delay = 15; +gint slideshow_random = FALSE; +gint slideshow_repeat = FALSE; + +gint debug = FALSE; + +/* logo & misc images */ + + diff --git a/src/gqview.h b/src/gqview.h new file mode 100644 index 00000000..1f8fee6e --- /dev/null +++ b/src/gqview.h @@ -0,0 +1,354 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "intl.h" + +/* + *------------------------------------- + * Standard library includes + *------------------------------------- + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + *------------------------------------- + * includes for glib / gtk / imlib + *------------------------------------- + */ + +#include +#include +#include + +/* + *---------------------------------------------------------------------------- + * defines + *---------------------------------------------------------------------------- + */ + +#define RC_FILE_NAME ".gqviewrc" +#define RC_THUMB_DIR ".gqview_thmb" + +#define ZOOM_RESET_ORIGINAL 0 +#define ZOOM_RESET_FIT_WINDOW 1 +#define ZOOM_RESET_NONE 2 + +typedef struct _ImageWindow ImageWindow; +struct _ImageWindow +{ + GtkWidget *eventbox; + GtkWidget *table; + GtkWidget *viewport; + GtkWidget *image; + + gchar *image_path; + gchar *image_name; + + gint width; + gint height; + gint size; + + gint old_width; + gint old_height; + + gint unknown; + gint zoom; + + GdkPixmap *image_pixmap; + GdkImlibImage *image_data; + + gint in_drag; + gint drag_last_x; + gint drag_last_y; + gint drag_moved; + + gint artificial_size; + gint new_img; + + /* info, zoom labels & windows */ + + GtkWidget *top_window; /* window that gets title set to image filename */ + GtkWidget *info_label; /* label set to show image h x w , size */ + GtkWidget *zoom_label; /* label to display zoom */ + gchar *title; /* window title to display left of file name */ + gint show_title_zoom; /* option to include zoom in window title */ + + /* button functions */ + void (*func_btn1)(ImageWindow *, GdkEventButton *, gpointer); + void (*func_btn2)(ImageWindow *, GdkEventButton *, gpointer); + void (*func_btn3)(ImageWindow *, GdkEventButton *, gpointer); + + gpointer data_btn1; + gpointer data_btn2; + gpointer data_btn3; +}; + +/* image */ +extern ImageWindow *main_image; + +/* main window */ +extern GtkWidget *mainwindow; +extern GtkWidget *mainwindow_hbox; +extern GtkWidget *mainwindow_vbox; +extern GtkAccelGroup *mainwindow_accel_grp; + +extern GtkWidget *info_box; +extern GtkWidget *info_progress_bar; +extern GtkWidget *info_status; +extern GtkWidget *info_details; +extern GtkWidget *info_zoom; + +/* full screen */ +extern ImageWindow *normal_image; +extern ImageWindow *full_screen_image; +extern GtkWidget *full_screen_window; + +/* tools floating window */ +extern GtkWidget *toolwindow; + +/* tools */ +extern GtkWidget *tool_vbox; + +extern GtkWidget *path_entry; +extern GtkWidget *history_menu; + +extern GtkWidget *dir_clist; +extern GtkWidget *file_clist; + +extern GtkWidget *menu_file; +extern GtkWidget *menu_edit; +extern GtkWidget *menu_view; +extern GtkWidget *menu_help; +extern GtkWidget *menu_file_popup; +extern GtkWidget *menu_filelist_edit; +extern GtkWidget *menu_image_popup; +extern GtkWidget *menu_image_edit; +extern GtkWidget *menu_window_full; +extern GtkWidget *menu_window_full_edit; +extern GtkWidget *menu_window_view; +extern GtkWidget *menu_window_view_edit; + +extern GtkWidget *thumb_button; +extern GtkWidget *thumb_menu_item; + +/* lists */ +extern GList *dir_list; +extern GList *file_list; +extern gchar *current_path; + +extern GList *filename_filter; + +/* -- options -- */ +extern gint main_window_w; +extern gint main_window_h; +extern gint main_window_x; +extern gint main_window_y; + +extern gint float_window_w; +extern gint float_window_h; +extern gint float_window_x; +extern gint float_window_y; + +extern gint save_window_positions; +extern gint tools_float; +extern gint tools_hidden; +extern gint progressive_key_scrolling; + +extern gint startup_path_enable; +extern gchar *startup_path; +extern gint confirm_delete; +extern gint restore_tool; +extern gint zoom_mode; +extern gint fit_window; +extern gint limit_window_size; +extern gint max_window_size; +extern gint thumb_max_width; +extern gint thumb_max_height; +extern gint enable_thumb_caching; +extern gint use_xvpics_thumbnails; +extern gint show_dot_files; +extern gint file_filter_disable; +extern gint filter_include_jpg; +extern gint filter_include_xpm; +extern gint filter_include_tif; +extern gint filter_include_gif; +extern gint filter_include_png; +extern gint filter_include_ppm; +extern gint filter_include_pgm; +extern gint filter_include_pcx; +extern gint filter_include_bmp; +extern gchar *custom_filter; +extern gchar *editor_name[]; +extern gchar *editor_command[]; + +extern gint thumbnails_enabled; + +extern gint slideshow_delay; /* in seconds */ +extern gint slideshow_random; +extern gint slideshow_repeat; + +extern gint debug; + +/* logo & misc images */ +extern const int logo_width; +extern const int logo_height; +extern const unsigned char logo[]; + +/* -- functions -- */ + +/* main.c */ +gchar *filename_from_path(char *t); +gchar *remove_level_from_path(gchar *path); +void parse_out_relatives(gchar *path); +void start_editor_from_file(gint n, gchar *path); +void start_editor_from_image(gint n); +void start_editor_from_list(gint n); +void keyboard_scroll_calc(gint *x, gint *y, GdkEventKey *event); +gint key_press_cb(GtkWidget *widget, GdkEventKey *event); +void exit_gqview(); + +/* window.c */ +void toolwindow_float(); +void toolwindow_hide(); +void create_main_window(); + +/* menu.c */ +void add_menu_popup_item(GtkWidget *menu, gchar *label, + GtkSignalFunc func, gpointer data); +void add_menu_divider(GtkWidget *menu); +void update_edit_menus(GtkAccelGroup *accel_grp); +GtkWidget *create_menu_bar(GtkAccelGroup *accel_grp); +void create_menu_popups(); +GtkWidget *create_button_bar(GtkTooltips *tooltips); + +/* img-main.c */ +void full_screen_start(); +void full_screen_stop(); +void full_screen_toggle(); +void image_scroll(gint x, gint y); +void image_adjust_zoom(gint increment); +void image_set_zoom(gint zoom); +void image_set_path(gchar *path); +gchar *image_get_path(); +gchar *image_get_name(); +void image_change_to(gchar *path); +void image_set_labels(GtkWidget *info, GtkWidget *zoom); +GtkWidget *image_create(); + +/* filelist.c */ +void update_status_label(gchar *text); +void rebuild_file_filter(); +gint find_file_in_list(gchar *path); +GList *file_get_selected_list(); +void free_selected_list(GList *list); +gint file_clicked_is_selected(); +gchar *file_clicked_get_path(); +gint file_count(); +gint file_selection_count(); +gchar *file_get_path(gint row); +gint file_is_selected(gint row); +void file_image_change_to(gint row); +void file_next_image(); +void file_prev_image(); +void file_first_image(); +void file_last_image(); +void file_is_gone(gchar *path, GList *ignore_list); +void file_is_renamed(gchar *source, gchar *dest); +void dir_select_cb(GtkWidget *widget, gint row, gint col, + GdkEvent *event, gpointer data); +void dir_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data); +void file_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data); +void file_select_cb(GtkWidget *widget, gint row, gint col, + GdkEvent *event, gpointer data); +void file_unselect_cb(GtkWidget *widget, gint row, gint col, + GdkEvent *event, gpointer data); +void file_clist_highlight_set(); +void file_clist_highlight_unset(); +void path_entry_cb(gchar *newdir, gpointer data); +void interrupt_thumbs(); +void filelist_populate_clist(); +void filelist_refresh(); +void filelist_change_to(gchar *path); + +/* config.c */ +void show_config_window(); +void show_about_window(); + +/* rcfile.c */ +void save_options(); +void load_options(); + +/* tabcomp.c */ +GtkWidget *tab_completion_new_with_history(GtkWidget **entry, GtkWidget *window, gchar *text, + const gchar *history_key, gint max_levels, + void (*enter_func)(gchar *, gpointer), gpointer data); +gchar *tab_completion_set_to_last_history(GtkWidget *entry); +void tab_completion_append_to_history(GtkWidget *entry, gchar *path); + +GtkWidget *tab_completion_new(GtkWidget **entry, GtkWidget *window, gchar *text, + void (*enter_func)(gchar *, gpointer), gpointer data); +void tab_completion_add_to_entry(GtkWidget *entry, void (*enter_func)(gchar *, gpointer), gpointer data); +void tab_completion_add_tab_func(GtkWidget *entry, void (*tab_func)(gchar *, gpointer), gpointer data); +gchar *remove_trailing_slash(gchar *path); + +/* fileops.c */ +gchar *homedir(); +int isfile(char *s); +int isdir(char *s); +int filesize(char *s); +time_t filetime(gchar *s); +int copy_file(char *s, char *t); +int move_file(char *s, char *t); +gchar *get_current_dir(); + +/* dnd.c */ +void image_dnd_init(ImageWindow *imd); +void init_dnd(); + +/* pathsel.c */ +GtkWidget *destination_widget_new(gchar *path, GtkWidget *entry); +void destination_widget_sync_to_entry(GtkWidget *entry); + +#include "utildlg.h" + +/* utilops.c */ +void file_util_delete(gchar *source_path, GList *source_list); +void file_util_move(gchar *source_path, GList *source_list, gchar *dest_path); +void file_util_copy(gchar *source_path, GList *source_list, gchar *dest_path); +void file_util_rename(gchar *source_path, GList *source_list); +void file_util_create_dir(gchar *path); + +/* thumb.c */ +gint create_thumbnail(gchar *path, GdkPixmap **thumb_pixmap, GdkBitmap **thumb_mask); +gint maintain_thumbnail_dir(gchar *dir, gint recursive); + +/* slideshow.c */ +void slideshow_start(); +void slideshow_stop(); +void slideshow_toggle(); +gint slideshow_is_running(); + +/* img-view.c */ +void view_window_new(gchar *path); +void view_window_active_edit(gint n); +void create_menu_view_popup(); + + + diff --git a/src/icons/.cvsignore b/src/icons/.cvsignore new file mode 100644 index 00000000..3dda7298 --- /dev/null +++ b/src/icons/.cvsignore @@ -0,0 +1,2 @@ +Makefile.in +Makefile diff --git a/src/icons/Makefile.am b/src/icons/Makefile.am new file mode 100644 index 00000000..8b13875c --- /dev/null +++ b/src/icons/Makefile.am @@ -0,0 +1,12 @@ +EXTRA_DIST = \ + icon_config.xpm \ + icon_float.xpm \ + icon_home.xpm \ + icon_reload.xpm \ + icon_thumb.xpm \ + icon_zoom_fit.xpm \ + icon_zoom_in.xpm \ + icon_zoom_norm.xpm \ + icon_zoom_out.xpm \ + img_unknown.xpm + diff --git a/src/icons/icon_config.xpm b/src/icons/icon_config.xpm new file mode 100644 index 00000000..427c8686 --- /dev/null +++ b/src/icons/icon_config.xpm @@ -0,0 +1,28 @@ +/* XPM */ +static char * icon_config_xpm[] = { +"20 20 5 1", +" c None", +". c #000000000000", +"X c #CF3CCF3CCF3C", +"o c #79E77DF779E7", +"O c #FFFFFFFFFFFF", +" ", +" ... ", +" .XX. ", +" .XX. ", +" .. .X.o ", +" .X. .XX.o ", +" .XX.XXO.o ", +" .XXOXXX. ", +" ....XOX. ", +" ooo.XOX. ", +" .XOX.... ", +" .XXOXOX. ", +" .XXX.XX. ", +" .OX.o.X.o ", +" .X.oo ..o ", +" .XX. oo ", +" .XX. ", +" ...o ", +" ooo ", +" "}; diff --git a/src/icons/icon_float.xpm b/src/icons/icon_float.xpm new file mode 100644 index 00000000..ae27662c --- /dev/null +++ b/src/icons/icon_float.xpm @@ -0,0 +1,28 @@ +/* XPM */ +static char * icon_float_xpm[] = { +"10 20 5 1", +" c None", +". c #000000", +"+ c #FFFFFF", +"@ c #CFCFCF", +"# c #797D79", +" ", +" ....... ", +" .++@+@.# ", +" .+@+@@.# ", +" .@@@.## ", +" .+@@.## ", +" .@@@.# ", +" .+@@.# ", +" .++@@@. ", +".++@+@+@. ", +".+@@@@@@.#", +".........#", +" #.@.####", +" .+.# ", +" .+.# ", +" .+.# ", +" .+.# ", +" .## ", +" # ", +" "}; diff --git a/src/icons/icon_home.xpm b/src/icons/icon_home.xpm new file mode 100644 index 00000000..7e3ed43e --- /dev/null +++ b/src/icons/icon_home.xpm @@ -0,0 +1,30 @@ +/* XPM */ +static char * icon_home_xpm[] = { +"20 20 7 1", +" c None", +". c #FFFF00000000", +"X c #79E700000000", +"o c #10402CB22081", +"O c #79E77DF779E7", +"+ c #9E799A699E79", +"@ c #FFFFFFFFFFFF", +" ", +" .XX oo ", +" .XoOo++o ", +" .Xoo+++@o ", +" .Xo+++@@@o ", +" .o+++@@@@@o ", +" o+++@@@@@@@o ", +" o+++@@@@@@@@@o ", +" ooo+@@@@@@@@@ooo ", +" Oo@@@@@@@@@@oOOO ", +" o@@@@@@@@@@oO ", +" o@@oooo@@@@oO ", +" o@@oO o@@@@oO ", +" o@@oO o@@@@oO ", +" o@@oO o@@@@oO ", +" o@@oO o@@@@oO ", +" o@@oO o@@@@oO ", +" ooooO ooooooO ", +" OOOO OOOOOO ", +" "}; diff --git a/src/icons/icon_reload.xpm b/src/icons/icon_reload.xpm new file mode 100644 index 00000000..b39fc37f --- /dev/null +++ b/src/icons/icon_reload.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static char * icon_reload_xpm[] = { +"20 20 4 1", +" c None", +". c #000000000000", +"X c #00007DF70000", +"o c #79E77DF779E7", +" ", +" ", +" ...... ", +" .XXXXXX.. ", +" .XXXXXXXXX. ", +" .XXXX...XXXX. ", +" .XXX.ooo..XX. ", +" .XX.oo .XXX. ", +" ...XX... .XX.o ", +" .XXXX.oo .XX.o ", +" .XX.oo .XX.o ", +" ..oo .XX.o ", +" oo .XXX.o ", +" ..... ..XX.oo ", +" .XXX....XXXX.o ", +" .XXXXXXXXX.oo ", +" ..XXXXX..oo ", +" o.....ooo ", +" ooooo ", +" "}; diff --git a/src/icons/icon_thumb.xpm b/src/icons/icon_thumb.xpm new file mode 100644 index 00000000..2fe88f8f --- /dev/null +++ b/src/icons/icon_thumb.xpm @@ -0,0 +1,26 @@ +/* XPM */ +static char * icon_thumb_xpm[] = { +"20 20 3 1", +" c None", +". c #000000", +"+ c #797D79", +" ", +" ", +" ...... ", +" ......+ . . ", +" ......+ . . . ", +" ......+ + + + ", +" ++++++ ", +" ", +" ...... ", +" ......+ . . . . ", +" ......+ . . . . ", +" ......+ + + + + ", +" ++++++ ", +" ", +" ...... ", +" ......+ . . . ", +" ......+ . . . . ", +" ......+ + + + + ", +" ++++++ ", +" "}; diff --git a/src/icons/icon_zoom_fit.xpm b/src/icons/icon_zoom_fit.xpm new file mode 100644 index 00000000..ac6eb2f2 --- /dev/null +++ b/src/icons/icon_zoom_fit.xpm @@ -0,0 +1,26 @@ +/* XPM */ +static char * icon_zoom_fit_xpm[] = { +"20 20 3 1", +" c None", +". c #000000000000", +"X c #79E77DF779E7", +" ", +" ", +" ....... ", +" XX.XXXX ", +" ... ", +" . .X. ", +" . .X . ", +" .X . .X . .X ", +" .X. X . .X ", +" ...... ......X ", +" .X.XXXX XX.X.X ", +" .X . . . .X ", +" .X .X .X ", +" X . .X. X ", +" ... ", +" .X ", +" ....... ", +" XXXXXXX ", +" ", +" "}; diff --git a/src/icons/icon_zoom_in.xpm b/src/icons/icon_zoom_in.xpm new file mode 100644 index 00000000..f4e74ebb --- /dev/null +++ b/src/icons/icon_zoom_in.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static char * icon_zoom_in_xpm[] = { +"20 20 6 1", +" c None", +". c #000000000000", +"X c #E79DE79DE79D", +"o c #B6DAB2CAB6DA", +"O c #79E77DF779E7", +"+ c #FFFFFFFFFFFF", +" ", +" ... ", +" ..XXX.. ", +" .XXo.oXX. ", +" .Xoo.XoX. ", +" .XooX.XXXX. ", +" .X.......X.O ", +" .XoXX.XXXX.O ", +" .XXX.XXX.OO ", +" .XXX.XXX.O ", +" ..XXX..X. ", +" ...OO.X.. ", +" OOO .+X. ", +" .X+X. ", +" .X+X. ", +" .X+X. ", +" .X+X. ", +" .X.OO", +" .OO ", +" O "}; diff --git a/src/icons/icon_zoom_norm.xpm b/src/icons/icon_zoom_norm.xpm new file mode 100644 index 00000000..e8169af7 --- /dev/null +++ b/src/icons/icon_zoom_norm.xpm @@ -0,0 +1,26 @@ +/* XPM */ +static char * icon_zoom_norm_xpm[] = { +"20 20 3 1", +" c None", +". c #000000000000", +"X c #79E77DF779E7", +" ", +" ", +" ..... ..... ", +" .XXXXX XXX.X ", +" .X .X ", +" .X .X ", +" .X .X ", +" X X ", +" ", +" ", +" ", +" ", +" . . ", +" .X .X ", +" .X .X ", +" .X .X ", +" ..... .....X ", +" XXXXX XXXXX ", +" ", +" "}; diff --git a/src/icons/icon_zoom_out.xpm b/src/icons/icon_zoom_out.xpm new file mode 100644 index 00000000..6f8e354f --- /dev/null +++ b/src/icons/icon_zoom_out.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static char * icon_zoom_out_xpm[] = { +"20 20 6 1", +" c None", +". c #000000000000", +"X c #E79DE79DE79D", +"o c #B6DAB2CAB6DA", +"O c #79E77DF779E7", +"+ c #FFFFFFFFFFFF", +" ", +" ... ", +" ..XXX.. ", +" .XXoooXX. ", +" .XooXooX. ", +" .XooXXXXXX. ", +" .X.......X.O ", +" .XoXXXXXXX.O ", +" .XXXXXXX.OO ", +" .XXXXXXX.O ", +" ..XXX..X. ", +" ...OO.X.. ", +" OOO .+X. ", +" .X+X. ", +" .X+X. ", +" .X+X. ", +" .X+X. ", +" .X.OO", +" .OO ", +" O "}; diff --git a/src/icons/img_unknown.xpm b/src/icons/img_unknown.xpm new file mode 100644 index 00000000..0b202bfc --- /dev/null +++ b/src/icons/img_unknown.xpm @@ -0,0 +1,159 @@ +/* XPM */ +static char * img_unknown_xpm[] = { +"48 48 108 2", +" c None", +". c #DDDDDD", +"+ c #DCDCDC", +"@ c #DBDBDB", +"# c #DADADA", +"$ c #D9D9D9", +"% c #D8D8D8", +"& c #D7D7D7", +"* c #D6D6D6", +"= c #D5D5D5", +"- c #D4D4D4", +"; c #D3D3D3", +"> c #D2D2D2", +", c #D1D1D1", +"' c #F40000", +") c #F30000", +"! c #F10000", +"~ c #F00000", +"{ c #EF0000", +"] c #EE0000", +"^ c #ED0000", +"/ c #CDCDCD", +"( c #CECECE", +"_ c #CFCFCF", +": c #D0D0D0", +"< c #F50000", +"[ c #EB0000", +"} c #EA0000", +"| c #E90000", +"1 c #E80000", +"2 c #C9C9C9", +"3 c #CACACA", +"4 c #CCCCCC", +"5 c #F60000", +"6 c #EC0000", +"7 c #E60000", +"8 c #E50000", +"9 c #E40000", +"0 c #E30000", +"a c #E20000", +"b c #C6C6C6", +"c c #C7C7C7", +"d c #CBCBCB", +"e c #C4C4C4", +"f c #C3C3C3", +"g c #DF0000", +"h c #DE0000", +"i c #DD0000", +"j c #DC0000", +"k c #F70000", +"l c #E70000", +"m c #C0C0C0", +"n c #BEBEBE", +"o c #BCBCBC", +"p c #D80000", +"q c #D70000", +"r c #D90000", +"s c #BDBDBD", +"t c #BFBFBF", +"u c #C5C5C5", +"v c #F20000", +"w c #C2C2C2", +"x c #BBBBBB", +"y c #B9B9B9", +"z c #B8B8B8", +"A c #D30000", +"B c #D20000", +"C c #D50000", +"D c #C1C1C1", +"E c #E00000", +"F c #BABABA", +"G c #B6B6B6", +"H c #B5B5B5", +"I c #B4B4B4", +"J c #CF0000", +"K c #CE0000", +"L c #D00000", +"M c #B7B7B7", +"N c #B3B3B3", +"O c #B2B2B2", +"P c #CC0000", +"Q c #CB0000", +"R c #CA0000", +"S c #B1B1B1", +"T c #C80000", +"U c #C70000", +"V c #AFAFAF", +"W c #C90000", +"X c #C60000", +"Y c #C50000", +"Z c #ADADAD", +"` c #C40000", +" . c #ABABAB", +".. c #AEAEAE", +"+. c #C8C8C8", +"@. c #C30000", +"#. c #AAAAAA", +"$. c #B0B0B0", +"%. c #D10000", +"&. c #A9A9A9", +"*. c #ACACAC", +"=. c #D60000", +"-. c #DA0000", +";. c #D40000", +">. c #CD0000", +",. c #DB0000", +"'. c #E10000", +"). c #000000", +". . . . . . . . . . . . . . . . + + @ @ # $ % & * * * = = = = = = * * & % $ $ # @ + + . . . . . ", +". . . . . . . . . . . . . . . + + @ # $ % & * = - ; > > , , , , > ; ; = * * % $ # @ + + . . . . ", +". . . . . . . . . . . . . . + + @ # % & * = ' ) ! ~ { ] ^ / / / ( _ : , > - * & % # @ + + . . . ", +". . . . . . . . . . . . . + + @ # % * * < ) ! { ^ [ } | 1 1 1 1 2 3 4 / _ , ; = * % $ @ + + . . ", +". . . . . . . . . . . . . + @ # % * 5 ' ! { 6 } 1 7 8 9 0 a a 0 0 b c 2 d / : > = * % # @ + . . ", +". . . . . . . . . . . . + @ # $ & 5 ' ! ] [ 1 b e f g h i i j i i g f e c 2 4 : > = * % # @ + . ", +". . . . . . . . . . . . + @ $ & k ' ! ] } l 9 f m n o o p q q q p r s t f u 2 4 : > = & $ @ + . ", +". . . . . . . . . . . + @ # % * < v { [ l 0 w t o x y z A A B B B A C x s D u 2 / : ; * % # @ + ", +". . . . . . . . . . . + @ $ & k ' ~ 6 1 9 E n o F z G H I J K K K J L G y s D u 2 ( , = & $ @ + ", +". . . . . . . . . . . + # $ & 5 v { } 7 a m o F M G H N O P Q R R Q P O G y n f c 4 : ; * % # + ", +". . . . . . . . . . + + # % * - v ] | 8 f t o y M G I O S Q R T U U T V O G x m u 2 _ > * % # @ ", +". . . . . . . . . . + @ # % * - : / 2 b w n o y M G I N S Q W U X Y X Z V I z s f 2 / , = & $ @ ", +". . . . . . . . . . + @ # % * - : ( 2 b f t o F z G G I O Q W U Y ` ` ...S G o w c 4 : - & $ @ ", +". . . . . . . . . . + + # % * - , ( 3 +.e D n o x y M G J P R U Y @.@.#.Z $.G x D b d : - * $ @ ", +". . . . . . . . . . . + # $ & = > : 4 2 b f D n o x y M %.K Q U Y @.&.&.*.$.H x m b d : - * $ @ ", +". . . . . . . . . . . + @ $ % * ; : ( d 2 b f D t s x =.A J Q T Y ` &.&.*.$.H x D b d : - * $ @ ", +". . . . . . . . . . . + @ # % * = > : / 3 +.b f w t -.q ;.L P W X &.&.#.Z S G o D c 4 : - & $ @ ", +". . . . . . . . . . . + + @ $ & * - , _ / 3 +.u f g j p ;.L >.W *.#.#.*.V N M o f +./ , = & $ @ ", +". . . . . . . . . . . . + @ # % & = ; : _ 4 2 c 0 E j p C %.>.V Z *.*...$.H y t e 2 ( > * % # @ ", +". . . . . . . . . . . . + + @ $ % * - > : / } l 0 E j p ;.%.O V ....V $.N M o D b d : ; * % # + ", +". . . . . . . . . . . . . + @ # % * = > ! ^ } 7 0 g ,.p M H O $.V V S N G x t e 2 / , = & $ @ + ", +". . . . . . . . . . . . . + @ # $ & = ' ~ ^ | 7 a h o F M H N O S O I G F n f c d : ; * % # @ + ", +". . . . . . . . . . . . . + @ # $ & = ) ~ 6 1 9 w t o y M G I I I G M F s w b 3 ( , = * $ # + . ", +". . . . . . . . . . . . . + @ # % * = v { [ l e D n x y M G G G M y o n w u 2 / : ; * % # @ + . ", +". . . . . . . . . . . . . + @ # % * - ! ] } b f m o x y z M z y x o t f b 2 / : ; * & $ @ + . . ", +". . . . . . . . . . . . . + @ $ & * ' ~ 6 1 u w t o x F y F x o n D f c 2 / : > = & $ # @ + . . ", +". . . . . . . . . . . . . + # $ & = ) { [ l e D n o x x x o s m w u +.3 / : ; = * % # @ + . . . ", +". . . . . . . . . . . . + @ # % * - : / 2 b f m s o o o s t D f b 2 d ( : ; = & % # @ + . . . . ", +". . . . . . . . . . . . + @ $ & * ; : 4 2 u w t s o o s t w f c 2 4 _ , - * & $ # @ + . . . . . ", +". . . . . . . . . . . . + # $ * = , _ } c f D t s s s t D f c 2 / : > - * & $ # @ + . . . . . . ", +". . . . . . . . . . . + @ # % * - ! ^ | 8 '.m n s s n D f b 2 4 : > - * & $ # @ + . . . . . . . ", +". . . . . . . . . . . + @ $ & = ) { [ l 0 g j s o s t w e +.d _ , - * & $ # @ + . . . . . . . . ", +". . . . . . . . . . . + # $ * < v ] } 8 '.h ,.o o s t w u 2 / : ; * & $ # @ + . . . . . . . . . ", +". . . . . . . . . . + @ # % * ' ! 6 1 0 g j -.o o o t f b 3 ( , - * % # @ + . . . . . . . . . . ", +". . . . . . . . . . + @ # & * ) { [ 7 a h -.p x x o t f c 3 _ > = & $ @ + . . . . . . . . . . . ", +". . . . . . . . . . + @ $ & = ) ] } 8 '.i r x F x o m f c d _ > * & # @ + . . . . . . . . . . . ", +". . . . . . . . . . + @ $ & = , ] | 8 E j o F F x s m f +.4 : ; * % # @ + . . . . . . . . . . . ", +". . . . . . . . . . + @ $ & = , ( 3 b f t o x x o n D u 2 / : - * % # + . . . . . . . . . . . . ", +". . . . . . . . . . + @ $ & = ).).3 c f m n o o s m f b 3 ( , = & $ @ + . . . . . . . . . . . . ", +". . . . . . . . . . + @ $ & * ).).4 2 u f m t t m f u 2 4 : > * & $ @ + . . . . . . . . . . . . ", +". . . . . . . . . . + @ # % * ).).( 3 +.u f f f f u +.3 ( : - * % # @ + . . . . . . . . . . . . ", +". . . ).).. ).).. ).+ ).).$ * ).).: ).).+.).b ).).2 3 / ).).).& $ ).).. ).).. ).. ).).. . . . . ", +". . . ).).. ).).. ).).+ ).).% ).).).)./ d ).).2 ).).( ).).= ).).# ).).).).).. ).).. ).).. . . . ", +". . . ).).. ).).. ).).+ ).).$ ).).).> : _ ).).( ).).: ).).* ).).@ ).).).).).. ).).. ).).. . . . ", +". . . ).).. ).).. ).).. ).).# ).).).).; > ).)., ).).- ).).% ).).@ ).).).).).. ).).. ).).. . . . ", +". . . . ).).. ).. ).).. ).).@ ).).% ).).= ).).- ).).* & ).).).@ + . ).. ).. . ).).. ).).. . . . ", +". . . . . . . . . . . . . + + @ # $ $ % & & * * & & % $ # @ @ + . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . + + @ @ # # $ $ $ $ $ $ # # @ + + . . . . . . . . . . . . . . . . . "}; diff --git a/src/image.c b/src/image.c new file mode 100644 index 00000000..7f8c55c7 --- /dev/null +++ b/src/image.c @@ -0,0 +1,773 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" +#include "image.h" +#include "icons/img_unknown.xpm" + +static gchar *zoom_as_text(gint zoom, gfloat scale); +static void set_zoom_label(GtkWidget *label, gint zoom, gfloat scale); +static void set_info_label(GtkWidget *label, gint width, gint height, gint size, gint unknown); +static void set_window_title(ImageWindow *imd, gchar *text); + +static gint image_area_size_top_window(ImageWindow *imd, gint w, gint h); + +static void image_area_recalc_size(ImageWindow *imd, GtkAllocation *allocation); + +static void image_area_redraw(ImageWindow *imd); +static gint image_area_size_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data); +static gint image_area_update_cb(GtkWidget *widget, GdkEventConfigure *event, gpointer data); + +static void set_mouse_cursor (GdkWindow *window, gint icon); +static void image_area_mouse_moved(GtkWidget *widget, GdkEventButton *bevent, gpointer data); +static void image_area_mouse_pressed(GtkWidget *widget, GdkEventButton *bevent, gpointer data); +static void image_area_mouse_released(GtkWidget *widget, GdkEventButton *bevent, gpointer data); +static void image_area_mouse_drag(GtkWidget *widget, GdkDragContext *context, gpointer data); + +/* + *----------------------------------------------------------------------------- + * image status widget update routines (private) + *----------------------------------------------------------------------------- + */ + +static gchar *zoom_as_text(gint zoom, gfloat scale) +{ + gint l = 1; + gint r = 1; + gchar *approx = " "; + if (zoom > 1) l = zoom; + if (zoom < -1) r = -zoom; + if (zoom == 0 && scale != 0) + { + if (scale < 1) r = 1 / scale + 0.5; + approx = " ~"; + } + return g_strdup_printf("%d :%s%d", l, approx, r); +} + +static void set_zoom_label(GtkWidget *label, gint zoom, gfloat scale) +{ + gchar *buf; + buf = zoom_as_text(zoom, scale); + gtk_label_set(GTK_LABEL(label), buf); + g_free(buf); +} + +static void set_info_label(GtkWidget *label, gint width, gint height, gint size, gint unknown) +{ + gchar buf[64]; + if (unknown) + sprintf(buf, _("( ? x ? ) %d bytes"), size); + else + sprintf(buf, _("( %d x %d ) %d bytes"), width, height, size); + gtk_label_set(GTK_LABEL(label), buf); +} + +static void set_window_title(ImageWindow *imd, gchar *text) +{ + gchar *title = NULL; + if (!imd->top_window) return; + + if (imd->title) + { + title = g_strconcat(imd->title, imd->image_name, text, NULL); + } + else + { + title = g_strconcat(imd->image_name, text, NULL); + } + + gtk_window_set_title(GTK_WINDOW(imd->top_window), title); + g_free(title); +} + +/* + *----------------------------------------------------------------------------- + * fit window to image utility (private) + *----------------------------------------------------------------------------- + */ + +static gint image_area_size_top_window(ImageWindow *imd, gint w, gint h) +{ + if (!imd->top_window) return FALSE; + if (imd == full_screen_image) return FALSE; + if (imd == normal_image && !toolwindow) return FALSE; + if (!fit_window) return FALSE; + + if (imd == normal_image) + { + /* account for border frame */ + w += 4; + h += 4; + } + + if (limit_window_size) + { + gint sw = gdk_screen_width() * max_window_size / 100; + gint sh = gdk_screen_height() * max_window_size / 100; + + if (w > sw) w = sw; + if (h > sh) h = sh; + } + + /* to cheat on a prob a little, don't resize if within 1 either way... + ...dumb off by 1 errors! ;) */ + +/* if (w >= (imd->top_window)->allocation.width - 1 && + w <= (imd->top_window)->allocation.width + 1 && + h >= (imd->top_window)->allocation.height - 1 && + h <= (imd->top_window)->allocation.height + 1) + return FALSE; +*/ + if (debug) printf("auto sized to %d x %d\n", w, h); + + gdk_window_resize(imd->top_window->window, w, h); + gtk_widget_set_usize(imd->top_window, w, h); + + return TRUE; +} + +/* + *----------------------------------------------------------------------------- + * image widget zoom/recalc routines + *----------------------------------------------------------------------------- + */ + +void image_area_scroll(ImageWindow *imd, gint x, gint y) +{ + if (x != 0) + { + GtkAdjustment *h = gtk_viewport_get_hadjustment(GTK_VIEWPORT(imd->viewport)); + gfloat val = h->value + x; + if (val < h->lower) val = h->lower; + if (val > h->upper - h->page_size) val = h->upper - h->page_size; + gtk_adjustment_set_value(GTK_ADJUSTMENT(h), val); + } + + if (y != 0) + { + GtkAdjustment *v = gtk_viewport_get_vadjustment(GTK_VIEWPORT(imd->viewport)); + gfloat val = v->value + y; + if (val < v->lower) val = v->lower; + if (val > v->upper - v->page_size) val = v->upper - v->page_size; + gtk_adjustment_set_value(GTK_ADJUSTMENT(v), val); + } +} + +gint image_area_get_zoom(ImageWindow *imd) +{ + return imd->zoom; +} + +void image_area_adjust_zoom(ImageWindow *imd, gint increment) +{ + gint zoom = imd->zoom; + if (increment < 0) + { + while (increment < 0) + { + zoom--; + if (zoom == 0 || zoom == -1) zoom = -2; + increment++; + } + if (zoom < -8) zoom = -8; + } + else + { + while (increment > 0) + { + zoom++; + if (zoom == -1) zoom = 1; + increment--; + } + if (zoom > 3) zoom = 3; + } + if (zoom != imd->zoom) + image_area_set_zoom(imd, zoom); +} + +void image_area_set_zoom(ImageWindow *imd, gint zoom) +{ + if (zoom == imd->zoom && imd->width > 0 && imd->height > 0) return; + + imd->zoom = zoom; + image_area_recalc_size(imd, NULL); + + gtk_widget_set_usize (imd->table, imd->width, imd->height); + gtk_drawing_area_size(GTK_DRAWING_AREA(imd->image), imd->width, imd->height); +} + +static void image_area_recalc_size(ImageWindow *imd, GtkAllocation *allocation) +{ + gint w, h, ww, wh; + gfloat scale_factor = 1; + + w = imd->image_data->rgb_width; + h = imd->image_data->rgb_height; + if (allocation) + { + ww = allocation->width; + wh = allocation->height; + } + else + { + ww = (imd->eventbox)->allocation.width; + wh = (imd->eventbox)->allocation.height; + } + + if (imd == normal_image) + { + /* account for frame */ + ww -= 4; + wh -= 4; + } + + if (imd->zoom == 0) /* zoom to fit */ + { + if (imd == normal_image && imd->width == 0 && imd->height == 0 && + fit_window && toolwindow) + { + if (limit_window_size) + { + ww = (gdk_screen_width() * max_window_size / 100) - 4; + wh = (gdk_screen_height() * max_window_size / 100) - 4; + } + else + { + ww = w; + wh = h; + } + } + if (w > ww || h > wh) + { + if ((gfloat)ww / w > (gfloat)wh / h) + { + scale_factor = (gfloat) wh / h; + h = wh; + w = w * scale_factor + 0.5; + if (w > ww) w = ww; + } + else + { + scale_factor = (gfloat)ww / w; + w = ww; + h = h * scale_factor + 0.5; + if (h > wh) h = wh; + } + if (w < 1) w = 1; + if (h < 1) h = 1; + } + } + else if (imd->zoom > 0) /* zoom orig, in */ + { + scale_factor = imd->zoom; + w = w * scale_factor; + h = h * scale_factor; + } + else if (imd->zoom < -1) /* zoom out */ + { + scale_factor = (- imd->zoom); + w = w / scale_factor; + h = h / scale_factor; + } + + imd->width = w; + imd->height = h; + + if (debug) printf("recalc %d x %d @ %f\n", w, h, scale_factor); + + if (imd->zoom_label) + { + set_zoom_label(imd->zoom_label, imd->zoom, scale_factor); + } + +/* this is causing problems with resizing + if (imd->top_window && imd->show_title_zoom) + { + gchar *buf = zoom_as_text(imd->zoom, scale_factor); + gchar *zbuf = g_strconcat(" [ ", buf, "]", NULL); + g_free(buf); + set_window_title(imd, zbuf); + g_free(zbuf); + } +*/ + + if (image_area_size_top_window(imd, w, h)) + { + /* this is hacky */ + imd->artificial_size = TRUE; + gtk_grab_add (info_zoom); + while(gtk_events_pending()) gtk_main_iteration(); + gtk_grab_remove(info_zoom); + imd->artificial_size = FALSE; + } +} + +/* + *----------------------------------------------------------------------------- + * image widget set/get image information + *----------------------------------------------------------------------------- + */ + +void image_area_set_path(ImageWindow *imd, gchar *newpath) +{ + if (!imd->image_path || !newpath) return; + + g_free(imd->image_path); + imd->image_path = g_strdup(newpath); + imd->image_name = filename_from_path(imd->image_path); + + if (imd->top_window) + { + set_window_title(imd, NULL); + } +} + +gchar *image_area_get_path(ImageWindow *imd) +{ + return imd->image_path; +} + +gchar *image_area_get_name(ImageWindow *imd) +{ + return imd->image_name; +} + +void image_area_set_image(ImageWindow *imd, gchar *path, gint zoom) +{ + if (path && imd->image_path && !strcmp(path, imd->image_path)) return; + + g_free(imd->image_path); + if (path) + { + imd->image_path = g_strdup(path); + imd->image_name = filename_from_path(imd->image_path); + } + else + { + imd->image_path = NULL; + imd->image_name = " "; + zoom = 1; + } + + if (imd->image_data) gdk_imlib_destroy_image(imd->image_data); + if (path && isfile(path)) + { + imd->image_data = gdk_imlib_load_image(path); + if (!imd->image_data) + { + imd->image_data = gdk_imlib_create_image_from_xpm_data((gchar **)img_unknown_xpm); + imd->unknown = TRUE; + } + else + { + imd->unknown = FALSE; + } + imd->size = filesize(path); + } + else + { + if (path) + imd->image_data = gdk_imlib_create_image_from_xpm_data((gchar **)img_unknown_xpm); + else + imd->image_data = gdk_imlib_create_image_from_data((char *)logo, NULL, logo_width, logo_height); + imd->unknown = TRUE; + imd->size = 0; + } + + imd->width = imd->old_width = 0; + imd->height = imd->old_height = 0; + + if (imd->top_window) + { + set_window_title(imd, NULL); + } + if (imd->info_label) + { + set_info_label(imd->info_label, imd->image_data->rgb_width, imd->image_data->rgb_height, imd->size, imd->unknown); + } + + /* do info area updates here */ + + imd->new_img = TRUE; + image_area_set_zoom(imd, zoom); +} + +/* + *----------------------------------------------------------------------------- + * image widget redraw/callbacks (private) + *----------------------------------------------------------------------------- + */ + +static void image_area_redraw(ImageWindow *imd) +{ + GdkBitmap *mask = NULL; + + if (debug) printf("redrawn %d x %d\n", imd->width, imd->height); + + if (!imd->image_data) return; + + if (imd->width == imd->old_width && imd->height == imd->old_height) + { + if (debug) printf("redraw cancelled\n"); + return; + } + + if (imd->image_pixmap) gdk_imlib_free_pixmap(imd->image_pixmap); + imd->image_pixmap = NULL; + + gdk_imlib_render(imd->image_data, imd->width, imd->height); + imd->image_pixmap = gdk_imlib_move_image(imd->image_data); + mask = gdk_imlib_move_mask(imd->image_data); + + gdk_window_set_back_pixmap(imd->image->window, imd->image_pixmap, FALSE); + gdk_window_shape_combine_mask (imd->image->window, mask, 0, 0); + gdk_window_clear(imd->image->window); + gdk_flush(); + + imd->old_width = imd->width; + imd->old_height = imd->height; +} + +static gint image_area_size_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data) +{ + ImageWindow *imd = data; + gint old_w, old_h; + GtkAdjustment *h; + GtkAdjustment *v; + gfloat h_pos; + gfloat v_pos; + gfloat h_max; + gfloat v_max; + + if (imd->artificial_size) return FALSE; + + h = gtk_viewport_get_hadjustment(GTK_VIEWPORT(imd->viewport)); + v = gtk_viewport_get_vadjustment(GTK_VIEWPORT(imd->viewport)); + + h_pos = h->value; + h_max = allocation->width; + v_pos = v->value; + v_max = allocation->height; + + if (imd == normal_image) + { + h_max -= 4.0; + v_max -= 4.0; + } + + if (h_pos > h->upper - h_max) h_pos = h->upper - h_max; + if (v_pos > v->upper - v_max) v_pos = v->upper - v_max; + + if (imd->new_img) + { + imd->new_img = FALSE; + gtk_adjustment_clamp_page(h, 0.0, h_max); + gtk_adjustment_clamp_page(v, 0.0, v_max); + } + else + { + gtk_adjustment_clamp_page(h, h_pos, h_max); + gtk_adjustment_clamp_page(v, v_pos, v_max); + } + + gtk_adjustment_changed(h); + gtk_adjustment_changed(v); + + if (!imd->image_data || imd->zoom != 0) return FALSE; + + old_w = imd->width; + old_h = imd->height; + image_area_recalc_size(imd, allocation); + if (old_w != imd->width || old_h != imd->height) + { + gtk_widget_set_usize (imd->table, imd->width, imd->height); + gtk_drawing_area_size(GTK_DRAWING_AREA(imd->image), imd->width, imd->height); + } + + if (debug) printf("sized %d x %d (%d x %d)\n", allocation->width, allocation->height, imd->width, imd->height); + + return FALSE; +} + +static gint image_area_update_cb(GtkWidget *widget, GdkEventConfigure *event, gpointer data) +{ + ImageWindow *imd = data; + + if (imd->artificial_size) return FALSE; + + image_area_redraw(imd); + + return FALSE; +} + +/* + *----------------------------------------------------------------------------- + * image widget mouse routines (private) + *----------------------------------------------------------------------------- + */ + +static void set_mouse_cursor (GdkWindow *window, gint icon) +{ + GdkCursor *cursor; + + if (icon == -1) + { + cursor = NULL; + } + else + { + cursor = gdk_cursor_new (icon); + } + + gdk_window_set_cursor (window, cursor); + + if (cursor) gdk_cursor_destroy (cursor); +} + +static void image_area_mouse_moved(GtkWidget *widget, GdkEventButton *bevent, gpointer data) +{ + ImageWindow *imd = data; + GtkAdjustment* h; + GtkAdjustment* v; + gfloat x, y; + gfloat val; + + if (!imd->in_drag || !gdk_pointer_is_grabbed()) return; + + if (imd->drag_moved < 4) + { + imd->drag_moved++; + } + else + { + set_mouse_cursor (imd->eventbox->window, GDK_FLEUR); + } + + h = gtk_viewport_get_hadjustment(GTK_VIEWPORT(imd->viewport)); + v = gtk_viewport_get_vadjustment(GTK_VIEWPORT(imd->viewport)); + + x = imd->drag_last_x - bevent->x; + y = imd->drag_last_y - bevent->y; + + /* x */ + if (h->upper - h->page_size > 0) + { + val = (float)h->value + x; + if (val < 0 ) val = 0; + if (val > h->upper - h->page_size) val = h->upper - h->page_size; + h->value = val; + gtk_adjustment_set_value (GTK_ADJUSTMENT(h), val); + } + + /* y */ + if (v->upper - v->page_size > 0) + { + val = v->value + y; + if (val < 0 ) val = 0; + if (val > v->upper - v->page_size) val = v->upper - v->page_size; + v->value = val; + gtk_adjustment_set_value (GTK_ADJUSTMENT(v), val); + } + + gtk_adjustment_value_changed(h); + gtk_adjustment_value_changed(v); + + imd->drag_last_x = bevent->x; + imd->drag_last_y = bevent->y; +} + +static void image_area_mouse_pressed(GtkWidget *widget, GdkEventButton *bevent, gpointer data) +{ + ImageWindow *imd = data; + switch (bevent->button) + { + case 1: + imd->in_drag = TRUE; + imd->drag_last_x = bevent->x; + imd->drag_last_y = bevent->y; + imd->drag_moved = 0; + gdk_pointer_grab (imd->eventbox->window, FALSE, + GDK_POINTER_MOTION_MASK | + GDK_BUTTON_RELEASE_MASK, + NULL, NULL, bevent->time); + gtk_grab_add (imd->eventbox); + break; + case 2: + imd->drag_moved = 0; + break; + case 3: + if (imd->func_btn3) + imd->func_btn3(imd, bevent, imd->data_btn3); + break; + default: + break; + } + gtk_widget_grab_focus(imd->viewport); +} + +static void image_area_mouse_released(GtkWidget *widget, GdkEventButton *bevent, gpointer data) +{ + ImageWindow *imd = data; + if (gdk_pointer_is_grabbed() && GTK_WIDGET_HAS_GRAB (imd->eventbox)) + { + gtk_grab_remove (imd->eventbox); + gdk_pointer_ungrab (bevent->time); + set_mouse_cursor (imd->eventbox->window, -1); + } + + if (bevent->button == 1) + { + if (imd->drag_moved < 4 && imd->func_btn1) + imd->func_btn1(imd, bevent, imd->data_btn1); + } + + if (bevent->button == 2) + { + if (imd->drag_moved < 4 && imd->func_btn2) + imd->func_btn2(imd, bevent, imd->data_btn2); + } + + imd->in_drag = FALSE; +} + +static void image_area_mouse_drag(GtkWidget *widget, GdkDragContext *context, gpointer data) +{ + ImageWindow *imd = data; + imd->drag_moved = 4; +} + +/* + *----------------------------------------------------------------------------- + * image widget setup routines + *----------------------------------------------------------------------------- + */ + +void image_area_set_topwindow(ImageWindow *imd, GtkWidget *window, gchar *title, gint show_zoom) +{ + imd->top_window = window; + imd->show_title_zoom = show_zoom; + + g_free(imd->title); + if (title) + imd->title = g_strdup(title); + else + imd->title = NULL; +} + +void image_area_set_labels(ImageWindow *imd, GtkWidget *info, GtkWidget *zoom) +{ + imd->info_label = info; + imd->zoom_label = zoom; +} + +void image_area_set_button(ImageWindow *imd, gint button, + void (*func)(ImageWindow *, GdkEventButton *, gpointer), gpointer data) +{ + switch (button) + { + case 1: + imd->func_btn1 = func; + imd->data_btn1 = data; + break; + case 2: + imd->func_btn2 = func; + imd->data_btn2 = data; + break; + case 3: + imd->func_btn3 = func; + imd->data_btn3 = data; + break; + } +} + +ImageWindow *image_area_new(GtkWidget *top_window) +{ + GtkObject *h_adj; + GtkObject *v_adj; + ImageWindow *imd; + + imd = g_new0(ImageWindow, 1); + imd->zoom = 0; + + imd->top_window = top_window; + imd->title = g_strdup("GQview - "); + imd->show_title_zoom = FALSE; + imd->new_img = FALSE; + + imd->eventbox = gtk_event_box_new(); + + gtk_signal_connect(GTK_OBJECT(imd->eventbox),"motion_notify_event", + GTK_SIGNAL_FUNC(image_area_mouse_moved), imd); + gtk_signal_connect(GTK_OBJECT(imd->eventbox),"button_press_event", + GTK_SIGNAL_FUNC(image_area_mouse_pressed), imd); + gtk_signal_connect(GTK_OBJECT(imd->eventbox),"button_release_event", + GTK_SIGNAL_FUNC(image_area_mouse_released), imd); + gtk_widget_set_events(imd->eventbox, GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK); + + /* viewer */ + h_adj = gtk_adjustment_new(0.0,0.0,0.0,1.0,1.0,1.0); + v_adj = gtk_adjustment_new(0.0,0.0,0.0,1.0,1.0,1.0); + + imd->viewport = gtk_viewport_new (GTK_ADJUSTMENT(h_adj), GTK_ADJUSTMENT(v_adj)); + gtk_container_add(GTK_CONTAINER(imd->eventbox), imd->viewport); + + /* table for resize */ + imd->table = gtk_table_new (1,1,TRUE); + gtk_container_add(GTK_CONTAINER (imd->viewport), imd->table); + + /* imagewindow */ + imd->image = gtk_drawing_area_new(); + gtk_table_attach(GTK_TABLE (imd->table),imd->image,0,1,0,1,GTK_EXPAND,GTK_EXPAND,0,0); + + gtk_signal_connect(GTK_OBJECT(imd->eventbox),"size_allocate",GTK_SIGNAL_FUNC(image_area_size_cb), imd); + gtk_signal_connect(GTK_OBJECT(imd->image),"configure_event",GTK_SIGNAL_FUNC(image_area_update_cb), imd); + + gtk_signal_connect(GTK_OBJECT(imd->viewport),"drag_begin", + GTK_SIGNAL_FUNC(image_area_mouse_drag), imd); + + return imd; +} + +void image_area_free(ImageWindow *imd) +{ + g_free(imd->image_path); + + if (imd->image_pixmap) gdk_imlib_free_pixmap(imd->image_pixmap); + if (imd->image_data) gdk_imlib_destroy_image(imd->image_data); + + g_free(imd); +} + +gint get_default_zoom(ImageWindow *imd) +{ + gint zoom; + + if (zoom_mode == ZOOM_RESET_ORIGINAL) + { + zoom = 1; + } + else if (zoom_mode == ZOOM_RESET_FIT_WINDOW) + { + zoom = 0; + } + else + { + if (imd) + { + zoom = image_area_get_zoom(imd); + } + else + { + zoom = 1; + } + } + + return zoom; +} + diff --git a/src/image.h b/src/image.h new file mode 100644 index 00000000..e620c825 --- /dev/null +++ b/src/image.h @@ -0,0 +1,40 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +ImageWindow *image_area_new(GtkWidget *top_window); +void image_area_free(ImageWindow *imd); + +/* for attaching the top window for resizing */ +void image_area_set_topwindow(ImageWindow *imd, GtkWidget *window, gchar *title, gint show_zoom); + +/* attach labels to be updated */ +void image_area_set_labels(ImageWindow *imd, GtkWidget *info, GtkWidget *zoom); + +/* set the current image to a different path */ +void image_area_set_path(ImageWindow *imd, gchar *newpath); + +/* attach handler functions for mouse buttons (1-3) */ +void image_area_set_button(ImageWindow *imd, gint button, + void (*func)(ImageWindow *, GdkEventButton *, gpointer), gpointer data); + +/* get the current image's path, etc. */ +gchar *image_area_get_path(ImageWindow *imd); +gchar *image_area_get_name(ImageWindow *imd); + +/* load a new image, or NULL sets to logo */ +void image_area_set_image(ImageWindow *imd, gchar *path, gint zoom); + +/* image manipulation */ +void image_area_scroll(ImageWindow *imd, gint x, gint y); +gint image_area_get_zoom(ImageWindow *imd); +void image_area_adjust_zoom(ImageWindow *imd, gint increment); +void image_area_set_zoom(ImageWindow *imd, gint zoom); + +/* get the default zoom for an image */ +gint get_default_zoom(ImageWindow *imd); + diff --git a/src/img-main.c b/src/img-main.c new file mode 100644 index 00000000..cbf4921d --- /dev/null +++ b/src/img-main.c @@ -0,0 +1,361 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" +#include "image.h" +#include /* for keyboard values */ + +#define BLACK_BACKGROUND 1 + +/* + *----------------------------------------------------------------------------- + * full screen keyboard + *----------------------------------------------------------------------------- + */ + +static gint full_screen_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data) +{ + ImageWindow *imd = data; + gint stop_signal = FALSE; + gint x = 0; + gint y = 0; + + switch (event->keyval) + { + case GDK_Left: + x -= 1; + stop_signal = TRUE; + break; + case GDK_Right: + x += 1; + stop_signal = TRUE; + break; + case GDK_Up: + y -= 1; + stop_signal = TRUE; + break; + case GDK_Down: + y += 1; + stop_signal = TRUE; + break; + case '+': case '=': + image_area_adjust_zoom(imd, 1); + break; + case '-': + image_area_adjust_zoom(imd, -1); + break; + case 'x': + image_area_set_zoom(imd, 0); + break; + case 'z': + image_area_set_zoom(imd, 1); + break; + case GDK_Page_Up: + case GDK_BackSpace: + file_prev_image(); + stop_signal = TRUE; + break; + case GDK_Page_Down: + case GDK_space: + file_next_image(); + stop_signal = TRUE; + break; + case GDK_Home: + file_first_image(); + stop_signal = TRUE; + break; + case GDK_End: + file_last_image(); + stop_signal = TRUE; + break; + case GDK_Delete: + full_screen_stop(); + file_util_delete(image_area_get_path(imd), NULL); + stop_signal = TRUE; + break; + case GDK_Escape: + full_screen_stop(); + stop_signal = TRUE; + break; + case 'Q': case 'q': + exit_gqview(); + return FALSE; + break; + case 'S': case 's': + slideshow_toggle(); + break; + } + + if (event->state & GDK_CONTROL_MASK) + { + gint n = -1; + switch (event->keyval) + { + case '1': + n = 0; + break; + case '2': + n = 1; + break; + case '3': + n = 2; + break; + case '4': + n = 3; + break; + case '5': + n = 4; + break; + case '6': + n = 5; + break; + case '7': + n = 6; + break; + case '8': + n = 7; + break; + case 'F': case 'f': + full_screen_stop(); + break; + case 'C': case 'c': + full_screen_stop(); + file_util_copy(image_area_get_path(imd), NULL, current_path); + break; + case 'M': case 'm': + full_screen_stop(); + file_util_move(image_area_get_path(imd), NULL, current_path); + break; + case 'R': case 'r': + full_screen_stop(); + file_util_rename(image_area_get_path(imd), NULL); + break; + case 'D': case 'd': + full_screen_stop(); + file_util_delete(image_area_get_path(imd), NULL); + break; + } + if (n != -1) + { + full_screen_stop(); + start_editor_from_file(n, image_area_get_path(imd)); + } + } + + if (event->state & GDK_SHIFT_MASK) + { + x *= 3; + y *= 3; + } + + if (x != 0 || y!= 0) + { + keyboard_scroll_calc(&x, &y, event); + image_area_scroll(imd, x, y); + } + + return stop_signal; +} + +/* + *---------------------------------------------------------------------------- + * mouse button callbacks + *---------------------------------------------------------------------------- + */ + +static void button1_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data) +{ + file_next_image(); +} + +static void button2_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data) +{ + file_prev_image(); +} + +static void button3_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data) +{ + if (main_image == normal_image) + { + gtk_menu_popup (GTK_MENU(menu_image_popup), NULL, NULL, NULL, NULL, + bevent->button, bevent->time); + } + else + { + gtk_menu_popup (GTK_MENU(menu_window_full), NULL, NULL, NULL, NULL, + bevent->button, bevent->time); + } +} + +/* + *---------------------------------------------------------------------------- + * full screen functions + *---------------------------------------------------------------------------- + */ + +static gint full_screen_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data) +{ + full_screen_stop(); + return TRUE; +} + +static gint full_screen_destroy_cb(GtkWidget *widget, GdkEventAny *event, gpointer data) +{ + image_area_free(full_screen_image); + full_screen_image = NULL; + + return FALSE; +} + +void full_screen_start() +{ + GtkWidget *window; + gint w; + gint h; + + if (full_screen_window) return; + + w = gdk_screen_width(); + h = gdk_screen_height(); + + window = gtk_window_new(GTK_WINDOW_POPUP); + gtk_container_border_width(GTK_CONTAINER(window), 0); + gtk_signal_connect(GTK_OBJECT(window), "delete_event", (GtkSignalFunc)full_screen_delete_cb, NULL); + gtk_signal_connect(GTK_OBJECT(window), "destroy_event", (GtkSignalFunc)full_screen_destroy_cb, NULL); + + gtk_window_set_title(GTK_WINDOW(window), _("GQview full screen")); + gtk_widget_set_usize(window, w, h); + + full_screen_image = image_area_new(NULL); + + gtk_viewport_set_shadow_type (GTK_VIEWPORT(full_screen_image->viewport), GTK_SHADOW_NONE); + gtk_container_add(GTK_CONTAINER(window), full_screen_image->eventbox); + + /* set background to black */ + if (BLACK_BACKGROUND) + { + GtkStyle *style; + style = gtk_style_copy(gtk_widget_get_style(full_screen_image->eventbox)); + gtk_style_ref(style); + style->bg[GTK_STATE_NORMAL] = style->black; + gtk_widget_set_style(full_screen_image->viewport, style); + gtk_style_unref(style); + } + + gtk_widget_show_all(full_screen_image->eventbox); + + gtk_signal_connect(GTK_OBJECT(window), "key_press_event", GTK_SIGNAL_FUNC(full_screen_key_press_cb), full_screen_image); + + image_area_set_image(full_screen_image, image_get_path(), image_area_get_zoom(normal_image)); + +/* + if (!GTK_WIDGET_REALIZED(window)) gtk_widget_realize(window); + gdk_window_set_override_redirect(window->window, TRUE); +*/ + gtk_widget_show(window); + gdk_keyboard_grab(window->window, TRUE, GDK_CURRENT_TIME); + + /* hide normal window */ + gtk_widget_hide(mainwindow); + image_area_set_image(normal_image, NULL, image_area_get_zoom(normal_image)); + + full_screen_window = window; + + image_area_set_button(full_screen_image, 1, button1_cb, NULL); + image_area_set_button(full_screen_image, 2, button2_cb, NULL); + image_area_set_button(full_screen_image, 3, button3_cb, NULL); + + main_image = full_screen_image; +} + +void full_screen_stop() +{ + if (!full_screen_window) return; + + gdk_keyboard_ungrab (GDK_CURRENT_TIME); + + image_area_set_image(normal_image, image_get_path(), image_area_get_zoom(full_screen_image)); + main_image = normal_image; + + gtk_widget_destroy(full_screen_window); + full_screen_window = NULL; + + gtk_widget_show(mainwindow); +} + +void full_screen_toggle() +{ + if (full_screen_window) + { + full_screen_stop(); + } + else + { + full_screen_start(); + } +} + +/* + *---------------------------------------------------------------------------- + * main image manipulation + *---------------------------------------------------------------------------- + */ + +void image_scroll(gint x, gint y) +{ + image_area_scroll(main_image, x, y); +} + +void image_adjust_zoom(gint increment) +{ + image_area_adjust_zoom(main_image, increment); +} + +void image_set_zoom(gint zoom) +{ + image_area_set_zoom(main_image, zoom); +} + +void image_set_path(gchar *path) +{ + image_area_set_path(main_image, path); +} + +gchar *image_get_path() +{ + return image_area_get_path(main_image); +} + +gchar *image_get_name() +{ + return image_area_get_name(main_image); +} + +void image_change_to(gchar *path) +{ + image_area_set_image(main_image, path, get_default_zoom(main_image)); +} + +void image_set_labels(GtkWidget *info, GtkWidget *zoom) +{ + image_area_set_labels(normal_image, info, zoom); +} + +GtkWidget *image_create() +{ + normal_image = image_area_new(mainwindow); + + main_image = normal_image; + + image_area_set_button(main_image, 1, button1_cb, NULL); + image_area_set_button(main_image, 2, button2_cb, NULL); + image_area_set_button(main_image, 3, button3_cb, NULL); + + return main_image->eventbox; +} + diff --git a/src/img-view.c b/src/img-view.c new file mode 100644 index 00000000..0c9b8f80 --- /dev/null +++ b/src/img-view.c @@ -0,0 +1,300 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" +#include "image.h" +#include /* for keyboard values */ + +/* + *----------------------------------------------------------------------------- + * view window keyboard + *----------------------------------------------------------------------------- + */ + +static gint view_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data) +{ + ImageWindow *imd = data; + gint stop_signal = FALSE; + gint x = 0; + gint y = 0; + + switch (event->keyval) + { + case GDK_Left: + x -= 1; + stop_signal = TRUE; + break; + case GDK_Right: + x += 1; + stop_signal = TRUE; + break; + case GDK_Up: + y -= 1; + stop_signal = TRUE; + break; + case GDK_Down: + y += 1; + stop_signal = TRUE; + break; + case '+': case '=': + image_area_adjust_zoom(imd, 1); + break; + case '-': + image_area_adjust_zoom(imd, -1); + break; + case 'x': + image_area_set_zoom(imd, 0); + break; + case 'z': + image_area_set_zoom(imd, 1); + break; + case GDK_Delete: + file_util_delete(image_area_get_path(imd), NULL); + stop_signal = TRUE; + break; + case GDK_Escape: + gtk_widget_destroy(imd->top_window); + stop_signal = TRUE; + break; + } + + if (event->state & GDK_CONTROL_MASK) + { + gint n = -1; + switch (event->keyval) + { + case '1': + n = 0; + break; + case '2': + n = 1; + break; + case '3': + n = 2; + break; + case '4': + n = 3; + break; + case '5': + n = 4; + break; + case '6': + n = 5; + break; + case '7': + n = 6; + break; + case '8': + n = 7; + break; + } + if (n != -1) + { + start_editor_from_file(n, image_area_get_path(imd)); + } + } + + if (event->state & GDK_SHIFT_MASK) + { + x *= 3; + y *= 3; + } + + if (x != 0 || y!= 0) + { + keyboard_scroll_calc(&x, &y, event); + image_area_scroll(imd, x, y); + } + + return stop_signal; +} + +/* + *----------------------------------------------------------------------------- + * view window main routines + *----------------------------------------------------------------------------- + */ + +static void button3_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data) +{ + gtk_object_set_data(GTK_OBJECT(menu_window_view), "view_active", imd); + gtk_menu_popup (GTK_MENU(menu_window_view), NULL, NULL, NULL, NULL, + bevent->button, bevent->time); +} + +static gint view_window_delete_cb(GtkWidget *w, GdkEventAny *event, gpointer data) +{ + gtk_widget_destroy(w); + return TRUE; +} + +static gint view_window_destroy_cb(GtkWidget *w, GdkEventAny *event, gpointer data) +{ + ImageWindow *imd = data; + image_area_free(imd); + return FALSE; +} + +void view_window_new(gchar *path) +{ + GtkWidget *window; + ImageWindow *imd; + GtkAllocation req_size; + gint w, h; + if (!path) return; + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, FALSE); + gtk_window_set_title (GTK_WINDOW (window), "GQview"); + gtk_window_set_wmclass(GTK_WINDOW (window), "view", "GQview"); + gtk_container_border_width (GTK_CONTAINER (window), 0); + + imd = image_area_new(NULL); + image_area_set_topwindow(imd, window, NULL, TRUE); + gtk_container_add(GTK_CONTAINER(window), imd->eventbox); + gtk_viewport_set_shadow_type (GTK_VIEWPORT(imd->viewport), GTK_SHADOW_NONE); + gtk_container_border_width (GTK_CONTAINER (imd->viewport), 0); + gtk_widget_show_all(imd->eventbox); + + image_dnd_init(imd); + + image_area_set_button(imd, 3, button3_cb, NULL); + + gtk_signal_connect(GTK_OBJECT(window), "delete_event", (GtkSignalFunc) view_window_delete_cb, NULL); + gtk_signal_connect(GTK_OBJECT(window), "destroy_event", (GtkSignalFunc) view_window_destroy_cb, imd); + gtk_signal_connect(GTK_OBJECT(window), "key_press_event", GTK_SIGNAL_FUNC(view_window_key_press_cb), imd); + + image_area_set_image(imd, path, get_default_zoom(NULL)); + + w = imd->width; + h = imd->height; + if (limit_window_size) + { + gint mw = gdk_screen_width() * max_window_size / 100; + gint mh = gdk_screen_height() * max_window_size / 100; + + if (w > mw) w = mw; + if (h > mh) h = mh; + } + + gtk_window_set_default_size (GTK_WINDOW(window), w, h); + req_size.x = req_size.y = 0; + req_size.width = w; + req_size.height = h; + gtk_widget_size_allocate(GTK_WIDGET(window), &req_size); + + gtk_widget_set_usize(imd->eventbox, w, h); + + gtk_widget_show(window); +} + +/* + *----------------------------------------------------------------------------- + * view window menu routines and callbacks + *----------------------------------------------------------------------------- + */ + +static ImageWindow *view_window_get_active() +{ + return gtk_object_get_data(GTK_OBJECT(menu_window_view), "view_active"); +} + +void view_window_active_edit(gint n) +{ + ImageWindow *imd = view_window_get_active(); + if (!imd) return; + start_editor_from_file(n, image_area_get_path(imd)); +} + +static void view_zoom_in_cb(GtkWidget *widget, gpointer data) +{ + ImageWindow *imd = view_window_get_active(); + if (!imd) return; + image_area_adjust_zoom(imd, 1); +} + +static void view_zoom_out_cb(GtkWidget *widget, gpointer data) +{ + ImageWindow *imd = view_window_get_active(); + if (!imd) return; + image_area_adjust_zoom(imd, -1); +} + +static void view_zoom_1_1_cb(GtkWidget *widget, gpointer data) +{ + ImageWindow *imd = view_window_get_active(); + if (!imd) return; + image_area_set_zoom(imd, 1); +} + +static void view_zoom_fit_cb(GtkWidget *widget, gpointer data) +{ + ImageWindow *imd = view_window_get_active(); + if (!imd) return; + image_area_set_zoom(imd, 0); +} + +static void view_copy_cb(GtkWidget *widget, gpointer data) +{ + ImageWindow *imd = view_window_get_active(); + if (!imd) return; + file_util_copy(image_area_get_path(imd), NULL, current_path); +} + +static void view_move_cb(GtkWidget *widget, gpointer data) +{ + ImageWindow *imd = view_window_get_active(); + if (!imd) return; + file_util_move(image_area_get_path(imd), NULL, current_path); +} + +static void view_rename_cb(GtkWidget *widget, gpointer data) +{ + ImageWindow *imd = view_window_get_active(); + if (!imd) return; + file_util_rename(image_area_get_path(imd), NULL); +} + +static void view_delete_cb(GtkWidget *widget, gpointer data) +{ + ImageWindow *imd = view_window_get_active(); + if (!imd) return; + file_util_delete(image_area_get_path(imd), NULL); +} + +static void view_close_cb(GtkWidget *widget, gpointer data) +{ + ImageWindow *imd = view_window_get_active(); + if (!imd) return; + gtk_widget_destroy(imd->top_window); +} + +void create_menu_view_popup() +{ + menu_window_view = gtk_menu_new(); + add_menu_popup_item(menu_window_view, _("Zoom in"), view_zoom_in_cb, NULL); + add_menu_popup_item(menu_window_view, _("Zoom out"), view_zoom_out_cb, NULL); + add_menu_popup_item(menu_window_view, _("Zoom 1:1"), view_zoom_1_1_cb, NULL); + add_menu_popup_item(menu_window_view, _("Fit image to window"), view_zoom_fit_cb, NULL); + add_menu_divider(menu_window_view); + + menu_window_view_edit = gtk_menu_item_new_with_label(_("Edit")); + gtk_menu_append(GTK_MENU(menu_window_view), menu_window_view_edit); + gtk_widget_show(menu_window_view_edit); + + add_menu_divider(menu_window_view); + add_menu_popup_item(menu_window_view, _("Copy..."), view_copy_cb, NULL); + add_menu_popup_item(menu_window_view, _("Move..."), view_move_cb, NULL); + add_menu_popup_item(menu_window_view, _("Rename..."), view_rename_cb, NULL); + add_menu_popup_item(menu_window_view, _("Delete..."), view_delete_cb, NULL); + + add_menu_divider(menu_window_view); + add_menu_popup_item(menu_window_view, _("Close window"), view_close_cb, NULL); +} + + diff --git a/src/intl.h b/src/intl.h new file mode 100644 index 00000000..0f172d7c --- /dev/null +++ b/src/intl.h @@ -0,0 +1,22 @@ +#ifndef __INTL_H__ +#define __INTL_H__ + +#ifdef ENABLE_NLS +# include +# define _(String) dgettext(PACKAGE,String) +# ifdef gettext_noop +# define N_(String) gettext_noop(String) +# else +# define N_(String) (String) +# endif /* gettext_noop */ +#else +# define _(String) (String) +# define N_(String) (String) +# define textdomain(String) (String) +# define gettext(String) (String) +# define dgettext(Domain,String) (String) +# define dcgettext(Domain,String,Type) (String) +# define bindtextdomain(Domain,Directory) (Domain) +#endif /* ENABLE_NLS */ + +#endif /* __INTL_H__ */ diff --git a/src/logo.h b/src/logo.h new file mode 100644 index 00000000..fc310f60 --- /dev/null +++ b/src/logo.h @@ -0,0 +1,3507 @@ +/* Imlib raw rgb data file created by convertrgb */ + +const int logo_width = 200; +const int logo_height = 70; +const GdkImlibColor logo_alpha = { -1, -1, -1, 0 }; +const unsigned char logo[] = { +0x13, 0x16, 0x42, 0x23, 0x28, 0x75, 0x19, 0x1d, 0x53, 0x12, 0x15, 0x3a, +0x12, 0x16, 0x3b, 0x13, 0x17, 0x3c, 0x15, 0x17, 0x3d, 0x15, 0x18, 0x3d, +0x16, 0x19, 0x3e, 0x17, 0x1a, 0x3f, 0x18, 0x1b, 0x3f, 0x17, 0x1a, 0x40, +0x16, 0x1a, 0x41, 0x15, 0x18, 0x42, 0x15, 0x18, 0x42, 0x14, 0x17, 0x43, +0x13, 0x16, 0x44, 0x12, 0x16, 0x45, 0x13, 0x16, 0x46, 0x15, 0x18, 0x47, +0x16, 0x1a, 0x47, 0x18, 0x1c, 0x48, 0x1a, 0x1e, 0x4a, 0x1d, 0x20, 0x4a, +0x1a, 0x1e, 0x4b, 0x17, 0x1b, 0x4d, 0x15, 0x18, 0x4e, 0x12, 0x16, 0x4e, +0x10, 0x15, 0x4f, 0x12, 0x15, 0x51, 0x14, 0x17, 0x52, 0x16, 0x1a, 0x53, +0x1a, 0x1e, 0x54, 0x1d, 0x22, 0x55, 0x1e, 0x22, 0x57, 0x1f, 0x24, 0x58, +0x20, 0x25, 0x59, 0x21, 0x26, 0x5a, 0x22, 0x27, 0x5c, 0x22, 0x27, 0x5d, +0x24, 0x29, 0x5e, 0x21, 0x26, 0x5f, 0x1e, 0x23, 0x61, 0x1c, 0x21, 0x62, +0x1a, 0x1f, 0x64, 0x1a, 0x1f, 0x64, 0x18, 0x1d, 0x66, 0x20, 0x26, 0x67, +0x28, 0x2f, 0x5f, 0x1b, 0x1f, 0x3b, 0x2b, 0x31, 0x6b, 0x23, 0x29, 0x6c, +0x1f, 0x24, 0x6d, 0x1b, 0x21, 0x6e, 0x20, 0x26, 0x6f, 0x2f, 0x35, 0x6f, +0x1e, 0x22, 0x41, 0x22, 0x27, 0x4d, 0x27, 0x2d, 0x58, 0x2b, 0x32, 0x62, +0x2d, 0x35, 0x73, 0x25, 0x2c, 0x74, 0x23, 0x29, 0x74, 0x25, 0x2c, 0x74, +0x22, 0x28, 0x74, 0x1d, 0x23, 0x75, 0x21, 0x27, 0x75, 0x2a, 0x32, 0x75, +0x27, 0x2d, 0x74, 0x23, 0x29, 0x74, 0x22, 0x27, 0x74, 0x20, 0x26, 0x74, +0x1e, 0x23, 0x73, 0x1f, 0x25, 0x73, 0x2c, 0x33, 0x72, 0x25, 0x2b, 0x55, +0x26, 0x2d, 0x71, 0x22, 0x27, 0x6f, 0x27, 0x2f, 0x6f, 0x2b, 0x32, 0x6d, +0x24, 0x2a, 0x6d, 0x20, 0x25, 0x6c, 0x22, 0x27, 0x6b, 0x24, 0x2a, 0x6a, +0x26, 0x2d, 0x69, 0x28, 0x2f, 0x67, 0x28, 0x2e, 0x67, 0x25, 0x2a, 0x65, +0x22, 0x27, 0x64, 0x21, 0x26, 0x64, 0x21, 0x26, 0x62, 0x20, 0x25, 0x62, +0x1f, 0x24, 0x60, 0x1e, 0x22, 0x5f, 0x1d, 0x21, 0x5e, 0x1d, 0x22, 0x5d, +0x1e, 0x24, 0x5c, 0x1f, 0x25, 0x5a, 0x21, 0x26, 0x5a, 0x22, 0x27, 0x58, +0x24, 0x29, 0x57, 0x20, 0x25, 0x4a, 0x20, 0x25, 0x4b, 0x21, 0x26, 0x54, +0x1e, 0x22, 0x53, 0x1b, 0x1f, 0x52, 0x19, 0x1d, 0x50, 0x19, 0x1d, 0x50, +0x1a, 0x1e, 0x4f, 0x1a, 0x1e, 0x4d, 0x1a, 0x1f, 0x4d, 0x1c, 0x1f, 0x4b, +0x1a, 0x1e, 0x4a, 0x18, 0x1c, 0x4a, 0x16, 0x1a, 0x48, 0x15, 0x18, 0x47, +0x13, 0x16, 0x47, 0x12, 0x15, 0x46, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, +0x12, 0x15, 0x43, 0x12, 0x15, 0x42, 0x12, 0x15, 0x41, 0x11, 0x15, 0x41, +0x11, 0x15, 0x3f, 0x11, 0x15, 0x3f, 0x11, 0x15, 0x3f, 0x11, 0x15, 0x3d, +0x11, 0x15, 0x3d, 0x11, 0x15, 0x3d, 0x11, 0x14, 0x3b, 0x11, 0x14, 0x3b, +0x11, 0x14, 0x3a, 0x10, 0x13, 0x39, 0x10, 0x13, 0x39, 0x10, 0x12, 0x38, +0x10, 0x12, 0x37, 0x0f, 0x12, 0x37, 0x0f, 0x12, 0x36, 0x0f, 0x12, 0x35, +0x0f, 0x12, 0x35, 0x0f, 0x11, 0x35, 0x0e, 0x10, 0x34, 0x0e, 0x10, 0x33, +0x0e, 0x10, 0x33, 0x0e, 0x10, 0x32, 0x0d, 0x0f, 0x32, 0x0d, 0x0f, 0x32, +0x0d, 0x0f, 0x31, 0x0d, 0x0f, 0x30, 0x0d, 0x0f, 0x2f, 0x0d, 0x0f, 0x2f, +0x0c, 0x0e, 0x2f, 0x0b, 0x0d, 0x2e, 0x0b, 0x0d, 0x2d, 0x0b, 0x0d, 0x2d, +0x0a, 0x0d, 0x2d, 0x0a, 0x0d, 0x2d, 0x0a, 0x0d, 0x2c, 0x0a, 0x0d, 0x2c, +0x0a, 0x0d, 0x2c, 0x0a, 0x0c, 0x2b, 0x0a, 0x0c, 0x2a, 0x0a, 0x0c, 0x2a, +0x0a, 0x0c, 0x2a, 0x0a, 0x0b, 0x2a, 0x0a, 0x0b, 0x29, 0x0a, 0x0b, 0x29, +0x0a, 0x0b, 0x28, 0x0a, 0x0b, 0x28, 0x0a, 0x0b, 0x27, 0x0a, 0x0b, 0x27, +0x0a, 0x0b, 0x27, 0x09, 0x0b, 0x26, 0x09, 0x0b, 0x26, 0x0a, 0x0b, 0x26, +0x09, 0x0a, 0x26, 0x0a, 0x0b, 0x26, 0x09, 0x0a, 0x25, 0x09, 0x0a, 0x25, +0x09, 0x0a, 0x24, 0x09, 0x0a, 0x24, 0x09, 0x0a, 0x24, 0x09, 0x0a, 0x24, +0x09, 0x0a, 0x23, 0x09, 0x0a, 0x23, 0x09, 0x0a, 0x22, 0x09, 0x0a, 0x22, +0x09, 0x0a, 0x22, 0x09, 0x0a, 0x22, 0x08, 0x0a, 0x22, 0x08, 0x0a, 0x22, +0x08, 0x0a, 0x21, 0x08, 0x0a, 0x21, 0x07, 0x09, 0x20, 0x07, 0x09, 0x20, +0x07, 0x09, 0x20, 0x07, 0x09, 0x20, 0x07, 0x09, 0x1f, 0x02, 0x02, 0x08, +0x2c, 0x34, 0x9d, 0x3d, 0x4a, 0xd5, 0x3b, 0x45, 0xc6, 0x37, 0x41, 0xba, +0x3a, 0x42, 0xbb, 0x3c, 0x46, 0xbc, 0x3d, 0x47, 0xbe, 0x3e, 0x4a, 0xc1, +0x43, 0x4c, 0xc2, 0x47, 0x51, 0xc4, 0x4a, 0x55, 0xc7, 0x4e, 0x58, 0xca, +0x4e, 0x59, 0xcc, 0x4c, 0x58, 0xcf, 0x49, 0x54, 0xd0, 0x47, 0x51, 0xd4, +0x43, 0x4e, 0xd5, 0x41, 0x4c, 0xd9, 0x3e, 0x49, 0xdc, 0x3d, 0x47, 0xde, +0x41, 0x4e, 0xe1, 0x47, 0x51, 0xe5, 0x4a, 0x58, 0xe7, 0x51, 0x60, 0xeb, +0x59, 0x66, 0xef, 0x59, 0x67, 0xf2, 0x51, 0x5d, 0xf3, 0x47, 0x54, 0xf8, +0x3e, 0x4c, 0xfc, 0x38, 0x46, 0xfe, 0x38, 0x43, 0xff, 0x3e, 0x4a, 0xff, +0x47, 0x53, 0xff, 0x51, 0x5e, 0xff, 0x5e, 0x6c, 0xff, 0x63, 0x70, 0xff, +0x66, 0x75, 0xff, 0x6a, 0x78, 0xff, 0x6c, 0x7d, 0xff, 0x6f, 0x81, 0xff, +0x70, 0x82, 0xff, 0x73, 0x83, 0xff, 0x6a, 0x7a, 0xff, 0x60, 0x70, 0xff, +0x59, 0x67, 0xff, 0x55, 0x65, 0xff, 0x53, 0x61, 0xff, 0x55, 0x66, 0xff, +0x75, 0x87, 0xff, 0x4a, 0x54, 0xa0, 0x73, 0x86, 0xff, 0x7e, 0x93, 0xff, +0x6b, 0x7d, 0xff, 0x5e, 0x70, 0xff, 0x5d, 0x6c, 0xff, 0x82, 0x95, 0xff, +0x4f, 0x5d, 0xac, 0x66, 0x77, 0xdc, 0x78, 0x89, 0xff, 0x86, 0x98, 0xff, +0x98, 0xab, 0xff, 0x7d, 0x92, 0xff, 0x70, 0x83, 0xff, 0x7a, 0x8e, 0xff, +0x70, 0x83, 0xff, 0x60, 0x70, 0xff, 0x6a, 0x7e, 0xff, 0x89, 0xa0, 0xff, +0x7e, 0x94, 0xff, 0x70, 0x86, 0xff, 0x6b, 0x7e, 0xff, 0x66, 0x7a, 0xff, +0x60, 0x72, 0xff, 0x6a, 0x7e, 0xff, 0x8a, 0x9e, 0xff, 0x8a, 0xa0, 0xff, +0x72, 0x86, 0xff, 0x73, 0x87, 0xff, 0x8a, 0xa0, 0xff, 0x82, 0x98, 0xff, +0x6f, 0x82, 0xff, 0x6b, 0x7d, 0xff, 0x72, 0x86, 0xff, 0x7c, 0x8e, 0xff, +0x81, 0x94, 0xff, 0x89, 0x9c, 0xff, 0x7c, 0x8f, 0xff, 0x72, 0x83, 0xff, +0x6b, 0x7d, 0xff, 0x6b, 0x7c, 0xff, 0x6b, 0x7a, 0xff, 0x65, 0x77, 0xff, +0x61, 0x72, 0xff, 0x5e, 0x6f, 0xff, 0x60, 0x70, 0xff, 0x63, 0x73, 0xff, +0x67, 0x78, 0xff, 0x6c, 0x7c, 0xff, 0x72, 0x81, 0xff, 0x72, 0x7e, 0xff, +0x65, 0x70, 0xe1, 0x67, 0x73, 0xed, 0x6b, 0x7a, 0xff, 0x60, 0x6c, 0xff, +0x58, 0x65, 0xff, 0x51, 0x5e, 0xff, 0x54, 0x61, 0xfe, 0x55, 0x63, 0xfc, +0x55, 0x65, 0xf8, 0x59, 0x66, 0xf5, 0x5a, 0x67, 0xf2, 0x53, 0x5e, 0xef, +0x4a, 0x58, 0xeb, 0x46, 0x51, 0xe7, 0x41, 0x4c, 0xe5, 0x3d, 0x47, 0xe1, +0x3a, 0x43, 0xde, 0x3a, 0x43, 0xdb, 0x3a, 0x43, 0xd9, 0x3a, 0x46, 0xd8, +0x3a, 0x43, 0xd4, 0x3a, 0x43, 0xd0, 0x3a, 0x46, 0xce, 0x3a, 0x46, 0xcc, +0x3a, 0x43, 0xc9, 0x38, 0x43, 0xc7, 0x38, 0x43, 0xc4, 0x38, 0x42, 0xc2, +0x38, 0x41, 0xbe, 0x38, 0x41, 0xbd, 0x38, 0x41, 0xbc, 0x38, 0x41, 0xbb, +0x37, 0x3e, 0xb7, 0x37, 0x3e, 0xb5, 0x35, 0x3d, 0xb3, 0x33, 0x3c, 0xb0, +0x33, 0x3c, 0xaf, 0x31, 0x3a, 0xac, 0x31, 0x3a, 0xab, 0x30, 0x38, 0xaa, +0x2f, 0x37, 0xa6, 0x2f, 0x35, 0xa5, 0x2c, 0x35, 0xa3, 0x2c, 0x33, 0xa1, +0x2c, 0x33, 0xa0, 0x2b, 0x33, 0x9e, 0x2b, 0x31, 0x9c, 0x2a, 0x30, 0x9b, +0x28, 0x30, 0x99, 0x28, 0x2f, 0x98, 0x28, 0x2f, 0x95, 0x26, 0x2c, 0x94, +0x25, 0x2b, 0x93, 0x25, 0x2b, 0x93, 0x25, 0x2b, 0x92, 0x23, 0x2a, 0x8f, +0x23, 0x2a, 0x8e, 0x23, 0x28, 0x8c, 0x21, 0x28, 0x8c, 0x21, 0x28, 0x8a, +0x21, 0x26, 0x89, 0x21, 0x26, 0x87, 0x20, 0x26, 0x86, 0x20, 0x26, 0x86, +0x20, 0x26, 0x83, 0x20, 0x26, 0x82, 0x20, 0x26, 0x82, 0x20, 0x26, 0x81, +0x20, 0x26, 0x7e, 0x20, 0x26, 0x7e, 0x20, 0x26, 0x7d, 0x20, 0x25, 0x7c, +0x20, 0x25, 0x7c, 0x20, 0x25, 0x78, 0x20, 0x25, 0x78, 0x20, 0x25, 0x78, +0x20, 0x25, 0x77, 0x20, 0x25, 0x77, 0x1e, 0x23, 0x73, 0x1e, 0x23, 0x73, +0x1e, 0x23, 0x72, 0x1e, 0x23, 0x72, 0x1e, 0x23, 0x70, 0x1e, 0x23, 0x70, +0x1d, 0x23, 0x6f, 0x1d, 0x23, 0x6f, 0x1d, 0x21, 0x6c, 0x1d, 0x21, 0x6c, +0x1d, 0x21, 0x6b, 0x1a, 0x21, 0x6b, 0x1a, 0x20, 0x6a, 0x1a, 0x20, 0x6a, +0x1a, 0x20, 0x67, 0x1a, 0x20, 0x67, 0x1a, 0x20, 0x67, 0x19, 0x1e, 0x66, +0x19, 0x1e, 0x66, 0x19, 0x1e, 0x65, 0x19, 0x1e, 0x65, 0x0c, 0x0e, 0x2e, +0x1a, 0x20, 0x62, 0x2c, 0x36, 0xa2, 0x33, 0x3d, 0xb2, 0x32, 0x39, 0xa7, +0x33, 0x3a, 0xaa, 0x34, 0x3d, 0xac, 0x36, 0x3f, 0xad, 0x38, 0x40, 0xb0, +0x3a, 0x44, 0xb2, 0x3e, 0x46, 0xb3, 0x40, 0x4a, 0xb7, 0x44, 0x4e, 0xb9, +0x46, 0x4f, 0xba, 0x4a, 0x54, 0xbe, 0x4a, 0x55, 0xbf, 0x47, 0x52, 0xc1, +0x45, 0x4f, 0xc5, 0x41, 0x4b, 0xc6, 0x3f, 0x47, 0xc9, 0x3d, 0x46, 0xcb, +0x39, 0x45, 0xcf, 0x3a, 0x45, 0xd3, 0x40, 0x4a, 0xd4, 0x45, 0x4f, 0xd6, +0x4a, 0x55, 0xda, 0x51, 0x5f, 0xdc, 0x5a, 0x67, 0xe0, 0x51, 0x5b, 0xe4, +0x45, 0x51, 0xe6, 0x3e, 0x47, 0xea, 0x36, 0x41, 0xed, 0x33, 0x3e, 0xf0, +0x39, 0x44, 0xf5, 0x40, 0x4c, 0xf7, 0x4b, 0x59, 0xfc, 0x5a, 0x67, 0xff, +0x5c, 0x6a, 0xff, 0x60, 0x6d, 0xff, 0x62, 0x73, 0xff, 0x66, 0x75, 0xff, +0x68, 0x77, 0xff, 0x6c, 0x7c, 0xff, 0x6c, 0x7c, 0xff, 0x62, 0x70, 0xff, +0x5a, 0x68, 0xff, 0x52, 0x60, 0xff, 0x4f, 0x5f, 0xff, 0x4b, 0x5a, 0xff, +0x59, 0x68, 0xff, 0x81, 0x92, 0xff, 0x2b, 0x34, 0x67, 0x83, 0x96, 0xff, +0x6d, 0x7d, 0xff, 0x5c, 0x6d, 0xff, 0x51, 0x61, 0xff, 0x67, 0x7b, 0xff, +0x67, 0x76, 0xdc, 0x51, 0x5f, 0xad, 0x62, 0x71, 0xd5, 0x73, 0x83, 0xfd, +0x7c, 0x8e, 0xff, 0x7c, 0x8f, 0xff, 0x67, 0x7b, 0xff, 0x71, 0x84, 0xff, +0x6d, 0x7e, 0xff, 0x5b, 0x6d, 0xff, 0x64, 0x77, 0xff, 0x83, 0x98, 0xff, +0x77, 0x8c, 0xff, 0x6c, 0x7e, 0xff, 0x66, 0x77, 0xff, 0x5f, 0x71, 0xff, +0x56, 0x68, 0xff, 0x6d, 0x81, 0xff, 0x56, 0x66, 0xc1, 0x84, 0x99, 0xff, +0x61, 0x73, 0xff, 0x71, 0x87, 0xff, 0x8b, 0x9e, 0xff, 0x71, 0x84, 0xff, +0x5f, 0x70, 0xff, 0x67, 0x7a, 0xff, 0x6f, 0x81, 0xff, 0x76, 0x88, 0xff, +0x7e, 0x91, 0xff, 0x7a, 0x8b, 0xff, 0x6f, 0x7e, 0xff, 0x64, 0x75, 0xff, +0x66, 0x75, 0xff, 0x62, 0x73, 0xff, 0x61, 0x70, 0xff, 0x5c, 0x6c, 0xff, +0x59, 0x67, 0xff, 0x5a, 0x68, 0xff, 0x5c, 0x6d, 0xff, 0x61, 0x6f, 0xff, +0x66, 0x76, 0xff, 0x6c, 0x7a, 0xff, 0x67, 0x75, 0xf0, 0x5a, 0x64, 0xc6, +0x61, 0x6f, 0xe1, 0x62, 0x70, 0xfc, 0x5a, 0x66, 0xf7, 0x51, 0x5c, 0xf5, +0x4e, 0x5a, 0xf0, 0x4f, 0x5b, 0xed, 0x51, 0x5f, 0xea, 0x54, 0x60, 0xe7, +0x55, 0x61, 0xe2, 0x52, 0x5c, 0xe0, 0x4b, 0x55, 0xdc, 0x45, 0x4f, 0xda, +0x3f, 0x4b, 0xd6, 0x3a, 0x45, 0xd4, 0x38, 0x40, 0xd3, 0x38, 0x40, 0xce, +0x38, 0x3f, 0xcb, 0x38, 0x3f, 0xc8, 0x38, 0x40, 0xc6, 0x36, 0x40, 0xc4, +0x36, 0x40, 0xc1, 0x36, 0x40, 0xbf, 0x36, 0x3f, 0xbb, 0x36, 0x3f, 0xba, +0x36, 0x3f, 0xb8, 0x36, 0x3e, 0xb4, 0x36, 0x3e, 0xb3, 0x34, 0x3d, 0xb0, +0x34, 0x3e, 0xae, 0x34, 0x3d, 0xac, 0x34, 0x3d, 0xac, 0x33, 0x3a, 0xa9, +0x32, 0x39, 0xa7, 0x32, 0x39, 0xa5, 0x30, 0x38, 0xa3, 0x2f, 0x36, 0xa1, +0x2f, 0x36, 0x9f, 0x2d, 0x34, 0x9d, 0x2d, 0x34, 0x9c, 0x2b, 0x33, 0x99, +0x2a, 0x32, 0x98, 0x2a, 0x32, 0x97, 0x2a, 0x30, 0x96, 0x29, 0x2f, 0x94, +0x27, 0x2f, 0x92, 0x27, 0x2d, 0x8f, 0x25, 0x2b, 0x8e, 0x24, 0x2b, 0x8c, +0x24, 0x2a, 0x8b, 0x24, 0x2a, 0x8b, 0x23, 0x29, 0x89, 0x23, 0x29, 0x88, +0x22, 0x27, 0x87, 0x22, 0x27, 0x84, 0x1f, 0x25, 0x83, 0x1f, 0x25, 0x82, +0x1f, 0x24, 0x81, 0x1e, 0x24, 0x81, 0x1e, 0x24, 0x7e, 0x1e, 0x24, 0x7d, +0x1e, 0x24, 0x7c, 0x1e, 0x24, 0x7b, 0x1e, 0x24, 0x7b, 0x1e, 0x24, 0x7a, +0x1e, 0x24, 0x77, 0x1e, 0x24, 0x77, 0x1e, 0x24, 0x76, 0x1e, 0x23, 0x75, +0x1e, 0x24, 0x75, 0x1e, 0x23, 0x73, 0x1e, 0x23, 0x71, 0x1e, 0x23, 0x71, +0x1e, 0x23, 0x70, 0x1d, 0x22, 0x6d, 0x1d, 0x22, 0x6d, 0x1d, 0x22, 0x6d, +0x1d, 0x22, 0x6d, 0x1d, 0x22, 0x6c, 0x1d, 0x22, 0x6a, 0x1c, 0x22, 0x68, +0x1c, 0x22, 0x67, 0x1c, 0x22, 0x67, 0x1c, 0x1f, 0x66, 0x1c, 0x1f, 0x66, +0x19, 0x1e, 0x66, 0x19, 0x1e, 0x64, 0x19, 0x1e, 0x62, 0x19, 0x1e, 0x62, +0x18, 0x1e, 0x61, 0x18, 0x1e, 0x61, 0x18, 0x1d, 0x60, 0x18, 0x1d, 0x60, +0x18, 0x1d, 0x60, 0x17, 0x1c, 0x5f, 0x17, 0x1c, 0x5f, 0x17, 0x1c, 0x5c, +0x17, 0x1c, 0x5c, 0x17, 0x1c, 0x5b, 0x16, 0x1a, 0x57, 0x04, 0x04, 0x0f, +0x12, 0x16, 0x44, 0x25, 0x2d, 0x89, 0x28, 0x30, 0x92, 0x25, 0x2b, 0x82, +0x26, 0x2b, 0x80, 0x26, 0x2c, 0x82, 0x28, 0x2d, 0x83, 0x29, 0x2f, 0x85, +0x2a, 0x30, 0x86, 0x2c, 0x32, 0x88, 0x2e, 0x34, 0x8a, 0x30, 0x36, 0x8b, +0x31, 0x3b, 0x8d, 0x34, 0x3c, 0x8f, 0x37, 0x3f, 0x91, 0x3b, 0x42, 0x93, +0x3b, 0x42, 0x95, 0x37, 0x40, 0x98, 0x34, 0x3d, 0x99, 0x32, 0x3b, 0x9b, +0x31, 0x39, 0x9d, 0x2e, 0x36, 0x9e, 0x2c, 0x33, 0xa1, 0x2f, 0x37, 0xa4, +0x32, 0x3c, 0xa5, 0x37, 0x41, 0xa7, 0x3e, 0x46, 0xab, 0x43, 0x4e, 0xad, +0x42, 0x4c, 0xaf, 0x39, 0x42, 0xb3, 0x30, 0x3b, 0xb5, 0x2b, 0x33, 0xb7, +0x28, 0x2f, 0xb9, 0x2b, 0x33, 0xbd, 0x31, 0x3b, 0xbf, 0x39, 0x42, 0xc2, +0x44, 0x4f, 0xc6, 0x48, 0x53, 0xc8, 0x4a, 0x56, 0xcb, 0x4e, 0x58, 0xce, +0x51, 0x5c, 0xd1, 0x52, 0x5f, 0xd4, 0x54, 0x61, 0xd8, 0x54, 0x60, 0xdb, +0x4c, 0x56, 0xde, 0x44, 0x50, 0xe1, 0x3f, 0x4a, 0xe5, 0x3c, 0x46, 0xe7, +0x39, 0x43, 0xeb, 0x4e, 0x5a, 0xee, 0x41, 0x4a, 0x8b, 0x41, 0x4d, 0x8d, +0x5f, 0x6d, 0xf8, 0x4e, 0x5b, 0xfb, 0x42, 0x50, 0xfe, 0x44, 0x52, 0xff, +0x68, 0x78, 0xff, 0x2c, 0x33, 0x64, 0x41, 0x4c, 0x8c, 0x49, 0x53, 0x9c, +0x51, 0x5d, 0xb0, 0x67, 0x77, 0xff, 0x52, 0x61, 0xff, 0x58, 0x67, 0xff, +0x57, 0x67, 0xff, 0x49, 0x57, 0xff, 0x4f, 0x5d, 0xff, 0x69, 0x79, 0xff, +0x5f, 0x6e, 0xff, 0x54, 0x63, 0xff, 0x50, 0x5f, 0xff, 0x4a, 0x58, 0xff, +0x44, 0x52, 0xff, 0x5d, 0x6d, 0xff, 0x1d, 0x24, 0x4e, 0x60, 0x6e, 0xff, +0x4f, 0x5c, 0xff, 0x60, 0x6f, 0xfe, 0x63, 0x73, 0xfc, 0x51, 0x60, 0xf9, +0x4d, 0x5a, 0xf7, 0x53, 0x62, 0xf3, 0x5b, 0x68, 0xf1, 0x60, 0x6e, 0xee, +0x63, 0x72, 0xec, 0x58, 0x67, 0xea, 0x50, 0x5d, 0xe6, 0x4f, 0x5b, 0xe4, +0x4e, 0x5b, 0xe1, 0x4c, 0x57, 0xde, 0x48, 0x54, 0xdc, 0x45, 0x51, 0xda, +0x45, 0x51, 0xd8, 0x49, 0x54, 0xd5, 0x4d, 0x57, 0xd2, 0x50, 0x5c, 0xd0, +0x55, 0x60, 0xcc, 0x4c, 0x55, 0xad, 0x40, 0x4a, 0x90, 0x4c, 0x56, 0xae, +0x4d, 0x57, 0xc2, 0x44, 0x4f, 0xbf, 0x3e, 0x46, 0xbd, 0x3d, 0x45, 0xb9, +0x3e, 0x48, 0xb7, 0x40, 0x49, 0xb5, 0x41, 0x4c, 0xb1, 0x44, 0x4d, 0xb0, +0x3e, 0x45, 0xad, 0x39, 0x41, 0xaa, 0x32, 0x3b, 0xa7, 0x2f, 0x39, 0xa6, +0x2c, 0x33, 0xa3, 0x2b, 0x31, 0xa1, 0x2b, 0x31, 0x9e, 0x2b, 0x32, 0x9d, +0x2a, 0x32, 0x9b, 0x2a, 0x31, 0x99, 0x2a, 0x31, 0x97, 0x2b, 0x32, 0x94, +0x2b, 0x32, 0x93, 0x2a, 0x31, 0x91, 0x2a, 0x31, 0x8f, 0x2a, 0x30, 0x8c, +0x2a, 0x30, 0x8b, 0x2a, 0x2f, 0x89, 0x2a, 0x2f, 0x87, 0x29, 0x2f, 0x86, +0x29, 0x2e, 0x83, 0x28, 0x2e, 0x82, 0x28, 0x2d, 0x81, 0x27, 0x2c, 0x7f, +0x26, 0x2b, 0x7e, 0x24, 0x2a, 0x7c, 0x24, 0x2a, 0x7b, 0x22, 0x29, 0x79, +0x21, 0x28, 0x78, 0x21, 0x28, 0x77, 0x21, 0x28, 0x76, 0x20, 0x26, 0x74, +0x1f, 0x26, 0x73, 0x1f, 0x24, 0x72, 0x1e, 0x22, 0x70, 0x1d, 0x21, 0x6f, +0x1c, 0x21, 0x6e, 0x1c, 0x20, 0x6d, 0x1c, 0x20, 0x6c, 0x1b, 0x1f, 0x6a, +0x1b, 0x1f, 0x69, 0x1a, 0x1e, 0x68, 0x19, 0x1d, 0x67, 0x19, 0x1e, 0x66, +0x19, 0x1d, 0x65, 0x18, 0x1c, 0x64, 0x18, 0x1c, 0x63, 0x18, 0x1c, 0x62, +0x18, 0x1c, 0x62, 0x18, 0x1c, 0x61, 0x18, 0x1c, 0x60, 0x18, 0x1b, 0x5f, +0x18, 0x1b, 0x5d, 0x18, 0x1c, 0x5d, 0x18, 0x1b, 0x5c, 0x18, 0x1b, 0x5b, +0x18, 0x1b, 0x5a, 0x18, 0x1b, 0x5a, 0x18, 0x1b, 0x58, 0x18, 0x1b, 0x57, +0x17, 0x1b, 0x57, 0x17, 0x1b, 0x56, 0x17, 0x1b, 0x55, 0x17, 0x1b, 0x55, +0x17, 0x1b, 0x54, 0x16, 0x1a, 0x53, 0x16, 0x1a, 0x52, 0x16, 0x1a, 0x52, +0x16, 0x1a, 0x52, 0x16, 0x19, 0x51, 0x16, 0x19, 0x51, 0x15, 0x19, 0x4f, +0x15, 0x19, 0x4f, 0x15, 0x18, 0x4e, 0x14, 0x18, 0x4d, 0x14, 0x18, 0x4d, +0x14, 0x17, 0x4d, 0x14, 0x17, 0x4c, 0x14, 0x17, 0x4a, 0x14, 0x17, 0x4a, +0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, +0x13, 0x16, 0x48, 0x10, 0x15, 0x46, 0x10, 0x15, 0x46, 0x10, 0x15, 0x45, +0x10, 0x15, 0x45, 0x10, 0x15, 0x44, 0x0f, 0x12, 0x3e, 0x01, 0x01, 0x06, +0x12, 0x15, 0x44, 0x25, 0x2c, 0x8a, 0x27, 0x2e, 0x8f, 0x21, 0x28, 0x7a, +0x1f, 0x25, 0x72, 0x1f, 0x25, 0x73, 0x21, 0x26, 0x75, 0x22, 0x28, 0x76, +0x23, 0x29, 0x77, 0x25, 0x2b, 0x79, 0x26, 0x2d, 0x7b, 0x27, 0x2e, 0x7c, +0x29, 0x30, 0x7e, 0x2c, 0x32, 0x80, 0x2e, 0x35, 0x81, 0x31, 0x38, 0x83, +0x33, 0x3b, 0x85, 0x36, 0x3e, 0x87, 0x35, 0x3d, 0x88, 0x32, 0x3b, 0x8a, +0x30, 0x37, 0x8c, 0x2d, 0x35, 0x8e, 0x2c, 0x32, 0x90, 0x29, 0x31, 0x92, +0x29, 0x31, 0x94, 0x2c, 0x34, 0x96, 0x30, 0x39, 0x98, 0x35, 0x3e, 0x9a, +0x3b, 0x43, 0x9d, 0x40, 0x49, 0x9f, 0x36, 0x40, 0xa2, 0x2f, 0x37, 0xa4, +0x29, 0x31, 0xa7, 0x24, 0x2c, 0xa9, 0x25, 0x2d, 0xab, 0x2a, 0x33, 0xae, +0x32, 0x3b, 0xb1, 0x3e, 0x47, 0xb3, 0x42, 0x4c, 0xb6, 0x44, 0x4f, 0xb9, +0x47, 0x52, 0xbc, 0x4a, 0x55, 0xbf, 0x4b, 0x57, 0xc2, 0x4e, 0x59, 0xc5, +0x4b, 0x56, 0xc8, 0x44, 0x4d, 0xcb, 0x3c, 0x46, 0xce, 0x38, 0x42, 0xd1, +0x34, 0x3f, 0xd4, 0x38, 0x42, 0xd7, 0x52, 0x60, 0xda, 0x11, 0x15, 0x31, +0x52, 0x5e, 0xb8, 0x4c, 0x59, 0xe3, 0x40, 0x4b, 0xe6, 0x37, 0x43, 0xe7, +0x50, 0x5d, 0xe7, 0x13, 0x18, 0x36, 0x1d, 0x24, 0x48, 0x2e, 0x37, 0x67, +0x36, 0x3f, 0x75, 0x56, 0x64, 0xc6, 0x50, 0x5e, 0xe4, 0x51, 0x5f, 0xe3, +0x54, 0x63, 0xe3, 0x44, 0x52, 0xe3, 0x48, 0x56, 0xe3, 0x58, 0x66, 0xcf, +0x58, 0x66, 0xe2, 0x4e, 0x5d, 0xe2, 0x4a, 0x58, 0xe2, 0x43, 0x51, 0xe1, +0x3f, 0x4c, 0xe1, 0x56, 0x65, 0xcd, 0x27, 0x2e, 0x5c, 0x50, 0x5e, 0xe1, +0x4e, 0x5c, 0xe1, 0x54, 0x61, 0xc5, 0x54, 0x63, 0xe1, 0x44, 0x50, 0xe1, +0x47, 0x54, 0xdf, 0x4f, 0x5c, 0xdd, 0x55, 0x62, 0xda, 0x4f, 0x5c, 0xbf, +0x55, 0x62, 0xd5, 0x4c, 0x59, 0xd2, 0x47, 0x53, 0xd0, 0x47, 0x52, 0xce, +0x45, 0x51, 0xcc, 0x43, 0x4e, 0xca, 0x40, 0x4b, 0xc7, 0x3f, 0x49, 0xc5, +0x43, 0x4d, 0xc2, 0x45, 0x50, 0xbf, 0x4a, 0x54, 0xbe, 0x4b, 0x55, 0xb2, +0x41, 0x4b, 0x94, 0x36, 0x3d, 0x76, 0x44, 0x4d, 0x9c, 0x44, 0x4f, 0xb1, +0x3c, 0x46, 0xae, 0x36, 0x3f, 0xac, 0x37, 0x41, 0xa9, 0x3a, 0x42, 0xa7, +0x3c, 0x44, 0xa4, 0x3e, 0x47, 0xa2, 0x3b, 0x43, 0x9f, 0x35, 0x3e, 0x9c, +0x30, 0x38, 0x9b, 0x2d, 0x34, 0x98, 0x29, 0x30, 0x96, 0x26, 0x2d, 0x94, +0x26, 0x2d, 0x92, 0x27, 0x2d, 0x8f, 0x26, 0x2d, 0x8d, 0x26, 0x2e, 0x8c, +0x26, 0x2d, 0x8a, 0x26, 0x2d, 0x88, 0x26, 0x2d, 0x86, 0x26, 0x2d, 0x84, +0x26, 0x2c, 0x82, 0x26, 0x2c, 0x81, 0x26, 0x2b, 0x7f, 0x25, 0x2b, 0x7d, +0x26, 0x2b, 0x7c, 0x25, 0x2b, 0x7a, 0x25, 0x2a, 0x78, 0x24, 0x2a, 0x77, +0x23, 0x28, 0x75, 0x22, 0x27, 0x73, 0x22, 0x27, 0x72, 0x21, 0x26, 0x71, +0x20, 0x25, 0x70, 0x20, 0x25, 0x6f, 0x1e, 0x24, 0x6d, 0x1e, 0x23, 0x6c, +0x1e, 0x23, 0x6b, 0x1d, 0x21, 0x69, 0x1c, 0x21, 0x68, 0x1b, 0x20, 0x67, +0x1b, 0x1f, 0x66, 0x19, 0x1e, 0x65, 0x19, 0x1d, 0x63, 0x18, 0x1d, 0x62, +0x18, 0x1c, 0x61, 0x17, 0x1b, 0x60, 0x17, 0x1b, 0x5f, 0x17, 0x1a, 0x5e, +0x16, 0x1a, 0x5d, 0x15, 0x19, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x19, 0x5a, +0x15, 0x19, 0x59, 0x14, 0x19, 0x58, 0x15, 0x19, 0x58, 0x15, 0x19, 0x57, +0x15, 0x18, 0x56, 0x15, 0x18, 0x55, 0x15, 0x18, 0x54, 0x15, 0x18, 0x53, +0x15, 0x18, 0x53, 0x14, 0x18, 0x52, 0x14, 0x18, 0x51, 0x14, 0x18, 0x50, +0x14, 0x18, 0x50, 0x14, 0x18, 0x4f, 0x14, 0x18, 0x4e, 0x14, 0x18, 0x4e, +0x13, 0x17, 0x4d, 0x13, 0x17, 0x4c, 0x13, 0x17, 0x4c, 0x13, 0x17, 0x4b, +0x13, 0x17, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, 0x12, 0x16, 0x48, +0x12, 0x16, 0x47, 0x11, 0x15, 0x47, 0x11, 0x15, 0x47, 0x11, 0x15, 0x45, +0x11, 0x14, 0x45, 0x11, 0x14, 0x44, 0x10, 0x14, 0x44, 0x10, 0x14, 0x43, +0x10, 0x14, 0x43, 0x10, 0x13, 0x42, 0x10, 0x13, 0x42, 0x0f, 0x13, 0x41, +0x0f, 0x12, 0x41, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x3f, +0x0e, 0x12, 0x3f, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3d, +0x0e, 0x11, 0x3d, 0x0e, 0x11, 0x3d, 0x0d, 0x0f, 0x36, 0x01, 0x01, 0x05, +0x12, 0x15, 0x45, 0x25, 0x2b, 0x8a, 0x27, 0x2d, 0x90, 0x22, 0x27, 0x7b, +0x1e, 0x24, 0x73, 0x1f, 0x25, 0x74, 0x20, 0x26, 0x76, 0x21, 0x27, 0x77, +0x22, 0x28, 0x78, 0x24, 0x2a, 0x7a, 0x25, 0x2b, 0x7b, 0x26, 0x2c, 0x7d, +0x27, 0x2e, 0x7f, 0x29, 0x30, 0x80, 0x2c, 0x32, 0x82, 0x2d, 0x35, 0x84, +0x31, 0x37, 0x86, 0x33, 0x3b, 0x87, 0x36, 0x3e, 0x89, 0x3a, 0x41, 0x8b, +0x37, 0x3f, 0x8d, 0x35, 0x3c, 0x8f, 0x32, 0x3a, 0x91, 0x2f, 0x36, 0x93, +0x2c, 0x34, 0x95, 0x2a, 0x31, 0x98, 0x2c, 0x33, 0x99, 0x30, 0x38, 0x9c, +0x35, 0x3e, 0x9e, 0x3c, 0x44, 0xa1, 0x43, 0x4c, 0xa3, 0x3d, 0x46, 0xa6, +0x33, 0x3c, 0xa8, 0x2b, 0x34, 0xaa, 0x26, 0x2f, 0xae, 0x25, 0x2d, 0xb0, +0x2b, 0x33, 0xb3, 0x32, 0x3c, 0xb6, 0x3f, 0x47, 0xb9, 0x45, 0x4f, 0xbc, +0x48, 0x52, 0xbe, 0x4a, 0x56, 0xc2, 0x4e, 0x59, 0xc5, 0x50, 0x5b, 0xc8, +0x51, 0x5d, 0xcb, 0x4d, 0x58, 0xce, 0x43, 0x4f, 0xd1, 0x3c, 0x47, 0xd5, +0x38, 0x43, 0xd7, 0x35, 0x40, 0xdb, 0x41, 0x4d, 0xde, 0x4c, 0x56, 0xa8, +0x1c, 0x21, 0x45, 0x5c, 0x6a, 0xe7, 0x49, 0x56, 0xe7, 0x3f, 0x4b, 0xe7, +0x46, 0x53, 0xe6, 0x3c, 0x45, 0x81, 0x14, 0x19, 0x39, 0x15, 0x1a, 0x3a, +0x1d, 0x23, 0x48, 0x3a, 0x43, 0x7e, 0x58, 0x67, 0xe3, 0x55, 0x64, 0xe3, +0x5c, 0x6b, 0xe3, 0x4a, 0x57, 0xe2, 0x4c, 0x5b, 0xe2, 0x4c, 0x59, 0xab, +0x5d, 0x6d, 0xe2, 0x53, 0x62, 0xe2, 0x4e, 0x5c, 0xe1, 0x47, 0x55, 0xe1, +0x47, 0x55, 0xe1, 0x2d, 0x35, 0x68, 0x32, 0x3b, 0x73, 0x4c, 0x5a, 0xe0, +0x59, 0x68, 0xe0, 0x45, 0x50, 0x9d, 0x52, 0x60, 0xe0, 0x48, 0x55, 0xe0, +0x4f, 0x5d, 0xe0, 0x57, 0x65, 0xe1, 0x54, 0x62, 0xcd, 0x52, 0x5f, 0xc6, +0x52, 0x5f, 0xd9, 0x4a, 0x57, 0xd6, 0x49, 0x56, 0xd4, 0x49, 0x55, 0xd2, +0x46, 0x52, 0xd0, 0x43, 0x4d, 0xcd, 0x41, 0x4b, 0xca, 0x44, 0x4f, 0xc8, +0x48, 0x54, 0xc5, 0x4c, 0x58, 0xc3, 0x4a, 0x54, 0xae, 0x3f, 0x47, 0x8c, +0x30, 0x38, 0x6a, 0x46, 0x50, 0xa1, 0x46, 0x51, 0xb6, 0x3d, 0x48, 0xb3, +0x39, 0x42, 0xb1, 0x3b, 0x43, 0xad, 0x3e, 0x46, 0xab, 0x3f, 0x48, 0xa8, +0x41, 0x4a, 0xa6, 0x3c, 0x44, 0xa3, 0x35, 0x3d, 0xa1, 0x30, 0x38, 0x9e, +0x2b, 0x33, 0x9b, 0x29, 0x30, 0x9a, 0x28, 0x2e, 0x97, 0x28, 0x2f, 0x95, +0x28, 0x2f, 0x93, 0x27, 0x2f, 0x91, 0x28, 0x2f, 0x8e, 0x28, 0x30, 0x8d, +0x28, 0x2f, 0x8b, 0x28, 0x2e, 0x89, 0x28, 0x2e, 0x87, 0x28, 0x2e, 0x85, +0x28, 0x2e, 0x83, 0x27, 0x2d, 0x81, 0x27, 0x2d, 0x80, 0x27, 0x2d, 0x7e, +0x26, 0x2c, 0x7c, 0x25, 0x2b, 0x7b, 0x24, 0x2a, 0x79, 0x24, 0x29, 0x77, +0x23, 0x28, 0x76, 0x22, 0x27, 0x74, 0x21, 0x26, 0x73, 0x20, 0x26, 0x71, +0x20, 0x25, 0x70, 0x1f, 0x24, 0x6f, 0x1e, 0x24, 0x6d, 0x1d, 0x22, 0x6c, +0x1d, 0x21, 0x6b, 0x1c, 0x21, 0x6a, 0x1b, 0x20, 0x69, 0x1a, 0x1f, 0x67, +0x1a, 0x1e, 0x66, 0x19, 0x1d, 0x65, 0x18, 0x1d, 0x64, 0x18, 0x1c, 0x63, +0x18, 0x1b, 0x62, 0x17, 0x1b, 0x61, 0x17, 0x1b, 0x60, 0x16, 0x1a, 0x5e, +0x16, 0x1a, 0x5d, 0x16, 0x1a, 0x5d, 0x16, 0x1a, 0x5c, 0x16, 0x1a, 0x5b, +0x16, 0x1a, 0x5a, 0x16, 0x1a, 0x59, 0x16, 0x1a, 0x58, 0x15, 0x19, 0x57, +0x15, 0x19, 0x56, 0x15, 0x19, 0x55, 0x15, 0x19, 0x54, 0x15, 0x19, 0x54, +0x15, 0x19, 0x53, 0x15, 0x19, 0x52, 0x15, 0x19, 0x51, 0x15, 0x19, 0x51, +0x14, 0x19, 0x50, 0x14, 0x19, 0x4f, 0x14, 0x19, 0x4e, 0x14, 0x19, 0x4e, +0x14, 0x19, 0x4d, 0x14, 0x17, 0x4c, 0x14, 0x17, 0x4c, 0x13, 0x17, 0x4b, +0x13, 0x17, 0x4a, 0x13, 0x17, 0x4a, 0x12, 0x16, 0x48, 0x12, 0x15, 0x48, +0x12, 0x15, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x45, +0x11, 0x14, 0x45, 0x10, 0x14, 0x44, 0x10, 0x14, 0x44, 0x10, 0x13, 0x43, +0x10, 0x13, 0x43, 0x10, 0x13, 0x42, 0x10, 0x13, 0x42, 0x0f, 0x12, 0x41, +0x0f, 0x12, 0x41, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0e, 0x12, 0x3f, +0x0e, 0x12, 0x3f, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3d, +0x0e, 0x11, 0x3d, 0x0e, 0x11, 0x3d, 0x0d, 0x0f, 0x36, 0x01, 0x01, 0x05, +0x13, 0x16, 0x45, 0x27, 0x2d, 0x8b, 0x28, 0x2e, 0x90, 0x22, 0x27, 0x7c, +0x1e, 0x23, 0x73, 0x1f, 0x24, 0x75, 0x1f, 0x25, 0x76, 0x20, 0x26, 0x77, +0x21, 0x28, 0x79, 0x22, 0x28, 0x7a, 0x23, 0x29, 0x7c, 0x25, 0x2b, 0x7e, +0x26, 0x2d, 0x7f, 0x27, 0x2e, 0x81, 0x2a, 0x30, 0x83, 0x2c, 0x32, 0x85, +0x2e, 0x35, 0x87, 0x31, 0x37, 0x88, 0x33, 0x3b, 0x8a, 0x36, 0x3e, 0x8c, +0x3a, 0x42, 0x8e, 0x3d, 0x44, 0x90, 0x3a, 0x42, 0x93, 0x36, 0x3f, 0x94, +0x34, 0x3b, 0x97, 0x30, 0x38, 0x98, 0x2d, 0x35, 0x9b, 0x2c, 0x33, 0x9d, +0x30, 0x38, 0xa0, 0x34, 0x3e, 0xa2, 0x3a, 0x43, 0xa5, 0x42, 0x4b, 0xa7, +0x45, 0x4f, 0xa9, 0x39, 0x42, 0xad, 0x2f, 0x38, 0xaf, 0x28, 0x31, 0xb2, +0x25, 0x2d, 0xb5, 0x2a, 0x32, 0xb8, 0x32, 0x3c, 0xbb, 0x3f, 0x49, 0xbe, +0x48, 0x52, 0xc1, 0x4b, 0x56, 0xc4, 0x4f, 0x5a, 0xc8, 0x51, 0x5d, 0xcb, +0x54, 0x60, 0xce, 0x55, 0x63, 0xd2, 0x4f, 0x5a, 0xd5, 0x44, 0x51, 0xd9, +0x3d, 0x48, 0xdb, 0x39, 0x44, 0xdf, 0x35, 0x40, 0xe3, 0x4f, 0x5c, 0xe5, +0x13, 0x17, 0x35, 0x3a, 0x43, 0x7d, 0x56, 0x64, 0xe7, 0x48, 0x54, 0xe7, +0x3f, 0x4b, 0xe6, 0x5c, 0x6a, 0xd6, 0x16, 0x1b, 0x3c, 0x16, 0x1b, 0x3c, +0x16, 0x1b, 0x3d, 0x16, 0x1b, 0x3d, 0x59, 0x68, 0xd0, 0x59, 0x69, 0xe2, +0x58, 0x67, 0xcf, 0x4f, 0x5e, 0xe2, 0x4f, 0x5e, 0xe1, 0x3d, 0x48, 0x89, +0x56, 0x64, 0xc7, 0x57, 0x67, 0xe1, 0x52, 0x61, 0xe0, 0x4a, 0x59, 0xe0, +0x53, 0x62, 0xe0, 0x12, 0x17, 0x39, 0x3f, 0x4b, 0x90, 0x51, 0x60, 0xdf, +0x47, 0x54, 0xa5, 0x4a, 0x56, 0xab, 0x4f, 0x5d, 0xdf, 0x50, 0x5d, 0xdf, +0x58, 0x67, 0xdf, 0x53, 0x5f, 0xc4, 0x47, 0x52, 0xa3, 0x59, 0x67, 0xdf, +0x4e, 0x5b, 0xdd, 0x4d, 0x59, 0xdb, 0x4d, 0x59, 0xd8, 0x4a, 0x56, 0xd6, +0x45, 0x51, 0xd3, 0x42, 0x4e, 0xd1, 0x47, 0x52, 0xce, 0x4c, 0x57, 0xcc, +0x50, 0x5b, 0xc9, 0x4b, 0x55, 0xad, 0x3b, 0x43, 0x83, 0x2f, 0x37, 0x67, +0x48, 0x53, 0xa8, 0x48, 0x53, 0xbb, 0x3e, 0x49, 0xb9, 0x3c, 0x45, 0xb5, +0x3f, 0x48, 0xb2, 0x41, 0x4b, 0xb0, 0x43, 0x4d, 0xac, 0x42, 0x4c, 0xaa, +0x3b, 0x44, 0xa7, 0x35, 0x3d, 0xa5, 0x30, 0x37, 0xa2, 0x2c, 0x33, 0xa0, +0x29, 0x30, 0x9d, 0x29, 0x30, 0x9b, 0x29, 0x31, 0x99, 0x29, 0x31, 0x96, +0x2a, 0x31, 0x94, 0x2a, 0x31, 0x92, 0x2a, 0x31, 0x90, 0x29, 0x30, 0x8d, +0x2a, 0x30, 0x8b, 0x2a, 0x30, 0x8a, 0x29, 0x30, 0x88, 0x28, 0x2f, 0x86, +0x28, 0x30, 0x84, 0x28, 0x2f, 0x82, 0x27, 0x2e, 0x80, 0x26, 0x2d, 0x7f, +0x25, 0x2c, 0x7d, 0x24, 0x2b, 0x7b, 0x24, 0x2a, 0x7a, 0x23, 0x29, 0x78, +0x22, 0x28, 0x76, 0x22, 0x27, 0x75, 0x21, 0x26, 0x73, 0x21, 0x26, 0x72, +0x1f, 0x25, 0x70, 0x1f, 0x24, 0x6f, 0x1e, 0x22, 0x6e, 0x1d, 0x22, 0x6c, +0x1c, 0x20, 0x6c, 0x1b, 0x1f, 0x6a, 0x1a, 0x1f, 0x69, 0x1a, 0x1e, 0x68, +0x19, 0x1e, 0x67, 0x18, 0x1d, 0x65, 0x18, 0x1c, 0x64, 0x17, 0x1c, 0x63, +0x17, 0x1b, 0x62, 0x16, 0x1b, 0x61, 0x17, 0x1b, 0x60, 0x17, 0x1b, 0x5f, +0x17, 0x1a, 0x5e, 0x17, 0x1b, 0x5d, 0x17, 0x1b, 0x5c, 0x16, 0x1a, 0x5b, +0x17, 0x1b, 0x5a, 0x17, 0x1b, 0x59, 0x16, 0x1a, 0x58, 0x16, 0x1a, 0x57, +0x16, 0x1a, 0x56, 0x16, 0x1a, 0x56, 0x16, 0x1a, 0x55, 0x16, 0x1a, 0x54, +0x15, 0x1a, 0x53, 0x15, 0x1a, 0x52, 0x15, 0x1a, 0x52, 0x15, 0x1a, 0x51, +0x15, 0x19, 0x50, 0x15, 0x19, 0x4f, 0x15, 0x19, 0x4f, 0x14, 0x19, 0x4e, +0x14, 0x18, 0x4d, 0x14, 0x17, 0x4d, 0x13, 0x17, 0x4c, 0x13, 0x17, 0x4b, +0x13, 0x17, 0x4b, 0x12, 0x16, 0x4a, 0x12, 0x15, 0x48, 0x12, 0x15, 0x48, +0x11, 0x15, 0x47, 0x11, 0x15, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x45, +0x10, 0x14, 0x45, 0x10, 0x14, 0x44, 0x10, 0x14, 0x44, 0x10, 0x13, 0x43, +0x10, 0x13, 0x43, 0x10, 0x13, 0x43, 0x10, 0x13, 0x42, 0x0f, 0x12, 0x41, +0x0f, 0x12, 0x41, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0e, 0x11, 0x3f, +0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, +0x0e, 0x11, 0x3d, 0x0e, 0x11, 0x3d, 0x0d, 0x0f, 0x36, 0x01, 0x01, 0x05, +0x13, 0x17, 0x45, 0x27, 0x2e, 0x8b, 0x28, 0x2f, 0x93, 0x22, 0x28, 0x7c, +0x1f, 0x24, 0x74, 0x1f, 0x24, 0x75, 0x1f, 0x25, 0x77, 0x1f, 0x25, 0x78, +0x20, 0x26, 0x79, 0x21, 0x28, 0x7b, 0x22, 0x29, 0x7d, 0x23, 0x29, 0x7f, +0x25, 0x2b, 0x80, 0x26, 0x2d, 0x82, 0x27, 0x2e, 0x84, 0x29, 0x30, 0x86, +0x2b, 0x31, 0x87, 0x2d, 0x34, 0x89, 0x30, 0x37, 0x8b, 0x33, 0x3b, 0x8d, +0x35, 0x3e, 0x8f, 0x3a, 0x41, 0x91, 0x37, 0x3f, 0x85, 0x36, 0x3f, 0x81, +0x3c, 0x44, 0x98, 0x38, 0x40, 0x9a, 0x34, 0x3d, 0x9d, 0x32, 0x3a, 0x9f, +0x2e, 0x36, 0xa1, 0x30, 0x37, 0xa4, 0x34, 0x3d, 0xa6, 0x3b, 0x44, 0xa8, +0x42, 0x4c, 0xac, 0x4b, 0x56, 0xae, 0x40, 0x4a, 0xb1, 0x35, 0x3e, 0xb4, +0x2b, 0x34, 0xb7, 0x26, 0x2e, 0xba, 0x2a, 0x33, 0xbe, 0x32, 0x3c, 0xc1, +0x3f, 0x4a, 0xc4, 0x4a, 0x56, 0xc7, 0x4e, 0x5a, 0xcb, 0x52, 0x5e, 0xce, +0x54, 0x62, 0xd1, 0x57, 0x63, 0xd3, 0x59, 0x66, 0xd7, 0x50, 0x5c, 0xdc, +0x44, 0x51, 0xe0, 0x3e, 0x49, 0xe3, 0x3a, 0x45, 0xe5, 0x3e, 0x4a, 0xe6, +0x56, 0x63, 0xc3, 0x14, 0x19, 0x39, 0x50, 0x5c, 0xae, 0x53, 0x61, 0xe7, +0x46, 0x53, 0xe6, 0x56, 0x65, 0xe5, 0x17, 0x1d, 0x3f, 0x17, 0x1d, 0x3f, +0x17, 0x1d, 0x40, 0x17, 0x1d, 0x40, 0x41, 0x4c, 0x8e, 0x5e, 0x6d, 0xe2, +0x51, 0x5e, 0xb7, 0x56, 0x66, 0xe1, 0x53, 0x63, 0xe1, 0x2a, 0x32, 0x61, +0x4b, 0x58, 0xa9, 0x5c, 0x6c, 0xdf, 0x56, 0x66, 0xdf, 0x4d, 0x5c, 0xdf, +0x52, 0x61, 0xc2, 0x12, 0x18, 0x3b, 0x49, 0x56, 0xa9, 0x55, 0x65, 0xcf, +0x18, 0x1f, 0x45, 0x51, 0x5f, 0xc0, 0x51, 0x60, 0xde, 0x59, 0x68, 0xdd, +0x4c, 0x58, 0xb1, 0x3a, 0x44, 0x85, 0x48, 0x53, 0xa6, 0x57, 0x65, 0xdf, +0x50, 0x5e, 0xe0, 0x4f, 0x5d, 0xe0, 0x4e, 0x5a, 0xdd, 0x48, 0x54, 0xda, +0x45, 0x50, 0xd8, 0x49, 0x55, 0xd5, 0x4f, 0x5b, 0xd2, 0x54, 0x61, 0xcf, +0x4a, 0x55, 0xa9, 0x38, 0x40, 0x7a, 0x2e, 0x36, 0x65, 0x4b, 0x56, 0xad, +0x49, 0x54, 0xc1, 0x3f, 0x4a, 0xbd, 0x3f, 0x49, 0xbb, 0x42, 0x4c, 0xb8, +0x45, 0x4f, 0xb5, 0x48, 0x52, 0xb1, 0x42, 0x4b, 0xaf, 0x3b, 0x43, 0xac, +0x34, 0x3d, 0xa9, 0x2f, 0x38, 0xa7, 0x2b, 0x33, 0xa4, 0x2b, 0x32, 0xa1, +0x2b, 0x33, 0x9f, 0x2b, 0x33, 0x9c, 0x2c, 0x33, 0x9a, 0x2c, 0x33, 0x98, +0x2c, 0x33, 0x95, 0x2c, 0x33, 0x93, 0x2c, 0x32, 0x91, 0x2b, 0x32, 0x8f, +0x2b, 0x32, 0x8c, 0x2b, 0x32, 0x8a, 0x2b, 0x32, 0x89, 0x2a, 0x31, 0x87, +0x29, 0x30, 0x85, 0x28, 0x2f, 0x83, 0x27, 0x2e, 0x81, 0x26, 0x2d, 0x7f, +0x25, 0x2c, 0x7e, 0x24, 0x2b, 0x7c, 0x24, 0x2a, 0x7a, 0x23, 0x29, 0x79, +0x22, 0x28, 0x77, 0x21, 0x27, 0x75, 0x20, 0x25, 0x74, 0x1f, 0x25, 0x72, +0x1e, 0x24, 0x71, 0x1e, 0x22, 0x6f, 0x1d, 0x21, 0x6e, 0x1c, 0x20, 0x6c, +0x1b, 0x20, 0x6c, 0x1a, 0x20, 0x6b, 0x1a, 0x1e, 0x69, 0x19, 0x1e, 0x68, +0x18, 0x1d, 0x67, 0x18, 0x1d, 0x66, 0x18, 0x1c, 0x65, 0x17, 0x1c, 0x63, +0x18, 0x1b, 0x62, 0x17, 0x1c, 0x61, 0x18, 0x1c, 0x60, 0x18, 0x1c, 0x5f, +0x17, 0x1b, 0x5e, 0x17, 0x1c, 0x5d, 0x17, 0x1c, 0x5c, 0x17, 0x1b, 0x5b, +0x18, 0x1c, 0x5a, 0x18, 0x1c, 0x59, 0x18, 0x1c, 0x58, 0x17, 0x1b, 0x57, +0x17, 0x1c, 0x57, 0x17, 0x1b, 0x56, 0x17, 0x1b, 0x55, 0x16, 0x1b, 0x54, +0x16, 0x1a, 0x53, 0x16, 0x1a, 0x53, 0x15, 0x1a, 0x52, 0x15, 0x1a, 0x51, +0x15, 0x19, 0x50, 0x15, 0x19, 0x50, 0x14, 0x19, 0x4f, 0x14, 0x19, 0x4e, +0x14, 0x18, 0x4d, 0x13, 0x17, 0x4d, 0x13, 0x17, 0x4c, 0x13, 0x16, 0x4b, +0x13, 0x16, 0x4b, 0x12, 0x16, 0x4a, 0x12, 0x15, 0x49, 0x11, 0x15, 0x48, +0x11, 0x15, 0x47, 0x11, 0x15, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, +0x10, 0x14, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, 0x10, 0x13, 0x43, +0x10, 0x13, 0x43, 0x10, 0x12, 0x43, 0x0f, 0x12, 0x42, 0x0f, 0x12, 0x41, +0x0f, 0x12, 0x41, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0e, 0x11, 0x3f, +0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, +0x0d, 0x10, 0x3d, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x36, 0x01, 0x01, 0x05, +0x14, 0x17, 0x45, 0x29, 0x31, 0x8d, 0x29, 0x32, 0x93, 0x24, 0x2a, 0x7d, +0x1f, 0x26, 0x74, 0x20, 0x26, 0x76, 0x20, 0x26, 0x77, 0x20, 0x26, 0x78, +0x20, 0x26, 0x7a, 0x20, 0x26, 0x7c, 0x21, 0x28, 0x7e, 0x22, 0x29, 0x7f, +0x24, 0x2a, 0x80, 0x25, 0x2b, 0x82, 0x26, 0x2d, 0x85, 0x27, 0x2e, 0x87, +0x29, 0x31, 0x89, 0x2b, 0x32, 0x8a, 0x2d, 0x34, 0x8c, 0x30, 0x37, 0x8f, +0x32, 0x3a, 0x90, 0x36, 0x3e, 0x93, 0x3a, 0x41, 0x94, 0x3b, 0x44, 0x92, +0x36, 0x3e, 0x7f, 0x36, 0x3f, 0x81, 0x3e, 0x48, 0x9e, 0x3a, 0x44, 0xa1, +0x36, 0x3f, 0xa3, 0x32, 0x3b, 0xa6, 0x2f, 0x37, 0xa8, 0x34, 0x3c, 0xab, +0x39, 0x43, 0xad, 0x42, 0x4b, 0xb0, 0x4b, 0x56, 0xb3, 0x49, 0x54, 0xb6, +0x3a, 0x44, 0xba, 0x2f, 0x39, 0xbd, 0x28, 0x31, 0xc0, 0x2a, 0x32, 0xc3, +0x32, 0x3c, 0xc6, 0x40, 0x4a, 0xc9, 0x4d, 0x59, 0xcd, 0x52, 0x5e, 0xd1, +0x56, 0x63, 0xd4, 0x56, 0x62, 0xce, 0x57, 0x65, 0xd1, 0x57, 0x64, 0xce, +0x52, 0x5e, 0xe4, 0x46, 0x53, 0xe5, 0x41, 0x4d, 0xe5, 0x3d, 0x49, 0xe5, +0x4d, 0x5c, 0xe5, 0x16, 0x1b, 0x3b, 0x16, 0x1c, 0x3d, 0x60, 0x6f, 0xe0, +0x51, 0x5f, 0xe6, 0x4b, 0x5a, 0xe5, 0x19, 0x1e, 0x42, 0x19, 0x1f, 0x43, +0x19, 0x1e, 0x43, 0x19, 0x1e, 0x43, 0x19, 0x1e, 0x43, 0x57, 0x66, 0xc8, +0x44, 0x4f, 0x96, 0x5d, 0x6d, 0xe0, 0x58, 0x68, 0xe0, 0x18, 0x1e, 0x44, +0x3e, 0x4a, 0x8c, 0x53, 0x63, 0xc3, 0x5b, 0x6b, 0xdf, 0x51, 0x61, 0xde, +0x24, 0x2c, 0x5a, 0x14, 0x19, 0x3e, 0x51, 0x5f, 0xc1, 0x36, 0x40, 0x7c, +0x11, 0x17, 0x3a, 0x54, 0x64, 0xcd, 0x57, 0x67, 0xd8, 0x46, 0x53, 0xa3, +0x2e, 0x37, 0x6d, 0x23, 0x2a, 0x57, 0x4c, 0x58, 0xb1, 0x57, 0x65, 0xdf, +0x55, 0x63, 0xe0, 0x53, 0x60, 0xe2, 0x4d, 0x5a, 0xe1, 0x48, 0x55, 0xdf, +0x4c, 0x58, 0xdc, 0x51, 0x5e, 0xd9, 0x58, 0x65, 0xd6, 0x47, 0x52, 0x9f, +0x31, 0x38, 0x6a, 0x2e, 0x36, 0x65, 0x4f, 0x5a, 0xb7, 0x4a, 0x55, 0xc6, +0x40, 0x4b, 0xc4, 0x44, 0x4e, 0xc0, 0x47, 0x52, 0xbd, 0x4a, 0x55, 0xba, +0x4c, 0x56, 0xb7, 0x41, 0x4b, 0xb4, 0x3a, 0x43, 0xb0, 0x33, 0x3c, 0xae, +0x2e, 0x36, 0xab, 0x2d, 0x35, 0xa8, 0x2d, 0x35, 0xa5, 0x2d, 0x36, 0xa3, +0x2e, 0x35, 0xa0, 0x2e, 0x35, 0x9e, 0x2e, 0x35, 0x9b, 0x2e, 0x36, 0x99, +0x2d, 0x35, 0x96, 0x2d, 0x35, 0x94, 0x2d, 0x35, 0x92, 0x2d, 0x35, 0x90, +0x2c, 0x34, 0x8d, 0x2d, 0x33, 0x8b, 0x2c, 0x32, 0x89, 0x2a, 0x31, 0x88, +0x29, 0x30, 0x86, 0x28, 0x2f, 0x83, 0x27, 0x2d, 0x81, 0x26, 0x2d, 0x80, +0x25, 0x2b, 0x7e, 0x24, 0x2a, 0x7d, 0x23, 0x2a, 0x7b, 0x22, 0x28, 0x79, +0x21, 0x27, 0x78, 0x20, 0x25, 0x76, 0x1f, 0x24, 0x74, 0x1e, 0x23, 0x73, +0x1d, 0x22, 0x71, 0x1c, 0x22, 0x70, 0x1c, 0x21, 0x6e, 0x1b, 0x20, 0x6d, +0x1a, 0x1f, 0x6c, 0x1a, 0x1f, 0x6b, 0x19, 0x1e, 0x69, 0x19, 0x1e, 0x69, +0x18, 0x1d, 0x67, 0x19, 0x1d, 0x66, 0x19, 0x1d, 0x65, 0x19, 0x1d, 0x64, +0x19, 0x1d, 0x63, 0x19, 0x1d, 0x62, 0x19, 0x1d, 0x61, 0x19, 0x1d, 0x5f, +0x19, 0x1d, 0x5e, 0x18, 0x1d, 0x5d, 0x18, 0x1d, 0x5c, 0x18, 0x1d, 0x5b, +0x19, 0x1d, 0x5a, 0x18, 0x1d, 0x5a, 0x18, 0x1d, 0x59, 0x18, 0x1d, 0x58, +0x17, 0x1c, 0x57, 0x17, 0x1c, 0x56, 0x17, 0x1c, 0x55, 0x16, 0x1b, 0x54, +0x16, 0x1a, 0x54, 0x16, 0x1a, 0x53, 0x15, 0x1a, 0x52, 0x15, 0x1a, 0x51, +0x15, 0x19, 0x50, 0x14, 0x19, 0x50, 0x14, 0x19, 0x4f, 0x14, 0x18, 0x4e, +0x14, 0x18, 0x4e, 0x13, 0x17, 0x4c, 0x13, 0x16, 0x4c, 0x13, 0x16, 0x4c, +0x12, 0x16, 0x4b, 0x12, 0x16, 0x4a, 0x12, 0x15, 0x49, 0x11, 0x15, 0x48, +0x11, 0x15, 0x47, 0x11, 0x15, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, +0x10, 0x14, 0x45, 0x10, 0x14, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, +0x10, 0x13, 0x43, 0x10, 0x12, 0x43, 0x0f, 0x12, 0x42, 0x0f, 0x12, 0x41, +0x0f, 0x12, 0x41, 0x0e, 0x12, 0x40, 0x0e, 0x12, 0x40, 0x0e, 0x12, 0x40, +0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, +0x0d, 0x10, 0x3d, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x36, 0x01, 0x01, 0x05, +0x15, 0x18, 0x46, 0x2b, 0x31, 0x8d, 0x2c, 0x34, 0x94, 0x25, 0x2a, 0x7d, +0x21, 0x27, 0x75, 0x22, 0x27, 0x76, 0x22, 0x28, 0x77, 0x22, 0x28, 0x79, +0x22, 0x28, 0x7b, 0x21, 0x28, 0x7d, 0x21, 0x28, 0x7e, 0x21, 0x28, 0x80, +0x22, 0x29, 0x81, 0x23, 0x2a, 0x83, 0x25, 0x2b, 0x85, 0x26, 0x2d, 0x88, +0x28, 0x2f, 0x89, 0x29, 0x31, 0x8b, 0x2b, 0x32, 0x8d, 0x2d, 0x34, 0x8f, +0x2f, 0x37, 0x91, 0x31, 0x3a, 0x94, 0x36, 0x3e, 0x96, 0x39, 0x41, 0x98, +0x3d, 0x45, 0x9a, 0x3a, 0x43, 0x8c, 0x33, 0x3a, 0x76, 0x37, 0x3f, 0x81, +0x41, 0x4b, 0xa5, 0x3c, 0x45, 0xa7, 0x38, 0x41, 0xa9, 0x34, 0x3c, 0xac, +0x32, 0x3b, 0xb0, 0x38, 0x42, 0xb2, 0x40, 0x4a, 0xb5, 0x4a, 0x55, 0xb8, +0x55, 0x61, 0xbc, 0x42, 0x4d, 0xbf, 0x34, 0x3e, 0xc2, 0x2a, 0x33, 0xc5, +0x28, 0x33, 0xc9, 0x32, 0x3c, 0xcd, 0x40, 0x4b, 0xd0, 0x52, 0x5e, 0xd4, +0x56, 0x63, 0xd7, 0x58, 0x65, 0xd5, 0x57, 0x63, 0xce, 0x58, 0x65, 0xce, +0x57, 0x63, 0xc8, 0x54, 0x63, 0xe4, 0x4a, 0x57, 0xe4, 0x44, 0x51, 0xe4, +0x41, 0x4d, 0xe4, 0x57, 0x65, 0xc7, 0x17, 0x1d, 0x3f, 0x1c, 0x22, 0x47, +0x5f, 0x6f, 0xe6, 0x4f, 0x5d, 0xe5, 0x4f, 0x5c, 0xae, 0x1b, 0x20, 0x46, +0x1b, 0x20, 0x46, 0x1b, 0x20, 0x47, 0x1a, 0x20, 0x47, 0x49, 0x56, 0xa2, +0x33, 0x3d, 0x75, 0x51, 0x60, 0xb7, 0x5c, 0x6d, 0xdf, 0x1a, 0x20, 0x48, +0x28, 0x31, 0x61, 0x46, 0x54, 0x9f, 0x54, 0x63, 0xc5, 0x55, 0x65, 0xdd, +0x16, 0x1c, 0x42, 0x15, 0x1b, 0x41, 0x49, 0x57, 0xac, 0x13, 0x19, 0x3e, +0x20, 0x27, 0x54, 0x53, 0x63, 0xcd, 0x3f, 0x4b, 0x93, 0x24, 0x2c, 0x5a, +0x0f, 0x14, 0x36, 0x2a, 0x32, 0x66, 0x50, 0x5e, 0xc0, 0x58, 0x67, 0xd9, +0x59, 0x68, 0xe0, 0x53, 0x61, 0xe2, 0x4d, 0x5b, 0xe3, 0x4e, 0x5c, 0xe3, +0x56, 0x63, 0xe0, 0x59, 0x67, 0xd4, 0x45, 0x4f, 0x97, 0x2a, 0x31, 0x5c, +0x2f, 0x36, 0x65, 0x54, 0x60, 0xc4, 0x4b, 0x56, 0xcd, 0x44, 0x4f, 0xc9, +0x48, 0x53, 0xc6, 0x4c, 0x57, 0xc3, 0x50, 0x5b, 0xbf, 0x4b, 0x56, 0xbc, +0x40, 0x4a, 0xb8, 0x38, 0x41, 0xb5, 0x32, 0x3c, 0xb3, 0x2e, 0x37, 0xaf, +0x2e, 0x37, 0xac, 0x2f, 0x38, 0xaa, 0x30, 0x38, 0xa7, 0x30, 0x38, 0xa4, +0x30, 0x38, 0xa1, 0x30, 0x39, 0x9f, 0x30, 0x38, 0x9c, 0x30, 0x38, 0x9a, +0x30, 0x37, 0x98, 0x2f, 0x36, 0x95, 0x2f, 0x36, 0x92, 0x2f, 0x36, 0x91, +0x2d, 0x34, 0x8e, 0x2d, 0x33, 0x8c, 0x2b, 0x32, 0x8a, 0x2a, 0x30, 0x88, +0x28, 0x2f, 0x86, 0x27, 0x2f, 0x84, 0x26, 0x2d, 0x82, 0x25, 0x2c, 0x80, +0x24, 0x2a, 0x7e, 0x23, 0x29, 0x7d, 0x22, 0x28, 0x7c, 0x21, 0x26, 0x7a, +0x20, 0x25, 0x78, 0x1f, 0x24, 0x77, 0x1e, 0x24, 0x75, 0x1d, 0x22, 0x73, +0x1c, 0x22, 0x72, 0x1b, 0x21, 0x70, 0x1b, 0x21, 0x6f, 0x1a, 0x20, 0x6d, +0x1a, 0x1f, 0x6c, 0x1a, 0x1f, 0x6b, 0x1a, 0x1e, 0x69, 0x1a, 0x1f, 0x69, +0x1a, 0x1f, 0x68, 0x1a, 0x1f, 0x66, 0x1a, 0x1f, 0x65, 0x1a, 0x1e, 0x64, +0x1a, 0x1e, 0x63, 0x1a, 0x1e, 0x62, 0x1a, 0x1e, 0x61, 0x1a, 0x1e, 0x60, +0x1a, 0x1f, 0x5f, 0x1a, 0x1e, 0x5e, 0x19, 0x1f, 0x5d, 0x19, 0x1f, 0x5c, +0x19, 0x1e, 0x5b, 0x19, 0x1e, 0x5a, 0x18, 0x1d, 0x59, 0x18, 0x1d, 0x58, +0x17, 0x1c, 0x57, 0x17, 0x1c, 0x56, 0x16, 0x1b, 0x55, 0x16, 0x1b, 0x55, +0x16, 0x1b, 0x54, 0x15, 0x1a, 0x53, 0x15, 0x1a, 0x52, 0x15, 0x1a, 0x51, +0x15, 0x19, 0x51, 0x14, 0x19, 0x50, 0x14, 0x18, 0x4f, 0x13, 0x18, 0x4e, +0x13, 0x18, 0x4e, 0x13, 0x16, 0x4c, 0x12, 0x16, 0x4c, 0x12, 0x16, 0x4c, +0x12, 0x16, 0x4b, 0x12, 0x16, 0x4a, 0x12, 0x16, 0x4a, 0x11, 0x15, 0x48, +0x11, 0x14, 0x48, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, +0x10, 0x13, 0x45, 0x10, 0x13, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, +0x10, 0x13, 0x43, 0x10, 0x12, 0x43, 0x0f, 0x12, 0x42, 0x0f, 0x12, 0x42, +0x0f, 0x12, 0x41, 0x0e, 0x12, 0x41, 0x0e, 0x11, 0x40, 0x0e, 0x11, 0x40, +0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, +0x0d, 0x10, 0x3d, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x14, 0x18, 0x46, 0x2b, 0x31, 0x8e, 0x2d, 0x34, 0x94, 0x27, 0x2c, 0x7e, +0x23, 0x28, 0x75, 0x23, 0x29, 0x77, 0x24, 0x29, 0x78, 0x24, 0x2a, 0x7a, +0x24, 0x29, 0x7b, 0x23, 0x2a, 0x7d, 0x23, 0x2a, 0x7f, 0x24, 0x2a, 0x81, +0x24, 0x2a, 0x82, 0x23, 0x2a, 0x84, 0x23, 0x2a, 0x86, 0x25, 0x2b, 0x88, +0x27, 0x2d, 0x8a, 0x27, 0x2e, 0x8c, 0x29, 0x30, 0x8e, 0x2b, 0x32, 0x90, +0x2d, 0x34, 0x93, 0x2f, 0x37, 0x94, 0x31, 0x3a, 0x97, 0x34, 0x3c, 0x99, +0x38, 0x40, 0x9c, 0x3c, 0x45, 0x9e, 0x3f, 0x48, 0x9b, 0x39, 0x41, 0x87, +0x31, 0x38, 0x70, 0x38, 0x40, 0x83, 0x44, 0x4e, 0xab, 0x3f, 0x48, 0xae, +0x39, 0x43, 0xb1, 0x33, 0x3c, 0xb4, 0x37, 0x41, 0xb7, 0x3f, 0x4a, 0xba, +0x49, 0x54, 0xbe, 0x56, 0x62, 0xc1, 0x4d, 0x58, 0xc4, 0x3b, 0x46, 0xc8, +0x2e, 0x38, 0xcc, 0x29, 0x32, 0xcf, 0x30, 0x3b, 0xd3, 0x40, 0x4b, 0xd7, +0x55, 0x62, 0xda, 0x5a, 0x68, 0xdf, 0x58, 0x65, 0xd1, 0x51, 0x5d, 0xb9, +0x4b, 0x56, 0xa7, 0x4c, 0x59, 0xab, 0x59, 0x67, 0xe3, 0x4c, 0x5b, 0xe3, +0x47, 0x55, 0xe3, 0x4c, 0x5a, 0xe4, 0x18, 0x1e, 0x41, 0x1a, 0x1f, 0x44, +0x3e, 0x49, 0x85, 0x5b, 0x6c, 0xe5, 0x5b, 0x6c, 0xe4, 0x1d, 0x23, 0x4a, +0x1d, 0x23, 0x4b, 0x1d, 0x23, 0x4b, 0x1d, 0x23, 0x4c, 0x25, 0x2d, 0x5b, +0x25, 0x2d, 0x5b, 0x39, 0x44, 0x80, 0x56, 0x66, 0xc7, 0x1b, 0x22, 0x4c, +0x1b, 0x21, 0x4b, 0x36, 0x40, 0x7b, 0x4b, 0x59, 0xac, 0x50, 0x60, 0xbe, +0x17, 0x1d, 0x46, 0x16, 0x1c, 0x45, 0x22, 0x2a, 0x59, 0x14, 0x1a, 0x41, +0x2d, 0x36, 0x6d, 0x3b, 0x46, 0x89, 0x15, 0x1b, 0x42, 0x10, 0x16, 0x3a, +0x10, 0x15, 0x38, 0x33, 0x3e, 0x79, 0x49, 0x55, 0xaa, 0x50, 0x5e, 0xbd, +0x5a, 0x69, 0xe0, 0x54, 0x62, 0xe2, 0x54, 0x62, 0xe3, 0x5c, 0x69, 0xe4, +0x59, 0x66, 0xd0, 0x3f, 0x49, 0x8a, 0x1b, 0x20, 0x42, 0x30, 0x38, 0x69, +0x59, 0x65, 0xd1, 0x4d, 0x58, 0xd4, 0x49, 0x55, 0xd0, 0x4e, 0x58, 0xcc, +0x52, 0x5e, 0xc8, 0x57, 0x62, 0xc5, 0x4a, 0x54, 0xc2, 0x3f, 0x49, 0xbe, +0x37, 0x41, 0xbb, 0x31, 0x3a, 0xb7, 0x31, 0x39, 0xb4, 0x31, 0x3a, 0xb1, +0x32, 0x3a, 0xae, 0x32, 0x3b, 0xab, 0x33, 0x3b, 0xa8, 0x33, 0x3b, 0xa5, +0x33, 0x3a, 0xa3, 0x33, 0x3a, 0xa0, 0x32, 0x3a, 0x9e, 0x31, 0x3a, 0x9b, +0x31, 0x3a, 0x99, 0x30, 0x39, 0x96, 0x30, 0x37, 0x94, 0x2f, 0x35, 0x91, +0x2d, 0x33, 0x8f, 0x2b, 0x32, 0x8d, 0x2b, 0x31, 0x8b, 0x29, 0x30, 0x88, +0x28, 0x2f, 0x87, 0x27, 0x2e, 0x85, 0x25, 0x2c, 0x83, 0x24, 0x2b, 0x81, +0x23, 0x29, 0x7f, 0x21, 0x27, 0x7d, 0x21, 0x27, 0x7b, 0x20, 0x25, 0x7b, +0x1f, 0x24, 0x79, 0x1e, 0x24, 0x77, 0x1d, 0x23, 0x75, 0x1c, 0x22, 0x74, +0x1c, 0x21, 0x72, 0x1b, 0x21, 0x71, 0x1b, 0x20, 0x6f, 0x1b, 0x20, 0x6e, +0x1b, 0x20, 0x6c, 0x1b, 0x20, 0x6b, 0x1c, 0x20, 0x6a, 0x1b, 0x20, 0x68, +0x1b, 0x20, 0x68, 0x1c, 0x20, 0x66, 0x1c, 0x20, 0x66, 0x1c, 0x21, 0x65, +0x1b, 0x20, 0x63, 0x1a, 0x20, 0x62, 0x1a, 0x20, 0x61, 0x1a, 0x20, 0x60, +0x1b, 0x20, 0x5f, 0x1a, 0x20, 0x5e, 0x1a, 0x1f, 0x5d, 0x19, 0x1f, 0x5c, +0x19, 0x1e, 0x5b, 0x18, 0x1d, 0x5a, 0x18, 0x1d, 0x59, 0x17, 0x1c, 0x58, +0x17, 0x1c, 0x57, 0x16, 0x1c, 0x56, 0x16, 0x1b, 0x56, 0x16, 0x1b, 0x55, +0x16, 0x1a, 0x54, 0x15, 0x1a, 0x53, 0x15, 0x1a, 0x52, 0x15, 0x19, 0x52, +0x15, 0x19, 0x51, 0x14, 0x18, 0x4f, 0x13, 0x18, 0x4f, 0x13, 0x18, 0x4f, +0x13, 0x17, 0x4e, 0x13, 0x17, 0x4d, 0x12, 0x16, 0x4c, 0x12, 0x16, 0x4c, +0x12, 0x16, 0x4b, 0x12, 0x16, 0x4b, 0x12, 0x16, 0x4a, 0x11, 0x14, 0x48, +0x11, 0x14, 0x48, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, +0x10, 0x13, 0x45, 0x10, 0x13, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, +0x10, 0x12, 0x43, 0x10, 0x12, 0x43, 0x0f, 0x12, 0x42, 0x0f, 0x12, 0x42, +0x0e, 0x12, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x40, 0x0e, 0x11, 0x40, +0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3f, 0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3d, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x14, 0x17, 0x47, 0x28, 0x31, 0x8e, 0x2a, 0x32, 0x95, 0x25, 0x2b, 0x7e, +0x23, 0x28, 0x76, 0x24, 0x2a, 0x78, 0x26, 0x2b, 0x78, 0x26, 0x2b, 0x7a, +0x25, 0x2b, 0x7c, 0x26, 0x2b, 0x7e, 0x26, 0x2c, 0x80, 0x26, 0x2c, 0x81, +0x26, 0x2c, 0x83, 0x26, 0x2c, 0x85, 0x26, 0x2c, 0x87, 0x26, 0x2c, 0x89, +0x25, 0x2c, 0x8b, 0x26, 0x2d, 0x8d, 0x28, 0x2f, 0x8f, 0x29, 0x31, 0x91, +0x2b, 0x32, 0x94, 0x2d, 0x34, 0x95, 0x2f, 0x37, 0x98, 0x32, 0x39, 0x9a, +0x34, 0x3c, 0x9d, 0x37, 0x40, 0x9f, 0x3b, 0x44, 0xa2, 0x41, 0x49, 0xa5, +0x41, 0x49, 0x9c, 0x37, 0x3f, 0x7f, 0x29, 0x2f, 0x5d, 0x3b, 0x44, 0x89, +0x47, 0x52, 0xb3, 0x40, 0x4a, 0xb6, 0x3a, 0x44, 0xb9, 0x36, 0x40, 0xbc, +0x3d, 0x49, 0xc0, 0x48, 0x52, 0xc3, 0x55, 0x62, 0xc6, 0x5b, 0x68, 0xca, +0x44, 0x50, 0xce, 0x33, 0x3e, 0xd2, 0x28, 0x32, 0xd6, 0x30, 0x3a, 0xda, +0x3f, 0x4b, 0xde, 0x5a, 0x67, 0xe2, 0x57, 0x64, 0xce, 0x4b, 0x57, 0xaa, +0x3e, 0x47, 0x89, 0x33, 0x3c, 0x72, 0x3f, 0x4a, 0x8b, 0x5c, 0x6b, 0xe2, +0x51, 0x60, 0xe2, 0x4c, 0x5a, 0xe3, 0x5b, 0x6b, 0xd4, 0x1b, 0x21, 0x47, +0x1d, 0x23, 0x49, 0x4f, 0x5b, 0xaa, 0x58, 0x6a, 0xe4, 0x1f, 0x25, 0x4e, +0x1f, 0x26, 0x4f, 0x1f, 0x25, 0x4f, 0x1f, 0x26, 0x50, 0x1e, 0x25, 0x50, +0x1f, 0x25, 0x51, 0x1f, 0x25, 0x51, 0x4d, 0x5c, 0xad, 0x1e, 0x24, 0x50, +0x1d, 0x24, 0x50, 0x23, 0x2b, 0x5a, 0x3e, 0x4b, 0x8f, 0x22, 0x2a, 0x5a, +0x18, 0x1f, 0x4a, 0x17, 0x1e, 0x47, 0x16, 0x1c, 0x46, 0x15, 0x1b, 0x44, +0x36, 0x42, 0x81, 0x13, 0x19, 0x40, 0x12, 0x18, 0x3e, 0x11, 0x17, 0x3d, +0x10, 0x16, 0x3b, 0x31, 0x3a, 0x73, 0x3e, 0x4a, 0x8f, 0x4d, 0x5a, 0xb3, +0x5a, 0x6a, 0xe0, 0x5b, 0x6a, 0xe2, 0x58, 0x67, 0xd0, 0x4c, 0x58, 0xa9, +0x2e, 0x36, 0x66, 0x13, 0x17, 0x35, 0x31, 0x38, 0x6a, 0x5d, 0x6b, 0xdf, +0x4e, 0x5a, 0xdb, 0x4e, 0x5a, 0xd7, 0x54, 0x60, 0xd3, 0x5a, 0x66, 0xce, +0x56, 0x62, 0xcb, 0x48, 0x54, 0xc7, 0x3e, 0x48, 0xc4, 0x36, 0x40, 0xc0, +0x33, 0x3c, 0xbd, 0x33, 0x3d, 0xb9, 0x34, 0x3d, 0xb6, 0x34, 0x3e, 0xb3, +0x35, 0x3d, 0xaf, 0x36, 0x3e, 0xad, 0x35, 0x3e, 0xaa, 0x35, 0x3e, 0xa7, +0x35, 0x3e, 0xa4, 0x35, 0x3d, 0xa1, 0x35, 0x3d, 0x9e, 0x33, 0x3c, 0x9c, +0x32, 0x3a, 0x99, 0x30, 0x39, 0x97, 0x2f, 0x36, 0x95, 0x2e, 0x35, 0x92, +0x2c, 0x33, 0x90, 0x2b, 0x31, 0x8e, 0x2a, 0x31, 0x8c, 0x28, 0x30, 0x89, +0x26, 0x2d, 0x87, 0x25, 0x2c, 0x86, 0x24, 0x2a, 0x84, 0x23, 0x29, 0x82, +0x22, 0x27, 0x80, 0x21, 0x26, 0x7e, 0x1f, 0x25, 0x7c, 0x1e, 0x25, 0x7b, +0x1d, 0x23, 0x79, 0x1d, 0x23, 0x78, 0x1d, 0x23, 0x76, 0x1c, 0x22, 0x74, +0x1d, 0x22, 0x73, 0x1d, 0x22, 0x71, 0x1d, 0x22, 0x70, 0x1d, 0x22, 0x6e, +0x1d, 0x22, 0x6d, 0x1d, 0x22, 0x6b, 0x1d, 0x22, 0x6a, 0x1d, 0x22, 0x69, +0x1d, 0x22, 0x68, 0x1c, 0x22, 0x66, 0x1c, 0x22, 0x66, 0x1c, 0x22, 0x65, +0x1c, 0x21, 0x63, 0x1c, 0x21, 0x63, 0x1b, 0x21, 0x61, 0x1b, 0x20, 0x60, +0x1a, 0x20, 0x5f, 0x1a, 0x1f, 0x5e, 0x19, 0x1f, 0x5d, 0x19, 0x1e, 0x5c, +0x18, 0x1e, 0x5b, 0x18, 0x1d, 0x5a, 0x17, 0x1d, 0x59, 0x17, 0x1c, 0x58, +0x17, 0x1c, 0x57, 0x16, 0x1b, 0x57, 0x16, 0x1b, 0x56, 0x16, 0x1a, 0x55, +0x16, 0x1a, 0x54, 0x15, 0x1a, 0x53, 0x15, 0x19, 0x52, 0x14, 0x19, 0x52, +0x14, 0x19, 0x51, 0x13, 0x18, 0x4f, 0x13, 0x18, 0x4f, 0x13, 0x18, 0x4f, +0x13, 0x17, 0x4e, 0x13, 0x17, 0x4d, 0x12, 0x16, 0x4c, 0x12, 0x16, 0x4c, +0x12, 0x16, 0x4b, 0x12, 0x16, 0x4b, 0x12, 0x15, 0x4a, 0x11, 0x14, 0x48, +0x11, 0x14, 0x48, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, +0x10, 0x13, 0x45, 0x10, 0x13, 0x45, 0x10, 0x12, 0x44, 0x10, 0x12, 0x44, +0x10, 0x12, 0x43, 0x10, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0e, 0x11, 0x42, +0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x40, 0x0e, 0x11, 0x40, +0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3f, 0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x13, 0x17, 0x47, 0x27, 0x2f, 0x8f, 0x29, 0x32, 0x95, 0x24, 0x2b, 0x7f, +0x21, 0x27, 0x76, 0x22, 0x29, 0x78, 0x24, 0x2a, 0x79, 0x25, 0x2b, 0x7b, +0x26, 0x2c, 0x7d, 0x27, 0x2e, 0x7f, 0x27, 0x2e, 0x80, 0x27, 0x2e, 0x81, +0x27, 0x2e, 0x84, 0x27, 0x2f, 0x86, 0x28, 0x2f, 0x88, 0x27, 0x2e, 0x89, +0x28, 0x2e, 0x8c, 0x28, 0x2f, 0x8e, 0x28, 0x2f, 0x90, 0x28, 0x2e, 0x92, +0x29, 0x31, 0x95, 0x2b, 0x33, 0x97, 0x2d, 0x34, 0x99, 0x2e, 0x37, 0x9b, +0x31, 0x38, 0x9e, 0x33, 0x3d, 0xa1, 0x36, 0x3f, 0xa3, 0x3a, 0x44, 0xa6, +0x3f, 0x48, 0xa9, 0x44, 0x4e, 0xac, 0x3e, 0x47, 0x94, 0x33, 0x3a, 0x74, +0x23, 0x2a, 0x52, 0x3d, 0x46, 0x8d, 0x49, 0x54, 0xbb, 0x41, 0x4c, 0xbe, +0x3a, 0x45, 0xc2, 0x3c, 0x46, 0xc5, 0x46, 0x51, 0xc9, 0x53, 0x5f, 0xcc, +0x65, 0x73, 0xd0, 0x50, 0x5d, 0xd4, 0x3a, 0x44, 0xd8, 0x2a, 0x34, 0xdd, +0x2e, 0x39, 0xe1, 0x40, 0x4d, 0xe2, 0x56, 0x63, 0xcd, 0x49, 0x55, 0xa6, +0x34, 0x3d, 0x74, 0x21, 0x28, 0x52, 0x14, 0x19, 0x3c, 0x2f, 0x38, 0x6b, +0x5a, 0x69, 0xd6, 0x56, 0x65, 0xe1, 0x50, 0x60, 0xe2, 0x1c, 0x22, 0x4a, +0x1e, 0x24, 0x4c, 0x20, 0x27, 0x4f, 0x58, 0x68, 0xc1, 0x3f, 0x49, 0x87, +0x22, 0x29, 0x54, 0x22, 0x29, 0x55, 0x21, 0x28, 0x55, 0x22, 0x29, 0x56, +0x21, 0x28, 0x56, 0x21, 0x28, 0x56, 0x40, 0x4c, 0x8f, 0x20, 0x27, 0x55, +0x1f, 0x26, 0x55, 0x1e, 0x26, 0x54, 0x2f, 0x39, 0x71, 0x1c, 0x23, 0x50, +0x1a, 0x21, 0x4e, 0x19, 0x1f, 0x4c, 0x17, 0x1e, 0x49, 0x16, 0x1d, 0x48, +0x15, 0x1b, 0x45, 0x14, 0x1a, 0x43, 0x13, 0x19, 0x41, 0x12, 0x18, 0x3f, +0x11, 0x17, 0x3d, 0x20, 0x27, 0x54, 0x33, 0x3c, 0x76, 0x4e, 0x5c, 0xb4, +0x57, 0x66, 0xce, 0x49, 0x54, 0xa1, 0x34, 0x3d, 0x73, 0x15, 0x19, 0x39, +0x15, 0x19, 0x39, 0x30, 0x38, 0x67, 0x5f, 0x6e, 0xe6, 0x4d, 0x59, 0xe2, +0x55, 0x61, 0xdd, 0x5a, 0x66, 0xd7, 0x4a, 0x54, 0xa5, 0x54, 0x60, 0xd1, +0x46, 0x51, 0xcd, 0x3c, 0x47, 0xca, 0x34, 0x3e, 0xc6, 0x36, 0x40, 0xc2, +0x36, 0x40, 0xbe, 0x38, 0x40, 0xbb, 0x38, 0x41, 0xb8, 0x38, 0x42, 0xb4, +0x38, 0x41, 0xb1, 0x39, 0x42, 0xae, 0x39, 0x41, 0xab, 0x38, 0x41, 0xa8, +0x37, 0x41, 0xa5, 0x36, 0x3f, 0xa2, 0x35, 0x3c, 0x9f, 0x32, 0x3b, 0x9d, +0x31, 0x39, 0x9a, 0x30, 0x38, 0x98, 0x2e, 0x36, 0x96, 0x2d, 0x34, 0x93, +0x2c, 0x33, 0x91, 0x2a, 0x31, 0x8e, 0x3b, 0x42, 0x7e, 0x90, 0x8f, 0x41, +0xa5, 0xa3, 0x32, 0xa5, 0xa2, 0x31, 0x4d, 0x50, 0x69, 0x21, 0x27, 0x82, +0x20, 0x27, 0x80, 0x1f, 0x25, 0x7f, 0x1f, 0x24, 0x7d, 0x1e, 0x24, 0x7b, +0x1e, 0x24, 0x79, 0x1e, 0x24, 0x78, 0x1f, 0x24, 0x77, 0x1f, 0x24, 0x75, +0x1f, 0x24, 0x73, 0x1f, 0x24, 0x72, 0x1f, 0x24, 0x70, 0x1f, 0x24, 0x6f, +0x1e, 0x24, 0x6d, 0x1e, 0x24, 0x6c, 0x1e, 0x24, 0x6a, 0x1e, 0x24, 0x69, +0x1e, 0x24, 0x68, 0x1e, 0x24, 0x68, 0x1d, 0x22, 0x65, 0x1d, 0x22, 0x65, +0x1c, 0x21, 0x63, 0x1c, 0x21, 0x63, 0x1b, 0x21, 0x62, 0x1a, 0x20, 0x60, +0x1a, 0x1f, 0x5f, 0x1a, 0x1f, 0x5e, 0x19, 0x1e, 0x5d, 0x18, 0x1e, 0x5c, +0x18, 0x1d, 0x5b, 0x18, 0x1d, 0x5a, 0x18, 0x1d, 0x5a, 0x17, 0x1c, 0x59, +0x17, 0x1b, 0x58, 0x16, 0x1b, 0x57, 0x16, 0x1a, 0x56, 0x16, 0x1a, 0x55, +0x15, 0x19, 0x54, 0x14, 0x19, 0x53, 0x14, 0x19, 0x53, 0x14, 0x19, 0x52, +0x14, 0x18, 0x51, 0x13, 0x18, 0x4f, 0x13, 0x18, 0x4f, 0x13, 0x17, 0x4f, +0x13, 0x17, 0x4e, 0x13, 0x17, 0x4d, 0x12, 0x16, 0x4c, 0x12, 0x16, 0x4c, +0x12, 0x15, 0x4b, 0x12, 0x15, 0x4b, 0x12, 0x15, 0x4a, 0x11, 0x14, 0x49, +0x11, 0x14, 0x48, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, +0x11, 0x14, 0x47, 0x10, 0x13, 0x45, 0x10, 0x12, 0x44, 0x10, 0x12, 0x44, +0x10, 0x12, 0x43, 0x10, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0e, 0x11, 0x42, +0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x40, 0x0e, 0x11, 0x40, +0x0e, 0x10, 0x3f, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x13, 0x16, 0x48, 0x27, 0x2d, 0x8f, 0x29, 0x31, 0x96, 0x23, 0x29, 0x7f, +0x20, 0x26, 0x77, 0x21, 0x28, 0x78, 0x22, 0x29, 0x7a, 0x24, 0x29, 0x7b, +0x24, 0x2a, 0x7d, 0x26, 0x2c, 0x7f, 0x27, 0x2d, 0x81, 0x28, 0x2f, 0x82, +0x29, 0x30, 0x84, 0x2a, 0x31, 0x86, 0x2b, 0x32, 0x89, 0x2b, 0x32, 0x8a, +0x2a, 0x32, 0x8c, 0x2a, 0x32, 0x8f, 0x2a, 0x32, 0x90, 0x2a, 0x32, 0x93, +0x2a, 0x32, 0x95, 0x2a, 0x32, 0x98, 0x2a, 0x32, 0x9a, 0x2d, 0x34, 0x9d, +0x2f, 0x37, 0x9f, 0x31, 0x38, 0xa2, 0x33, 0x3c, 0xa5, 0x36, 0x3f, 0xa7, +0x3a, 0x43, 0xab, 0x3d, 0x47, 0xad, 0x44, 0x4c, 0xb0, 0x47, 0x52, 0xae, +0x3d, 0x46, 0x8f, 0x2e, 0x35, 0x67, 0x22, 0x28, 0x50, 0x40, 0x49, 0x93, +0x4c, 0x58, 0xc4, 0x43, 0x4f, 0xc8, 0x3a, 0x46, 0xcb, 0x44, 0x4f, 0xcf, +0x51, 0x5e, 0xd3, 0x41, 0x4b, 0x94, 0x49, 0x54, 0xa8, 0x44, 0x4f, 0xe0, +0x30, 0x3b, 0xe1, 0x2f, 0x3a, 0xe1, 0x42, 0x4f, 0xe1, 0x4f, 0x5c, 0xb8, +0x31, 0x3a, 0x71, 0x17, 0x1c, 0x41, 0x15, 0x1a, 0x3d, 0x16, 0x1c, 0x40, +0x1f, 0x26, 0x50, 0x52, 0x61, 0xbc, 0x5b, 0x6b, 0xe1, 0x5f, 0x70, 0xe0, +0x1f, 0x26, 0x4f, 0x22, 0x29, 0x53, 0x24, 0x2b, 0x57, 0x5e, 0x70, 0xd6, +0x25, 0x2c, 0x5a, 0x25, 0x2c, 0x5a, 0x25, 0x2c, 0x5b, 0x24, 0x2c, 0x5b, +0x24, 0x2c, 0x5c, 0x24, 0x2b, 0x5c, 0x30, 0x3a, 0x72, 0x23, 0x2a, 0x5b, +0x22, 0x2a, 0x5b, 0x21, 0x28, 0x58, 0x1f, 0x26, 0x56, 0x1e, 0x25, 0x55, +0x1c, 0x23, 0x52, 0x1a, 0x21, 0x4f, 0x19, 0x20, 0x4d, 0x17, 0x1e, 0x4b, +0x16, 0x1d, 0x48, 0x15, 0x1c, 0x46, 0x14, 0x1a, 0x43, 0x13, 0x19, 0x42, +0x13, 0x19, 0x41, 0x14, 0x1a, 0x40, 0x34, 0x3e, 0x78, 0x48, 0x54, 0xa1, +0x34, 0x3e, 0x75, 0x16, 0x1c, 0x3e, 0x16, 0x1b, 0x3d, 0x17, 0x1c, 0x3c, +0x1e, 0x24, 0x48, 0x62, 0x70, 0xe6, 0x56, 0x63, 0xe7, 0x5c, 0x6a, 0xe5, +0x55, 0x61, 0xc1, 0x4f, 0x5a, 0xb2, 0x51, 0x5d, 0xd8, 0x43, 0x4f, 0xd4, +0x3a, 0x43, 0xcf, 0x38, 0x42, 0xcc, 0x39, 0x44, 0xc8, 0x3a, 0x44, 0xc4, +0x3c, 0x45, 0xc1, 0x3c, 0x45, 0xbd, 0x3c, 0x46, 0xba, 0x3c, 0x46, 0xb6, +0x3c, 0x45, 0xb2, 0x3c, 0x45, 0xaf, 0x3b, 0x45, 0xac, 0x39, 0x42, 0xa9, +0x37, 0x40, 0xa7, 0x36, 0x3e, 0xa3, 0x34, 0x3b, 0xa1, 0x33, 0x3a, 0x9e, +0x30, 0x38, 0x9c, 0x2f, 0x37, 0x99, 0x2e, 0x34, 0x96, 0x2b, 0x32, 0x94, +0x29, 0x31, 0x91, 0x66, 0x69, 0x61, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, +0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0x62, 0x64, 0x59, +0x20, 0x27, 0x81, 0x21, 0x26, 0x7f, 0x21, 0x26, 0x7d, 0x20, 0x26, 0x7b, +0x21, 0x27, 0x7a, 0x20, 0x27, 0x78, 0x20, 0x26, 0x77, 0x20, 0x26, 0x75, +0x20, 0x27, 0x74, 0x21, 0x27, 0x72, 0x21, 0x26, 0x71, 0x20, 0x26, 0x6f, +0x21, 0x26, 0x6e, 0x20, 0x25, 0x6c, 0x20, 0x25, 0x6b, 0x1f, 0x24, 0x6a, +0x1e, 0x23, 0x68, 0x1e, 0x23, 0x67, 0x1d, 0x22, 0x66, 0x1c, 0x22, 0x65, +0x1c, 0x21, 0x64, 0x1b, 0x21, 0x63, 0x1a, 0x20, 0x62, 0x1a, 0x1f, 0x60, +0x19, 0x1f, 0x5f, 0x19, 0x1f, 0x5f, 0x19, 0x1d, 0x5e, 0x18, 0x1d, 0x5d, +0x18, 0x1d, 0x5c, 0x18, 0x1c, 0x5b, 0x17, 0x1c, 0x5a, 0x17, 0x1c, 0x59, +0x17, 0x1b, 0x58, 0x17, 0x1b, 0x57, 0x16, 0x1a, 0x56, 0x16, 0x1a, 0x55, +0x15, 0x19, 0x54, 0x15, 0x19, 0x54, 0x15, 0x19, 0x53, 0x14, 0x18, 0x52, +0x14, 0x18, 0x51, 0x14, 0x17, 0x50, 0x13, 0x17, 0x4f, 0x13, 0x17, 0x4f, +0x13, 0x17, 0x4e, 0x13, 0x16, 0x4e, 0x12, 0x16, 0x4c, 0x12, 0x16, 0x4c, +0x12, 0x16, 0x4c, 0x12, 0x15, 0x4b, 0x12, 0x15, 0x4a, 0x11, 0x14, 0x49, +0x11, 0x14, 0x48, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, 0x10, 0x14, 0x47, +0x10, 0x14, 0x47, 0x10, 0x12, 0x45, 0x10, 0x12, 0x45, 0x10, 0x12, 0x44, +0x10, 0x12, 0x43, 0x10, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0e, 0x11, 0x42, +0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x40, 0x0e, 0x11, 0x40, +0x0e, 0x10, 0x3f, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3f, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x13, 0x17, 0x48, 0x27, 0x2d, 0x90, 0x28, 0x2e, 0x96, 0x23, 0x28, 0x80, +0x20, 0x25, 0x78, 0x20, 0x26, 0x78, 0x21, 0x27, 0x7a, 0x22, 0x28, 0x7c, +0x23, 0x2a, 0x7e, 0x24, 0x2a, 0x80, 0x26, 0x2c, 0x81, 0x27, 0x2e, 0x83, +0x28, 0x2f, 0x85, 0x29, 0x31, 0x87, 0x2b, 0x32, 0x89, 0x2e, 0x34, 0x8b, +0x2d, 0x34, 0x8d, 0x2e, 0x34, 0x90, 0x2e, 0x35, 0x91, 0x2d, 0x34, 0x94, +0x2d, 0x34, 0x96, 0x2d, 0x34, 0x99, 0x2d, 0x35, 0x9b, 0x2d, 0x35, 0x9e, +0x2c, 0x35, 0xa0, 0x2f, 0x36, 0xa4, 0x30, 0x39, 0xa6, 0x33, 0x3c, 0xa9, +0x36, 0x3e, 0xab, 0x39, 0x42, 0xae, 0x3d, 0x46, 0xb1, 0x41, 0x4b, 0xb5, +0x69, 0x70, 0x91, 0x7a, 0x7f, 0x71, 0xac, 0xaa, 0x30, 0xa5, 0xa3, 0x21, +0xa3, 0xa0, 0x1d, 0xaf, 0xae, 0x38, 0xb3, 0xb3, 0x49, 0xaf, 0xaf, 0x4a, +0xae, 0xad, 0x4c, 0x80, 0x86, 0x93, 0x81, 0x87, 0x7e, 0x0d, 0x12, 0x30, +0x53, 0x61, 0xe0, 0x3a, 0x46, 0xe0, 0x30, 0x3c, 0xe0, 0x43, 0x51, 0xdf, +0x48, 0x55, 0xa6, 0x13, 0x19, 0x3c, 0x15, 0x1a, 0x3f, 0x16, 0x1c, 0x42, +0x18, 0x1e, 0x45, 0x1a, 0x21, 0x49, 0x4b, 0x58, 0xa7, 0x5c, 0x6c, 0xd6, +0x21, 0x28, 0x53, 0x24, 0x2b, 0x57, 0x27, 0x2e, 0x5b, 0x34, 0x3d, 0x72, +0x29, 0x30, 0x60, 0x29, 0x30, 0x61, 0x29, 0x30, 0x62, 0x28, 0x30, 0x62, +0x27, 0x2f, 0x62, 0x50, 0x55, 0x4e, 0x66, 0x69, 0x43, 0xa6, 0xa4, 0x25, +0xa5, 0xa3, 0x25, 0xa5, 0xa3, 0x24, 0xa4, 0xa2, 0x23, 0x8d, 0x8d, 0x2c, +0x60, 0x63, 0x3c, 0x32, 0x37, 0x4b, 0x1a, 0x21, 0x51, 0x19, 0x20, 0x4f, +0x17, 0x1e, 0x4c, 0x16, 0x1d, 0x49, 0x15, 0x1b, 0x47, 0x15, 0x1b, 0x46, +0x16, 0x1c, 0x45, 0x16, 0x1c, 0x44, 0x34, 0x3e, 0x78, 0x18, 0x1d, 0x43, +0x18, 0x1e, 0x42, 0x19, 0x1e, 0x41, 0x18, 0x1e, 0x40, 0x18, 0x1d, 0x3e, +0x5c, 0x6b, 0xd3, 0x60, 0x6e, 0xe7, 0x58, 0x65, 0xc8, 0x46, 0x50, 0x97, +0x5f, 0x6d, 0xe2, 0x4d, 0x5a, 0xdf, 0x40, 0x4b, 0xdb, 0x3a, 0x45, 0xd6, +0x3b, 0x46, 0xd2, 0x3c, 0x47, 0xce, 0x3e, 0x49, 0xca, 0x3f, 0x49, 0xc6, +0x3f, 0x49, 0xc2, 0x3f, 0x4b, 0xbf, 0x41, 0x4a, 0xbb, 0x40, 0x49, 0xb8, +0x40, 0x49, 0xb4, 0x3e, 0x47, 0xb0, 0x3a, 0x44, 0xad, 0x39, 0x41, 0xaa, +0x36, 0x3f, 0xa7, 0x35, 0x3d, 0xa5, 0x33, 0x3b, 0xa1, 0x31, 0x39, 0x9f, +0x2e, 0x36, 0x9c, 0x2c, 0x34, 0x9a, 0x2a, 0x32, 0x97, 0x28, 0x30, 0x95, +0x27, 0x2e, 0x92, 0xd0, 0xca, 0x16, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, +0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xcf, 0xca, 0x15, +0x22, 0x29, 0x82, 0x22, 0x29, 0x80, 0x22, 0x29, 0x7e, 0x22, 0x29, 0x7c, +0x23, 0x29, 0x7a, 0x23, 0x29, 0x78, 0x23, 0x29, 0x78, 0x23, 0x29, 0x76, +0x23, 0x28, 0x74, 0x23, 0x28, 0x73, 0x22, 0x28, 0x71, 0x21, 0x27, 0x6f, +0x21, 0x26, 0x6e, 0x20, 0x25, 0x6d, 0x1f, 0x24, 0x6b, 0x1e, 0x24, 0x6a, +0x1d, 0x23, 0x68, 0x1d, 0x23, 0x67, 0x1c, 0x22, 0x66, 0x1c, 0x22, 0x65, +0x1b, 0x21, 0x65, 0x1a, 0x20, 0x63, 0x19, 0x1f, 0x62, 0x19, 0x1f, 0x61, +0x19, 0x1e, 0x5f, 0x19, 0x1e, 0x5f, 0x19, 0x1d, 0x5e, 0x18, 0x1d, 0x5d, +0x18, 0x1c, 0x5c, 0x17, 0x1c, 0x5b, 0x17, 0x1c, 0x5a, 0x17, 0x1b, 0x59, +0x17, 0x1b, 0x58, 0x16, 0x1a, 0x57, 0x16, 0x1a, 0x56, 0x15, 0x19, 0x55, +0x15, 0x19, 0x55, 0x15, 0x18, 0x54, 0x15, 0x18, 0x53, 0x14, 0x18, 0x52, +0x14, 0x17, 0x51, 0x14, 0x17, 0x51, 0x13, 0x17, 0x50, 0x13, 0x17, 0x4f, +0x12, 0x16, 0x4e, 0x12, 0x16, 0x4e, 0x12, 0x16, 0x4c, 0x12, 0x15, 0x4c, +0x12, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x15, 0x4a, 0x11, 0x14, 0x49, +0x11, 0x14, 0x48, 0x11, 0x14, 0x48, 0x10, 0x14, 0x47, 0x10, 0x13, 0x47, +0x10, 0x13, 0x47, 0x10, 0x12, 0x45, 0x10, 0x12, 0x45, 0x0f, 0x12, 0x44, +0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0e, 0x11, 0x42, +0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x10, 0x40, 0x0e, 0x10, 0x40, +0x0e, 0x10, 0x40, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3f, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3e, 0x0d, 0x0f, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x14, 0x17, 0x48, 0x28, 0x2f, 0x90, 0x29, 0x32, 0x97, 0x23, 0x2a, 0x80, +0x20, 0x26, 0x78, 0x20, 0x26, 0x79, 0x20, 0x27, 0x7b, 0x20, 0x26, 0x7c, +0x21, 0x28, 0x7e, 0x22, 0x29, 0x80, 0x24, 0x2a, 0x81, 0x25, 0x2b, 0x83, +0x26, 0x2d, 0x86, 0x28, 0x2e, 0x88, 0x29, 0x30, 0x8a, 0x2a, 0x32, 0x8c, +0x2d, 0x33, 0x8e, 0x2e, 0x35, 0x90, 0x30, 0x38, 0x92, 0x31, 0x39, 0x95, +0x31, 0x39, 0x97, 0x30, 0x39, 0x9a, 0x31, 0x39, 0x9c, 0x30, 0x39, 0x9f, +0x2f, 0x38, 0xa1, 0x2f, 0x38, 0xa4, 0x2f, 0x38, 0xa7, 0x30, 0x39, 0xaa, +0x32, 0x3b, 0xad, 0x70, 0x73, 0x77, 0xac, 0xaa, 0x40, 0xc7, 0xc5, 0x18, +0xd1, 0xca, 0x1a, 0xd7, 0xd0, 0x1c, 0xde, 0xd7, 0x1d, 0xcf, 0xc9, 0x1a, +0xdb, 0xd4, 0x1c, 0xdc, 0xda, 0x1d, 0xc7, 0xc5, 0x18, 0xcc, 0xc6, 0x19, +0xd7, 0xd5, 0x1c, 0xdf, 0xd9, 0x22, 0xd1, 0xcf, 0x1a, 0xdf, 0xd9, 0x22, +0xcd, 0xc7, 0x0b, 0x99, 0x9a, 0x3f, 0x69, 0x72, 0xaf, 0x33, 0x40, 0xde, +0x45, 0x53, 0xde, 0x3d, 0x48, 0x8b, 0x15, 0x1b, 0x40, 0x17, 0x1d, 0x44, +0x19, 0x1f, 0x47, 0x1b, 0x21, 0x4a, 0x1d, 0x24, 0x4e, 0x3a, 0x46, 0x82, +0x54, 0x63, 0xbc, 0x25, 0x2c, 0x5b, 0x29, 0x30, 0x60, 0x2d, 0x34, 0x65, +0x35, 0x3e, 0x74, 0x2d, 0x35, 0x69, 0x55, 0x5a, 0x53, 0x92, 0x93, 0x33, +0xd0, 0xcb, 0x12, 0xe6, 0xdf, 0x37, 0xe3, 0xe1, 0x32, 0xdf, 0xd9, 0x22, +0xe0, 0xd9, 0x23, 0xe0, 0xd9, 0x23, 0xde, 0xd8, 0x1f, 0xd4, 0xcd, 0x1b, +0xd9, 0xd2, 0x1c, 0xde, 0xdb, 0x1d, 0xb8, 0xb5, 0x18, 0x74, 0x75, 0x31, +0x18, 0x20, 0x4f, 0x17, 0x1e, 0x4c, 0x16, 0x1d, 0x4b, 0x17, 0x1e, 0x4a, +0x18, 0x1f, 0x4a, 0x19, 0x1f, 0x49, 0x1a, 0x20, 0x48, 0x1b, 0x21, 0x48, +0x1b, 0x21, 0x47, 0x1b, 0x21, 0x45, 0x1a, 0x1f, 0x43, 0x56, 0x63, 0xbe, +0x50, 0x5c, 0xaf, 0x38, 0x41, 0x78, 0x2a, 0x31, 0x5d, 0x5d, 0x6b, 0xe7, +0x49, 0x55, 0xe6, 0x3c, 0x47, 0xe1, 0x3e, 0x49, 0xdd, 0x40, 0x4b, 0xd8, +0x42, 0x4d, 0xd4, 0x43, 0x4e, 0xd0, 0x43, 0x4f, 0xcc, 0x44, 0x4f, 0xc8, +0x45, 0x4f, 0xc4, 0x44, 0x4e, 0xc0, 0x43, 0x4e, 0xbc, 0x41, 0x4b, 0xb9, +0x3f, 0x47, 0xb5, 0x3b, 0x45, 0xb2, 0x39, 0x42, 0xae, 0x38, 0x40, 0xab, +0x35, 0x3e, 0xa8, 0x34, 0x3b, 0xa5, 0x30, 0x38, 0xa2, 0x2e, 0x36, 0x9f, +0x2c, 0x34, 0x9d, 0x29, 0x31, 0x9a, 0x27, 0x2f, 0x98, 0x27, 0x2d, 0x95, +0x65, 0x67, 0x64, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, +0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, +0x25, 0x2b, 0x82, 0x26, 0x2c, 0x80, 0x26, 0x2b, 0x7e, 0x25, 0x2b, 0x7c, +0x26, 0x2c, 0x7b, 0x26, 0x2c, 0x79, 0x25, 0x2b, 0x78, 0x24, 0x2a, 0x76, +0x23, 0x29, 0x75, 0x22, 0x28, 0x73, 0x22, 0x27, 0x71, 0x21, 0x26, 0x70, +0x20, 0x25, 0x6e, 0x1f, 0x24, 0x6d, 0x1e, 0x24, 0x6c, 0x1d, 0x23, 0x6a, +0x1d, 0x23, 0x69, 0x1c, 0x22, 0x67, 0x1c, 0x22, 0x66, 0x1b, 0x21, 0x65, +0x1a, 0x20, 0x64, 0x1a, 0x1f, 0x63, 0x19, 0x1f, 0x62, 0x19, 0x1e, 0x61, +0x19, 0x1e, 0x5f, 0x19, 0x1d, 0x5f, 0x18, 0x1c, 0x5e, 0x18, 0x1c, 0x5d, +0x17, 0x1c, 0x5c, 0x17, 0x1b, 0x5b, 0x17, 0x1b, 0x5a, 0x16, 0x1a, 0x59, +0x16, 0x1a, 0x58, 0x15, 0x19, 0x57, 0x15, 0x19, 0x56, 0x15, 0x19, 0x56, +0x15, 0x18, 0x55, 0x15, 0x18, 0x54, 0x14, 0x18, 0x53, 0x14, 0x17, 0x52, +0x14, 0x17, 0x52, 0x13, 0x17, 0x51, 0x13, 0x17, 0x50, 0x12, 0x16, 0x4f, +0x12, 0x16, 0x4f, 0x12, 0x16, 0x4e, 0x12, 0x16, 0x4d, 0x12, 0x15, 0x4c, +0x12, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x14, 0x4a, 0x11, 0x14, 0x4a, +0x11, 0x14, 0x48, 0x11, 0x14, 0x48, 0x10, 0x13, 0x47, 0x10, 0x13, 0x47, +0x10, 0x13, 0x47, 0x10, 0x12, 0x45, 0x10, 0x12, 0x45, 0x0f, 0x12, 0x44, +0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0e, 0x11, 0x42, +0x0e, 0x11, 0x42, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x10, 0x40, +0x0e, 0x10, 0x40, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3f, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3e, 0x0d, 0x0f, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x15, 0x19, 0x48, 0x2b, 0x31, 0x90, 0x2c, 0x34, 0x97, 0x26, 0x2c, 0x81, +0x22, 0x28, 0x78, 0x22, 0x28, 0x79, 0x22, 0x29, 0x7b, 0x22, 0x29, 0x7d, +0x22, 0x29, 0x7f, 0x22, 0x29, 0x81, 0x22, 0x29, 0x82, 0x23, 0x2a, 0x84, +0x24, 0x2b, 0x86, 0x26, 0x2d, 0x89, 0x27, 0x2e, 0x8a, 0x28, 0x2f, 0x8c, +0x2a, 0x32, 0x8f, 0x2c, 0x33, 0x90, 0x2d, 0x34, 0x93, 0x2f, 0x38, 0x96, +0x32, 0x39, 0x98, 0x33, 0x3c, 0x9b, 0x34, 0x3d, 0x9d, 0x34, 0x3c, 0xa0, +0x34, 0x3d, 0xa3, 0x34, 0x3c, 0xa5, 0x33, 0x3c, 0xa8, 0x82, 0x83, 0x62, +0xd1, 0xcc, 0x1a, 0xd9, 0xd2, 0x1c, 0xdb, 0xd4, 0x1c, 0xdf, 0xd8, 0x20, +0xcb, 0xc4, 0x18, 0xcf, 0xc9, 0x1a, 0xdd, 0xd6, 0x1c, 0xde, 0xd7, 0x1d, +0xdf, 0xd8, 0x20, 0xd2, 0xcc, 0x1b, 0xc6, 0xc4, 0x17, 0xc0, 0xba, 0x15, +0xd1, 0xcf, 0x1a, 0xe0, 0xda, 0x25, 0xe6, 0xdf, 0x37, 0xdf, 0xd9, 0x22, +0xdc, 0xda, 0x1d, 0xcf, 0xc9, 0x1a, 0x9e, 0x9b, 0x16, 0x58, 0x68, 0xdd, +0x3c, 0x4a, 0xdd, 0x46, 0x55, 0xdd, 0x32, 0x3c, 0x76, 0x17, 0x1d, 0x45, +0x19, 0x20, 0x49, 0x1c, 0x22, 0x4d, 0x1e, 0x25, 0x51, 0x21, 0x28, 0x56, +0x27, 0x2f, 0x60, 0x27, 0x2f, 0x60, 0x2b, 0x33, 0x65, 0x2f, 0x37, 0x6b, +0x45, 0x4c, 0x63, 0xaa, 0xa8, 0x2a, 0xe6, 0xdf, 0x37, 0xe6, 0xe0, 0x39, +0xe6, 0xe4, 0x3b, 0xea, 0xe4, 0x45, 0xe3, 0xe1, 0x32, 0xdf, 0xd9, 0x22, +0xd1, 0xcf, 0x1a, 0xdf, 0xd8, 0x20, 0xd2, 0xcc, 0x1b, 0xdc, 0xda, 0x1d, +0xde, 0xdb, 0x1d, 0xdf, 0xd8, 0x20, 0xe0, 0xda, 0x25, 0xdf, 0xd9, 0x22, +0xce, 0xc9, 0x0f, 0x45, 0x49, 0x3f, 0x19, 0x21, 0x50, 0x1b, 0x22, 0x50, +0x1c, 0x22, 0x4f, 0x1d, 0x23, 0x4e, 0x1e, 0x24, 0x4e, 0x1e, 0x24, 0x4c, +0x1e, 0x24, 0x4b, 0x1c, 0x22, 0x47, 0x49, 0x55, 0x9d, 0x2d, 0x35, 0x64, +0x18, 0x1d, 0x3f, 0x32, 0x3b, 0x6e, 0x5a, 0x69, 0xe6, 0x47, 0x53, 0xe6, +0x41, 0x4c, 0xe6, 0x43, 0x4f, 0xe5, 0x44, 0x51, 0xdf, 0x47, 0x52, 0xdb, +0x48, 0x54, 0xd6, 0x49, 0x55, 0xd2, 0x49, 0x55, 0xce, 0x49, 0x54, 0xca, +0x48, 0x53, 0xc5, 0x44, 0x4f, 0xc1, 0x42, 0x4c, 0xbd, 0x40, 0x49, 0xba, +0x3c, 0x46, 0xb6, 0x3a, 0x44, 0xb3, 0x38, 0x41, 0xb0, 0x35, 0x3d, 0xad, +0x32, 0x3b, 0xa9, 0x2f, 0x37, 0xa6, 0x2d, 0x35, 0xa4, 0x2a, 0x33, 0xa0, +0x29, 0x31, 0x9e, 0x27, 0x2e, 0x9b, 0x27, 0x2e, 0x98, 0x27, 0x2e, 0x96, +0x66, 0x69, 0x64, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, +0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xd0, 0xca, 0x15, +0x29, 0x30, 0x82, 0x28, 0x2f, 0x81, 0x28, 0x2f, 0x7f, 0x27, 0x2d, 0x7d, +0x26, 0x2c, 0x7b, 0x25, 0x2b, 0x79, 0x24, 0x2a, 0x77, 0x23, 0x29, 0x76, +0x22, 0x27, 0x75, 0x21, 0x26, 0x73, 0x21, 0x26, 0x72, 0x20, 0x25, 0x70, +0x1f, 0x25, 0x6f, 0x1e, 0x24, 0x6d, 0x1d, 0x24, 0x6c, 0x1d, 0x23, 0x6a, +0x1c, 0x22, 0x69, 0x1c, 0x21, 0x68, 0x1b, 0x21, 0x66, 0x1b, 0x20, 0x65, +0x1a, 0x1f, 0x64, 0x1a, 0x1f, 0x63, 0x19, 0x1e, 0x62, 0x19, 0x1e, 0x62, +0x19, 0x1d, 0x5f, 0x18, 0x1d, 0x5f, 0x18, 0x1c, 0x5e, 0x17, 0x1c, 0x5d, +0x17, 0x1b, 0x5c, 0x16, 0x1b, 0x5b, 0x16, 0x1a, 0x5a, 0x16, 0x1a, 0x59, +0x15, 0x19, 0x58, 0x15, 0x19, 0x57, 0x15, 0x19, 0x57, 0x15, 0x18, 0x56, +0x14, 0x18, 0x55, 0x14, 0x18, 0x54, 0x14, 0x17, 0x53, 0x13, 0x17, 0x52, +0x13, 0x17, 0x52, 0x13, 0x17, 0x51, 0x13, 0x16, 0x50, 0x12, 0x16, 0x4f, +0x12, 0x16, 0x4f, 0x12, 0x16, 0x4e, 0x12, 0x15, 0x4d, 0x12, 0x15, 0x4d, +0x11, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x14, 0x4b, 0x11, 0x14, 0x4a, +0x10, 0x14, 0x48, 0x10, 0x14, 0x48, 0x10, 0x13, 0x47, 0x10, 0x13, 0x47, +0x10, 0x13, 0x47, 0x0f, 0x12, 0x45, 0x0f, 0x12, 0x45, 0x0f, 0x12, 0x44, +0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0e, 0x11, 0x42, +0x0e, 0x11, 0x42, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x10, 0x40, +0x0e, 0x10, 0x40, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3f, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x17, 0x1a, 0x48, 0x2d, 0x34, 0x92, 0x2f, 0x36, 0x97, 0x28, 0x2d, 0x81, +0x24, 0x2a, 0x78, 0x25, 0x2a, 0x7a, 0x25, 0x2a, 0x7b, 0x24, 0x2a, 0x7d, +0x24, 0x2a, 0x7f, 0x25, 0x2a, 0x81, 0x25, 0x2b, 0x82, 0x25, 0x2b, 0x85, +0x25, 0x2c, 0x87, 0x25, 0x2c, 0x89, 0x25, 0x2d, 0x8b, 0x27, 0x2d, 0x8d, +0x28, 0x2f, 0x90, 0x29, 0x30, 0x91, 0x2b, 0x33, 0x94, 0x2d, 0x34, 0x96, +0x2f, 0x36, 0x99, 0x30, 0x38, 0x9b, 0x33, 0x3a, 0x9e, 0x35, 0x3e, 0xa0, +0x38, 0x41, 0xa4, 0x72, 0x76, 0x71, 0xd2, 0xcd, 0x19, 0xdf, 0xd9, 0x22, +0xe0, 0xde, 0x25, 0xd1, 0xcf, 0x1a, 0xdc, 0xda, 0x1d, 0xde, 0xdc, 0x1f, +0xde, 0xdc, 0x1f, 0xd4, 0xcd, 0x1b, 0xad, 0xac, 0x46, 0x8a, 0x8e, 0x72, +0x7c, 0x81, 0x8a, 0x80, 0x87, 0x8d, 0x82, 0x87, 0x84, 0x9a, 0x9b, 0x43, +0xce, 0xc9, 0x0d, 0xe0, 0xde, 0x25, 0xd4, 0xcd, 0x1b, 0xdb, 0xd4, 0x1c, +0xd9, 0xd2, 0x1c, 0xcf, 0xc9, 0x1a, 0x8d, 0x8c, 0x28, 0x11, 0x16, 0x3a, +0x1b, 0x22, 0x4d, 0x49, 0x59, 0xdb, 0x47, 0x56, 0xda, 0x26, 0x2e, 0x5f, +0x19, 0x20, 0x4b, 0x1c, 0x22, 0x4f, 0x1f, 0x26, 0x54, 0x22, 0x2a, 0x59, +0x26, 0x2d, 0x5e, 0x29, 0x31, 0x64, 0x2d, 0x35, 0x6a, 0x81, 0x83, 0x42, +0xde, 0xd7, 0x1d, 0xe1, 0xda, 0x26, 0xe4, 0xe2, 0x35, 0xe5, 0xdf, 0x36, +0xe1, 0xda, 0x26, 0xe8, 0xe2, 0x3f, 0xe1, 0xdb, 0x28, 0xbe, 0xbb, 0x21, +0xaa, 0xa8, 0x2d, 0xa9, 0xa7, 0x2c, 0xd4, 0xcd, 0x1b, 0xdf, 0xd8, 0x20, +0xd2, 0xcc, 0x1b, 0xde, 0xdb, 0x1d, 0xe2, 0xe0, 0x2d, 0xe1, 0xdf, 0x2a, +0xe3, 0xdd, 0x30, 0xdf, 0xd8, 0x20, 0x76, 0x77, 0x32, 0x1f, 0x26, 0x56, +0x20, 0x27, 0x56, 0x21, 0x27, 0x54, 0x22, 0x28, 0x53, 0x22, 0x28, 0x51, +0x20, 0x26, 0x4e, 0x1e, 0x24, 0x4a, 0x1c, 0x22, 0x47, 0x1a, 0x1f, 0x43, +0x3e, 0x48, 0x85, 0x57, 0x66, 0xe6, 0x49, 0x56, 0xe6, 0x4a, 0x57, 0xe6, +0x4b, 0x58, 0xe6, 0x4c, 0x58, 0xe6, 0x4c, 0x59, 0xe2, 0x4e, 0x5b, 0xdd, +0x4e, 0x5b, 0xd8, 0x4f, 0x5b, 0xd4, 0x4d, 0x59, 0xcf, 0x49, 0x54, 0xcb, +0x45, 0x51, 0xc7, 0x43, 0x4e, 0xc2, 0x41, 0x4a, 0xbf, 0x3d, 0x47, 0xbb, +0x39, 0x43, 0xb8, 0x35, 0x3f, 0xb4, 0x33, 0x3c, 0xb0, 0x30, 0x39, 0xad, +0x2e, 0x36, 0xaa, 0x2b, 0x34, 0xa7, 0x2a, 0x32, 0xa4, 0x29, 0x30, 0xa1, +0x29, 0x31, 0x9e, 0x2a, 0x32, 0x9c, 0x2b, 0x32, 0x99, 0x2b, 0x32, 0x97, +0x3f, 0x45, 0x84, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, +0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0x7d, 0x7d, 0x4d, +0x29, 0x30, 0x82, 0x28, 0x2e, 0x81, 0x27, 0x2d, 0x7f, 0x26, 0x2c, 0x7d, +0x25, 0x2b, 0x7b, 0x24, 0x2a, 0x7a, 0x23, 0x29, 0x78, 0x22, 0x28, 0x77, +0x21, 0x27, 0x75, 0x20, 0x26, 0x74, 0x20, 0x25, 0x72, 0x1f, 0x25, 0x71, +0x1e, 0x24, 0x6f, 0x1d, 0x23, 0x6e, 0x1d, 0x23, 0x6c, 0x1c, 0x22, 0x6b, +0x1c, 0x21, 0x69, 0x1c, 0x21, 0x68, 0x1b, 0x20, 0x67, 0x1b, 0x1f, 0x65, +0x1a, 0x1f, 0x65, 0x1a, 0x1e, 0x63, 0x19, 0x1e, 0x63, 0x19, 0x1d, 0x62, +0x18, 0x1d, 0x60, 0x18, 0x1c, 0x5f, 0x17, 0x1b, 0x5e, 0x17, 0x1b, 0x5d, +0x16, 0x1a, 0x5c, 0x16, 0x1a, 0x5b, 0x16, 0x1a, 0x5a, 0x15, 0x19, 0x59, +0x15, 0x19, 0x59, 0x15, 0x19, 0x58, 0x14, 0x19, 0x57, 0x14, 0x18, 0x56, +0x14, 0x18, 0x55, 0x14, 0x17, 0x54, 0x13, 0x17, 0x53, 0x13, 0x17, 0x53, +0x13, 0x17, 0x52, 0x13, 0x16, 0x51, 0x12, 0x16, 0x50, 0x12, 0x16, 0x4f, +0x12, 0x16, 0x4f, 0x12, 0x15, 0x4e, 0x11, 0x15, 0x4d, 0x11, 0x15, 0x4d, +0x11, 0x15, 0x4c, 0x11, 0x14, 0x4b, 0x11, 0x14, 0x4b, 0x11, 0x14, 0x4a, +0x10, 0x14, 0x48, 0x10, 0x14, 0x48, 0x10, 0x13, 0x48, 0x10, 0x13, 0x48, +0x10, 0x13, 0x47, 0x0f, 0x12, 0x45, 0x0f, 0x12, 0x45, 0x0f, 0x12, 0x44, +0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0e, 0x11, 0x42, +0x0e, 0x11, 0x42, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x10, 0x40, +0x0e, 0x10, 0x40, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3f, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x17, 0x1a, 0x48, 0x2f, 0x36, 0x92, 0x31, 0x3a, 0x98, 0x2a, 0x30, 0x81, +0x26, 0x2c, 0x78, 0x27, 0x2d, 0x7a, 0x26, 0x2d, 0x7c, 0x27, 0x2d, 0x7e, +0x27, 0x2e, 0x80, 0x27, 0x2e, 0x81, 0x27, 0x2f, 0x83, 0x28, 0x2e, 0x85, +0x28, 0x2e, 0x87, 0x28, 0x2f, 0x8a, 0x28, 0x2f, 0x8b, 0x28, 0x2f, 0x8e, +0x29, 0x2f, 0x90, 0x28, 0x2f, 0x92, 0x29, 0x30, 0x95, 0x2a, 0x32, 0x97, +0x2c, 0x34, 0x9a, 0x2e, 0x35, 0x9c, 0x30, 0x38, 0x9f, 0x44, 0x4c, 0x90, +0xaa, 0xa9, 0x3b, 0xde, 0xdb, 0x1d, 0xe1, 0xda, 0x26, 0xd7, 0xd5, 0x1c, +0xd7, 0xd5, 0x1c, 0xde, 0xdc, 0x1f, 0xd5, 0xcf, 0x1c, 0xd2, 0xcd, 0x1b, +0x86, 0x89, 0x6c, 0x3a, 0x44, 0xc2, 0x39, 0x43, 0xc6, 0x3c, 0x46, 0xcb, +0x40, 0x4c, 0xcf, 0x45, 0x51, 0xd2, 0x4c, 0x58, 0xd7, 0x54, 0x61, 0xdb, +0x52, 0x5f, 0xc3, 0x95, 0x95, 0x35, 0xb2, 0xac, 0x11, 0xd7, 0xd0, 0x1c, +0xd9, 0xd2, 0x1c, 0xe1, 0xda, 0x26, 0x87, 0x8f, 0x95, 0x2a, 0x33, 0x67, +0x12, 0x18, 0x3e, 0x14, 0x1a, 0x41, 0x50, 0x60, 0xc2, 0x49, 0x59, 0xd8, +0x19, 0x20, 0x4c, 0x1d, 0x24, 0x52, 0x20, 0x27, 0x56, 0x23, 0x2b, 0x5c, +0x27, 0x2f, 0x62, 0x2b, 0x33, 0x69, 0xa9, 0xa7, 0x2a, 0xe1, 0xda, 0x26, +0xe4, 0xde, 0x31, 0xe6, 0xe4, 0x39, 0xe0, 0xde, 0x25, 0xdf, 0xd8, 0x20, +0xe3, 0xdd, 0x30, 0x87, 0x8a, 0x4f, 0x3c, 0x46, 0x8a, 0x3b, 0x45, 0x89, +0x39, 0x43, 0x86, 0x34, 0x3e, 0x81, 0x30, 0x3a, 0x7c, 0x7e, 0x80, 0x45, +0xe1, 0xdb, 0x2a, 0xe0, 0xde, 0x25, 0xe0, 0xd9, 0x23, 0xe1, 0xda, 0x26, +0xe2, 0xdc, 0x2d, 0xe3, 0xdd, 0x2e, 0xde, 0xdb, 0x1d, 0x8f, 0x8e, 0x2d, +0x25, 0x2c, 0x5c, 0x26, 0x2e, 0x5c, 0x26, 0x2c, 0x59, 0x23, 0x2a, 0x55, +0x21, 0x27, 0x50, 0x1f, 0x25, 0x4c, 0x1d, 0x22, 0x48, 0x4b, 0x58, 0xa3, +0x54, 0x63, 0xe5, 0x52, 0x61, 0xe5, 0x54, 0x61, 0xe5, 0x55, 0x63, 0xe5, +0x55, 0x64, 0xe6, 0x55, 0x64, 0xe6, 0x54, 0x62, 0xe4, 0x56, 0x63, 0xdf, +0x52, 0x5f, 0xda, 0x4e, 0x5a, 0xd5, 0x4b, 0x57, 0xd1, 0x47, 0x52, 0xcd, +0x44, 0x4f, 0xc8, 0x3f, 0x4a, 0xc4, 0x3b, 0x46, 0xc0, 0x37, 0x41, 0xbc, +0x34, 0x3d, 0xb8, 0x31, 0x3a, 0xb5, 0x2f, 0x38, 0xb2, 0x2b, 0x34, 0xae, +0x2c, 0x35, 0xaa, 0x2d, 0x35, 0xa8, 0x2d, 0x36, 0xa5, 0x2e, 0x36, 0xa2, +0x2f, 0x36, 0x9f, 0x30, 0x37, 0x9c, 0x30, 0x37, 0x9a, 0x30, 0x38, 0x97, +0x30, 0x38, 0x95, 0x6d, 0x6f, 0x63, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, +0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0x91, 0x91, 0x40, 0x29, 0x30, 0x85, +0x27, 0x2f, 0x83, 0x26, 0x2d, 0x81, 0x26, 0x2c, 0x7f, 0x25, 0x2b, 0x7e, +0x24, 0x29, 0x7c, 0x23, 0x29, 0x7a, 0x22, 0x28, 0x78, 0x21, 0x27, 0x76, +0x20, 0x26, 0x75, 0x1f, 0x26, 0x74, 0x1f, 0x25, 0x72, 0x1e, 0x24, 0x71, +0x1d, 0x23, 0x6f, 0x1d, 0x23, 0x6e, 0x1c, 0x22, 0x6c, 0x1c, 0x21, 0x6b, +0x1c, 0x21, 0x6a, 0x1b, 0x20, 0x68, 0x1a, 0x1f, 0x67, 0x1a, 0x1e, 0x66, +0x19, 0x1e, 0x65, 0x19, 0x1d, 0x64, 0x19, 0x1d, 0x63, 0x18, 0x1c, 0x62, +0x18, 0x1c, 0x60, 0x17, 0x1b, 0x60, 0x17, 0x1b, 0x5f, 0x17, 0x1a, 0x5e, +0x16, 0x1a, 0x5d, 0x16, 0x1a, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x1a, 0x5a, +0x15, 0x19, 0x59, 0x14, 0x19, 0x58, 0x14, 0x18, 0x57, 0x14, 0x18, 0x56, +0x14, 0x17, 0x55, 0x13, 0x17, 0x54, 0x13, 0x17, 0x53, 0x13, 0x17, 0x53, +0x13, 0x16, 0x52, 0x12, 0x16, 0x51, 0x12, 0x15, 0x50, 0x12, 0x15, 0x50, +0x12, 0x15, 0x4f, 0x12, 0x15, 0x4e, 0x11, 0x15, 0x4d, 0x11, 0x15, 0x4d, +0x11, 0x15, 0x4c, 0x11, 0x14, 0x4b, 0x11, 0x14, 0x4b, 0x11, 0x14, 0x4a, +0x10, 0x14, 0x48, 0x10, 0x14, 0x48, 0x10, 0x13, 0x48, 0x10, 0x13, 0x48, +0x10, 0x13, 0x47, 0x10, 0x13, 0x46, 0x10, 0x13, 0x45, 0x0f, 0x13, 0x44, +0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0f, 0x12, 0x43, +0x0e, 0x11, 0x42, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x10, 0x40, +0x0e, 0x10, 0x40, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3f, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x14, 0x18, 0x48, 0x2b, 0x32, 0x92, 0x2e, 0x35, 0x98, 0x28, 0x2e, 0x82, +0x26, 0x2b, 0x79, 0x26, 0x2d, 0x7a, 0x28, 0x2f, 0x7c, 0x2a, 0x30, 0x7e, +0x2a, 0x31, 0x80, 0x2b, 0x31, 0x81, 0x2b, 0x31, 0x83, 0x2b, 0x32, 0x86, +0x2b, 0x32, 0x88, 0x2b, 0x32, 0x8a, 0x2b, 0x32, 0x8c, 0x2b, 0x32, 0x8e, +0x2c, 0x33, 0x90, 0x2c, 0x33, 0x93, 0x2c, 0x34, 0x96, 0x2b, 0x33, 0x97, +0x2b, 0x34, 0x9b, 0x2c, 0x34, 0x9d, 0x41, 0x47, 0x8f, 0xd1, 0xcb, 0x18, +0xd5, 0xcf, 0x1c, 0xd7, 0xd0, 0x1c, 0xde, 0xdc, 0x1f, 0xe1, 0xdf, 0x2a, +0xd1, 0xcf, 0x1a, 0xd7, 0xd0, 0x1c, 0x8a, 0x8d, 0x6a, 0x45, 0x4e, 0xbd, +0x44, 0x4e, 0xc0, 0x42, 0x4d, 0xc4, 0x41, 0x4c, 0xc8, 0x40, 0x4b, 0xcc, +0x3e, 0x49, 0xd0, 0x3d, 0x49, 0xd5, 0x42, 0x4e, 0xd9, 0x49, 0x56, 0xdd, +0x51, 0x5e, 0xe2, 0x89, 0x90, 0x97, 0xdd, 0xd6, 0x1c, 0xd9, 0xd2, 0x1c, +0xdf, 0xd8, 0x20, 0xe2, 0xe0, 0x2d, 0x3f, 0x42, 0x2f, 0x1f, 0x27, 0x54, +0x34, 0x3f, 0x7d, 0x14, 0x1a, 0x43, 0x15, 0x1c, 0x46, 0x17, 0x1e, 0x4a, +0x4c, 0x5e, 0xd6, 0x1d, 0x24, 0x54, 0x1f, 0x27, 0x59, 0x24, 0x2c, 0x5f, +0x28, 0x31, 0x66, 0xa8, 0xa6, 0x29, 0xde, 0xdb, 0x1d, 0xe2, 0xdc, 0x2b, +0xe0, 0xde, 0x25, 0xe4, 0xde, 0x31, 0xe1, 0xdb, 0x2a, 0xd4, 0xcf, 0x17, +0x59, 0x61, 0x88, 0x46, 0x51, 0x99, 0x45, 0x50, 0x99, 0x43, 0x4e, 0x98, +0x40, 0x4b, 0x94, 0x3b, 0x46, 0x8e, 0x35, 0x40, 0x87, 0x31, 0x3b, 0x81, +0x40, 0x48, 0x6d, 0xd0, 0xcb, 0x13, 0xd9, 0xd2, 0x1c, 0xe1, 0xdb, 0x2a, +0xde, 0xd7, 0x1d, 0xde, 0xdc, 0x1f, 0xe2, 0xe0, 0x2b, 0xe1, 0xdb, 0x28, +0x6a, 0x6c, 0x45, 0x2b, 0x32, 0x62, 0x28, 0x2f, 0x5c, 0x24, 0x2b, 0x57, +0x22, 0x29, 0x53, 0x20, 0x26, 0x4f, 0x55, 0x63, 0xbc, 0x5c, 0x6c, 0xe4, +0x5e, 0x6d, 0xe4, 0x60, 0x70, 0xe5, 0x60, 0x6f, 0xe3, 0x60, 0x6f, 0xe4, +0x60, 0x6e, 0xe4, 0x5f, 0x6e, 0xe4, 0x5a, 0x68, 0xe6, 0x53, 0x60, 0xe1, +0x4f, 0x5c, 0xdc, 0x4b, 0x57, 0xd7, 0x47, 0x53, 0xd2, 0x41, 0x4d, 0xce, +0x3c, 0x48, 0xc9, 0x38, 0x42, 0xc5, 0x36, 0x3f, 0xc1, 0x32, 0x3c, 0xbd, +0x2f, 0x38, 0xb9, 0x2f, 0x38, 0xb5, 0x30, 0x3a, 0xb2, 0x32, 0x3a, 0xaf, +0x32, 0x3b, 0xac, 0x33, 0x3c, 0xa9, 0x34, 0x3c, 0xa6, 0x34, 0x3d, 0xa2, +0x35, 0x3d, 0xa0, 0x35, 0x3e, 0x9d, 0x35, 0x3e, 0x9b, 0x33, 0x3b, 0x97, +0x31, 0x39, 0x95, 0x2f, 0x38, 0x93, 0x2e, 0x35, 0x90, 0x6a, 0x6d, 0x61, +0x69, 0x6b, 0x5f, 0x3e, 0x44, 0x7a, 0x29, 0x30, 0x88, 0x27, 0x2e, 0x86, +0x26, 0x2d, 0x83, 0x26, 0x2c, 0x81, 0x25, 0x2b, 0x80, 0x24, 0x29, 0x7e, +0x23, 0x28, 0x7c, 0x22, 0x28, 0x7a, 0x21, 0x28, 0x79, 0x20, 0x26, 0x77, +0x1f, 0x25, 0x75, 0x1e, 0x24, 0x74, 0x1e, 0x24, 0x73, 0x1d, 0x23, 0x71, +0x1d, 0x22, 0x70, 0x1d, 0x21, 0x6e, 0x1c, 0x21, 0x6d, 0x1b, 0x20, 0x6b, +0x1b, 0x1f, 0x6a, 0x1a, 0x1f, 0x68, 0x1a, 0x1e, 0x67, 0x19, 0x1e, 0x66, +0x19, 0x1d, 0x65, 0x18, 0x1c, 0x64, 0x18, 0x1c, 0x63, 0x18, 0x1b, 0x62, +0x17, 0x1b, 0x61, 0x17, 0x1b, 0x60, 0x16, 0x1b, 0x5f, 0x16, 0x1a, 0x5e, +0x16, 0x1a, 0x5d, 0x15, 0x19, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x19, 0x5a, +0x15, 0x19, 0x59, 0x14, 0x18, 0x58, 0x14, 0x18, 0x57, 0x14, 0x17, 0x56, +0x13, 0x17, 0x55, 0x13, 0x17, 0x54, 0x13, 0x17, 0x54, 0x13, 0x17, 0x53, +0x13, 0x16, 0x52, 0x13, 0x16, 0x51, 0x12, 0x16, 0x50, 0x12, 0x16, 0x50, +0x12, 0x16, 0x4f, 0x12, 0x15, 0x4e, 0x12, 0x15, 0x4e, 0x12, 0x15, 0x4d, +0x11, 0x15, 0x4c, 0x11, 0x14, 0x4b, 0x11, 0x14, 0x4b, 0x11, 0x14, 0x4a, +0x11, 0x14, 0x49, 0x10, 0x14, 0x48, 0x10, 0x13, 0x48, 0x10, 0x13, 0x48, +0x10, 0x13, 0x47, 0x10, 0x13, 0x47, 0x10, 0x13, 0x45, 0x0f, 0x13, 0x44, +0x0f, 0x13, 0x44, 0x0f, 0x12, 0x44, 0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43, +0x0e, 0x11, 0x42, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x40, +0x0e, 0x11, 0x40, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3f, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x13, 0x16, 0x48, 0x28, 0x2e, 0x93, 0x2a, 0x32, 0x98, 0x25, 0x2b, 0x82, +0x22, 0x28, 0x79, 0x23, 0x29, 0x7b, 0x24, 0x2a, 0x7d, 0x26, 0x2c, 0x7f, +0x27, 0x2e, 0x81, 0x29, 0x30, 0x82, 0x2b, 0x31, 0x84, 0x2d, 0x34, 0x86, +0x2e, 0x36, 0x88, 0x2f, 0x36, 0x8a, 0x2f, 0x37, 0x8c, 0x30, 0x38, 0x8f, +0x30, 0x38, 0x91, 0x2f, 0x38, 0x93, 0x30, 0x38, 0x96, 0x30, 0x38, 0x98, +0x30, 0x38, 0x9b, 0x43, 0x4a, 0x8d, 0xd1, 0xcc, 0x18, 0xdf, 0xd8, 0x20, +0xe3, 0xdd, 0x30, 0xde, 0xd7, 0x1d, 0xde, 0xd8, 0x1f, 0xcc, 0xc6, 0x19, +0xd1, 0xcc, 0x1a, 0x4b, 0x54, 0xa2, 0x3c, 0x46, 0xba, 0x3f, 0x4a, 0xbe, +0x44, 0x4e, 0xc2, 0x49, 0x54, 0xc5, 0x4b, 0x57, 0xca, 0x49, 0x56, 0xce, +0x48, 0x54, 0xd2, 0x46, 0x52, 0xd6, 0x44, 0x4f, 0xda, 0x40, 0x4c, 0xdf, +0x46, 0x53, 0xe2, 0x81, 0x88, 0x98, 0xde, 0xdc, 0x1f, 0xde, 0xdc, 0x1f, +0xe1, 0xda, 0x26, 0xe2, 0xdc, 0x2d, 0x12, 0x18, 0x3d, 0x13, 0x19, 0x3f, +0x14, 0x1a, 0x42, 0x15, 0x1b, 0x45, 0x15, 0x1c, 0x48, 0x17, 0x1e, 0x4c, +0x19, 0x21, 0x50, 0x46, 0x56, 0xa8, 0x20, 0x28, 0x5b, 0x24, 0x2c, 0x62, +0xa7, 0xa5, 0x28, 0xdf, 0xd9, 0x22, 0xe1, 0xda, 0x26, 0xdd, 0xd6, 0x1c, +0xe1, 0xdb, 0x28, 0xdf, 0xd9, 0x22, 0xd5, 0xd0, 0x19, 0x64, 0x6d, 0x98, +0x53, 0x5f, 0xac, 0x51, 0x5d, 0xac, 0x4f, 0x5c, 0xab, 0x4d, 0x5a, 0xaa, +0x49, 0x55, 0xa5, 0x43, 0x4f, 0x9d, 0x3c, 0x48, 0x95, 0x35, 0x41, 0x8c, +0x2f, 0x3a, 0x83, 0x54, 0x5a, 0x62, 0xdf, 0xd8, 0x20, 0xdb, 0xd4, 0x1c, +0xe0, 0xde, 0x25, 0xde, 0xdc, 0x1f, 0xe2, 0xdc, 0x2d, 0xdf, 0xd8, 0x20, +0xd1, 0xcc, 0x12, 0x41, 0x46, 0x5a, 0x29, 0x30, 0x5f, 0x26, 0x2d, 0x5b, +0x23, 0x2a, 0x55, 0x58, 0x68, 0xc6, 0x51, 0x5f, 0xb2, 0x4d, 0x59, 0xa7, +0x46, 0x52, 0x98, 0x45, 0x51, 0x97, 0x46, 0x52, 0x99, 0x45, 0x51, 0x98, +0x57, 0x64, 0xc9, 0x5d, 0x6c, 0xe4, 0x56, 0x63, 0xe5, 0x50, 0x5d, 0xe2, +0x49, 0x56, 0xdd, 0x43, 0x4f, 0xd8, 0x3d, 0x49, 0xd4, 0x39, 0x43, 0xcf, +0x36, 0x40, 0xca, 0x32, 0x3c, 0xc6, 0x34, 0x3d, 0xc2, 0x34, 0x3e, 0xbf, +0x36, 0x3f, 0xbb, 0x37, 0x40, 0xb7, 0x39, 0x42, 0xb3, 0x39, 0x43, 0xb0, +0x3a, 0x43, 0xad, 0x3b, 0x45, 0xa9, 0x3c, 0x45, 0xa6, 0x39, 0x42, 0xa3, +0x36, 0x3f, 0xa0, 0x35, 0x3d, 0x9e, 0x32, 0x3b, 0x9a, 0x31, 0x38, 0x98, +0x2f, 0x38, 0x95, 0x2d, 0x35, 0x93, 0x2d, 0x33, 0x91, 0x2b, 0x32, 0x8f, +0x29, 0x31, 0x8c, 0x28, 0x30, 0x8a, 0x26, 0x2e, 0x87, 0x26, 0x2d, 0x86, +0x25, 0x2b, 0x84, 0x25, 0x2b, 0x82, 0x23, 0x29, 0x80, 0x22, 0x29, 0x7f, +0x21, 0x28, 0x7d, 0x20, 0x27, 0x7b, 0x1f, 0x26, 0x79, 0x1f, 0x25, 0x77, +0x1f, 0x24, 0x76, 0x1e, 0x23, 0x75, 0x1e, 0x22, 0x73, 0x1d, 0x22, 0x71, +0x1c, 0x21, 0x70, 0x1c, 0x21, 0x6e, 0x1b, 0x20, 0x6d, 0x1b, 0x1f, 0x6b, +0x1a, 0x1f, 0x6a, 0x1a, 0x1e, 0x69, 0x19, 0x1e, 0x67, 0x18, 0x1d, 0x66, +0x18, 0x1d, 0x65, 0x18, 0x1c, 0x65, 0x17, 0x1c, 0x63, 0x17, 0x1b, 0x62, +0x16, 0x1b, 0x61, 0x16, 0x1b, 0x60, 0x16, 0x1a, 0x5f, 0x15, 0x1a, 0x5e, +0x15, 0x19, 0x5d, 0x15, 0x19, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x19, 0x5a, +0x15, 0x19, 0x59, 0x14, 0x18, 0x58, 0x14, 0x18, 0x57, 0x14, 0x18, 0x56, +0x14, 0x17, 0x55, 0x13, 0x17, 0x54, 0x13, 0x17, 0x54, 0x13, 0x17, 0x53, +0x13, 0x16, 0x52, 0x13, 0x16, 0x51, 0x13, 0x16, 0x51, 0x12, 0x16, 0x50, +0x12, 0x16, 0x4f, 0x12, 0x15, 0x4e, 0x12, 0x15, 0x4e, 0x12, 0x15, 0x4d, +0x11, 0x15, 0x4c, 0x11, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x14, 0x4a, +0x11, 0x14, 0x49, 0x11, 0x14, 0x48, 0x10, 0x14, 0x48, 0x10, 0x13, 0x48, +0x10, 0x13, 0x47, 0x10, 0x13, 0x47, 0x10, 0x13, 0x45, 0x0f, 0x13, 0x44, +0x0f, 0x13, 0x44, 0x0f, 0x12, 0x44, 0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43, +0x0f, 0x11, 0x42, 0x0f, 0x11, 0x41, 0x0f, 0x11, 0x41, 0x0e, 0x11, 0x40, +0x0e, 0x11, 0x40, 0x0e, 0x10, 0x3f, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3e, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x12, 0x15, 0x48, 0x25, 0x2c, 0x93, 0x28, 0x2e, 0x99, 0x22, 0x28, 0x82, +0x1f, 0x25, 0x79, 0x20, 0x26, 0x7b, 0x21, 0x27, 0x7d, 0x22, 0x29, 0x7f, +0x24, 0x2a, 0x81, 0x25, 0x2b, 0x82, 0x26, 0x2c, 0x84, 0x28, 0x2e, 0x87, +0x29, 0x31, 0x89, 0x2c, 0x32, 0x8a, 0x2e, 0x35, 0x8d, 0x2f, 0x37, 0x8f, +0x32, 0x3a, 0x91, 0x35, 0x3e, 0x94, 0x36, 0x3d, 0x96, 0x35, 0x3e, 0x99, +0x48, 0x4f, 0x8a, 0xd1, 0xcc, 0x18, 0xd5, 0xcf, 0x1c, 0xe3, 0xdd, 0x30, +0xe1, 0xdb, 0x2a, 0xde, 0xdb, 0x1d, 0xd7, 0xd0, 0x1c, 0xd1, 0xcc, 0x1a, +0x47, 0x4e, 0xa0, 0x34, 0x3d, 0xb7, 0x36, 0x40, 0xbb, 0x39, 0x44, 0xbf, +0x3c, 0x47, 0xc2, 0x40, 0x4b, 0xc6, 0x45, 0x50, 0xcb, 0x4a, 0x57, 0xcf, +0x51, 0x5d, 0xd4, 0x53, 0x61, 0xd8, 0x51, 0x5f, 0xdd, 0x4f, 0x5c, 0xe2, +0x4d, 0x5b, 0xe2, 0x7f, 0x85, 0x98, 0xdf, 0xd9, 0x22, 0xdf, 0xd9, 0x22, +0xde, 0xdb, 0x1d, 0xcf, 0xca, 0x0f, 0x13, 0x19, 0x3e, 0x14, 0x1a, 0x41, +0x15, 0x1b, 0x44, 0x16, 0x1c, 0x47, 0x17, 0x1e, 0x4a, 0x18, 0x1f, 0x4e, +0x19, 0x21, 0x52, 0x1c, 0x24, 0x57, 0x1f, 0x27, 0x5d, 0x8f, 0x8e, 0x31, +0xe6, 0xdf, 0x37, 0xe6, 0xdf, 0x37, 0xd7, 0xd5, 0x1c, 0xdf, 0xd9, 0x22, +0xdf, 0xd9, 0x22, 0xd5, 0xd0, 0x19, 0x72, 0x7c, 0xa9, 0x64, 0x70, 0xc2, +0x62, 0x6f, 0xc3, 0x5f, 0x6c, 0xc2, 0x5e, 0x6b, 0xc3, 0x5b, 0x68, 0xc0, +0x55, 0x63, 0xba, 0x4c, 0x59, 0xaf, 0x42, 0x4f, 0xa3, 0x3b, 0x47, 0x99, +0x34, 0x40, 0x8f, 0x2e, 0x39, 0x85, 0x92, 0x93, 0x3c, 0xd1, 0xca, 0x1a, +0xde, 0xdb, 0x1d, 0xdf, 0xd8, 0x20, 0xe0, 0xde, 0x25, 0xe1, 0xda, 0x26, +0xe1, 0xdb, 0x28, 0x94, 0x93, 0x32, 0x2b, 0x32, 0x63, 0x27, 0x2e, 0x5d, +0x30, 0x39, 0x6c, 0x25, 0x2c, 0x58, 0x1f, 0x25, 0x4e, 0x1d, 0x23, 0x4a, +0x1a, 0x20, 0x46, 0x1c, 0x21, 0x48, 0x3a, 0x45, 0x80, 0x4e, 0x5b, 0xb0, +0x5b, 0x69, 0xd7, 0x56, 0x65, 0xe3, 0x4d, 0x5a, 0xe4, 0x43, 0x50, 0xe3, +0x3e, 0x4a, 0xde, 0x39, 0x44, 0xd9, 0x36, 0x40, 0xd4, 0x38, 0x42, 0xd0, +0x39, 0x44, 0xcb, 0x3c, 0x45, 0xc7, 0x3c, 0x47, 0xc2, 0x3e, 0x49, 0xbf, +0x40, 0x4b, 0xbb, 0x42, 0x4c, 0xb7, 0x42, 0x4c, 0xb3, 0x3f, 0x49, 0xb0, +0x3d, 0x46, 0xad, 0x3a, 0x43, 0xaa, 0x38, 0x42, 0xa7, 0x36, 0x3e, 0xa4, +0x33, 0x3d, 0xa1, 0x32, 0x3a, 0x9e, 0x30, 0x38, 0x9b, 0x2e, 0x36, 0x99, +0x2d, 0x34, 0x96, 0x2c, 0x33, 0x94, 0x2a, 0x32, 0x91, 0x29, 0x31, 0x8f, +0x27, 0x2f, 0x8d, 0x27, 0x2e, 0x8a, 0x26, 0x2c, 0x89, 0x25, 0x2b, 0x87, +0x23, 0x2a, 0x84, 0x23, 0x29, 0x82, 0x22, 0x29, 0x80, 0x21, 0x27, 0x7f, +0x20, 0x26, 0x7d, 0x1f, 0x26, 0x7b, 0x1f, 0x25, 0x79, 0x1e, 0x24, 0x77, +0x1e, 0x23, 0x76, 0x1d, 0x22, 0x75, 0x1c, 0x21, 0x73, 0x1c, 0x21, 0x72, +0x1b, 0x20, 0x70, 0x1b, 0x20, 0x6f, 0x1a, 0x1f, 0x6d, 0x1a, 0x1e, 0x6c, +0x1a, 0x1e, 0x6a, 0x19, 0x1d, 0x69, 0x19, 0x1d, 0x68, 0x18, 0x1c, 0x66, +0x17, 0x1c, 0x65, 0x17, 0x1c, 0x65, 0x17, 0x1c, 0x63, 0x17, 0x1b, 0x62, +0x16, 0x1b, 0x61, 0x16, 0x1b, 0x60, 0x16, 0x1a, 0x5f, 0x16, 0x1a, 0x5e, +0x16, 0x1a, 0x5d, 0x15, 0x19, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x19, 0x5a, +0x15, 0x19, 0x59, 0x14, 0x18, 0x58, 0x14, 0x18, 0x57, 0x14, 0x18, 0x56, +0x14, 0x17, 0x55, 0x14, 0x17, 0x55, 0x13, 0x17, 0x54, 0x13, 0x17, 0x53, +0x13, 0x17, 0x52, 0x13, 0x16, 0x51, 0x13, 0x16, 0x51, 0x12, 0x16, 0x50, +0x12, 0x16, 0x4f, 0x12, 0x15, 0x4e, 0x12, 0x15, 0x4e, 0x12, 0x15, 0x4d, +0x11, 0x15, 0x4c, 0x11, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x14, 0x4a, +0x11, 0x14, 0x49, 0x11, 0x14, 0x48, 0x10, 0x14, 0x48, 0x10, 0x14, 0x48, +0x10, 0x13, 0x47, 0x10, 0x13, 0x47, 0x10, 0x13, 0x45, 0x10, 0x13, 0x45, +0x10, 0x13, 0x44, 0x0f, 0x12, 0x44, 0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43, +0x0f, 0x11, 0x42, 0x0f, 0x11, 0x41, 0x0f, 0x11, 0x41, 0x0f, 0x11, 0x40, +0x0f, 0x11, 0x40, 0x0e, 0x10, 0x3f, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3e, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x11, 0x14, 0x48, 0x23, 0x2b, 0x93, 0x24, 0x2d, 0x99, 0x20, 0x26, 0x82, +0x1d, 0x23, 0x79, 0x1e, 0x23, 0x7b, 0x1f, 0x24, 0x7d, 0x20, 0x25, 0x7f, +0x21, 0x26, 0x81, 0x21, 0x28, 0x82, 0x22, 0x29, 0x85, 0x23, 0x2a, 0x87, +0x25, 0x2c, 0x89, 0x27, 0x2e, 0x8b, 0x28, 0x2f, 0x8d, 0x2a, 0x31, 0x90, +0x2c, 0x33, 0x92, 0x2e, 0x34, 0x94, 0x30, 0x39, 0x96, 0x33, 0x3a, 0x99, +0xd1, 0xcc, 0x17, 0xdb, 0xd4, 0x1c, 0xde, 0xdc, 0x1f, 0xdf, 0xd9, 0x22, +0xde, 0xdb, 0x1d, 0xc7, 0xc5, 0x18, 0xc0, 0xba, 0x15, 0x4f, 0x57, 0x9e, +0x3b, 0x46, 0xb5, 0x3b, 0x46, 0xb8, 0x3b, 0x45, 0xbc, 0x3b, 0x45, 0xbf, +0x3a, 0x44, 0xc4, 0x3a, 0x44, 0xc8, 0x3d, 0x48, 0xcc, 0x40, 0x4c, 0xd0, +0x45, 0x51, 0xd5, 0x4b, 0x58, 0xd9, 0x52, 0x60, 0xdf, 0x5a, 0x68, 0xe2, +0x57, 0x65, 0xd1, 0x86, 0x8d, 0x8d, 0xe0, 0xde, 0x25, 0xd7, 0xd5, 0x1c, +0xe0, 0xd9, 0x23, 0xb3, 0xb3, 0x41, 0x2c, 0x36, 0x6b, 0x15, 0x1b, 0x43, +0x16, 0x1d, 0x47, 0x17, 0x1e, 0x49, 0x19, 0x20, 0x4d, 0x1a, 0x21, 0x51, +0x1b, 0x23, 0x55, 0x1d, 0x25, 0x59, 0x4b, 0x50, 0x4c, 0xe0, 0xde, 0x25, +0xe1, 0xda, 0x26, 0xe4, 0xe2, 0x35, 0xdf, 0xd9, 0x22, 0xdd, 0xd6, 0x1c, +0xdf, 0xd8, 0x20, 0x8a, 0x8f, 0x7d, 0x6d, 0x7a, 0xcf, 0x77, 0x85, 0xde, +0x76, 0x85, 0xe1, 0x73, 0x82, 0xe1, 0x71, 0x7f, 0xe1, 0x6c, 0x7b, 0xdd, +0x64, 0x73, 0xd4, 0x57, 0x66, 0xc5, 0x4b, 0x59, 0xb6, 0x41, 0x4e, 0xa8, +0x39, 0x46, 0x9b, 0x32, 0x3e, 0x8f, 0x4b, 0x55, 0x82, 0xde, 0xd8, 0x1f, +0xe4, 0xe2, 0x33, 0xe1, 0xdf, 0x2a, 0xd7, 0xd5, 0x1c, 0xdd, 0xd6, 0x1c, +0xe3, 0xdd, 0x30, 0xdb, 0xd4, 0x1c, 0x2c, 0x34, 0x66, 0x28, 0x30, 0x5f, +0x25, 0x2c, 0x5a, 0x22, 0x28, 0x54, 0x1f, 0x26, 0x50, 0x1c, 0x22, 0x4a, +0x1a, 0x20, 0x46, 0x2b, 0x33, 0x63, 0x42, 0x4e, 0x94, 0x5d, 0x6b, 0xe0, +0x52, 0x60, 0xe2, 0x48, 0x55, 0xe2, 0x40, 0x4d, 0xe3, 0x39, 0x45, 0xe3, +0x3c, 0x48, 0xdf, 0x3f, 0x4b, 0xda, 0x41, 0x4e, 0xd5, 0x45, 0x50, 0xd0, +0x48, 0x53, 0xcc, 0x4a, 0x55, 0xc8, 0x4b, 0x56, 0xc4, 0x48, 0x53, 0xbf, +0x44, 0x4f, 0xbc, 0x41, 0x4a, 0xb8, 0x3d, 0x48, 0xb5, 0x3a, 0x45, 0xb1, +0x39, 0x42, 0xae, 0x37, 0x3f, 0xab, 0x35, 0x3d, 0xa7, 0x33, 0x3b, 0xa4, +0x31, 0x39, 0xa1, 0x30, 0x38, 0x9f, 0x2e, 0x36, 0x9c, 0x2c, 0x33, 0x99, +0x2b, 0x32, 0x96, 0x29, 0x31, 0x94, 0x28, 0x30, 0x92, 0x27, 0x2e, 0x8f, +0x25, 0x2c, 0x8d, 0x25, 0x2c, 0x8b, 0x24, 0x2b, 0x89, 0x23, 0x2a, 0x87, +0x22, 0x29, 0x85, 0x21, 0x28, 0x82, 0x21, 0x27, 0x81, 0x20, 0x25, 0x7f, +0x1f, 0x24, 0x7d, 0x1f, 0x24, 0x7b, 0x1e, 0x23, 0x79, 0x1d, 0x22, 0x78, +0x1d, 0x22, 0x76, 0x1c, 0x21, 0x75, 0x1b, 0x20, 0x73, 0x1b, 0x20, 0x72, +0x1b, 0x1f, 0x70, 0x1a, 0x1f, 0x6f, 0x1a, 0x1f, 0x6d, 0x19, 0x1e, 0x6c, +0x19, 0x1e, 0x6a, 0x19, 0x1d, 0x69, 0x19, 0x1d, 0x68, 0x18, 0x1d, 0x66, +0x18, 0x1d, 0x65, 0x18, 0x1c, 0x65, 0x17, 0x1c, 0x63, 0x17, 0x1c, 0x63, +0x17, 0x1b, 0x61, 0x17, 0x1b, 0x60, 0x16, 0x1a, 0x5f, 0x16, 0x1a, 0x5e, +0x16, 0x1a, 0x5d, 0x15, 0x19, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x19, 0x5a, +0x15, 0x19, 0x59, 0x14, 0x19, 0x58, 0x14, 0x18, 0x57, 0x14, 0x18, 0x56, +0x14, 0x18, 0x56, 0x14, 0x18, 0x55, 0x13, 0x17, 0x54, 0x13, 0x17, 0x53, +0x13, 0x17, 0x52, 0x13, 0x16, 0x51, 0x13, 0x16, 0x51, 0x12, 0x16, 0x50, +0x12, 0x16, 0x4f, 0x12, 0x16, 0x4e, 0x12, 0x16, 0x4e, 0x12, 0x15, 0x4d, +0x12, 0x15, 0x4c, 0x12, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x14, 0x4a, +0x11, 0x14, 0x49, 0x11, 0x14, 0x48, 0x10, 0x14, 0x48, 0x10, 0x14, 0x48, +0x10, 0x13, 0x47, 0x10, 0x13, 0x47, 0x10, 0x13, 0x45, 0x10, 0x13, 0x45, +0x10, 0x13, 0x44, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, 0x0f, 0x12, 0x43, +0x0f, 0x11, 0x42, 0x0f, 0x11, 0x41, 0x0f, 0x11, 0x41, 0x0f, 0x11, 0x40, +0x0f, 0x11, 0x40, 0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3f, 0x0e, 0x10, 0x3f, +0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3e, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x13, 0x16, 0x49, 0x25, 0x2c, 0x93, 0x27, 0x2d, 0x99, 0x22, 0x27, 0x82, +0x1e, 0x24, 0x7a, 0x1e, 0x23, 0x7c, 0x1f, 0x24, 0x7e, 0x1e, 0x24, 0x80, +0x1f, 0x25, 0x81, 0x1f, 0x25, 0x83, 0x20, 0x26, 0x85, 0x20, 0x27, 0x87, +0x22, 0x28, 0x8a, 0x23, 0x29, 0x8b, 0x24, 0x2b, 0x8e, 0x25, 0x2c, 0x90, +0x27, 0x2e, 0x92, 0x28, 0x30, 0x95, 0x2a, 0x32, 0x97, 0x92, 0x92, 0x48, +0xdb, 0xd4, 0x1c, 0xd4, 0xcd, 0x1b, 0xe2, 0xe0, 0x2d, 0xdf, 0xd9, 0x22, +0xd1, 0xcf, 0x1a, 0xbe, 0xb8, 0x15, 0x78, 0x7c, 0x77, 0x46, 0x51, 0xb2, +0x46, 0x51, 0xb6, 0x46, 0x50, 0xb9, 0x46, 0x51, 0xbd, 0x46, 0x50, 0xc1, +0x44, 0x50, 0xc4, 0x44, 0x50, 0xc9, 0x43, 0x4d, 0xcd, 0x40, 0x4c, 0xd1, +0x40, 0x4b, 0xd6, 0x40, 0x4b, 0xdb, 0x45, 0x51, 0xe0, 0x4b, 0x58, 0xe2, +0x54, 0x63, 0xe1, 0x86, 0x8d, 0x8d, 0xdb, 0xd4, 0x1c, 0xe1, 0xdb, 0x28, +0xe1, 0xda, 0x26, 0x81, 0x83, 0x43, 0x38, 0x43, 0x83, 0x34, 0x3e, 0x7a, +0x17, 0x1e, 0x48, 0x19, 0x20, 0x4c, 0x1a, 0x21, 0x50, 0x1c, 0x23, 0x54, +0x1d, 0x25, 0x58, 0x1f, 0x27, 0x5e, 0xcf, 0xca, 0x11, 0xe1, 0xda, 0x26, +0xe0, 0xde, 0x25, 0xdb, 0xd4, 0x1c, 0xde, 0xdb, 0x1d, 0xe2, 0xdc, 0x2b, +0xb5, 0xb4, 0x40, 0x64, 0x71, 0xc9, 0x78, 0x87, 0xe4, 0x92, 0xa1, 0xfd, +0x8e, 0x9d, 0xfd, 0x86, 0x96, 0xfd, 0x80, 0x91, 0xfd, 0x7a, 0x8b, 0xf9, +0x6f, 0x80, 0xed, 0x61, 0x71, 0xdc, 0x54, 0x63, 0xca, 0x49, 0x58, 0xba, +0x3d, 0x4c, 0xa9, 0x42, 0x4f, 0xa7, 0x4b, 0x58, 0xaa, 0xb5, 0xb4, 0x3e, +0xde, 0xd8, 0x1f, 0xe1, 0xdf, 0x2a, 0xdc, 0xda, 0x1d, 0xde, 0xd7, 0x1d, +0xe1, 0xda, 0x26, 0xe2, 0xe0, 0x2d, 0x6a, 0x6d, 0x48, 0x2a, 0x31, 0x62, +0x25, 0x2c, 0x5b, 0x21, 0x28, 0x55, 0x1e, 0x25, 0x4f, 0x1b, 0x22, 0x4a, +0x28, 0x31, 0x60, 0x4d, 0x5a, 0xaf, 0x57, 0x66, 0xe0, 0x4c, 0x5b, 0xe0, +0x44, 0x53, 0xe1, 0x47, 0x55, 0xe1, 0x49, 0x57, 0xe2, 0x4c, 0x59, 0xe3, +0x4f, 0x5c, 0xe0, 0x53, 0x60, 0xdb, 0x56, 0x63, 0xd6, 0x53, 0x5f, 0xd1, +0x4d, 0x59, 0xcd, 0x4a, 0x55, 0xc9, 0x46, 0x50, 0xc4, 0x42, 0x4c, 0xc1, +0x40, 0x49, 0xbc, 0x3c, 0x46, 0xb8, 0x39, 0x43, 0xb5, 0x37, 0x41, 0xb1, +0x36, 0x3f, 0xae, 0x33, 0x3c, 0xab, 0x32, 0x3a, 0xa8, 0x2f, 0x37, 0xa5, +0x2e, 0x36, 0xa2, 0x2d, 0x35, 0x9f, 0x2b, 0x33, 0x9c, 0x29, 0x31, 0x9a, +0x29, 0x30, 0x97, 0x27, 0x2f, 0x95, 0x26, 0x2e, 0x92, 0x25, 0x2c, 0x90, +0x24, 0x2b, 0x8e, 0x23, 0x2a, 0x8b, 0x22, 0x29, 0x89, 0x22, 0x28, 0x87, +0x21, 0x27, 0x85, 0x20, 0x26, 0x83, 0x1f, 0x25, 0x81, 0x1f, 0x24, 0x80, +0x1f, 0x24, 0x7e, 0x1e, 0x23, 0x7c, 0x1d, 0x23, 0x7a, 0x1d, 0x22, 0x78, +0x1c, 0x21, 0x77, 0x1c, 0x21, 0x75, 0x1c, 0x21, 0x74, 0x1c, 0x20, 0x72, +0x1b, 0x20, 0x70, 0x1a, 0x1f, 0x6f, 0x1a, 0x1f, 0x6d, 0x1a, 0x1e, 0x6c, +0x1a, 0x1e, 0x6b, 0x19, 0x1d, 0x69, 0x19, 0x1e, 0x68, 0x19, 0x1d, 0x68, +0x18, 0x1d, 0x66, 0x18, 0x1c, 0x65, 0x17, 0x1c, 0x64, 0x17, 0x1c, 0x63, +0x17, 0x1b, 0x62, 0x17, 0x1b, 0x60, 0x16, 0x1b, 0x5f, 0x16, 0x1a, 0x5e, +0x16, 0x1a, 0x5d, 0x16, 0x1a, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x1a, 0x5a, +0x15, 0x19, 0x59, 0x14, 0x19, 0x58, 0x14, 0x18, 0x57, 0x14, 0x18, 0x56, +0x14, 0x18, 0x56, 0x14, 0x18, 0x55, 0x14, 0x17, 0x54, 0x13, 0x17, 0x53, +0x13, 0x17, 0x52, 0x13, 0x17, 0x51, 0x13, 0x17, 0x51, 0x12, 0x16, 0x50, +0x12, 0x16, 0x4f, 0x12, 0x16, 0x4e, 0x12, 0x16, 0x4e, 0x12, 0x15, 0x4d, +0x12, 0x15, 0x4c, 0x12, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x15, 0x4a, +0x11, 0x15, 0x49, 0x11, 0x14, 0x48, 0x11, 0x14, 0x48, 0x11, 0x14, 0x48, +0x10, 0x14, 0x47, 0x10, 0x14, 0x47, 0x10, 0x13, 0x45, 0x10, 0x13, 0x45, +0x10, 0x13, 0x44, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, 0x0f, 0x12, 0x43, +0x0f, 0x11, 0x42, 0x0f, 0x11, 0x41, 0x0f, 0x11, 0x41, 0x0f, 0x11, 0x40, +0x0f, 0x11, 0x40, 0x0f, 0x11, 0x3f, 0x0f, 0x11, 0x3f, 0x0e, 0x11, 0x3f, +0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x14, 0x17, 0x49, 0x29, 0x2f, 0x94, 0x2a, 0x31, 0x99, 0x24, 0x2a, 0x82, +0x20, 0x26, 0x7a, 0x20, 0x26, 0x7c, 0x21, 0x27, 0x7e, 0x21, 0x27, 0x80, +0x21, 0x27, 0x81, 0x21, 0x28, 0x83, 0x22, 0x28, 0x85, 0x23, 0x28, 0x88, +0x22, 0x29, 0x8a, 0x22, 0x28, 0x8c, 0x23, 0x29, 0x8e, 0x23, 0x29, 0x90, +0x23, 0x2a, 0x93, 0x24, 0x2b, 0x95, 0x4f, 0x53, 0x77, 0xcb, 0xc4, 0x18, +0xc9, 0xc7, 0x18, 0xde, 0xdb, 0x1d, 0xdb, 0xd4, 0x1c, 0xd4, 0xcd, 0x1b, +0xdf, 0xd9, 0x22, 0xbd, 0xba, 0x2b, 0x35, 0x3e, 0xaf, 0x38, 0x42, 0xb3, +0x3b, 0x46, 0xb6, 0x40, 0x4b, 0xb9, 0x45, 0x50, 0xbd, 0x4c, 0x57, 0xc2, +0x52, 0x5e, 0xc5, 0x52, 0x5f, 0xc9, 0x52, 0x5f, 0xce, 0x51, 0x5d, 0xd2, +0x4f, 0x5c, 0xd7, 0x4e, 0x5b, 0xdc, 0x4c, 0x59, 0xe1, 0x4b, 0x58, 0xe2, +0x49, 0x57, 0xe1, 0x70, 0x7a, 0xb0, 0xb6, 0xb6, 0x4f, 0xb3, 0xb3, 0x41, +0xa8, 0xa6, 0x28, 0x42, 0x45, 0x33, 0x16, 0x1c, 0x43, 0x17, 0x1e, 0x47, +0x19, 0x1f, 0x4b, 0x1a, 0x21, 0x4e, 0x1c, 0x23, 0x53, 0x1d, 0x25, 0x57, +0x20, 0x28, 0x5d, 0x8e, 0x8e, 0x2f, 0xe0, 0xde, 0x25, 0xd2, 0xcc, 0x1b, +0xd9, 0xd2, 0x1c, 0xdf, 0xd9, 0x22, 0xdf, 0xd8, 0x20, 0xd7, 0xd5, 0x1c, +0x64, 0x6e, 0xa6, 0x6a, 0x79, 0xd8, 0x80, 0x90, 0xf6, 0x99, 0xaa, 0xfd, +0xa5, 0xb6, 0xfd, 0x9d, 0xaf, 0xfd, 0x93, 0xa6, 0xfd, 0x8c, 0x9f, 0xfd, +0x7d, 0x90, 0xfd, 0x6b, 0x7d, 0xf6, 0x5b, 0x6c, 0xe0, 0x4d, 0x5e, 0xcb, +0x4b, 0x5b, 0xc1, 0x5c, 0x6a, 0xca, 0x67, 0x75, 0xce, 0xa3, 0xa6, 0x75, +0xd7, 0xd0, 0x1c, 0xd1, 0xca, 0x1a, 0xe1, 0xdf, 0x2a, 0xe7, 0xe1, 0x3e, +0xe1, 0xdb, 0x2a, 0xdf, 0xd9, 0x22, 0xa8, 0xa6, 0x28, 0x28, 0x30, 0x62, +0x23, 0x2b, 0x5a, 0x20, 0x27, 0x54, 0x1d, 0x24, 0x4f, 0x3c, 0x47, 0x88, +0x5a, 0x6a, 0xd9, 0x74, 0x7f, 0xae, 0x96, 0x9c, 0x7f, 0xb7, 0xb8, 0x4e, +0xdb, 0xd4, 0x1c, 0xa2, 0xa3, 0x54, 0x4a, 0x56, 0xa9, 0x54, 0x60, 0xc6, +0x59, 0x67, 0xe1, 0x53, 0x61, 0xdc, 0x4e, 0x5b, 0xd7, 0x49, 0x56, 0xd2, +0x45, 0x51, 0xce, 0x43, 0x4e, 0xc9, 0x51, 0x5a, 0xaf, 0x9a, 0x9b, 0x5a, +0xe8, 0xe6, 0x3f, 0xe3, 0xe1, 0x32, 0xbe, 0xbb, 0x2d, 0x5a, 0x5f, 0x8c, +0x32, 0x3a, 0xae, 0x2f, 0x37, 0xab, 0x2e, 0x36, 0xa8, 0x2c, 0x35, 0xa5, +0x2a, 0x33, 0xa3, 0x2a, 0x32, 0xa0, 0x28, 0x31, 0x9d, 0x27, 0x2f, 0x9a, +0x66, 0x69, 0x67, 0x8f, 0x8e, 0x46, 0xba, 0xb6, 0x26, 0xcb, 0xc4, 0x18, +0xc9, 0xc7, 0x18, 0xa4, 0xa2, 0x33, 0x22, 0x28, 0x8a, 0x21, 0x27, 0x88, +0x20, 0x26, 0x85, 0x20, 0x26, 0x83, 0x1f, 0x25, 0x81, 0x1f, 0x25, 0x80, +0x1f, 0x24, 0x7e, 0x1e, 0x24, 0x7c, 0x1e, 0x23, 0x7a, 0x1d, 0x22, 0x78, +0x1d, 0x22, 0x77, 0x1d, 0x22, 0x76, 0x1c, 0x22, 0x74, 0x1c, 0x21, 0x72, +0x32, 0x35, 0x65, 0x74, 0x74, 0x40, 0xa2, 0x9f, 0x29, 0xdb, 0xd4, 0x1c, +0xc7, 0xc5, 0x18, 0xc3, 0xbd, 0x16, 0xce, 0xc9, 0x12, 0xa1, 0x9e, 0x27, +0x45, 0x47, 0x51, 0x18, 0x1c, 0x65, 0x18, 0x1c, 0x64, 0x17, 0x1c, 0x63, +0x18, 0x1b, 0x62, 0x17, 0x1b, 0x60, 0x17, 0x1b, 0x5f, 0x17, 0x1a, 0x5e, +0x16, 0x1a, 0x5d, 0x5b, 0x5b, 0x3f, 0x88, 0x86, 0x2c, 0xb7, 0xb2, 0x19, +0xd9, 0xd2, 0x1c, 0xdf, 0xd9, 0x22, 0x5a, 0x5b, 0x3c, 0x14, 0x19, 0x57, +0x14, 0x18, 0x56, 0x14, 0x18, 0x55, 0x14, 0x17, 0x54, 0x13, 0x17, 0x53, +0x13, 0x17, 0x52, 0x13, 0x17, 0x52, 0x13, 0x17, 0x51, 0x13, 0x16, 0x50, +0x12, 0x16, 0x4f, 0x12, 0x16, 0x4f, 0x12, 0x16, 0x4e, 0x29, 0x2c, 0x45, +0x40, 0x41, 0x3c, 0x12, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x15, 0x4a, +0x11, 0x15, 0x4a, 0x11, 0x15, 0x48, 0x11, 0x15, 0x48, 0x11, 0x14, 0x48, +0x58, 0x57, 0x31, 0xb6, 0xb1, 0x15, 0xe2, 0xdc, 0x2b, 0xcd, 0xc7, 0x0e, +0x6e, 0x6d, 0x28, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, 0x10, 0x13, 0x43, +0x0f, 0x12, 0x42, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x41, 0x0f, 0x11, 0x40, +0x0f, 0x11, 0x40, 0x0f, 0x11, 0x3f, 0x0f, 0x11, 0x3f, 0x0e, 0x11, 0x3f, +0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x15, 0x19, 0x49, 0x2b, 0x33, 0x94, 0x2d, 0x35, 0x99, 0x26, 0x2d, 0x82, +0x23, 0x29, 0x7a, 0x23, 0x29, 0x7c, 0x23, 0x2a, 0x7e, 0x24, 0x2a, 0x80, +0x24, 0x2a, 0x81, 0x24, 0x2b, 0x83, 0x25, 0x2c, 0x86, 0x25, 0x2c, 0x88, +0x25, 0x2d, 0x8a, 0x26, 0x2d, 0x8c, 0x26, 0x2d, 0x8e, 0x27, 0x2e, 0x90, +0x26, 0x2e, 0x93, 0x27, 0x2e, 0x96, 0xbb, 0xb7, 0x27, 0xe1, 0xda, 0x26, +0xe1, 0xdf, 0x2a, 0xd4, 0xcd, 0x1b, 0xd7, 0xd5, 0x1c, 0xc7, 0xc1, 0x18, +0xd4, 0xcd, 0x1b, 0x53, 0x58, 0x87, 0x2c, 0x35, 0xb0, 0x2e, 0x37, 0xb3, +0x31, 0x3a, 0xb6, 0x33, 0x3d, 0xba, 0x37, 0x41, 0xbe, 0x3a, 0x44, 0xc2, +0x3f, 0x4a, 0xc7, 0x44, 0x4f, 0xcb, 0x49, 0x55, 0xcf, 0x51, 0x5d, 0xd4, +0x55, 0x61, 0xce, 0x48, 0x52, 0xa4, 0x50, 0x5b, 0xb8, 0x52, 0x5f, 0xbf, +0x51, 0x5f, 0xbe, 0x51, 0x5f, 0xbe, 0x53, 0x61, 0xc5, 0x55, 0x64, 0xcc, +0x55, 0x64, 0xcb, 0x41, 0x4e, 0x96, 0x1a, 0x21, 0x4b, 0x18, 0x1e, 0x48, +0x1a, 0x21, 0x4d, 0x1c, 0x23, 0x51, 0x1d, 0x25, 0x56, 0x20, 0x28, 0x5b, +0x37, 0x3d, 0x56, 0xe3, 0xdd, 0x30, 0xde, 0xd7, 0x1d, 0xdf, 0xd9, 0x22, +0xe0, 0xde, 0x25, 0xde, 0xd7, 0x1d, 0xe2, 0xe0, 0x2d, 0xaf, 0xaf, 0x3c, +0x53, 0x62, 0xc1, 0x69, 0x79, 0xe1, 0x83, 0x94, 0xfd, 0x9f, 0xb2, 0xfd, +0xc3, 0xd7, 0xfd, 0xba, 0xd0, 0xfd, 0xae, 0xc4, 0xfd, 0xa4, 0xbb, 0xfd, +0x8f, 0xa5, 0xfd, 0x75, 0x8b, 0xfd, 0x61, 0x75, 0xf8, 0x51, 0x64, 0xde, +0x6b, 0x7c, 0xed, 0x82, 0x92, 0xfa, 0x8c, 0x9b, 0xf6, 0x9c, 0xa2, 0x95, +0xc4, 0xbe, 0x17, 0xd4, 0xcd, 0x1b, 0xe1, 0xda, 0x26, 0xe3, 0xdd, 0x2e, +0xe2, 0xdc, 0x2b, 0xe4, 0xde, 0x33, 0xbc, 0xb8, 0x1c, 0x26, 0x2e, 0x62, +0x22, 0x29, 0x5a, 0x4f, 0x54, 0x4b, 0x88, 0x8c, 0x52, 0xa8, 0xa6, 0x28, +0xdb, 0xd4, 0x1c, 0xe0, 0xda, 0x25, 0xe1, 0xda, 0x26, 0xdd, 0xd6, 0x1c, +0xde, 0xd8, 0x1f, 0xcc, 0xc6, 0x19, 0x97, 0x9c, 0x7d, 0x54, 0x62, 0xe1, +0x4e, 0x5b, 0xe2, 0x4a, 0x56, 0xdd, 0x46, 0x52, 0xd8, 0x41, 0x4d, 0xd3, +0x3e, 0x49, 0xce, 0x3c, 0x46, 0xca, 0xac, 0xab, 0x46, 0xde, 0xdb, 0x1d, +0xe0, 0xda, 0x25, 0xe3, 0xdd, 0x2e, 0xe1, 0xdf, 0x2a, 0xdf, 0xd9, 0x22, +0x41, 0x48, 0x9c, 0x2c, 0x35, 0xac, 0x2b, 0x33, 0xa9, 0x3e, 0x44, 0x94, +0x67, 0x6a, 0x6f, 0x90, 0x90, 0x4b, 0xbb, 0xb7, 0x28, 0xdf, 0xd9, 0x22, +0xe1, 0xdb, 0x2a, 0xe1, 0xdb, 0x2a, 0xde, 0xdb, 0x1d, 0xe1, 0xda, 0x26, +0xe1, 0xdf, 0x2a, 0xa5, 0xa2, 0x33, 0x22, 0x29, 0x8a, 0x22, 0x28, 0x88, +0x22, 0x27, 0x86, 0x20, 0x26, 0x83, 0x20, 0x26, 0x82, 0x20, 0x26, 0x80, +0x1f, 0x25, 0x7e, 0x1f, 0x24, 0x7c, 0x1e, 0x24, 0x7a, 0x1e, 0x23, 0x78, +0x1d, 0x22, 0x77, 0x1d, 0x22, 0x76, 0x32, 0x36, 0x68, 0x8b, 0x8a, 0x36, +0xdc, 0xda, 0x1d, 0xe0, 0xd9, 0x23, 0xe0, 0xde, 0x25, 0xd1, 0xcf, 0x1a, +0xd4, 0xcd, 0x1b, 0xd9, 0xd2, 0x1c, 0xdf, 0xd8, 0x20, 0xdf, 0xd8, 0x20, +0xde, 0xd7, 0x1d, 0x89, 0x88, 0x31, 0x18, 0x1c, 0x64, 0x18, 0x1c, 0x63, +0x18, 0x1c, 0x62, 0x2d, 0x30, 0x57, 0x72, 0x71, 0x38, 0xa1, 0x9d, 0x24, +0xdf, 0xd9, 0x22, 0xe3, 0xdd, 0x30, 0xde, 0xd7, 0x1d, 0xdf, 0xd9, 0x22, +0xe0, 0xde, 0x25, 0xde, 0xd7, 0x1d, 0x5a, 0x5b, 0x3d, 0x15, 0x19, 0x57, +0x15, 0x19, 0x56, 0x15, 0x18, 0x55, 0x15, 0x18, 0x54, 0x14, 0x18, 0x53, +0x14, 0x18, 0x52, 0x14, 0x18, 0x52, 0x14, 0x17, 0x51, 0x2b, 0x2c, 0x47, +0xd5, 0xcf, 0x1c, 0xdd, 0xd6, 0x1c, 0xde, 0xdc, 0x1f, 0xdb, 0xd4, 0x1c, +0x9f, 0x9c, 0x1e, 0x12, 0x16, 0x4c, 0x12, 0x16, 0x4b, 0x12, 0x15, 0x4a, +0x12, 0x15, 0x4a, 0x12, 0x15, 0x48, 0x12, 0x15, 0x48, 0x40, 0x41, 0x39, +0xe2, 0xdc, 0x2b, 0xe4, 0xde, 0x33, 0xe2, 0xe0, 0x2b, 0xe1, 0xdb, 0x28, +0xe1, 0xdb, 0x28, 0x6f, 0x6d, 0x28, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, +0x0f, 0x12, 0x42, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x40, +0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0f, 0x11, 0x3f, 0x0e, 0x11, 0x3f, +0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x10, 0x37, 0x01, 0x01, 0x05, +0x16, 0x1a, 0x49, 0x2e, 0x36, 0x94, 0x31, 0x38, 0x9c, 0x2a, 0x30, 0x82, +0x26, 0x2c, 0x7a, 0x26, 0x2d, 0x7c, 0x27, 0x2d, 0x7e, 0x27, 0x2e, 0x80, +0x27, 0x2e, 0x81, 0x28, 0x2f, 0x84, 0x28, 0x30, 0x86, 0x29, 0x30, 0x88, +0x2a, 0x31, 0x8a, 0x2a, 0x31, 0x8c, 0x2b, 0x32, 0x8f, 0x2b, 0x33, 0x90, +0x2b, 0x33, 0x93, 0x54, 0x59, 0x76, 0xe0, 0xde, 0x25, 0xe6, 0xdf, 0x37, +0xe0, 0xde, 0x25, 0xdf, 0xd9, 0x22, 0xd1, 0xcf, 0x1a, 0xd1, 0xcf, 0x1a, +0xbc, 0xb9, 0x2b, 0x2e, 0x37, 0xac, 0x2e, 0x37, 0xb0, 0x2f, 0x38, 0xb3, +0x2e, 0x37, 0xb7, 0x2e, 0x37, 0xbb, 0x2e, 0x37, 0xbf, 0x2e, 0x37, 0xc3, +0x30, 0x3a, 0xc7, 0x33, 0x3d, 0xcc, 0x36, 0x41, 0xd0, 0x3a, 0x45, 0xd4, +0x3e, 0x4a, 0xd9, 0x44, 0x50, 0xde, 0x4c, 0x58, 0xe2, 0x55, 0x64, 0xe2, +0x51, 0x5f, 0xbe, 0x2d, 0x36, 0x69, 0x12, 0x17, 0x39, 0x13, 0x18, 0x3c, +0x14, 0x1a, 0x3f, 0x15, 0x1b, 0x42, 0x17, 0x1d, 0x46, 0x18, 0x1f, 0x4a, +0x1a, 0x21, 0x4e, 0x1c, 0x23, 0x52, 0x1e, 0x26, 0x58, 0x21, 0x29, 0x5e, +0x7a, 0x7b, 0x3b, 0xdf, 0xd8, 0x20, 0xe0, 0xda, 0x25, 0xdc, 0xda, 0x1d, +0xe2, 0xdc, 0x2d, 0xde, 0xd8, 0x1f, 0xdb, 0xd4, 0x1c, 0x66, 0x6f, 0x89, +0x4d, 0x5d, 0xc3, 0x62, 0x73, 0xe4, 0x7e, 0x91, 0xfd, 0xa3, 0xb8, 0xfd, +0xd0, 0xe7, 0xfd, 0xe6, 0xfd, 0xfd, 0xd2, 0xec, 0xfd, 0xc5, 0xe0, 0xfd, +0xa6, 0xc0, 0xfd, 0x83, 0x9c, 0xfd, 0x69, 0x80, 0xfd, 0x7b, 0x90, 0xfd, +0x9c, 0xaf, 0xfd, 0xa9, 0xba, 0xfd, 0x94, 0xa4, 0xfd, 0x7f, 0x8d, 0xeb, +0xcf, 0xc9, 0x1a, 0xdd, 0xd6, 0x1c, 0xde, 0xd8, 0x1f, 0xe0, 0xd9, 0x23, +0xde, 0xdc, 0x1f, 0xe5, 0xdf, 0x34, 0xe6, 0xe0, 0x39, 0x24, 0x2c, 0x60, +0x62, 0x65, 0x3e, 0xe4, 0xde, 0x31, 0xdf, 0xd8, 0x20, 0xde, 0xd7, 0x1d, +0xe2, 0xe0, 0x2b, 0xd7, 0xd0, 0x1c, 0xdc, 0xda, 0x1d, 0xde, 0xdc, 0x1f, +0xe0, 0xd9, 0x23, 0xce, 0xc7, 0x19, 0xc4, 0xc2, 0x37, 0x48, 0x56, 0xe1, +0x43, 0x4f, 0xe2, 0x3f, 0x4b, 0xdd, 0x3c, 0x48, 0xd8, 0x3a, 0x45, 0xd4, +0x37, 0x42, 0xcf, 0x34, 0x3f, 0xcb, 0xaa, 0xa9, 0x47, 0xe0, 0xda, 0x25, +0xde, 0xd8, 0x1f, 0xde, 0xdc, 0x1f, 0xe3, 0xdd, 0x30, 0xe3, 0xdd, 0x30, +0x92, 0x93, 0x52, 0x2b, 0x33, 0xac, 0x2b, 0x33, 0xa9, 0xde, 0xdb, 0x1d, +0xe3, 0xdd, 0x2e, 0xe2, 0xe0, 0x2b, 0xde, 0xdb, 0x1d, 0xdb, 0xd4, 0x1c, +0xd7, 0xd5, 0x1c, 0xde, 0xd8, 0x1f, 0xe0, 0xde, 0x25, 0xe6, 0xdf, 0x37, +0xe0, 0xde, 0x25, 0x64, 0x66, 0x5f, 0x23, 0x29, 0x8a, 0x23, 0x28, 0x88, +0x22, 0x28, 0x86, 0x22, 0x27, 0x84, 0x20, 0x26, 0x82, 0x20, 0x26, 0x80, +0x20, 0x25, 0x7e, 0x1f, 0x25, 0x7c, 0x1f, 0x24, 0x7a, 0x1e, 0x23, 0x78, +0x1e, 0x23, 0x78, 0x76, 0x75, 0x44, 0xcf, 0xc9, 0x1a, 0xce, 0xcc, 0x19, +0xde, 0xd8, 0x1f, 0xdd, 0xd6, 0x1c, 0xce, 0xc9, 0x12, 0xa2, 0x9f, 0x28, +0xb8, 0xb4, 0x1d, 0xdf, 0xd9, 0x22, 0xe1, 0xdb, 0x28, 0xd7, 0xd5, 0x1c, +0xd2, 0xcc, 0x1b, 0xdf, 0xd8, 0x20, 0x73, 0x73, 0x3a, 0x19, 0x1d, 0x63, +0x19, 0x1d, 0x62, 0xe5, 0xdf, 0x36, 0xe6, 0xdf, 0x37, 0xe4, 0xde, 0x31, +0xe2, 0xdc, 0x2d, 0xdf, 0xd8, 0x20, 0xe0, 0xda, 0x25, 0xdc, 0xda, 0x1d, +0xe2, 0xdc, 0x2d, 0xde, 0xd8, 0x1f, 0x89, 0x86, 0x2b, 0x16, 0x1a, 0x57, +0x16, 0x1a, 0x56, 0x15, 0x19, 0x55, 0x15, 0x19, 0x54, 0x15, 0x19, 0x53, +0x14, 0x18, 0x52, 0x14, 0x18, 0x52, 0x14, 0x18, 0x51, 0x88, 0x86, 0x27, +0xe2, 0xdc, 0x2b, 0xcb, 0xc4, 0x18, 0xd9, 0xd2, 0x1c, 0xde, 0xd7, 0x1d, +0x9f, 0x9c, 0x1e, 0x13, 0x16, 0x4c, 0x13, 0x16, 0x4b, 0x13, 0x16, 0x4b, +0x12, 0x16, 0x4a, 0x12, 0x15, 0x48, 0x12, 0x15, 0x48, 0x12, 0x15, 0x48, +0xde, 0xdc, 0x1f, 0xe5, 0xdf, 0x34, 0xe6, 0xe0, 0x39, 0xe2, 0xe0, 0x2d, +0xe2, 0xdc, 0x2d, 0xcd, 0xc7, 0x0d, 0x11, 0x13, 0x44, 0x11, 0x13, 0x44, +0x10, 0x13, 0x42, 0x10, 0x13, 0x42, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x41, +0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f, +0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x10, 0x37, 0x01, 0x01, 0x05, +0x14, 0x18, 0x49, 0x29, 0x32, 0x94, 0x2d, 0x35, 0x9c, 0x27, 0x2d, 0x83, +0x23, 0x29, 0x7a, 0x24, 0x2a, 0x7c, 0x25, 0x2b, 0x7e, 0x26, 0x2c, 0x80, +0x27, 0x2d, 0x81, 0x28, 0x2f, 0x84, 0x29, 0x30, 0x86, 0x2a, 0x31, 0x88, +0x2c, 0x33, 0x8a, 0x2d, 0x34, 0x8c, 0x2e, 0x36, 0x8f, 0x30, 0x38, 0x91, +0x32, 0x39, 0x93, 0xaa, 0xa8, 0x36, 0xde, 0xd7, 0x1d, 0xe1, 0xda, 0x26, +0xe1, 0xdb, 0x28, 0xdf, 0xd9, 0x22, 0xe1, 0xdb, 0x28, 0xde, 0xd7, 0x1d, +0x71, 0x74, 0x73, 0x37, 0x40, 0xad, 0x37, 0x40, 0xb0, 0x38, 0x42, 0xb4, +0x38, 0x42, 0xb8, 0x38, 0x42, 0xbc, 0x38, 0x42, 0xbf, 0x38, 0x42, 0xc3, +0x38, 0x42, 0xc7, 0x38, 0x43, 0xcc, 0x38, 0x42, 0xd0, 0x37, 0x42, 0xd5, +0x36, 0x42, 0xda, 0x35, 0x41, 0xdf, 0x35, 0x41, 0xe2, 0x3a, 0x46, 0xe1, +0x41, 0x4e, 0xe1, 0x48, 0x56, 0xe0, 0x53, 0x62, 0xdf, 0x55, 0x64, 0xcc, +0x32, 0x3c, 0x75, 0x16, 0x1c, 0x43, 0x17, 0x1d, 0x47, 0x19, 0x1f, 0x4a, +0x1b, 0x22, 0x4f, 0x1d, 0x24, 0x54, 0x1f, 0x27, 0x59, 0x22, 0x2a, 0x60, +0xd0, 0xca, 0x11, 0xe3, 0xdd, 0x30, 0xd2, 0xcc, 0x1b, 0xdb, 0xd4, 0x1c, +0xe1, 0xdf, 0x2a, 0xe1, 0xda, 0x26, 0xd3, 0xcf, 0x19, 0x4f, 0x5e, 0xc0, +0x53, 0x64, 0xd1, 0x58, 0x6b, 0xe5, 0x74, 0x89, 0xfd, 0x9e, 0xb6, 0xfd, +0xd9, 0xf4, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf7, 0xfd, 0xfd, +0xc5, 0xe5, 0xfd, 0x94, 0xb2, 0xfd, 0x8e, 0xa9, 0xfd, 0xc4, 0xdc, 0xfd, +0xcd, 0xe2, 0xfd, 0xaf, 0xc2, 0xfd, 0x98, 0xa9, 0xfd, 0x86, 0x95, 0xf7, +0xe0, 0xde, 0x25, 0xdf, 0xd9, 0x22, 0xd4, 0xcd, 0x1b, 0xd7, 0xd5, 0x1c, +0xdb, 0xd4, 0x1c, 0xe6, 0xdf, 0x37, 0xe1, 0xdf, 0x2a, 0x22, 0x2a, 0x60, +0x49, 0x4e, 0x46, 0xa2, 0xa0, 0x20, 0xce, 0xc9, 0x0f, 0xe1, 0xda, 0x26, +0xde, 0xdc, 0x1f, 0xd1, 0xcf, 0x1a, 0xd9, 0xd2, 0x1c, 0xe0, 0xde, 0x25, +0xe0, 0xda, 0x25, 0xd2, 0xcc, 0x1b, 0xcc, 0xc6, 0x19, 0x3e, 0x4a, 0xe1, +0x39, 0x45, 0xe2, 0x36, 0x41, 0xde, 0x35, 0x40, 0xda, 0x34, 0x40, 0xd5, +0x34, 0x3f, 0xd0, 0x33, 0x3e, 0xcc, 0x6e, 0x72, 0x87, 0xe6, 0xe0, 0x39, +0xe3, 0xdd, 0x30, 0xe1, 0xdf, 0x2a, 0xcc, 0xc6, 0x19, 0xd7, 0xd5, 0x1c, +0xa8, 0xa6, 0x3f, 0x2d, 0x35, 0xad, 0x2c, 0x34, 0xaa, 0xa7, 0xa6, 0x3c, +0xd0, 0xcb, 0x18, 0xe1, 0xdf, 0x2a, 0xdf, 0xd8, 0x20, 0xdf, 0xd8, 0x20, +0xd4, 0xcd, 0x1b, 0xd7, 0xd5, 0x1c, 0xde, 0xd7, 0x1d, 0xe1, 0xda, 0x26, +0xe1, 0xdb, 0x28, 0x4e, 0x51, 0x6e, 0x24, 0x2a, 0x8b, 0x24, 0x29, 0x88, +0x23, 0x29, 0x86, 0x22, 0x28, 0x84, 0x22, 0x28, 0x82, 0x22, 0x27, 0x80, +0x21, 0x27, 0x7e, 0x21, 0x26, 0x7c, 0x20, 0x26, 0x7a, 0x20, 0x26, 0x79, +0xa4, 0xa1, 0x2c, 0xd2, 0xcc, 0x1b, 0xdf, 0xd8, 0x20, 0xce, 0xcc, 0x19, +0xd4, 0xcd, 0x1b, 0x76, 0x75, 0x40, 0x1d, 0x22, 0x6e, 0x1d, 0x22, 0x6c, +0x1d, 0x21, 0x6b, 0x5f, 0x60, 0x49, 0xc7, 0xc5, 0x18, 0xd5, 0xcf, 0x1c, +0xd9, 0xd2, 0x1c, 0xe1, 0xdb, 0x2a, 0xce, 0xc9, 0x11, 0x1a, 0x1f, 0x63, +0x1a, 0x1e, 0x62, 0xa2, 0x9e, 0x25, 0xb8, 0xb3, 0x1a, 0xe3, 0xe1, 0x32, +0xe2, 0xdc, 0x2b, 0xe3, 0xdd, 0x30, 0xd2, 0xcc, 0x1b, 0xdb, 0xd4, 0x1c, +0xe1, 0xdf, 0x2a, 0xe1, 0xda, 0x26, 0xa1, 0x9d, 0x22, 0x17, 0x1b, 0x57, +0x17, 0x1b, 0x56, 0x16, 0x1a, 0x55, 0x16, 0x1a, 0x54, 0x16, 0x1a, 0x53, +0x15, 0x19, 0x52, 0x15, 0x19, 0x52, 0x15, 0x19, 0x51, 0xcf, 0xc9, 0x1a, +0xe3, 0xdd, 0x2e, 0xd7, 0xd0, 0x1c, 0xd7, 0xd5, 0x1c, 0xd4, 0xcd, 0x1b, +0xce, 0xc8, 0x0e, 0x14, 0x17, 0x4c, 0x14, 0x17, 0x4b, 0x13, 0x17, 0x4b, +0x13, 0x16, 0x4a, 0x13, 0x16, 0x49, 0x12, 0x15, 0x48, 0x12, 0x15, 0x48, +0xdb, 0xd4, 0x1c, 0xe6, 0xdf, 0x37, 0xe1, 0xdf, 0x2a, 0xe0, 0xde, 0x25, +0xe5, 0xdf, 0x36, 0xe2, 0xdc, 0x2d, 0x11, 0x14, 0x44, 0x11, 0x14, 0x44, +0x10, 0x13, 0x42, 0x10, 0x13, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, +0x0f, 0x13, 0x40, 0x0f, 0x13, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0e, 0x10, 0x37, 0x01, 0x01, 0x05, +0x13, 0x16, 0x49, 0x28, 0x2e, 0x94, 0x2a, 0x31, 0x9c, 0x24, 0x2a, 0x83, +0x20, 0x27, 0x7b, 0x20, 0x27, 0x7c, 0x21, 0x28, 0x7e, 0x22, 0x29, 0x80, +0x23, 0x2a, 0x82, 0x24, 0x2b, 0x84, 0x25, 0x2c, 0x86, 0x26, 0x2c, 0x88, +0x27, 0x2e, 0x8a, 0x28, 0x2e, 0x8c, 0x29, 0x30, 0x8f, 0x2a, 0x32, 0x91, +0x2b, 0x33, 0x94, 0xd9, 0xd2, 0x1c, 0xe1, 0xda, 0x26, 0xe2, 0xe0, 0x2d, +0xe0, 0xde, 0x25, 0xd7, 0xd5, 0x1c, 0xe2, 0xdc, 0x2b, 0xde, 0xd8, 0x1f, +0x39, 0x42, 0xaa, 0x3c, 0x45, 0xad, 0x3e, 0x48, 0xb1, 0x41, 0x4a, 0xb4, +0x44, 0x4e, 0xb8, 0x47, 0x51, 0xbc, 0x47, 0x51, 0xbf, 0x47, 0x53, 0xc4, +0x49, 0x54, 0xc8, 0x49, 0x54, 0xcc, 0x49, 0x55, 0xd1, 0x4a, 0x56, 0xd6, +0x4a, 0x56, 0xda, 0x4a, 0x56, 0xdf, 0x49, 0x56, 0xe2, 0x4b, 0x59, 0xe1, +0x4d, 0x5b, 0xe1, 0x4e, 0x5c, 0xe0, 0x4f, 0x5d, 0xdf, 0x4f, 0x5e, 0xde, +0x50, 0x60, 0xdd, 0x51, 0x61, 0xdb, 0x58, 0x69, 0xda, 0x40, 0x4e, 0x96, +0x1b, 0x22, 0x50, 0x1d, 0x25, 0x55, 0x20, 0x27, 0x5a, 0x4d, 0x52, 0x4d, +0xde, 0xd8, 0x1f, 0xe5, 0xdf, 0x36, 0xe1, 0xda, 0x26, 0xd9, 0xd2, 0x1c, +0xe3, 0xe1, 0x32, 0xe3, 0xdd, 0x30, 0xb4, 0xb4, 0x43, 0x5a, 0x69, 0xd0, +0x62, 0x73, 0xe7, 0x69, 0x7d, 0xfd, 0x72, 0x89, 0xfd, 0x8d, 0xa8, 0xfd, +0xd3, 0xf3, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, +0xee, 0xfd, 0xfd, 0xa6, 0xcb, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, +0xd5, 0xec, 0xfd, 0xb3, 0xc7, 0xfd, 0x8e, 0x9f, 0xfd, 0x74, 0x83, 0xea, +0xde, 0xd8, 0x1f, 0xe2, 0xe0, 0x2d, 0xe0, 0xde, 0x25, 0xde, 0xd7, 0x1d, +0xe2, 0xe0, 0x2b, 0xe2, 0xe0, 0x2d, 0xe0, 0xde, 0x25, 0x21, 0x29, 0x5f, +0x1e, 0x26, 0x59, 0x1c, 0x23, 0x53, 0x1a, 0x21, 0x4f, 0x39, 0x45, 0x86, +0x5f, 0x6d, 0xa8, 0xe0, 0xd9, 0x23, 0xcf, 0xc9, 0x1a, 0xdb, 0xd4, 0x1c, +0xdb, 0xd4, 0x1c, 0xd7, 0xd5, 0x1c, 0xdf, 0xd9, 0x22, 0x3e, 0x4b, 0xe1, +0x3b, 0x47, 0xe2, 0x39, 0x45, 0xdf, 0x39, 0x44, 0xda, 0x37, 0x43, 0xd6, +0x37, 0x41, 0xd1, 0x36, 0x40, 0xcc, 0x70, 0x74, 0x87, 0xe5, 0xdf, 0x36, +0xe1, 0xdf, 0x2a, 0xdf, 0xd9, 0x22, 0xdf, 0xd8, 0x20, 0xde, 0xd7, 0x1d, +0xa9, 0xa7, 0x3f, 0x2e, 0x37, 0xae, 0x2e, 0x36, 0xaa, 0x2d, 0x36, 0xa7, +0x2d, 0x35, 0xa4, 0x2c, 0x34, 0xa2, 0x54, 0x59, 0x7c, 0xd0, 0xcb, 0x17, +0xdf, 0xd8, 0x20, 0xd9, 0xd2, 0x1c, 0xe1, 0xda, 0x26, 0xe2, 0xe0, 0x2d, +0xe0, 0xde, 0x25, 0x27, 0x2e, 0x8c, 0x27, 0x2e, 0x8b, 0x26, 0x2d, 0x88, +0x26, 0x2d, 0x86, 0x25, 0x2c, 0x84, 0x25, 0x2c, 0x83, 0x24, 0x2b, 0x80, +0x23, 0x2a, 0x7e, 0x23, 0x29, 0x7c, 0x23, 0x29, 0x7b, 0xa4, 0xa2, 0x2d, +0xde, 0xdc, 0x1f, 0xe0, 0xde, 0x25, 0xdb, 0xd4, 0x1c, 0xd7, 0xd5, 0x1c, +0x61, 0x63, 0x4d, 0x1f, 0x25, 0x70, 0x1f, 0x25, 0x6e, 0x1e, 0x24, 0x6d, +0x1e, 0x23, 0x6b, 0x1e, 0x23, 0x6a, 0xb9, 0xb4, 0x1c, 0xde, 0xdc, 0x1f, +0xd7, 0xd5, 0x1c, 0xe1, 0xda, 0x26, 0xdb, 0xd4, 0x1c, 0x5e, 0x5f, 0x44, +0x1b, 0x20, 0x62, 0x1b, 0x20, 0x61, 0x1b, 0x1f, 0x60, 0x1b, 0x1f, 0x5f, +0x1a, 0x1e, 0x5e, 0xb8, 0xb3, 0x1a, 0xe1, 0xda, 0x26, 0xd9, 0xd2, 0x1c, +0xe3, 0xe1, 0x32, 0xe3, 0xdd, 0x30, 0xa1, 0x9e, 0x22, 0x18, 0x1c, 0x57, +0x17, 0x1c, 0x56, 0x17, 0x1b, 0x55, 0x17, 0x1b, 0x54, 0x16, 0x1b, 0x53, +0x16, 0x1b, 0x53, 0x16, 0x1a, 0x52, 0x72, 0x71, 0x30, 0xd1, 0xcf, 0x1a, +0xd4, 0xcd, 0x1b, 0xd7, 0xd5, 0x1c, 0xcb, 0xc4, 0x18, 0xd1, 0xcf, 0x1a, +0xce, 0xcc, 0x19, 0x14, 0x18, 0x4c, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4b, +0x14, 0x17, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, +0x9f, 0x9c, 0x1c, 0xe2, 0xe0, 0x2d, 0xe0, 0xde, 0x25, 0xde, 0xd7, 0x1d, +0xe2, 0xe0, 0x2d, 0xe7, 0xe1, 0x3c, 0x11, 0x14, 0x44, 0x11, 0x14, 0x44, +0x10, 0x14, 0x42, 0x10, 0x14, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, +0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05, +0x12, 0x15, 0x49, 0x25, 0x2c, 0x94, 0x27, 0x2d, 0x9c, 0x22, 0x27, 0x83, +0x1e, 0x23, 0x7b, 0x1f, 0x24, 0x7d, 0x1f, 0x24, 0x7f, 0x20, 0x26, 0x81, +0x20, 0x26, 0x82, 0x21, 0x27, 0x84, 0x22, 0x27, 0x86, 0x23, 0x29, 0x89, +0x23, 0x2a, 0x8a, 0x23, 0x2a, 0x8d, 0x24, 0x2b, 0x8f, 0x25, 0x2d, 0x91, +0x66, 0x69, 0x65, 0xc9, 0xc3, 0x18, 0xe1, 0xdb, 0x28, 0xe1, 0xda, 0x26, +0xdf, 0xd8, 0x20, 0xcb, 0xc4, 0x18, 0xd1, 0xcf, 0x1a, 0xa8, 0xa7, 0x3c, +0x30, 0x38, 0xaa, 0x31, 0x3a, 0xad, 0x33, 0x3c, 0xb1, 0x34, 0x3e, 0xb4, +0x37, 0x40, 0xb8, 0x38, 0x42, 0xbc, 0x3b, 0x44, 0xc0, 0x3d, 0x47, 0xc4, +0x3f, 0x4a, 0xc8, 0x43, 0x4d, 0xcd, 0x46, 0x51, 0xd1, 0x49, 0x55, 0xd6, +0x4d, 0x5a, 0xdb, 0x51, 0x5e, 0xe0, 0x58, 0x67, 0xe2, 0x56, 0x63, 0xcd, +0x44, 0x50, 0x9a, 0x27, 0x2f, 0x5e, 0x16, 0x1b, 0x41, 0x13, 0x19, 0x3e, +0x15, 0x1b, 0x41, 0x16, 0x1c, 0x44, 0x18, 0x1e, 0x48, 0x1a, 0x20, 0x4c, +0x1c, 0x23, 0x51, 0x1e, 0x25, 0x55, 0x20, 0x28, 0x5b, 0x8e, 0x8e, 0x2f, +0xd7, 0xd0, 0x1c, 0xe4, 0xe2, 0x35, 0xe5, 0xdf, 0x36, 0xe0, 0xda, 0x25, +0xe1, 0xda, 0x26, 0xe2, 0xe0, 0x2d, 0x85, 0x8d, 0x84, 0x60, 0x70, 0xdb, +0x6e, 0x80, 0xf9, 0x7e, 0x94, 0xfd, 0x8e, 0xa7, 0xfd, 0xa0, 0xbe, 0xfd, +0xb3, 0xd8, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, +0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, +0xc0, 0xd9, 0xfd, 0x91, 0xa7, 0xfd, 0x74, 0x86, 0xfd, 0x5f, 0x6f, 0xda, +0xe1, 0xda, 0x26, 0xd9, 0xd2, 0x1c, 0xe2, 0xe0, 0x2d, 0xe1, 0xdf, 0x2a, +0xe3, 0xdd, 0x2e, 0xe0, 0xde, 0x25, 0xde, 0xd8, 0x1f, 0x23, 0x2c, 0x62, +0x20, 0x28, 0x5b, 0x1e, 0x25, 0x55, 0x2c, 0x36, 0x6d, 0x3f, 0x4b, 0x91, +0x4d, 0x5c, 0xb4, 0xc5, 0xc4, 0x34, 0xe0, 0xd9, 0x23, 0xde, 0xdc, 0x1f, +0xc7, 0xc5, 0x18, 0xd7, 0xd5, 0x1c, 0xd9, 0xd2, 0x1c, 0x54, 0x5f, 0xc9, +0x40, 0x4d, 0xe3, 0x3f, 0x4b, 0xe0, 0x3f, 0x4b, 0xdb, 0x3f, 0x4a, 0xd6, +0x3e, 0x49, 0xd1, 0x3d, 0x49, 0xcd, 0x4f, 0x57, 0xb3, 0xe2, 0xdc, 0x2b, +0xe0, 0xde, 0x25, 0xde, 0xd8, 0x1f, 0xde, 0xd7, 0x1d, 0xdf, 0xd8, 0x20, +0x71, 0x75, 0x79, 0x36, 0x40, 0xae, 0x35, 0x3e, 0xaa, 0x35, 0x3d, 0xa7, +0x35, 0x3c, 0xa5, 0x33, 0x3b, 0xa2, 0x32, 0x3a, 0x9e, 0xe2, 0xe0, 0x2d, +0xdb, 0xd4, 0x1c, 0xc9, 0xc3, 0x18, 0xe1, 0xdb, 0x28, 0xe1, 0xda, 0x26, +0xbc, 0xb8, 0x25, 0x2c, 0x33, 0x8d, 0x2b, 0x33, 0x8b, 0x2b, 0x32, 0x89, +0x29, 0x30, 0x86, 0x29, 0x2f, 0x84, 0x29, 0x2f, 0x83, 0x28, 0x2e, 0x81, +0x27, 0x2d, 0x7f, 0x27, 0x2c, 0x7d, 0xa6, 0xa3, 0x2d, 0xe3, 0xdd, 0x30, +0xd5, 0xcf, 0x1c, 0xd5, 0xcf, 0x1c, 0xdf, 0xd8, 0x20, 0x8e, 0x8d, 0x37, +0x22, 0x28, 0x71, 0x22, 0x28, 0x70, 0x21, 0x27, 0x6e, 0x20, 0x26, 0x6d, +0x20, 0x26, 0x6b, 0x1f, 0x25, 0x6a, 0xa3, 0xa1, 0x27, 0xdf, 0xd8, 0x20, +0xdf, 0xd8, 0x20, 0xd7, 0xd5, 0x1c, 0xd9, 0xd2, 0x1c, 0x5f, 0x61, 0x44, +0x1c, 0x22, 0x62, 0x1c, 0x21, 0x61, 0x1b, 0x21, 0x60, 0x1b, 0x21, 0x5f, +0x1a, 0x20, 0x5e, 0xa2, 0x9f, 0x23, 0xe5, 0xdf, 0x36, 0xe0, 0xda, 0x25, +0xe1, 0xda, 0x26, 0xe2, 0xe0, 0x2d, 0xa1, 0x9e, 0x22, 0x18, 0x1d, 0x57, +0x18, 0x1d, 0x56, 0x18, 0x1c, 0x55, 0x18, 0x1c, 0x54, 0x17, 0x1b, 0x53, +0x17, 0x1b, 0x53, 0x16, 0x1b, 0x52, 0xce, 0xc8, 0x0f, 0xde, 0xdc, 0x1f, +0xce, 0xcc, 0x19, 0xd4, 0xcd, 0x1b, 0xc0, 0xba, 0x15, 0xd9, 0xd2, 0x1c, +0xdf, 0xd8, 0x20, 0x14, 0x18, 0x4c, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4b, +0x14, 0x18, 0x4a, 0x13, 0x17, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, +0x9f, 0x9c, 0x1c, 0xe0, 0xde, 0x25, 0xde, 0xd8, 0x1f, 0xe0, 0xde, 0x25, +0xe1, 0xda, 0x26, 0x9f, 0x9b, 0x1b, 0x11, 0x15, 0x44, 0x11, 0x15, 0x44, +0x11, 0x14, 0x42, 0x11, 0x14, 0x42, 0x11, 0x14, 0x41, 0x11, 0x14, 0x41, +0x10, 0x14, 0x40, 0x10, 0x14, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, +0x10, 0x13, 0x3e, 0x10, 0x13, 0x3e, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05, +0x11, 0x14, 0x49, 0x23, 0x2b, 0x94, 0x24, 0x2c, 0x9c, 0x20, 0x25, 0x83, +0x1c, 0x22, 0x7b, 0x1d, 0x23, 0x7d, 0x1d, 0x24, 0x7f, 0x1d, 0x24, 0x81, +0x1e, 0x24, 0x82, 0x1e, 0x25, 0x84, 0x1f, 0x26, 0x86, 0x1f, 0x27, 0x89, +0x20, 0x27, 0x8a, 0x20, 0x27, 0x8d, 0x21, 0x28, 0x8f, 0x22, 0x29, 0x91, +0x8e, 0x8e, 0x46, 0xdf, 0xd8, 0x20, 0xde, 0xd7, 0x1d, 0xe1, 0xda, 0x26, +0xdd, 0xd6, 0x1c, 0xce, 0xcc, 0x19, 0xd5, 0xcf, 0x1c, 0x7c, 0x7c, 0x60, +0x28, 0x31, 0xaa, 0x2a, 0x32, 0xae, 0x2b, 0x33, 0xb1, 0x2c, 0x34, 0xb5, +0x2d, 0x35, 0xb8, 0x2e, 0x37, 0xbd, 0x2e, 0x38, 0xc0, 0x30, 0x3a, 0xc4, +0x31, 0x3c, 0xc9, 0x33, 0x3d, 0xcd, 0x34, 0x3e, 0xd2, 0x36, 0x40, 0xd6, +0x37, 0x42, 0xdb, 0x39, 0x44, 0xe0, 0x3c, 0x48, 0xe2, 0x40, 0x4d, 0xe1, +0x44, 0x52, 0xe1, 0x49, 0x58, 0xdf, 0x4f, 0x5e, 0xdf, 0x56, 0x66, 0xde, +0x55, 0x65, 0xce, 0x42, 0x4e, 0x97, 0x2a, 0x33, 0x67, 0x1a, 0x20, 0x4c, +0x1c, 0x23, 0x51, 0x1e, 0x25, 0x56, 0x21, 0x29, 0x5c, 0xba, 0xb7, 0x1b, +0xdc, 0xda, 0x1d, 0xdd, 0xd6, 0x1c, 0xe7, 0xe1, 0x3c, 0xe2, 0xe0, 0x2d, +0xe1, 0xdb, 0x28, 0xe0, 0xda, 0x25, 0x67, 0x74, 0xb2, 0x63, 0x74, 0xe1, +0x71, 0x84, 0xfd, 0x85, 0x9b, 0xfd, 0x9e, 0xb8, 0xfd, 0xc4, 0xe4, 0xfd, +0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, +0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xc1, 0xe1, 0xfd, +0x8e, 0xa8, 0xfd, 0x7c, 0x92, 0xfd, 0x6d, 0x80, 0xfd, 0x62, 0x73, 0xe0, +0xde, 0xd8, 0x1f, 0xd7, 0xd0, 0x1c, 0xe4, 0xe2, 0x35, 0xe6, 0xdf, 0x37, +0xdf, 0xd8, 0x20, 0xe0, 0xde, 0x25, 0xdf, 0xd9, 0x22, 0x26, 0x2e, 0x65, +0x23, 0x2b, 0x5e, 0x20, 0x27, 0x58, 0x1e, 0x25, 0x53, 0x1b, 0x22, 0x4e, +0x19, 0x20, 0x4a, 0xa1, 0x9e, 0x1c, 0xe0, 0xde, 0x25, 0xe2, 0xe0, 0x2b, +0xd1, 0xcf, 0x1a, 0xd7, 0xd5, 0x1c, 0xd9, 0xd2, 0x1c, 0x87, 0x8e, 0x8e, +0x5c, 0x6a, 0xe3, 0x58, 0x66, 0xe1, 0x56, 0x64, 0xdc, 0x54, 0x61, 0xd7, +0x52, 0x5e, 0xd3, 0x50, 0x5c, 0xce, 0x4e, 0x5a, 0xca, 0xce, 0xc7, 0x19, +0xdf, 0xd8, 0x20, 0xde, 0xd8, 0x1f, 0xdf, 0xd8, 0x20, 0xde, 0xdb, 0x1d, +0x43, 0x4c, 0xb2, 0x41, 0x4b, 0xaf, 0x40, 0x49, 0xab, 0x3e, 0x47, 0xa7, +0x3c, 0x45, 0xa5, 0x3b, 0x44, 0xa2, 0x5f, 0x64, 0x7c, 0xd4, 0xcd, 0x1b, +0xd7, 0xd5, 0x1c, 0xdf, 0xd8, 0x20, 0xde, 0xd7, 0x1d, 0xe1, 0xda, 0x26, +0xaa, 0xa8, 0x34, 0x31, 0x39, 0x8d, 0x30, 0x38, 0x8b, 0x30, 0x37, 0x89, +0x2e, 0x35, 0x86, 0x2d, 0x34, 0x84, 0x2d, 0x33, 0x83, 0x2b, 0x32, 0x81, +0x2b, 0x32, 0x7f, 0x7d, 0x7e, 0x48, 0xd7, 0xd0, 0x1c, 0xde, 0xd8, 0x1f, +0xd4, 0xcd, 0x1b, 0xcc, 0xc6, 0x19, 0xd0, 0xca, 0x13, 0x26, 0x2b, 0x73, +0x25, 0x2a, 0x71, 0x25, 0x2a, 0x70, 0x23, 0x29, 0x6e, 0x23, 0x28, 0x6d, +0x22, 0x27, 0x6b, 0x22, 0x27, 0x6b, 0xcf, 0xc9, 0x12, 0xe0, 0xde, 0x25, +0xe0, 0xda, 0x25, 0xdd, 0xd6, 0x1c, 0xde, 0xdc, 0x1f, 0x60, 0x61, 0x44, +0x1e, 0x23, 0x62, 0x1e, 0x22, 0x61, 0x1d, 0x22, 0x60, 0x1d, 0x21, 0x5f, +0x1c, 0x20, 0x5e, 0xa2, 0x9f, 0x23, 0xe7, 0xe1, 0x3c, 0xe2, 0xe0, 0x2d, +0xe1, 0xdb, 0x28, 0xe0, 0xda, 0x25, 0xa2, 0x9f, 0x22, 0x19, 0x1e, 0x57, +0x19, 0x1e, 0x56, 0x18, 0x1d, 0x55, 0x18, 0x1d, 0x54, 0x18, 0x1c, 0x53, +0x18, 0x1c, 0x53, 0x72, 0x71, 0x30, 0xc4, 0xbe, 0x17, 0xe1, 0xdb, 0x28, +0xce, 0xcc, 0x19, 0xce, 0xcc, 0x19, 0xdf, 0xd9, 0x22, 0xdd, 0xd6, 0x1c, +0xd7, 0xd5, 0x1c, 0x14, 0x18, 0x4c, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4b, +0x14, 0x18, 0x4a, 0x13, 0x17, 0x49, 0x13, 0x17, 0x49, 0x13, 0x17, 0x48, +0x59, 0x59, 0x31, 0xe0, 0xde, 0x25, 0xdf, 0xd9, 0x22, 0xd9, 0xd2, 0x1c, +0xde, 0xdc, 0x1f, 0x6f, 0x6e, 0x28, 0x11, 0x15, 0x44, 0x11, 0x15, 0x44, +0x11, 0x14, 0x42, 0x11, 0x14, 0x42, 0x11, 0x14, 0x41, 0x11, 0x14, 0x41, +0x10, 0x14, 0x40, 0x10, 0x14, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, +0x10, 0x13, 0x3e, 0x10, 0x13, 0x3e, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05, +0x11, 0x15, 0x49, 0x23, 0x2b, 0x94, 0x25, 0x2d, 0x9c, 0x20, 0x26, 0x83, +0x1d, 0x23, 0x7b, 0x1d, 0x23, 0x7d, 0x1d, 0x24, 0x7f, 0x1e, 0x25, 0x81, +0x1f, 0x25, 0x82, 0x1f, 0x25, 0x84, 0x20, 0x26, 0x86, 0x20, 0x27, 0x89, +0x21, 0x28, 0x8a, 0x22, 0x28, 0x8d, 0x22, 0x29, 0x8f, 0x23, 0x2a, 0x91, +0xa5, 0xa2, 0x36, 0xe3, 0xdd, 0x30, 0xe2, 0xdc, 0x2b, 0xce, 0xc7, 0x19, +0xdb, 0xd4, 0x1c, 0xde, 0xdc, 0x1f, 0xc1, 0xbb, 0x16, 0x67, 0x69, 0x71, +0x28, 0x31, 0xaa, 0x2a, 0x32, 0xae, 0x2a, 0x32, 0xb1, 0x2b, 0x34, 0xb5, +0x2c, 0x35, 0xb9, 0x2d, 0x36, 0xbd, 0x2e, 0x37, 0xc0, 0x2f, 0x38, 0xc5, +0x30, 0x39, 0xc9, 0x30, 0x3a, 0xcd, 0x31, 0x3b, 0xd2, 0x31, 0x3d, 0xd6, +0x32, 0x3e, 0xdb, 0x33, 0x3f, 0xe0, 0x36, 0x42, 0xe2, 0x39, 0x45, 0xe1, +0x3c, 0x48, 0xe1, 0x3f, 0x4d, 0xe0, 0x42, 0x51, 0xdf, 0x48, 0x56, 0xde, +0x4c, 0x5b, 0xdd, 0x51, 0x61, 0xdb, 0x56, 0x68, 0xda, 0x52, 0x62, 0xc3, +0x44, 0x53, 0xa0, 0x2f, 0x3a, 0x74, 0x21, 0x29, 0x5c, 0xd7, 0xd0, 0x1c, +0xe1, 0xda, 0x26, 0xe0, 0xd9, 0x23, 0xde, 0xdb, 0x1d, 0xdc, 0xda, 0x1d, +0xe2, 0xdc, 0x2d, 0xe1, 0xda, 0x26, 0x58, 0x67, 0xc9, 0x64, 0x75, 0xe3, +0x73, 0x86, 0xfd, 0x86, 0x9d, 0xfd, 0xa2, 0xbd, 0xfd, 0xcb, 0xed, 0xfd, +0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, +0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xec, 0xfd, 0xfd, +0xbc, 0xd7, 0xfd, 0x9c, 0xb3, 0xfd, 0x86, 0x99, 0xfd, 0x80, 0x8e, 0xd9, +0xce, 0xc7, 0x19, 0xe3, 0xdd, 0x2e, 0xe5, 0xdf, 0x34, 0xe2, 0xdc, 0x2b, +0xdc, 0xda, 0x1d, 0xdc, 0xda, 0x1d, 0xbc, 0xb9, 0x1e, 0x29, 0x31, 0x68, +0x25, 0x2d, 0x60, 0x22, 0x29, 0x5a, 0x1f, 0x26, 0x54, 0x1c, 0x23, 0x4f, +0x1b, 0x21, 0x4b, 0x5d, 0x5f, 0x31, 0xde, 0xd8, 0x1f, 0xe0, 0xde, 0x25, +0xdf, 0xd9, 0x22, 0xd7, 0xd5, 0x1c, 0xe2, 0xe0, 0x2d, 0x78, 0x7c, 0x62, +0x4d, 0x58, 0xad, 0x54, 0x61, 0xc5, 0x55, 0x61, 0xc8, 0x55, 0x62, 0xca, +0x55, 0x61, 0xcc, 0x54, 0x61, 0xce, 0x52, 0x5e, 0xca, 0xc4, 0xc1, 0x31, +0xe0, 0xde, 0x25, 0xe1, 0xda, 0x26, 0xe3, 0xe1, 0x32, 0x9e, 0x9e, 0x55, +0x43, 0x4d, 0xb2, 0x42, 0x4b, 0xaf, 0x3f, 0x49, 0xab, 0x3e, 0x47, 0xa7, +0x3b, 0x45, 0xa5, 0x3b, 0x43, 0xa2, 0x72, 0x75, 0x6c, 0xc7, 0xc5, 0x18, +0xdb, 0xd4, 0x1c, 0xe3, 0xdd, 0x30, 0xe2, 0xdc, 0x2b, 0xce, 0xc7, 0x19, +0x6d, 0x6f, 0x61, 0x30, 0x37, 0x8d, 0x2f, 0x35, 0x8b, 0x2e, 0x35, 0x89, +0x2c, 0x34, 0x86, 0x2b, 0x33, 0x85, 0x2b, 0x32, 0x83, 0x29, 0x31, 0x81, +0x3d, 0x43, 0x71, 0xe0, 0xda, 0x25, 0xe1, 0xda, 0x26, 0xd4, 0xcd, 0x1b, +0xd1, 0xcf, 0x1a, 0xd4, 0xcd, 0x1b, 0x79, 0x7a, 0x43, 0x24, 0x29, 0x73, +0x23, 0x29, 0x71, 0x23, 0x28, 0x70, 0x22, 0x28, 0x6e, 0x21, 0x27, 0x6d, +0x20, 0x26, 0x6c, 0x77, 0x77, 0x3e, 0xdf, 0xd8, 0x20, 0xe1, 0xdb, 0x28, +0xdf, 0xd8, 0x20, 0xcc, 0xc6, 0x19, 0xde, 0xdb, 0x1d, 0x1d, 0x22, 0x63, +0x1c, 0x22, 0x62, 0x1c, 0x21, 0x61, 0x1c, 0x21, 0x60, 0x1c, 0x21, 0x5f, +0x1b, 0x20, 0x5e, 0xa2, 0x9f, 0x23, 0xde, 0xdb, 0x1d, 0xdc, 0xda, 0x1d, +0xe2, 0xdc, 0x2d, 0xe1, 0xda, 0x26, 0xa1, 0x9e, 0x22, 0x18, 0x1d, 0x57, +0x18, 0x1c, 0x56, 0x18, 0x1c, 0x55, 0x17, 0x1b, 0x54, 0x17, 0x1b, 0x53, +0x17, 0x1b, 0x53, 0xce, 0xc8, 0x0f, 0xdb, 0xd4, 0x1c, 0xce, 0xc7, 0x19, +0xd1, 0xca, 0x1a, 0xdf, 0xd9, 0x22, 0xde, 0xdc, 0x1f, 0xdd, 0xd6, 0x1c, +0xe2, 0xe0, 0x2b, 0x14, 0x18, 0x4c, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4b, +0x14, 0x18, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, +0x59, 0x59, 0x32, 0xdc, 0xda, 0x1d, 0xd7, 0xd0, 0x1c, 0xdc, 0xda, 0x1d, +0xe1, 0xda, 0x26, 0x12, 0x15, 0x45, 0x12, 0x14, 0x44, 0x11, 0x14, 0x44, +0x10, 0x14, 0x42, 0x10, 0x14, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, +0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05, +0x12, 0x15, 0x49, 0x24, 0x2c, 0x94, 0x25, 0x2d, 0x9c, 0x21, 0x26, 0x83, +0x1e, 0x23, 0x7b, 0x1e, 0x24, 0x7d, 0x1e, 0x24, 0x7f, 0x1f, 0x25, 0x81, +0x20, 0x25, 0x82, 0x20, 0x26, 0x84, 0x21, 0x27, 0x86, 0x21, 0x27, 0x89, +0x21, 0x28, 0x8a, 0x22, 0x28, 0x8d, 0x23, 0x29, 0x8f, 0x23, 0x2a, 0x91, +0xd0, 0xca, 0x17, 0xd7, 0xd0, 0x1c, 0xde, 0xd7, 0x1d, 0xdc, 0xda, 0x1d, +0xd7, 0xd5, 0x1c, 0xdf, 0xd8, 0x20, 0xd2, 0xcc, 0x1b, 0x3d, 0x44, 0x95, +0x2a, 0x33, 0xaa, 0x2c, 0x34, 0xae, 0x2c, 0x35, 0xb1, 0x2d, 0x36, 0xb5, +0x2e, 0x37, 0xb8, 0x2f, 0x38, 0xbd, 0x30, 0x3a, 0xc0, 0x31, 0x3b, 0xc5, +0x33, 0x3c, 0xc9, 0xaa, 0xa9, 0x49, 0xd1, 0xca, 0x1a, 0xc3, 0xbd, 0x16, +0xd7, 0xd5, 0x1c, 0xde, 0xd7, 0x1d, 0xd7, 0xd5, 0x1c, 0xdc, 0xda, 0x1d, +0xe1, 0xda, 0x26, 0xd7, 0xd5, 0x1c, 0xd1, 0xcf, 0x1a, 0xe1, 0xdb, 0x2a, +0xdd, 0xd6, 0x1c, 0xce, 0xcc, 0x19, 0xcb, 0xc4, 0x18, 0xa9, 0xa8, 0x2b, +0x1c, 0x23, 0x51, 0x1e, 0x26, 0x57, 0x36, 0x3c, 0x52, 0xe1, 0xdf, 0x2a, +0xc3, 0xbd, 0x16, 0xdf, 0xd9, 0x22, 0xe1, 0xda, 0x26, 0xe0, 0xde, 0x25, +0xce, 0xcc, 0x19, 0xc3, 0xc0, 0x2c, 0x58, 0x67, 0xc8, 0x64, 0x75, 0xe2, +0x72, 0x85, 0xfd, 0x86, 0x9c, 0xfd, 0xa0, 0xba, 0xfd, 0xbd, 0xdd, 0xfd, +0xe2, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, +0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf0, 0xfd, 0xfd, +0xc3, 0xdd, 0xfd, 0xa4, 0xba, 0xfd, 0x8d, 0xa0, 0xfd, 0x9f, 0xa8, 0xa9, +0xe1, 0xdb, 0x28, 0xe6, 0xdf, 0x37, 0xdf, 0xd8, 0x20, 0xd7, 0xd0, 0x1c, +0xe1, 0xdf, 0x2a, 0xdf, 0xd9, 0x22, 0xa9, 0xa7, 0x2b, 0x2b, 0x34, 0x6b, +0x27, 0x2f, 0x62, 0x24, 0x2b, 0x5c, 0x20, 0x27, 0x56, 0x2c, 0x35, 0x68, +0x48, 0x56, 0xa2, 0x82, 0x8a, 0x7f, 0xd2, 0xcc, 0x1b, 0xd7, 0xd5, 0x1c, +0xe0, 0xde, 0x25, 0xe0, 0xde, 0x25, 0xe0, 0xda, 0x25, 0x7e, 0x85, 0x99, +0x49, 0x56, 0xe4, 0x46, 0x52, 0xe2, 0x44, 0x50, 0xdc, 0x43, 0x4f, 0xd8, +0x42, 0x4e, 0xd3, 0x41, 0x4c, 0xce, 0x40, 0x4a, 0xca, 0xae, 0xad, 0x46, +0xdb, 0xd4, 0x1c, 0xe3, 0xdd, 0x30, 0xe4, 0xe2, 0x33, 0x4b, 0x53, 0xa2, +0x38, 0x41, 0xb2, 0x37, 0x40, 0xaf, 0x35, 0x3e, 0xab, 0x34, 0x3e, 0xa8, +0x33, 0x3c, 0xa5, 0x33, 0x3a, 0xa2, 0xaa, 0xa7, 0x39, 0xe1, 0xdf, 0x2a, +0xde, 0xdb, 0x1d, 0xd7, 0xd0, 0x1c, 0xde, 0xd7, 0x1d, 0xdc, 0xda, 0x1d, +0x6a, 0x6c, 0x61, 0x2b, 0x31, 0x8d, 0x2b, 0x31, 0x8b, 0x29, 0x30, 0x89, +0x28, 0x2f, 0x86, 0x27, 0x2e, 0x85, 0x27, 0x2d, 0x83, 0x26, 0x2d, 0x81, +0xba, 0xb6, 0x21, 0xdf, 0xd8, 0x20, 0xdf, 0xd8, 0x20, 0xd1, 0xcf, 0x1a, +0xd1, 0xca, 0x1a, 0xdc, 0xda, 0x1d, 0x22, 0x28, 0x74, 0x21, 0x27, 0x73, +0x20, 0x27, 0x71, 0x20, 0x26, 0x70, 0x20, 0x25, 0x6e, 0x1f, 0x25, 0x6d, +0x61, 0x62, 0x4a, 0xd7, 0xd5, 0x1c, 0xd1, 0xcf, 0x1a, 0xe1, 0xdb, 0x2a, +0xdd, 0xd6, 0x1c, 0xce, 0xcc, 0x19, 0x8b, 0x8a, 0x30, 0x1c, 0x21, 0x63, +0x1b, 0x20, 0x62, 0x1b, 0x20, 0x61, 0x1b, 0x1f, 0x60, 0x1a, 0x1f, 0x5f, +0x1a, 0x1e, 0x5e, 0xa2, 0x9e, 0x23, 0xe1, 0xda, 0x26, 0xe0, 0xde, 0x25, +0xce, 0xcc, 0x19, 0xde, 0xd7, 0x1d, 0xd4, 0xcd, 0x1b, 0x18, 0x1c, 0x57, +0x17, 0x1b, 0x56, 0x17, 0x1b, 0x55, 0x17, 0x1b, 0x54, 0x16, 0x1b, 0x53, +0x72, 0x71, 0x31, 0xdf, 0xd8, 0x20, 0xd7, 0xd5, 0x1c, 0x71, 0x70, 0x2f, +0xd5, 0xcf, 0x1c, 0xe0, 0xda, 0x25, 0xde, 0xd7, 0x1d, 0xdf, 0xd8, 0x20, +0xdf, 0xd8, 0x20, 0x14, 0x18, 0x4c, 0x14, 0x17, 0x4b, 0x14, 0x17, 0x4b, +0x13, 0x17, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, +0x12, 0x16, 0x47, 0xdf, 0xd9, 0x22, 0xdf, 0xd8, 0x20, 0xdf, 0xd9, 0x22, +0x87, 0x84, 0x22, 0x12, 0x14, 0x45, 0x11, 0x14, 0x44, 0x11, 0x14, 0x44, +0x10, 0x13, 0x42, 0x10, 0x13, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, +0x0f, 0x13, 0x40, 0x0f, 0x13, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0e, 0x10, 0x37, 0x01, 0x01, 0x05, +0x12, 0x15, 0x49, 0x25, 0x2c, 0x94, 0x27, 0x2d, 0x9c, 0x22, 0x27, 0x83, +0x1e, 0x23, 0x7b, 0x1f, 0x24, 0x7d, 0x1f, 0x24, 0x7f, 0x20, 0x25, 0x81, +0x20, 0x26, 0x82, 0x21, 0x26, 0x84, 0x21, 0x27, 0x86, 0x22, 0x28, 0x89, +0x22, 0x29, 0x8a, 0x23, 0x2a, 0x8d, 0x24, 0x2a, 0x8f, 0x25, 0x2c, 0x91, +0xd4, 0xcd, 0x1b, 0xe0, 0xde, 0x25, 0xdb, 0xd4, 0x1c, 0xd2, 0xcc, 0x1b, +0xde, 0xdb, 0x1d, 0xe1, 0xdb, 0x2a, 0xdf, 0xd8, 0x20, 0x2b, 0x33, 0xa7, +0x2c, 0x35, 0xaa, 0x2d, 0x36, 0xad, 0x2f, 0x38, 0xb1, 0x30, 0x39, 0xb4, +0x32, 0x3a, 0xb8, 0x33, 0x3d, 0xbc, 0x35, 0x3e, 0xc0, 0x36, 0x40, 0xc4, +0x37, 0x42, 0xc8, 0xac, 0xab, 0x49, 0xc7, 0xc5, 0x18, 0xcf, 0xc9, 0x1a, +0xd4, 0xcd, 0x1b, 0xce, 0xc7, 0x19, 0xd4, 0xcd, 0x1b, 0xde, 0xd7, 0x1d, +0xde, 0xd7, 0x1d, 0xd7, 0xd0, 0x1c, 0xd5, 0xcf, 0x1c, 0xdd, 0xd6, 0x1c, +0xd7, 0xd5, 0x1c, 0xe0, 0xde, 0x25, 0xdf, 0xd8, 0x20, 0xa2, 0x9f, 0x1e, +0x1c, 0x23, 0x51, 0x1e, 0x25, 0x55, 0x62, 0x65, 0x3f, 0xdc, 0xda, 0x1d, +0xcb, 0xc4, 0x18, 0xe0, 0xde, 0x25, 0xe1, 0xda, 0x26, 0xdf, 0xd8, 0x20, +0xe0, 0xd9, 0x23, 0xb1, 0xb1, 0x3e, 0x54, 0x63, 0xc2, 0x5d, 0x6d, 0xd8, +0x66, 0x78, 0xf1, 0x6f, 0x85, 0xfd, 0x7b, 0x94, 0xfd, 0x88, 0xa6, 0xfd, +0xa0, 0xc5, 0xfd, 0xc5, 0xf5, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, +0xfd, 0xfd, 0xfd, 0xf0, 0xfd, 0xfd, 0xbc, 0xe1, 0xfd, 0xb3, 0xd1, 0xfd, +0xa6, 0xbf, 0xfd, 0x98, 0xae, 0xfd, 0x86, 0x98, 0xfd, 0xa7, 0xad, 0x89, +0xe1, 0xda, 0x26, 0xe0, 0xd9, 0x23, 0xdf, 0xd9, 0x22, 0xdb, 0xd4, 0x1c, +0xe1, 0xdb, 0x2a, 0xdb, 0xd4, 0x1c, 0x80, 0x82, 0x42, 0x2b, 0x33, 0x6a, +0x26, 0x2e, 0x61, 0x23, 0x2a, 0x5b, 0x21, 0x28, 0x56, 0x1e, 0x25, 0x51, +0x1c, 0x22, 0x4b, 0x5e, 0x5f, 0x31, 0xe1, 0xdb, 0x2a, 0xde, 0xdc, 0x1f, +0xe1, 0xda, 0x26, 0xe0, 0xde, 0x25, 0xdc, 0xda, 0x1d, 0xa9, 0xab, 0x69, +0x55, 0x64, 0xe4, 0x4e, 0x5b, 0xe2, 0x49, 0x56, 0xdd, 0x46, 0x51, 0xd8, +0x43, 0x4e, 0xd3, 0x3f, 0x4a, 0xce, 0x4e, 0x58, 0xb4, 0xdf, 0xd9, 0x22, +0xd2, 0xcc, 0x1b, 0xdf, 0xd9, 0x22, 0x95, 0x96, 0x56, 0x32, 0x3b, 0xb5, +0x30, 0x3a, 0xb2, 0x2f, 0x38, 0xae, 0x2f, 0x37, 0xab, 0x2d, 0x35, 0xa8, +0x2d, 0x35, 0xa5, 0x2c, 0x34, 0xa2, 0xbc, 0xb8, 0x28, 0xde, 0xd7, 0x1d, +0xd4, 0xcd, 0x1b, 0xe0, 0xde, 0x25, 0xdb, 0xd4, 0x1c, 0xd2, 0xcc, 0x1b, +0x28, 0x2e, 0x8f, 0x26, 0x2e, 0x8d, 0x26, 0x2d, 0x8b, 0x26, 0x2c, 0x89, +0x25, 0x2b, 0x87, 0x24, 0x2a, 0x85, 0x24, 0x2a, 0x83, 0x39, 0x3d, 0x73, +0xe2, 0xe0, 0x2d, 0xe4, 0xe2, 0x35, 0xe2, 0xe0, 0x2b, 0xe1, 0xdb, 0x28, +0xdf, 0xd8, 0x20, 0xa4, 0xa1, 0x2c, 0x1f, 0x25, 0x74, 0x1f, 0x24, 0x73, +0x1f, 0x24, 0x71, 0x1e, 0x24, 0x70, 0x1e, 0x23, 0x6e, 0x8c, 0x8a, 0x34, +0xde, 0xd7, 0x1d, 0xd7, 0xd0, 0x1c, 0xd5, 0xcf, 0x1c, 0xdd, 0xd6, 0x1c, +0xd7, 0xd5, 0x1c, 0xce, 0xc9, 0x11, 0x31, 0x34, 0x59, 0x1a, 0x1f, 0x63, +0x1a, 0x1e, 0x62, 0x1a, 0x1e, 0x61, 0x19, 0x1d, 0x60, 0x19, 0x1d, 0x5f, +0x19, 0x1d, 0x5e, 0xa1, 0x9e, 0x23, 0xe1, 0xda, 0x26, 0xdf, 0xd8, 0x20, +0xe0, 0xd9, 0x23, 0xdf, 0xd8, 0x20, 0xe2, 0xdc, 0x2b, 0x17, 0x1b, 0x57, +0x16, 0x1a, 0x56, 0x16, 0x1a, 0x55, 0x16, 0x1a, 0x54, 0x15, 0x19, 0x53, +0xce, 0xc8, 0x0f, 0xe2, 0xdc, 0x2b, 0xa0, 0x9d, 0x1f, 0x14, 0x18, 0x50, +0xde, 0xd8, 0x1f, 0xe2, 0xe0, 0x2d, 0xde, 0xd7, 0x1d, 0xd7, 0xd5, 0x1c, +0xdf, 0xd9, 0x22, 0x59, 0x59, 0x35, 0x13, 0x16, 0x4b, 0x13, 0x16, 0x4b, +0x13, 0x16, 0x4a, 0x12, 0x16, 0x49, 0x12, 0x16, 0x49, 0x12, 0x16, 0x48, +0x6f, 0x6e, 0x2a, 0xdb, 0xd4, 0x1c, 0xe2, 0xe0, 0x2d, 0xcd, 0xc7, 0x0e, +0x28, 0x2a, 0x3e, 0x11, 0x14, 0x45, 0x11, 0x14, 0x44, 0x11, 0x14, 0x44, +0x10, 0x13, 0x42, 0x10, 0x13, 0x42, 0x10, 0x12, 0x41, 0x0f, 0x12, 0x41, +0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f, +0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x10, 0x37, 0x01, 0x01, 0x05, +0x12, 0x15, 0x49, 0x25, 0x2c, 0x94, 0x28, 0x2e, 0x9c, 0x22, 0x28, 0x83, +0x1f, 0x25, 0x7b, 0x1f, 0x25, 0x7c, 0x20, 0x25, 0x7e, 0x21, 0x26, 0x80, +0x21, 0x28, 0x82, 0x22, 0x28, 0x84, 0x23, 0x29, 0x86, 0x23, 0x29, 0x88, +0x24, 0x2b, 0x8a, 0x24, 0x2c, 0x8c, 0x25, 0x2c, 0x8f, 0x26, 0x2e, 0x91, +0xbe, 0xb8, 0x15, 0xdb, 0xd4, 0x1c, 0xe5, 0xdf, 0x36, 0xe3, 0xdd, 0x30, +0xe1, 0xdb, 0x28, 0xe2, 0xe0, 0x2d, 0xdd, 0xd6, 0x1c, 0x2f, 0x37, 0xa7, +0x31, 0x3a, 0xaa, 0x32, 0x3b, 0xad, 0x34, 0x3c, 0xb1, 0x35, 0x3e, 0xb4, +0x37, 0x41, 0xb8, 0x39, 0x43, 0xbc, 0x3b, 0x45, 0xbf, 0x3d, 0x48, 0xc4, +0x3f, 0x4a, 0xc8, 0x8a, 0x8d, 0x74, 0xb0, 0xaf, 0x4a, 0xc2, 0xbf, 0x35, +0xcb, 0xc4, 0x18, 0xd2, 0xcc, 0x1b, 0xd1, 0xcf, 0x1a, 0xe0, 0xd9, 0x23, +0xdb, 0xd4, 0x1c, 0xdb, 0xd4, 0x1c, 0xde, 0xd8, 0x1f, 0xdf, 0xd9, 0x22, +0xd3, 0xce, 0x17, 0xac, 0xab, 0x30, 0xa9, 0xa7, 0x2a, 0x78, 0x7a, 0x35, +0x1b, 0x22, 0x50, 0x1d, 0x25, 0x55, 0x62, 0x65, 0x3f, 0xde, 0xdb, 0x1d, +0xdf, 0xd8, 0x20, 0xcc, 0xc6, 0x19, 0xcb, 0xc4, 0x18, 0xd7, 0xd5, 0x1c, +0xe2, 0xe0, 0x2d, 0xae, 0xae, 0x3a, 0x47, 0x55, 0xb2, 0x4f, 0x5e, 0xc5, +0x54, 0x65, 0xd9, 0x59, 0x6d, 0xf0, 0x64, 0x7b, 0xfd, 0x70, 0x8b, 0xfd, +0x82, 0xa2, 0xfd, 0xa4, 0xc9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfb, 0xfd, 0xfd, +0xd6, 0xfd, 0xfd, 0xbc, 0xe1, 0xfd, 0x9f, 0xbf, 0xfd, 0x86, 0xa1, 0xfd, +0x7b, 0x92, 0xfd, 0x76, 0x8a, 0xfd, 0x71, 0x82, 0xf6, 0xbd, 0xbd, 0x4f, +0xdf, 0xd9, 0x22, 0xe1, 0xda, 0x26, 0xd4, 0xcd, 0x1b, 0xcf, 0xc9, 0x1a, +0xe0, 0xd9, 0x23, 0xe2, 0xdc, 0x2d, 0x55, 0x5b, 0x58, 0x29, 0x32, 0x67, +0x25, 0x2d, 0x60, 0x22, 0x2a, 0x5a, 0x20, 0x27, 0x55, 0x1d, 0x24, 0x4f, +0x1c, 0x22, 0x4b, 0x19, 0x1f, 0x47, 0xe2, 0xe0, 0x2b, 0xe4, 0xe2, 0x35, +0xe0, 0xda, 0x25, 0xde, 0xdc, 0x1f, 0xe0, 0xde, 0x25, 0x9f, 0x9c, 0x16, +0x10, 0x15, 0x33, 0x10, 0x14, 0x32, 0x25, 0x2c, 0x56, 0x37, 0x41, 0x7b, +0x42, 0x4b, 0x94, 0x4a, 0x55, 0xac, 0xa2, 0xa3, 0x58, 0xd1, 0xca, 0x1a, +0xe0, 0xde, 0x25, 0xd3, 0xce, 0x1b, 0x55, 0x5d, 0xa5, 0x40, 0x4a, 0xb5, +0x3d, 0x47, 0xb2, 0x3a, 0x44, 0xae, 0x38, 0x40, 0xab, 0x36, 0x3f, 0xa8, +0x34, 0x3b, 0xa5, 0x32, 0x3a, 0xa2, 0xe1, 0xdb, 0x2a, 0xc7, 0xc1, 0x18, +0xbe, 0xb8, 0x15, 0xdb, 0xd4, 0x1c, 0xe5, 0xdf, 0x36, 0xd0, 0xcb, 0x16, +0x28, 0x2f, 0x8f, 0x27, 0x2d, 0x8d, 0x26, 0x2d, 0x8b, 0x25, 0x2b, 0x88, +0x24, 0x2a, 0x87, 0x23, 0x29, 0x85, 0x22, 0x29, 0x83, 0x8d, 0x8d, 0x3d, +0xde, 0xd8, 0x1f, 0xdf, 0xd9, 0x22, 0xdb, 0xd4, 0x1c, 0xe1, 0xdf, 0x2a, +0xe1, 0xda, 0x26, 0x60, 0x62, 0x51, 0x1d, 0x23, 0x74, 0x1d, 0x23, 0x73, +0x49, 0x4c, 0x59, 0x8b, 0x8a, 0x35, 0xcf, 0xc9, 0x12, 0xe0, 0xd9, 0x23, +0xdb, 0xd4, 0x1c, 0xdb, 0xd4, 0x1c, 0xde, 0xd8, 0x1f, 0xdf, 0xd9, 0x22, +0xce, 0xc9, 0x11, 0x2f, 0x33, 0x5a, 0x19, 0x1e, 0x64, 0x19, 0x1d, 0x63, +0x19, 0x1d, 0x62, 0x18, 0x1d, 0x61, 0x18, 0x1c, 0x60, 0x18, 0x1c, 0x5f, +0x17, 0x1b, 0x5e, 0x72, 0x71, 0x36, 0xcb, 0xc4, 0x18, 0xd7, 0xd5, 0x1c, +0xe2, 0xe0, 0x2d, 0xe2, 0xe0, 0x2b, 0xe3, 0xdd, 0x30, 0x16, 0x1a, 0x57, +0x15, 0x19, 0x56, 0x15, 0x19, 0x55, 0x15, 0x19, 0x54, 0x71, 0x70, 0x31, +0xe3, 0xe1, 0x32, 0xe1, 0xdf, 0x2a, 0x2b, 0x2d, 0x48, 0x14, 0x17, 0x50, +0xcb, 0xc4, 0x18, 0xe3, 0xdd, 0x30, 0xe8, 0xe2, 0x3f, 0xe0, 0xda, 0x25, +0xcc, 0xc6, 0x19, 0x59, 0x59, 0x35, 0x12, 0x16, 0x4b, 0x12, 0x16, 0x4b, +0x12, 0x15, 0x4a, 0x12, 0x15, 0x49, 0x12, 0x15, 0x49, 0x12, 0x15, 0x48, +0xcd, 0xc7, 0x0e, 0xe2, 0xdc, 0x2d, 0xde, 0xd8, 0x1f, 0x6f, 0x6d, 0x29, +0x11, 0x14, 0x45, 0x11, 0x14, 0x45, 0x11, 0x14, 0x44, 0x10, 0x14, 0x44, +0x10, 0x12, 0x42, 0x10, 0x12, 0x42, 0x10, 0x12, 0x41, 0x10, 0x12, 0x41, +0x10, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0f, 0x11, 0x3f, 0x0e, 0x11, 0x3f, +0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x10, 0x37, 0x01, 0x01, 0x05, +0x13, 0x16, 0x49, 0x27, 0x2d, 0x94, 0x29, 0x2f, 0x9c, 0x23, 0x29, 0x83, +0x20, 0x26, 0x7a, 0x20, 0x26, 0x7c, 0x21, 0x27, 0x7e, 0x21, 0x28, 0x80, +0x22, 0x29, 0x81, 0x23, 0x2a, 0x84, 0x24, 0x2b, 0x86, 0x25, 0x2c, 0x88, +0x26, 0x2d, 0x8a, 0x27, 0x2d, 0x8c, 0x28, 0x2f, 0x8f, 0x2a, 0x30, 0x91, +0xde, 0xdb, 0x1d, 0xdd, 0xd6, 0x1c, 0xde, 0xd8, 0x1f, 0xe3, 0xdd, 0x30, +0xe4, 0xde, 0x31, 0xe4, 0xde, 0x31, 0xe1, 0xda, 0x26, 0x33, 0x3b, 0xa7, +0x35, 0x3e, 0xaa, 0x37, 0x40, 0xad, 0x38, 0x42, 0xb0, 0x3b, 0x44, 0xb4, +0x3d, 0x46, 0xb8, 0x3e, 0x48, 0xbc, 0x3f, 0x4a, 0xbf, 0x40, 0x4a, 0xc3, +0x41, 0x4c, 0xc7, 0x42, 0x4d, 0xcc, 0x43, 0x4d, 0xd0, 0x43, 0x4f, 0xd5, +0x43, 0x50, 0xda, 0xc2, 0xbf, 0x37, 0xdb, 0xd4, 0x1c, 0xe1, 0xdb, 0x28, +0xd7, 0xd5, 0x1c, 0xe1, 0xdf, 0x2a, 0xd2, 0xcc, 0x1b, 0xc5, 0xc3, 0x37, +0x52, 0x61, 0xc1, 0x35, 0x3f, 0x7a, 0x18, 0x1e, 0x47, 0x19, 0x20, 0x4b, +0x1b, 0x22, 0x4f, 0x1d, 0x24, 0x54, 0x61, 0x64, 0x3d, 0xde, 0xd7, 0x1d, +0xe0, 0xde, 0x25, 0xde, 0xd8, 0x1f, 0xd1, 0xcf, 0x1a, 0xcc, 0xc6, 0x19, +0xd2, 0xcc, 0x1b, 0xab, 0xab, 0x36, 0x3c, 0x4a, 0xa3, 0x43, 0x52, 0xb4, +0x48, 0x59, 0xc6, 0x4e, 0x61, 0xdb, 0x56, 0x6b, 0xf4, 0x61, 0x79, 0xfd, +0x73, 0x8e, 0xfd, 0xb3, 0xd1, 0xfd, 0xf5, 0xfd, 0xfd, 0xbb, 0xdd, 0xfd, +0xa3, 0xc3, 0xfd, 0x98, 0xb6, 0xfd, 0x87, 0xa2, 0xfd, 0x77, 0x8f, 0xfd, +0x69, 0x7e, 0xfd, 0x5c, 0x6f, 0xe9, 0x5b, 0x6c, 0xd9, 0xe1, 0xda, 0x26, +0xe3, 0xdd, 0x30, 0xcf, 0xc9, 0x1a, 0xde, 0xdb, 0x1d, 0xde, 0xdb, 0x1d, +0xce, 0xcc, 0x19, 0xd1, 0xcc, 0x13, 0x2c, 0x35, 0x6d, 0x28, 0x30, 0x66, +0x25, 0x2c, 0x5f, 0x22, 0x29, 0x59, 0x1f, 0x26, 0x54, 0x1d, 0x23, 0x4e, +0x1b, 0x21, 0x4a, 0x19, 0x1f, 0x46, 0xde, 0xd7, 0x1d, 0xe3, 0xdd, 0x2e, +0xe1, 0xda, 0x26, 0xe0, 0xd9, 0x23, 0xd7, 0xd5, 0x1c, 0x9f, 0x9c, 0x16, +0x10, 0x15, 0x33, 0x12, 0x17, 0x36, 0x12, 0x17, 0x35, 0x11, 0x16, 0x33, +0x13, 0x18, 0x36, 0x40, 0x42, 0x2a, 0xd9, 0xd2, 0x1c, 0xdd, 0xd6, 0x1c, +0xe0, 0xda, 0x25, 0x64, 0x65, 0x38, 0x30, 0x38, 0x6b, 0x37, 0x3f, 0x7c, +0x3d, 0x45, 0x8b, 0x41, 0x4b, 0x9a, 0x44, 0x4d, 0xa3, 0x44, 0x4d, 0xa8, +0x40, 0x49, 0xa5, 0x62, 0x67, 0x7f, 0xdf, 0xd9, 0x22, 0xd1, 0xca, 0x1a, +0xde, 0xdb, 0x1d, 0xdd, 0xd6, 0x1c, 0xde, 0xd8, 0x1f, 0xa9, 0xa7, 0x35, +0x2e, 0x36, 0x8f, 0x2c, 0x33, 0x8d, 0x2c, 0x32, 0x8b, 0x2a, 0x30, 0x88, +0x28, 0x2f, 0x87, 0x27, 0x2e, 0x85, 0x26, 0x2d, 0x82, 0xba, 0xb6, 0x22, +0xd5, 0xcf, 0x1c, 0xde, 0xd7, 0x1d, 0xde, 0xdc, 0x1f, 0xd1, 0xcf, 0x1a, +0xe1, 0xdb, 0x28, 0xa4, 0xa1, 0x2c, 0xb9, 0xb5, 0x1f, 0xdd, 0xd6, 0x1c, +0xd1, 0xcf, 0x1a, 0xd2, 0xcc, 0x1b, 0xdb, 0xd4, 0x1c, 0xe1, 0xdb, 0x28, +0xd7, 0xd5, 0x1c, 0xe1, 0xdf, 0x2a, 0xce, 0xc9, 0x12, 0x74, 0x74, 0x3d, +0x19, 0x1e, 0x67, 0x19, 0x1d, 0x65, 0x18, 0x1d, 0x64, 0x18, 0x1d, 0x63, +0x18, 0x1c, 0x62, 0x17, 0x1c, 0x61, 0x17, 0x1b, 0x60, 0x17, 0x1b, 0x5f, +0x16, 0x1a, 0x5d, 0x5b, 0x5b, 0x3f, 0xd1, 0xcf, 0x1a, 0xcc, 0xc6, 0x19, +0xd2, 0xcc, 0x1b, 0xe1, 0xda, 0x26, 0xe2, 0xe0, 0x2d, 0x15, 0x19, 0x57, +0x15, 0x18, 0x56, 0x14, 0x18, 0x55, 0x14, 0x18, 0x54, 0xce, 0xc8, 0x0f, +0xe4, 0xde, 0x31, 0x88, 0x85, 0x28, 0x13, 0x17, 0x51, 0x13, 0x17, 0x50, +0xe2, 0xe0, 0x2b, 0xe4, 0xde, 0x33, 0xe2, 0xe0, 0x2b, 0xd7, 0xd5, 0x1c, +0xd5, 0xcf, 0x1c, 0x58, 0x59, 0x35, 0x12, 0x15, 0x4b, 0x12, 0x15, 0x4b, +0x12, 0x15, 0x4a, 0x11, 0x15, 0x49, 0x11, 0x15, 0x49, 0x6f, 0x6d, 0x2b, +0xce, 0xcc, 0x19, 0xdf, 0xd9, 0x22, 0xb6, 0xb1, 0x14, 0x11, 0x14, 0x45, +0x10, 0x14, 0x45, 0x10, 0x14, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, +0x10, 0x12, 0x42, 0x10, 0x12, 0x42, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x41, +0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x3f, 0x0e, 0x11, 0x3f, +0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x14, 0x17, 0x49, 0x29, 0x2f, 0x94, 0x2a, 0x32, 0x9c, 0x24, 0x2b, 0x82, +0x21, 0x28, 0x7a, 0x22, 0x28, 0x7c, 0x22, 0x29, 0x7e, 0x23, 0x2a, 0x80, +0x24, 0x2a, 0x81, 0x25, 0x2c, 0x84, 0x26, 0x2d, 0x86, 0x27, 0x2e, 0x88, +0x28, 0x2f, 0x8a, 0x29, 0x30, 0x8c, 0x2a, 0x32, 0x8f, 0x2c, 0x33, 0x90, +0xd1, 0xcf, 0x1a, 0xdc, 0xda, 0x1d, 0xd7, 0xd5, 0x1c, 0xe0, 0xda, 0x25, +0xe6, 0xe4, 0x39, 0xdb, 0xd4, 0x1c, 0xe1, 0xda, 0x26, 0x34, 0x3c, 0xa6, +0x34, 0x3e, 0xa9, 0x35, 0x3e, 0xad, 0x36, 0x40, 0xb0, 0x37, 0x40, 0xb3, +0x37, 0x41, 0xb7, 0x38, 0x42, 0xbb, 0x38, 0x41, 0xbf, 0x38, 0x43, 0xc3, +0x39, 0x44, 0xc7, 0x3a, 0x44, 0xcc, 0x3a, 0x45, 0xd0, 0x3b, 0x46, 0xd4, +0x3b, 0x46, 0xd9, 0xc0, 0xbd, 0x37, 0xe4, 0xe2, 0x33, 0xce, 0xcc, 0x19, +0xdf, 0xd8, 0x20, 0xdf, 0xd8, 0x20, 0xce, 0xcc, 0x19, 0x70, 0x70, 0x24, +0x14, 0x1a, 0x3f, 0x15, 0x1b, 0x42, 0x16, 0x1d, 0x45, 0x18, 0x1e, 0x49, +0x19, 0x20, 0x4d, 0x1b, 0x22, 0x51, 0x60, 0x62, 0x3b, 0xe1, 0xdb, 0x2a, +0xdb, 0xd4, 0x1c, 0xd4, 0xcd, 0x1b, 0xc1, 0xbb, 0x16, 0xc9, 0xc7, 0x18, +0xd2, 0xcc, 0x1b, 0xa9, 0xa8, 0x33, 0x35, 0x42, 0x98, 0x3b, 0x4a, 0xa7, +0x40, 0x50, 0xb6, 0x46, 0x57, 0xc8, 0x4d, 0x60, 0xdd, 0x59, 0x6e, 0xf7, +0x71, 0x88, 0xfd, 0xb6, 0xcf, 0xfd, 0xb8, 0xd2, 0xfd, 0x95, 0xb0, 0xfd, +0x83, 0x9d, 0xfd, 0x7d, 0x96, 0xfd, 0x74, 0x8b, 0xfd, 0x69, 0x7e, 0xfd, +0x5e, 0x71, 0xee, 0x56, 0x67, 0xd8, 0x6e, 0x79, 0x99, 0xdf, 0xd8, 0x20, +0xdf, 0xd9, 0x22, 0xe1, 0xda, 0x26, 0xdf, 0xd9, 0x22, 0xe1, 0xda, 0x26, +0xe1, 0xda, 0x26, 0x93, 0x93, 0x36, 0x2a, 0x33, 0x6b, 0x27, 0x2f, 0x63, +0x23, 0x2b, 0x5d, 0x21, 0x28, 0x57, 0x1e, 0x25, 0x52, 0x1c, 0x23, 0x4e, +0x1a, 0x20, 0x49, 0x18, 0x1e, 0x45, 0xdf, 0xd9, 0x22, 0xdf, 0xd9, 0x22, +0xd7, 0xd5, 0x1c, 0xdb, 0xd4, 0x1c, 0xd7, 0xd5, 0x1c, 0xad, 0xac, 0x31, +0x4c, 0x58, 0xaa, 0x4a, 0x55, 0xa6, 0x46, 0x51, 0x9e, 0x42, 0x4b, 0x93, +0x3e, 0x48, 0x8b, 0xc0, 0xbc, 0x23, 0xe1, 0xda, 0x26, 0xde, 0xdc, 0x1f, +0xab, 0xa9, 0x2d, 0x37, 0x3f, 0x7a, 0x34, 0x3c, 0x74, 0x35, 0x3c, 0x75, +0x34, 0x3c, 0x75, 0x32, 0x39, 0x70, 0x31, 0x38, 0x6d, 0x33, 0x3a, 0x72, +0x30, 0x37, 0x6c, 0x6c, 0x6f, 0x4b, 0xdb, 0xd4, 0x1c, 0xc1, 0xbb, 0x16, +0xd1, 0xcf, 0x1a, 0xdc, 0xda, 0x1d, 0xd7, 0xd5, 0x1c, 0x85, 0x87, 0x53, +0x36, 0x3e, 0x8f, 0x34, 0x3c, 0x8d, 0x32, 0x3a, 0x8b, 0x30, 0x37, 0x88, +0x2f, 0x36, 0x87, 0x2d, 0x34, 0x85, 0x2b, 0x32, 0x82, 0xe1, 0xdf, 0x2a, +0xdf, 0xd9, 0x22, 0xd5, 0xcf, 0x1c, 0xde, 0xd7, 0x1d, 0xde, 0xdc, 0x1f, +0xcb, 0xc4, 0x18, 0xd1, 0xcf, 0x1a, 0xe1, 0xda, 0x26, 0xe1, 0xda, 0x26, +0xdf, 0xd8, 0x20, 0xde, 0xd7, 0x1d, 0xe4, 0xe2, 0x33, 0xcf, 0xc9, 0x12, +0xa3, 0xa0, 0x28, 0x60, 0x61, 0x49, 0x1d, 0x22, 0x69, 0x1c, 0x21, 0x68, +0x1c, 0x20, 0x67, 0x1b, 0x1f, 0x65, 0x1b, 0x1f, 0x64, 0x1a, 0x1e, 0x63, +0x19, 0x1e, 0x62, 0x19, 0x1d, 0x61, 0x18, 0x1d, 0x60, 0x18, 0x1c, 0x5e, +0x17, 0x1c, 0x5d, 0x5c, 0x5c, 0x3f, 0xc1, 0xbb, 0x16, 0xc9, 0xc7, 0x18, +0xd2, 0xcc, 0x1b, 0xd1, 0xcf, 0x1a, 0xdc, 0xda, 0x1d, 0x15, 0x19, 0x57, +0x15, 0x19, 0x56, 0x14, 0x18, 0x55, 0x71, 0x70, 0x31, 0xdf, 0xd8, 0x20, +0xdc, 0xda, 0x1d, 0x2a, 0x2c, 0x49, 0x13, 0x17, 0x51, 0x13, 0x16, 0x50, +0xe8, 0xe6, 0x3f, 0xe0, 0xde, 0x25, 0xc6, 0xc0, 0x17, 0xe3, 0xdd, 0x2e, +0xdc, 0xda, 0x1d, 0x58, 0x58, 0x35, 0x11, 0x15, 0x4b, 0x11, 0x15, 0x4b, +0x11, 0x15, 0x4a, 0x11, 0x14, 0x49, 0x28, 0x2a, 0x41, 0xcd, 0xc7, 0x0e, +0xe1, 0xda, 0x26, 0xe1, 0xdf, 0x2a, 0x3e, 0x3f, 0x37, 0x10, 0x13, 0x45, +0x10, 0x13, 0x45, 0x10, 0x13, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, +0x0f, 0x12, 0x42, 0x0f, 0x12, 0x42, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x41, +0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x11, 0x3f, +0x0f, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x14, 0x18, 0x49, 0x29, 0x32, 0x94, 0x2c, 0x34, 0x99, 0x26, 0x2c, 0x82, +0x23, 0x29, 0x7a, 0x24, 0x29, 0x7c, 0x25, 0x2a, 0x7e, 0x26, 0x2c, 0x80, +0x27, 0x2d, 0x81, 0x27, 0x2e, 0x83, 0x28, 0x2e, 0x86, 0x28, 0x2f, 0x88, +0x28, 0x30, 0x8a, 0x29, 0x30, 0x8c, 0x2a, 0x31, 0x8e, 0x2b, 0x32, 0x90, +0xd0, 0xcb, 0x16, 0xd1, 0xcf, 0x1a, 0xdb, 0xd4, 0x1c, 0xe4, 0xde, 0x31, +0xdf, 0xd8, 0x20, 0xe2, 0xe0, 0x2b, 0xe0, 0xde, 0x25, 0x43, 0x49, 0x94, +0x30, 0x39, 0xa9, 0x31, 0x39, 0xad, 0x31, 0x3a, 0xb0, 0x32, 0x3b, 0xb3, +0x32, 0x3b, 0xb6, 0x32, 0x3c, 0xba, 0x33, 0x3d, 0xbe, 0x35, 0x3e, 0xc2, +0x38, 0x43, 0xc7, 0x3b, 0x46, 0xcb, 0x3f, 0x4b, 0xcf, 0x45, 0x50, 0xd4, +0x4a, 0x56, 0xd8, 0xde, 0xd7, 0x1d, 0xe4, 0xe2, 0x33, 0xe1, 0xda, 0x26, +0xd4, 0xcd, 0x1b, 0xcc, 0xc6, 0x19, 0xd2, 0xcc, 0x1b, 0x58, 0x59, 0x29, +0x13, 0x19, 0x3e, 0x14, 0x1a, 0x41, 0x15, 0x1c, 0x44, 0x16, 0x1d, 0x47, +0x18, 0x1f, 0x4b, 0x19, 0x20, 0x4e, 0x47, 0x4b, 0x42, 0xe4, 0xe2, 0x35, +0xe0, 0xde, 0x25, 0xc9, 0xc7, 0x18, 0xd1, 0xcf, 0x1a, 0xce, 0xc7, 0x19, +0xc3, 0xbd, 0x16, 0xbc, 0xb9, 0x22, 0x30, 0x3c, 0x8d, 0x34, 0x42, 0x9a, +0x39, 0x47, 0xa7, 0x40, 0x50, 0xb8, 0x48, 0x59, 0xca, 0x50, 0x63, 0xdd, +0x77, 0x8b, 0xfd, 0xb0, 0xc6, 0xfd, 0x94, 0xaa, 0xfd, 0x7c, 0x93, 0xfd, +0x70, 0x86, 0xfd, 0x69, 0x7f, 0xfd, 0x64, 0x78, 0xfb, 0x5d, 0x70, 0xea, +0x56, 0x67, 0xd8, 0x4e, 0x5e, 0xc6, 0x9e, 0xa1, 0x54, 0xe2, 0xe0, 0x2b, +0xdf, 0xd8, 0x20, 0xe0, 0xda, 0x25, 0xde, 0xdc, 0x1f, 0xe3, 0xdd, 0x30, +0xe6, 0xdf, 0x37, 0x52, 0x57, 0x55, 0x26, 0x2f, 0x65, 0x24, 0x2c, 0x5f, +0x22, 0x29, 0x5a, 0x1f, 0x26, 0x55, 0x1e, 0x24, 0x50, 0x1b, 0x22, 0x4c, +0x1a, 0x20, 0x48, 0x18, 0x1e, 0x44, 0xa0, 0x9e, 0x1a, 0xce, 0xc7, 0x19, +0xd9, 0xd2, 0x1c, 0xd7, 0xd5, 0x1c, 0xde, 0xd7, 0x1d, 0xd3, 0xce, 0x16, +0x4d, 0x58, 0xae, 0x51, 0x5d, 0xb8, 0x4e, 0x59, 0xb3, 0x50, 0x5b, 0xba, +0x92, 0x96, 0x6c, 0xe1, 0xda, 0x26, 0xdb, 0xd4, 0x1c, 0xd4, 0xcf, 0x1b, +0x5c, 0x64, 0xa0, 0x49, 0x53, 0xac, 0x46, 0x52, 0xa9, 0x45, 0x4f, 0xa3, +0x43, 0x4b, 0x9c, 0x40, 0x4a, 0x99, 0x40, 0x48, 0x96, 0x3e, 0x47, 0x93, +0x3c, 0x44, 0x8d, 0xad, 0xab, 0x34, 0xd1, 0xca, 0x1a, 0xd1, 0xca, 0x1a, +0xd7, 0xd5, 0x1c, 0xd1, 0xcf, 0x1a, 0xdb, 0xd4, 0x1c, 0x70, 0x73, 0x57, +0x36, 0x3d, 0x80, 0x35, 0x3c, 0x7f, 0x34, 0x3c, 0x7e, 0x36, 0x3d, 0x81, +0x36, 0x3e, 0x87, 0x34, 0x3a, 0x84, 0x59, 0x5d, 0x66, 0xdf, 0xd9, 0x22, +0xdd, 0xd6, 0x1c, 0xdb, 0xd4, 0x1c, 0xdf, 0xd9, 0x22, 0xd7, 0xd5, 0x1c, +0xbb, 0xb7, 0x20, 0x67, 0x69, 0x51, 0x66, 0x67, 0x4f, 0x65, 0x67, 0x4e, +0x65, 0x66, 0x4d, 0x38, 0x3c, 0x63, 0x22, 0x28, 0x6f, 0x21, 0x27, 0x6d, +0x20, 0x26, 0x6c, 0x20, 0x25, 0x6a, 0x1f, 0x25, 0x69, 0x1f, 0x24, 0x68, +0x1e, 0x23, 0x67, 0x1d, 0x22, 0x65, 0x1d, 0x21, 0x64, 0x1c, 0x21, 0x63, +0x1b, 0x20, 0x62, 0x1b, 0x20, 0x61, 0x1a, 0x1f, 0x5f, 0x19, 0x1e, 0x5e, +0x19, 0x1d, 0x5d, 0x5d, 0x5d, 0x3f, 0xd1, 0xcf, 0x1a, 0xce, 0xc7, 0x19, +0xc3, 0xbd, 0x16, 0xcf, 0xc9, 0x1a, 0xe1, 0xdb, 0x2a, 0x2c, 0x2f, 0x4e, +0x16, 0x1a, 0x56, 0x2b, 0x2e, 0x4c, 0xe2, 0xdc, 0x2d, 0xdf, 0xd9, 0x22, +0x88, 0x86, 0x28, 0x14, 0x18, 0x52, 0x14, 0x18, 0x51, 0x14, 0x17, 0x50, +0xd4, 0xcd, 0x1b, 0xde, 0xd8, 0x1f, 0xe3, 0xdd, 0x2e, 0xe1, 0xdf, 0x2a, +0xd1, 0xca, 0x1a, 0x58, 0x59, 0x35, 0x12, 0x15, 0x4b, 0x12, 0x15, 0x4a, +0x12, 0x15, 0x4a, 0x11, 0x15, 0x49, 0x86, 0x84, 0x24, 0xe3, 0xdd, 0x30, +0xe6, 0xdf, 0x37, 0x86, 0x84, 0x23, 0x10, 0x13, 0x45, 0x10, 0x13, 0x45, +0x10, 0x13, 0x45, 0x10, 0x13, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, +0x0f, 0x12, 0x42, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x40, +0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0e, 0x11, 0x3f, 0x0e, 0x10, 0x3f, +0x0e, 0x10, 0x3e, 0x0e, 0x10, 0x3e, 0x0e, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x14, 0x19, 0x49, 0x2b, 0x32, 0x94, 0x2c, 0x35, 0x99, 0x26, 0x2c, 0x82, +0x22, 0x29, 0x7a, 0x23, 0x29, 0x7c, 0x24, 0x2a, 0x7e, 0x24, 0x2a, 0x80, +0x25, 0x2b, 0x81, 0x25, 0x2c, 0x83, 0x26, 0x2c, 0x85, 0x26, 0x2d, 0x88, +0x27, 0x2d, 0x8a, 0x27, 0x2e, 0x8c, 0x28, 0x2f, 0x8e, 0x28, 0x2f, 0x90, +0xa7, 0xa4, 0x35, 0xcf, 0xc9, 0x1a, 0xe1, 0xdf, 0x2a, 0xe2, 0xe0, 0x2d, +0xe0, 0xd9, 0x23, 0xdb, 0xd4, 0x1c, 0xe2, 0xe0, 0x2d, 0x6a, 0x6d, 0x70, +0x2c, 0x35, 0xa8, 0x2e, 0x37, 0xac, 0x31, 0x39, 0xaf, 0x33, 0x3c, 0xb3, +0x35, 0x3e, 0xb6, 0x38, 0x42, 0xba, 0x3c, 0x47, 0xbd, 0x40, 0x4a, 0xc2, +0x44, 0x4f, 0xc5, 0x4a, 0x56, 0xc9, 0x50, 0x5d, 0xce, 0x52, 0x5d, 0xc5, +0x69, 0x70, 0x7f, 0xe1, 0xda, 0x26, 0xde, 0xdb, 0x1d, 0xe1, 0xda, 0x26, +0xd9, 0xd2, 0x1c, 0xdc, 0xda, 0x1d, 0xd5, 0xcf, 0x1c, 0x11, 0x16, 0x39, +0x12, 0x18, 0x3c, 0x13, 0x19, 0x3f, 0x14, 0x1a, 0x42, 0x15, 0x1c, 0x45, +0x16, 0x1d, 0x48, 0x17, 0x1e, 0x4c, 0x19, 0x21, 0x50, 0xe1, 0xdf, 0x2a, +0xde, 0xd8, 0x1f, 0xd9, 0xd2, 0x1c, 0xe0, 0xde, 0x25, 0xd5, 0xcf, 0x1c, +0xc7, 0xc1, 0x18, 0xdf, 0xd8, 0x20, 0x2b, 0x37, 0x84, 0x2e, 0x3b, 0x8e, +0x34, 0x41, 0x9a, 0x3b, 0x49, 0xa9, 0x42, 0x52, 0xb8, 0x55, 0x66, 0xd3, +0x79, 0x8a, 0xfd, 0x90, 0xa2, 0xfd, 0x7a, 0x8d, 0xfd, 0x6a, 0x7d, 0xfb, +0x60, 0x73, 0xf0, 0x5b, 0x6d, 0xe6, 0x58, 0x69, 0xdd, 0x53, 0x64, 0xd1, +0x4d, 0x5d, 0xc3, 0x46, 0x55, 0xb4, 0xe5, 0xdf, 0x34, 0xd7, 0xd0, 0x1c, +0xd2, 0xcc, 0x1b, 0xe3, 0xe1, 0x32, 0xe4, 0xe2, 0x33, 0xe5, 0xdf, 0x36, +0xbb, 0xb7, 0x1d, 0x25, 0x2e, 0x66, 0x23, 0x2b, 0x60, 0x21, 0x29, 0x5b, +0x1f, 0x26, 0x56, 0x1d, 0x24, 0x52, 0x3c, 0x49, 0x8a, 0x3f, 0x4b, 0x8e, +0x32, 0x3c, 0x73, 0x27, 0x2f, 0x5e, 0xa0, 0x9e, 0x1a, 0xd7, 0xd5, 0x1c, +0xd4, 0xcd, 0x1b, 0xd9, 0xd2, 0x1c, 0xdc, 0xda, 0x1d, 0xde, 0xdb, 0x1d, +0x53, 0x60, 0xbe, 0x50, 0x5c, 0xba, 0x52, 0x5d, 0xbd, 0x61, 0x6b, 0xaa, +0xd5, 0xcf, 0x1c, 0xdc, 0xda, 0x1d, 0xdb, 0xd4, 0x1c, 0x81, 0x86, 0x82, +0x4d, 0x59, 0xbe, 0x4b, 0x55, 0xba, 0x49, 0x53, 0xb7, 0x47, 0x51, 0xb4, +0x44, 0x4e, 0xb0, 0x44, 0x4c, 0xad, 0x42, 0x4b, 0xa9, 0x41, 0x4a, 0xa6, +0x40, 0x4a, 0xa4, 0xc0, 0xbd, 0x29, 0xe7, 0xe1, 0x3c, 0xe4, 0xde, 0x31, +0xdb, 0xd4, 0x1c, 0xcf, 0xc9, 0x1a, 0xe1, 0xdf, 0x2a, 0x4b, 0x52, 0x81, +0x38, 0x41, 0x8e, 0x37, 0x40, 0x8d, 0x36, 0x3e, 0x8a, 0x36, 0x3d, 0x88, +0x35, 0x3c, 0x86, 0x34, 0x3a, 0x84, 0x6e, 0x71, 0x59, 0xe0, 0xd9, 0x23, +0xe1, 0xdb, 0x2a, 0xd7, 0xd5, 0x1c, 0xd7, 0xd5, 0x1c, 0xde, 0xdc, 0x1f, +0xa8, 0xa6, 0x2c, 0x2c, 0x32, 0x76, 0x2b, 0x31, 0x74, 0x29, 0x30, 0x72, +0x28, 0x2f, 0x71, 0x27, 0x2d, 0x6f, 0x26, 0x2c, 0x6f, 0x25, 0x2a, 0x6d, +0x24, 0x29, 0x6c, 0x23, 0x28, 0x6a, 0x22, 0x27, 0x69, 0x21, 0x26, 0x68, +0x20, 0x25, 0x66, 0x1f, 0x25, 0x65, 0x1e, 0x24, 0x64, 0x1d, 0x23, 0x63, +0x1d, 0x22, 0x62, 0x1d, 0x21, 0x60, 0x1c, 0x21, 0x5f, 0x1b, 0x20, 0x5e, +0x1b, 0x20, 0x5d, 0x5e, 0x5f, 0x3f, 0xe0, 0xde, 0x25, 0xd5, 0xcf, 0x1c, +0xc7, 0xc1, 0x18, 0xdf, 0xd8, 0x20, 0xdb, 0xd4, 0x1c, 0x5c, 0x5d, 0x3c, +0x17, 0x1c, 0x56, 0x89, 0x87, 0x29, 0xdf, 0xd9, 0x22, 0xde, 0xdc, 0x1f, +0x2c, 0x2f, 0x49, 0x16, 0x1a, 0x52, 0x15, 0x19, 0x51, 0x15, 0x19, 0x50, +0xa0, 0x9c, 0x1f, 0xe2, 0xe0, 0x2b, 0xdf, 0xd9, 0x22, 0xd4, 0xcd, 0x1b, +0xdb, 0xd4, 0x1c, 0x9f, 0x9c, 0x1e, 0x13, 0x16, 0x4b, 0x12, 0x16, 0x4a, +0x12, 0x16, 0x4a, 0x40, 0x41, 0x3a, 0xe4, 0xe2, 0x33, 0xe5, 0xdf, 0x36, +0xb6, 0xb1, 0x15, 0x11, 0x14, 0x47, 0x11, 0x14, 0x45, 0x11, 0x14, 0x45, +0x10, 0x14, 0x45, 0x10, 0x14, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x43, +0x10, 0x12, 0x42, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x40, +0x0f, 0x12, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f, 0x0f, 0x11, 0x3f, +0x0f, 0x11, 0x3e, 0x0e, 0x10, 0x3e, 0x0e, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x14, 0x17, 0x49, 0x29, 0x31, 0x93, 0x2a, 0x32, 0x99, 0x24, 0x2b, 0x82, +0x21, 0x28, 0x7a, 0x21, 0x28, 0x7c, 0x22, 0x29, 0x7e, 0x22, 0x29, 0x80, +0x23, 0x2a, 0x81, 0x23, 0x2a, 0x83, 0x23, 0x2b, 0x85, 0x24, 0x2b, 0x87, +0x24, 0x2c, 0x8a, 0x25, 0x2c, 0x8b, 0x25, 0x2d, 0x8e, 0x26, 0x2d, 0x90, +0x7b, 0x7c, 0x54, 0xe6, 0xe0, 0x39, 0xe6, 0xdf, 0x37, 0xd7, 0xd0, 0x1c, +0xcb, 0xc4, 0x18, 0xe0, 0xda, 0x25, 0xd5, 0xcf, 0x1c, 0x94, 0x94, 0x4d, +0x33, 0x3b, 0xa8, 0x35, 0x3f, 0xac, 0x38, 0x41, 0xaf, 0x3b, 0x46, 0xb2, +0x3f, 0x49, 0xb6, 0x43, 0x4d, 0xb9, 0x48, 0x54, 0xbd, 0x4e, 0x59, 0xbf, +0x47, 0x52, 0xa7, 0x3b, 0x43, 0x85, 0x28, 0x2e, 0x5b, 0x0c, 0x10, 0x2a, +0x54, 0x55, 0x1f, 0xde, 0xd7, 0x1d, 0xdc, 0xda, 0x1d, 0xcc, 0xc6, 0x19, +0xdd, 0xd6, 0x1c, 0xd7, 0xd5, 0x1c, 0xcd, 0xc8, 0x0c, 0x11, 0x16, 0x38, +0x11, 0x17, 0x3b, 0x12, 0x18, 0x3d, 0x13, 0x19, 0x40, 0x1b, 0x22, 0x4f, +0x39, 0x45, 0x89, 0x27, 0x31, 0x66, 0x17, 0x1f, 0x4d, 0xb8, 0xb4, 0x17, +0xd2, 0xcc, 0x1b, 0xe0, 0xda, 0x25, 0xe2, 0xe0, 0x2d, 0xd9, 0xd2, 0x1c, +0xe1, 0xdf, 0x2a, 0xd7, 0xd0, 0x1c, 0x50, 0x57, 0x61, 0x2b, 0x37, 0x85, +0x30, 0x3d, 0x8f, 0x36, 0x44, 0x9c, 0x40, 0x4f, 0xac, 0x59, 0x68, 0xca, +0x78, 0x87, 0xee, 0x79, 0x89, 0xf4, 0x68, 0x79, 0xe6, 0x5c, 0x6d, 0xdb, +0x55, 0x66, 0xd3, 0x50, 0x60, 0xcb, 0x4e, 0x5d, 0xc4, 0x4b, 0x5a, 0xbc, +0x45, 0x53, 0xb1, 0x89, 0x8d, 0x5e, 0xe2, 0xdc, 0x2d, 0xe2, 0xe0, 0x2b, +0xe2, 0xe0, 0x2b, 0xe0, 0xde, 0x25, 0xdf, 0xd8, 0x20, 0xe2, 0xe0, 0x2d, +0x4d, 0x52, 0x50, 0x21, 0x29, 0x60, 0x20, 0x28, 0x5b, 0x1e, 0x26, 0x57, +0x1d, 0x24, 0x53, 0x1b, 0x22, 0x4e, 0x28, 0x31, 0x63, 0x46, 0x53, 0x9f, +0x57, 0x67, 0xcf, 0x57, 0x66, 0xdf, 0xb6, 0xb7, 0x4f, 0xdb, 0xd4, 0x1c, +0xe2, 0xe0, 0x2d, 0xde, 0xdc, 0x1f, 0xd7, 0xd5, 0x1c, 0xc1, 0xbf, 0x16, +0x59, 0x66, 0xd4, 0x57, 0x66, 0xd2, 0x55, 0x62, 0xce, 0xc5, 0xc2, 0x32, +0xd9, 0xd2, 0x1c, 0xde, 0xd8, 0x1f, 0xa2, 0xa4, 0x5b, 0x4f, 0x5b, 0xc2, +0x4c, 0x57, 0xbe, 0x49, 0x55, 0xba, 0x48, 0x52, 0xb7, 0x45, 0x4f, 0xb3, +0x44, 0x4e, 0xb0, 0x42, 0x4c, 0xad, 0x3f, 0x4a, 0xa9, 0x3f, 0x47, 0xa6, +0x3d, 0x46, 0xa3, 0xe4, 0xe2, 0x33, 0xe6, 0xdf, 0x37, 0xe1, 0xdf, 0x2a, +0xd7, 0xd5, 0x1c, 0xe6, 0xe0, 0x39, 0xe6, 0xdf, 0x37, 0x36, 0x3d, 0x90, +0x35, 0x3c, 0x8e, 0x34, 0x3b, 0x8c, 0x33, 0x3a, 0x8a, 0x32, 0x3a, 0x87, +0x31, 0x39, 0x86, 0x31, 0x38, 0x84, 0x6c, 0x6f, 0x59, 0xe4, 0xde, 0x31, +0xe2, 0xe0, 0x2b, 0xc7, 0xc5, 0x18, 0xcc, 0xc6, 0x19, 0xdf, 0xd9, 0x22, +0xa8, 0xa5, 0x2c, 0x2b, 0x32, 0x75, 0x2a, 0x31, 0x74, 0x2a, 0x30, 0x72, +0x29, 0x2f, 0x70, 0x29, 0x2f, 0x6f, 0x28, 0x2e, 0x6e, 0x27, 0x2d, 0x6d, +0x27, 0x2d, 0x6c, 0x26, 0x2c, 0x6a, 0x26, 0x2b, 0x69, 0x25, 0x29, 0x68, +0x23, 0x29, 0x66, 0x22, 0x27, 0x65, 0x22, 0x27, 0x64, 0x20, 0x25, 0x63, +0x20, 0x24, 0x62, 0x1f, 0x23, 0x60, 0x1e, 0x23, 0x5f, 0x1d, 0x22, 0x5e, +0x1d, 0x21, 0x5d, 0x5f, 0x60, 0x3f, 0xe2, 0xe0, 0x2d, 0xd9, 0xd2, 0x1c, +0xe1, 0xdf, 0x2a, 0xd7, 0xd0, 0x1c, 0xd9, 0xd2, 0x1c, 0x5d, 0x5d, 0x3b, +0x2f, 0x32, 0x4d, 0xdd, 0xd6, 0x1c, 0xd1, 0xca, 0x1a, 0x89, 0x87, 0x28, +0x17, 0x1b, 0x52, 0x16, 0x1a, 0x51, 0x16, 0x1a, 0x51, 0x16, 0x1a, 0x50, +0xa0, 0x9d, 0x1f, 0xe1, 0xdf, 0x2a, 0xd7, 0xd0, 0x1c, 0xd4, 0xcd, 0x1b, +0xd7, 0xd5, 0x1c, 0xa0, 0x9c, 0x1e, 0x14, 0x17, 0x4b, 0x13, 0x17, 0x4a, +0x13, 0x16, 0x4a, 0xce, 0xc8, 0x0e, 0xdf, 0xd8, 0x20, 0xe2, 0xe0, 0x2d, +0x29, 0x2b, 0x3f, 0x12, 0x15, 0x47, 0x11, 0x14, 0x45, 0x11, 0x14, 0x45, +0x11, 0x14, 0x45, 0x11, 0x14, 0x45, 0x11, 0x14, 0x44, 0x10, 0x13, 0x43, +0x10, 0x12, 0x42, 0x10, 0x12, 0x41, 0x10, 0x12, 0x41, 0x10, 0x12, 0x40, +0x10, 0x12, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f, 0x0f, 0x11, 0x3f, +0x0f, 0x11, 0x3e, 0x0f, 0x11, 0x3e, 0x0e, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x13, 0x17, 0x48, 0x28, 0x2e, 0x93, 0x2a, 0x31, 0x99, 0x24, 0x2a, 0x82, +0x20, 0x26, 0x79, 0x20, 0x26, 0x7b, 0x21, 0x26, 0x7d, 0x21, 0x27, 0x7f, +0x21, 0x28, 0x81, 0x22, 0x28, 0x83, 0x22, 0x29, 0x85, 0x23, 0x29, 0x87, +0x23, 0x2a, 0x89, 0x24, 0x2b, 0x8b, 0x25, 0x2c, 0x8d, 0x27, 0x2e, 0x90, +0x52, 0x56, 0x73, 0xe6, 0xdf, 0x37, 0xe1, 0xdb, 0x28, 0xde, 0xd7, 0x1d, +0xc9, 0xc7, 0x18, 0xdf, 0xd9, 0x22, 0xe2, 0xdc, 0x2d, 0xd2, 0xcc, 0x18, +0x3b, 0x43, 0xa8, 0x3d, 0x46, 0xab, 0x41, 0x4b, 0xae, 0x46, 0x50, 0xb1, +0x46, 0x50, 0xa9, 0x3f, 0x49, 0x93, 0x34, 0x3c, 0x76, 0x23, 0x29, 0x51, +0x0b, 0x0f, 0x28, 0x0b, 0x0e, 0x27, 0x0b, 0x0f, 0x29, 0x0c, 0x10, 0x2a, +0x84, 0x82, 0x17, 0xde, 0xdb, 0x1d, 0xc7, 0xc5, 0x18, 0xde, 0xd7, 0x1d, +0xe1, 0xda, 0x26, 0xdb, 0xd4, 0x1c, 0x9f, 0x9c, 0x18, 0x2f, 0x38, 0x6f, +0x44, 0x50, 0x9d, 0x53, 0x63, 0xcc, 0x55, 0x65, 0xda, 0x4e, 0x5e, 0xbe, +0x3e, 0x4b, 0x95, 0x26, 0x2f, 0x64, 0x16, 0x1d, 0x4b, 0x72, 0x74, 0x2e, +0xe0, 0xde, 0x25, 0xdf, 0xd8, 0x20, 0xce, 0xc7, 0x19, 0xdf, 0xd8, 0x20, +0xe1, 0xda, 0x26, 0xdb, 0xd4, 0x1c, 0x7a, 0x7d, 0x44, 0x29, 0x34, 0x7d, +0x2d, 0x39, 0x86, 0x31, 0x3d, 0x8e, 0x40, 0x4d, 0xa2, 0x55, 0x62, 0xbc, +0x70, 0x7e, 0xdb, 0x66, 0x74, 0xd3, 0x5a, 0x69, 0xca, 0x51, 0x60, 0xc2, +0x4c, 0x5b, 0xbc, 0x46, 0x55, 0xb4, 0x43, 0x52, 0xae, 0x40, 0x4e, 0xa7, +0x4e, 0x59, 0x8e, 0xe3, 0xdd, 0x30, 0xdf, 0xd8, 0x20, 0xe0, 0xd9, 0x23, +0xdf, 0xd9, 0x22, 0xe3, 0xdd, 0x2e, 0xe1, 0xdb, 0x2a, 0x8e, 0x8e, 0x31, +0x20, 0x28, 0x60, 0x1e, 0x26, 0x5a, 0x1d, 0x25, 0x57, 0x1c, 0x23, 0x53, +0x1a, 0x21, 0x4f, 0x19, 0x20, 0x4b, 0x18, 0x1e, 0x48, 0x2e, 0x38, 0x6e, +0x4e, 0x5c, 0xb4, 0x5b, 0x6a, 0xde, 0x94, 0x99, 0x7f, 0xde, 0xdb, 0x1d, +0xde, 0xd7, 0x1d, 0xd9, 0xd2, 0x1c, 0xde, 0xd8, 0x1f, 0xdb, 0xd4, 0x1c, +0x52, 0x60, 0xe0, 0x57, 0x63, 0xdb, 0x95, 0x99, 0x7a, 0xcf, 0xc9, 0x1a, +0xd7, 0xd5, 0x1c, 0xc4, 0xc1, 0x32, 0x4f, 0x5a, 0xc5, 0x4d, 0x58, 0xc1, +0x4a, 0x55, 0xbd, 0x48, 0x53, 0xb9, 0x47, 0x52, 0xb6, 0x46, 0x4f, 0xb2, +0x43, 0x4d, 0xaf, 0x41, 0x4b, 0xac, 0x40, 0x49, 0xa8, 0x3e, 0x47, 0xa5, +0x61, 0x66, 0x7f, 0xe0, 0xde, 0x25, 0xdf, 0xd9, 0x22, 0xe2, 0xe0, 0x2d, +0xe4, 0xe2, 0x35, 0xe6, 0xdf, 0x37, 0xaa, 0xa8, 0x35, 0x32, 0x3b, 0x90, +0x32, 0x39, 0x8e, 0x31, 0x38, 0x8c, 0x30, 0x37, 0x89, 0x30, 0x36, 0x87, +0x2f, 0x36, 0x86, 0x2e, 0x35, 0x83, 0x6a, 0x6d, 0x58, 0xde, 0xd8, 0x1f, +0xdf, 0xd9, 0x22, 0xe1, 0xdf, 0x2a, 0xd5, 0xcf, 0x1c, 0xcb, 0xc4, 0x18, +0xbb, 0xb7, 0x20, 0x28, 0x2f, 0x75, 0x28, 0x2f, 0x73, 0x28, 0x2f, 0x72, +0x28, 0x2e, 0x70, 0x28, 0x2d, 0x6f, 0x26, 0x2c, 0x6e, 0x26, 0x2c, 0x6d, +0x25, 0x2b, 0x6b, 0x25, 0x2a, 0x6a, 0x25, 0x2a, 0x69, 0x24, 0x29, 0x67, +0x23, 0x29, 0x66, 0x23, 0x28, 0x65, 0x23, 0x28, 0x64, 0x22, 0x27, 0x63, +0x21, 0x26, 0x61, 0x21, 0x26, 0x60, 0x21, 0x25, 0x5f, 0x20, 0x24, 0x5e, +0x1f, 0x23, 0x5d, 0x1e, 0x23, 0x5c, 0xce, 0xc7, 0x19, 0xdf, 0xd8, 0x20, +0xe1, 0xda, 0x26, 0xdb, 0xd4, 0x1c, 0xdf, 0xd9, 0x22, 0x5e, 0x5f, 0x3b, +0x8a, 0x89, 0x2a, 0xd7, 0xd0, 0x1c, 0xce, 0xc9, 0x0f, 0x2e, 0x31, 0x4a, +0x18, 0x1c, 0x52, 0x17, 0x1c, 0x51, 0x17, 0x1c, 0x51, 0x16, 0x1b, 0x50, +0xa0, 0x9d, 0x1f, 0xe0, 0xd9, 0x23, 0xdc, 0xda, 0x1d, 0xd2, 0xcc, 0x1b, +0xe1, 0xda, 0x26, 0xa0, 0x9d, 0x1e, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4a, +0xa0, 0x9c, 0x1d, 0xe3, 0xdd, 0x2e, 0xe1, 0xdb, 0x2a, 0x59, 0x59, 0x32, +0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, +0x12, 0x14, 0x45, 0x11, 0x14, 0x44, 0x11, 0x14, 0x44, 0x11, 0x14, 0x43, +0x10, 0x13, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x12, 0x40, +0x10, 0x12, 0x40, 0x10, 0x12, 0x3f, 0x10, 0x12, 0x3f, 0x0f, 0x12, 0x3f, +0x0f, 0x11, 0x3e, 0x0f, 0x11, 0x3e, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05, +0x13, 0x16, 0x48, 0x27, 0x2d, 0x93, 0x29, 0x2f, 0x99, 0x23, 0x28, 0x82, +0x1f, 0x24, 0x79, 0x1f, 0x25, 0x7b, 0x20, 0x25, 0x7d, 0x21, 0x26, 0x7f, +0x21, 0x28, 0x81, 0x22, 0x29, 0x82, 0x23, 0x2a, 0x84, 0x25, 0x2c, 0x87, +0x26, 0x2d, 0x89, 0x28, 0x2e, 0x8a, 0x28, 0x30, 0x8d, 0x2a, 0x32, 0x8f, +0x2d, 0x34, 0x91, 0xbc, 0xb9, 0x26, 0xe0, 0xda, 0x25, 0xc0, 0xba, 0x15, +0xe2, 0xdc, 0x2b, 0xe2, 0xdc, 0x2b, 0xe1, 0xda, 0x26, 0xdf, 0xd8, 0x20, +0x8b, 0x8d, 0x60, 0x40, 0x4a, 0x99, 0x37, 0x40, 0x81, 0x30, 0x37, 0x6b, +0x21, 0x27, 0x4e, 0x0b, 0x0f, 0x27, 0x09, 0x0d, 0x23, 0x09, 0x0d, 0x24, +0x0a, 0x0e, 0x26, 0x0a, 0x0e, 0x27, 0x0b, 0x0f, 0x28, 0x0b, 0x0f, 0x29, +0x9d, 0x9a, 0x13, 0xce, 0xcc, 0x19, 0xdf, 0xd8, 0x20, 0xdc, 0xda, 0x1d, +0xdf, 0xd8, 0x20, 0xde, 0xdb, 0x1d, 0x93, 0x98, 0x7e, 0x4a, 0x59, 0xdd, +0x4a, 0x59, 0xdc, 0x4f, 0x5f, 0xdb, 0x54, 0x65, 0xda, 0x4c, 0x5b, 0xba, +0x31, 0x3b, 0x77, 0x14, 0x1b, 0x45, 0x15, 0x1c, 0x49, 0x2c, 0x32, 0x44, +0xdd, 0xd6, 0x1c, 0xdb, 0xd4, 0x1c, 0xdc, 0xda, 0x1d, 0xc7, 0xc5, 0x18, +0xc3, 0xbd, 0x16, 0xe1, 0xdb, 0x28, 0xcf, 0xca, 0x12, 0x26, 0x30, 0x75, +0x29, 0x34, 0x7c, 0x31, 0x3d, 0x88, 0x3e, 0x4a, 0x99, 0x50, 0x5c, 0xae, +0x5b, 0x68, 0xbc, 0x54, 0x61, 0xb7, 0x4b, 0x59, 0xb0, 0x45, 0x53, 0xab, +0x41, 0x4e, 0xa6, 0x3c, 0x49, 0x9f, 0x3a, 0x47, 0x9c, 0x38, 0x44, 0x96, +0xab, 0xaa, 0x34, 0xdf, 0xd8, 0x20, 0xd7, 0xd5, 0x1c, 0xd7, 0xd5, 0x1c, +0xe0, 0xde, 0x25, 0xe4, 0xe2, 0x33, 0xcf, 0xca, 0x11, 0x20, 0x29, 0x61, +0x1e, 0x26, 0x5c, 0x1c, 0x24, 0x57, 0x1a, 0x22, 0x53, 0x19, 0x20, 0x4f, +0x18, 0x1f, 0x4c, 0x17, 0x1e, 0x48, 0x16, 0x1d, 0x45, 0x16, 0x1c, 0x43, +0x32, 0x3c, 0x75, 0x4f, 0x5d, 0xb8, 0x86, 0x8f, 0x97, 0xd7, 0xd5, 0x1c, +0xc7, 0xc1, 0x18, 0xdf, 0xd9, 0x22, 0xd7, 0xd5, 0x1c, 0xe0, 0xde, 0x25, +0x78, 0x7d, 0x96, 0x66, 0x6f, 0xab, 0xde, 0xd7, 0x1d, 0xcb, 0xc4, 0x18, +0xd4, 0xcf, 0x1d, 0x5c, 0x66, 0xb2, 0x4b, 0x56, 0xc3, 0x4a, 0x55, 0xc0, +0x49, 0x52, 0xbc, 0x46, 0x51, 0xb8, 0x44, 0x4f, 0xb4, 0x43, 0x4d, 0xb1, +0x42, 0x4b, 0xae, 0x40, 0x4a, 0xab, 0x40, 0x48, 0xa8, 0x3d, 0x47, 0xa5, +0x74, 0x77, 0x6e, 0xdc, 0xda, 0x1d, 0xe3, 0xdd, 0x30, 0xe4, 0xde, 0x31, +0xe3, 0xe1, 0x32, 0xe2, 0xe0, 0x2d, 0xaa, 0xa8, 0x35, 0x32, 0x3a, 0x8f, +0x31, 0x39, 0x8e, 0x31, 0x37, 0x8b, 0x2f, 0x36, 0x89, 0x2e, 0x35, 0x87, +0x2c, 0x34, 0x85, 0x2c, 0x33, 0x83, 0x54, 0x57, 0x66, 0xe1, 0xdf, 0x2a, +0xe0, 0xde, 0x25, 0xdb, 0xd4, 0x1c, 0xdf, 0xd9, 0x22, 0xde, 0xd7, 0x1d, +0xd5, 0xcf, 0x1c, 0x28, 0x2e, 0x75, 0x27, 0x2d, 0x73, 0x27, 0x2c, 0x72, +0x26, 0x2c, 0x70, 0x26, 0x2c, 0x6f, 0x25, 0x2a, 0x6e, 0x24, 0x2a, 0x6d, +0x24, 0x29, 0x6b, 0x23, 0x29, 0x6a, 0x23, 0x28, 0x69, 0x23, 0x27, 0x67, +0x22, 0x27, 0x66, 0x22, 0x27, 0x65, 0x21, 0x26, 0x64, 0x20, 0x25, 0x62, +0x20, 0x25, 0x61, 0x20, 0x25, 0x60, 0x20, 0x24, 0x5f, 0x1f, 0x24, 0x5e, +0x1f, 0x23, 0x5d, 0x1e, 0x23, 0x5c, 0xdc, 0xda, 0x1d, 0xc7, 0xc5, 0x18, +0xc3, 0xbd, 0x16, 0xe1, 0xdb, 0x28, 0xe1, 0xda, 0x26, 0x75, 0x74, 0x32, +0xe3, 0xdd, 0x30, 0xe3, 0xdd, 0x30, 0x74, 0x74, 0x31, 0x1a, 0x1e, 0x53, +0x19, 0x1d, 0x52, 0x18, 0x1c, 0x51, 0x18, 0x1c, 0x51, 0x18, 0x1c, 0x50, +0xa1, 0x9d, 0x1f, 0xe4, 0xe2, 0x35, 0xe0, 0xde, 0x25, 0xd9, 0xd2, 0x1c, +0xe4, 0xde, 0x33, 0xa0, 0x9d, 0x1e, 0x15, 0x19, 0x4b, 0x5a, 0x5b, 0x33, +0xe0, 0xde, 0x25, 0xe4, 0xe2, 0x33, 0xa0, 0x9c, 0x1c, 0x13, 0x17, 0x48, +0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x16, 0x45, 0x12, 0x15, 0x45, +0x12, 0x15, 0x45, 0x12, 0x15, 0x44, 0x12, 0x15, 0x44, 0x11, 0x14, 0x43, +0x10, 0x14, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x13, 0x40, +0x10, 0x13, 0x40, 0x10, 0x12, 0x3f, 0x10, 0x12, 0x3f, 0x0f, 0x12, 0x3e, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05, +0x13, 0x16, 0x48, 0x27, 0x2d, 0x93, 0x28, 0x2e, 0x98, 0x23, 0x28, 0x82, +0x20, 0x26, 0x79, 0x20, 0x27, 0x7b, 0x21, 0x28, 0x7d, 0x22, 0x29, 0x7f, +0x24, 0x2a, 0x81, 0x25, 0x2b, 0x82, 0x26, 0x2c, 0x84, 0x28, 0x2e, 0x86, +0x29, 0x30, 0x88, 0x2b, 0x32, 0x8a, 0x2d, 0x34, 0x8c, 0x2f, 0x37, 0x8f, +0x31, 0x38, 0x91, 0x59, 0x5f, 0x74, 0xdd, 0xd6, 0x1c, 0xe6, 0xdf, 0x37, +0xe6, 0xe4, 0x39, 0xde, 0xd8, 0x1f, 0xdf, 0xd9, 0x22, 0xe0, 0xd9, 0x23, +0xd1, 0xcb, 0x12, 0x36, 0x3a, 0x44, 0x10, 0x14, 0x2d, 0x08, 0x0b, 0x20, +0x08, 0x0c, 0x21, 0x09, 0x0c, 0x22, 0x09, 0x0d, 0x23, 0x09, 0x0d, 0x24, +0x0a, 0x0d, 0x25, 0x0c, 0x11, 0x2c, 0x23, 0x29, 0x52, 0x36, 0x3f, 0x7b, +0xd1, 0xcf, 0x1a, 0xd7, 0xd0, 0x1c, 0xd7, 0xd5, 0x1c, 0xde, 0xd7, 0x1d, +0xdd, 0xd6, 0x1c, 0xe2, 0xdc, 0x2b, 0x78, 0x7f, 0x97, 0x46, 0x54, 0xdd, +0x4a, 0x59, 0xdc, 0x50, 0x60, 0xdb, 0x53, 0x63, 0xcf, 0x3e, 0x4a, 0x93, +0x21, 0x2a, 0x5a, 0x22, 0x2a, 0x5c, 0x25, 0x2f, 0x64, 0x37, 0x44, 0x89, +0x9f, 0xa3, 0x55, 0xe1, 0xda, 0x26, 0xcb, 0xc4, 0x18, 0xd9, 0xd2, 0x1c, +0xce, 0xc7, 0x19, 0xde, 0xd8, 0x1f, 0xcc, 0xc6, 0x19, 0x79, 0x7b, 0x40, +0x27, 0x31, 0x74, 0x30, 0x3b, 0x81, 0x3c, 0x47, 0x90, 0x4b, 0x56, 0xa1, +0x4c, 0x58, 0xa5, 0x47, 0x53, 0xa2, 0x3f, 0x4b, 0x9b, 0x3b, 0x48, 0x98, +0x39, 0x45, 0x94, 0x35, 0x41, 0x90, 0x33, 0x3f, 0x8c, 0x81, 0x84, 0x4e, +0xd7, 0xd0, 0x1c, 0xd4, 0xcd, 0x1b, 0xe2, 0xe0, 0x2d, 0xe3, 0xdd, 0x30, +0xe3, 0xdd, 0x30, 0xcf, 0xca, 0x11, 0x36, 0x3c, 0x58, 0x1e, 0x27, 0x5c, +0x1d, 0x24, 0x58, 0x33, 0x3f, 0x7e, 0x19, 0x20, 0x50, 0x17, 0x1e, 0x4c, +0x16, 0x1d, 0x48, 0x16, 0x1c, 0x46, 0x15, 0x1b, 0x43, 0x14, 0x1a, 0x41, +0x13, 0x19, 0x3e, 0x33, 0x3c, 0x76, 0x83, 0x8b, 0x83, 0xd7, 0xd5, 0x1c, +0xce, 0xc7, 0x19, 0xd4, 0xcd, 0x1b, 0xdb, 0xd4, 0x1c, 0xcf, 0xc9, 0x1a, +0x86, 0x8a, 0x7d, 0xd2, 0xcd, 0x1e, 0xde, 0xdb, 0x1d, 0xdc, 0xda, 0x1d, +0x63, 0x69, 0x9f, 0x40, 0x4b, 0xc6, 0x43, 0x4d, 0xc3, 0x43, 0x4e, 0xbf, +0x45, 0x50, 0xbb, 0x44, 0x4e, 0xb8, 0x43, 0x4c, 0xb4, 0x41, 0x4b, 0xb0, +0x40, 0x4a, 0xad, 0x3f, 0x47, 0xaa, 0x3d, 0x47, 0xa7, 0x3c, 0x44, 0xa4, +0xad, 0xab, 0x3a, 0xe5, 0xdf, 0x34, 0xe1, 0xdb, 0x28, 0xdb, 0xd4, 0x1c, +0xe3, 0xdd, 0x30, 0xe0, 0xde, 0x25, 0x6e, 0x71, 0x63, 0x32, 0x3a, 0x8f, +0x31, 0x38, 0x8d, 0x30, 0x36, 0x8b, 0x2e, 0x35, 0x88, 0x2e, 0x35, 0x87, +0x2c, 0x34, 0x85, 0x2c, 0x33, 0x83, 0x2a, 0x32, 0x81, 0xdc, 0xda, 0x1d, +0xde, 0xdc, 0x1f, 0xde, 0xd8, 0x1f, 0xe0, 0xde, 0x25, 0xe2, 0xe0, 0x2d, +0xdd, 0xd6, 0x1c, 0x66, 0x67, 0x50, 0x25, 0x2b, 0x73, 0x25, 0x2a, 0x71, +0x25, 0x2a, 0x70, 0x24, 0x29, 0x6f, 0x24, 0x29, 0x6d, 0x23, 0x28, 0x6c, +0x23, 0x28, 0x6b, 0x22, 0x27, 0x6a, 0x22, 0x27, 0x68, 0x21, 0x26, 0x67, +0x36, 0x3a, 0x5b, 0xb9, 0xb5, 0x1c, 0x20, 0x24, 0x63, 0x1f, 0x24, 0x62, +0x1f, 0x24, 0x61, 0x1f, 0x23, 0x60, 0x1f, 0x23, 0x5f, 0x1e, 0x22, 0x5e, +0x1e, 0x22, 0x5d, 0x1e, 0x22, 0x5c, 0xcb, 0xc4, 0x18, 0xd9, 0xd2, 0x1c, +0xce, 0xc7, 0x19, 0xde, 0xd8, 0x1f, 0xcc, 0xc6, 0x19, 0xe2, 0xe0, 0x2d, +0xe6, 0xe4, 0x3b, 0xce, 0xc9, 0x0f, 0x1a, 0x1e, 0x54, 0x1a, 0x1e, 0x53, +0x1a, 0x1e, 0x52, 0x19, 0x1d, 0x51, 0x19, 0x1d, 0x51, 0x19, 0x1d, 0x50, +0xa1, 0x9e, 0x1f, 0xde, 0xdc, 0x1f, 0xdb, 0xd4, 0x1c, 0xe0, 0xde, 0x25, +0xd7, 0xd0, 0x1c, 0xa0, 0x9d, 0x1e, 0x2c, 0x2f, 0x43, 0xce, 0xc8, 0x0e, +0xe3, 0xdd, 0x30, 0xce, 0xc8, 0x0e, 0x14, 0x18, 0x48, 0x14, 0x18, 0x48, +0x13, 0x17, 0x47, 0x13, 0x17, 0x47, 0x13, 0x16, 0x45, 0x13, 0x16, 0x45, +0x12, 0x16, 0x45, 0x12, 0x15, 0x44, 0x12, 0x15, 0x44, 0x12, 0x15, 0x43, +0x11, 0x15, 0x42, 0x11, 0x14, 0x41, 0x11, 0x14, 0x41, 0x10, 0x14, 0x40, +0x10, 0x14, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3e, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05, +0x13, 0x17, 0x48, 0x28, 0x2f, 0x92, 0x2a, 0x32, 0x98, 0x25, 0x2b, 0x82, +0x22, 0x28, 0x79, 0x23, 0x29, 0x7a, 0x24, 0x2a, 0x7c, 0x26, 0x2b, 0x7e, +0x27, 0x2d, 0x80, 0x28, 0x2f, 0x81, 0x2a, 0x30, 0x83, 0x2c, 0x32, 0x86, +0x2d, 0x34, 0x88, 0x2f, 0x36, 0x8a, 0x32, 0x39, 0x8c, 0x33, 0x3b, 0x8e, +0x37, 0x3f, 0x90, 0x39, 0x41, 0x93, 0xbf, 0xbc, 0x25, 0xe4, 0xde, 0x31, +0xe4, 0xde, 0x31, 0xe4, 0xe2, 0x35, 0xe6, 0xdf, 0x37, 0xe2, 0xdc, 0x2b, +0xdc, 0xda, 0x1d, 0x9b, 0x98, 0x0f, 0x08, 0x0b, 0x1f, 0x08, 0x0b, 0x20, +0x08, 0x0c, 0x21, 0x10, 0x14, 0x30, 0x1f, 0x25, 0x4b, 0x2f, 0x36, 0x69, +0x3a, 0x43, 0x85, 0x46, 0x51, 0xa6, 0x4f, 0x5b, 0xc7, 0x4b, 0x57, 0xcb, +0xcc, 0xc6, 0x19, 0xdd, 0xd6, 0x1c, 0xcc, 0xc6, 0x19, 0xd9, 0xd2, 0x1c, +0xe0, 0xde, 0x25, 0xe0, 0xde, 0x25, 0x53, 0x5d, 0xc7, 0x46, 0x54, 0xde, +0x4d, 0x5c, 0xdc, 0x56, 0x66, 0xdc, 0x47, 0x54, 0xa9, 0x46, 0x53, 0xa6, +0x46, 0x54, 0xa9, 0x4b, 0x5b, 0xb8, 0x52, 0x63, 0xd5, 0x4e, 0x61, 0xd3, +0x15, 0x1c, 0x4a, 0xce, 0xc8, 0x0e, 0xdf, 0xd9, 0x22, 0xe0, 0xde, 0x25, +0xe2, 0xe0, 0x2d, 0xd2, 0xcc, 0x1b, 0xd2, 0xcc, 0x1b, 0xe6, 0xe0, 0x39, +0x3b, 0x44, 0x64, 0x2f, 0x39, 0x7a, 0x39, 0x43, 0x87, 0x45, 0x50, 0x95, +0x41, 0x4c, 0x93, 0x3c, 0x47, 0x8f, 0x37, 0x42, 0x8b, 0x34, 0x3f, 0x89, +0x32, 0x3d, 0x86, 0x2f, 0x3a, 0x82, 0x6a, 0x6f, 0x57, 0xdf, 0xd8, 0x20, +0xcf, 0xc9, 0x1a, 0xdf, 0xd9, 0x22, 0xdd, 0xd6, 0x1c, 0xd4, 0xcd, 0x1b, +0xcf, 0xca, 0x11, 0x35, 0x3c, 0x57, 0x24, 0x2d, 0x66, 0x1d, 0x25, 0x59, +0x1b, 0x22, 0x54, 0x33, 0x3f, 0x7f, 0x49, 0x59, 0xb1, 0x50, 0x62, 0xc6, +0x15, 0x1c, 0x46, 0x14, 0x1b, 0x43, 0x14, 0x1a, 0x41, 0x13, 0x19, 0x3e, +0x12, 0x18, 0x3c, 0x22, 0x29, 0x55, 0x65, 0x6c, 0x75, 0xd5, 0xcf, 0x1c, +0xc9, 0xc3, 0x18, 0xdb, 0xd4, 0x1c, 0xe0, 0xd9, 0x23, 0xc9, 0xc3, 0x18, +0xc9, 0xc7, 0x18, 0xd9, 0xd2, 0x1c, 0xde, 0xd7, 0x1d, 0x71, 0x76, 0x8b, +0x36, 0x3f, 0xc9, 0x36, 0x40, 0xc5, 0x39, 0x42, 0xc1, 0x39, 0x44, 0xbd, +0x3b, 0x45, 0xba, 0x3b, 0x46, 0xb6, 0x3d, 0x47, 0xb3, 0x3e, 0x47, 0xb0, +0x3e, 0x47, 0xac, 0x3c, 0x46, 0xa9, 0x3c, 0x45, 0xa6, 0x3a, 0x42, 0xa3, +0xac, 0xaa, 0x3a, 0xe2, 0xe0, 0x2b, 0xdf, 0xd8, 0x20, 0xe1, 0xdf, 0x2a, +0xe2, 0xdc, 0x2b, 0xbc, 0xb6, 0x15, 0x6e, 0x71, 0x63, 0x31, 0x39, 0x8e, +0x31, 0x38, 0x8d, 0x30, 0x36, 0x8a, 0x2e, 0x35, 0x88, 0x2d, 0x35, 0x87, +0x2d, 0x34, 0x84, 0x2b, 0x32, 0x82, 0x2a, 0x32, 0x80, 0xbb, 0xb7, 0x21, +0xde, 0xd8, 0x1f, 0xe1, 0xdb, 0x2a, 0xe2, 0xdc, 0x2b, 0xde, 0xd8, 0x1f, +0xdf, 0xd8, 0x20, 0xd0, 0xca, 0x13, 0x24, 0x2a, 0x73, 0x24, 0x29, 0x71, +0x23, 0x29, 0x70, 0x23, 0x29, 0x6f, 0x22, 0x28, 0x6d, 0x21, 0x27, 0x6c, +0x21, 0x27, 0x6b, 0x21, 0x26, 0x69, 0x20, 0x26, 0x68, 0x77, 0x77, 0x3c, +0xe0, 0xda, 0x25, 0xdf, 0xd8, 0x20, 0x1f, 0x24, 0x63, 0x1e, 0x24, 0x62, +0x1e, 0x23, 0x61, 0x1e, 0x22, 0x60, 0x1e, 0x22, 0x5f, 0x1d, 0x22, 0x5e, +0x1d, 0x21, 0x5d, 0x1d, 0x21, 0x5c, 0xdf, 0xd9, 0x22, 0xe0, 0xde, 0x25, +0xe2, 0xe0, 0x2d, 0xd2, 0xcc, 0x1b, 0xd2, 0xcc, 0x1b, 0xe6, 0xe0, 0x39, +0xde, 0xdb, 0x1d, 0x73, 0x74, 0x31, 0x19, 0x1e, 0x54, 0x19, 0x1d, 0x53, +0x19, 0x1d, 0x52, 0x19, 0x1d, 0x51, 0x18, 0x1c, 0x50, 0x18, 0x1c, 0x50, +0x73, 0x72, 0x2f, 0xd4, 0xcd, 0x1b, 0xe3, 0xdd, 0x30, 0xdf, 0xd8, 0x20, +0xcf, 0xc9, 0x1a, 0xdf, 0xd9, 0x22, 0xb7, 0xb2, 0x16, 0xd4, 0xcd, 0x1b, +0xd7, 0xd0, 0x1c, 0x2b, 0x2e, 0x41, 0x15, 0x19, 0x48, 0x15, 0x19, 0x48, +0x15, 0x18, 0x47, 0x14, 0x18, 0x47, 0x14, 0x17, 0x45, 0x14, 0x17, 0x45, +0x13, 0x17, 0x45, 0x13, 0x16, 0x44, 0x13, 0x16, 0x44, 0x12, 0x16, 0x43, +0x12, 0x15, 0x42, 0x12, 0x15, 0x41, 0x11, 0x15, 0x41, 0x11, 0x14, 0x40, +0x11, 0x14, 0x40, 0x11, 0x14, 0x3f, 0x10, 0x14, 0x3f, 0x10, 0x13, 0x3e, +0x10, 0x13, 0x3e, 0x10, 0x13, 0x3d, 0x0f, 0x11, 0x37, 0x01, 0x01, 0x05, +0x14, 0x18, 0x48, 0x29, 0x32, 0x92, 0x2d, 0x35, 0x98, 0x27, 0x2d, 0x81, +0x25, 0x2a, 0x78, 0x26, 0x2c, 0x7a, 0x26, 0x2d, 0x7c, 0x28, 0x2f, 0x7e, +0x2a, 0x30, 0x80, 0x2c, 0x32, 0x81, 0x2d, 0x35, 0x83, 0x2f, 0x36, 0x85, +0x32, 0x38, 0x87, 0x34, 0x3c, 0x89, 0x37, 0x3f, 0x8b, 0x38, 0x40, 0x89, +0x34, 0x3c, 0x7c, 0x30, 0x36, 0x6f, 0x3d, 0x42, 0x54, 0xcf, 0xca, 0x0e, +0xe0, 0xda, 0x25, 0xe3, 0xe1, 0x32, 0xe6, 0xe0, 0x39, 0xe2, 0xe0, 0x2d, +0xdd, 0xd6, 0x1c, 0xe0, 0xde, 0x25, 0xcf, 0xc9, 0x0e, 0x3d, 0x42, 0x53, +0x35, 0x3c, 0x77, 0x3d, 0x47, 0x90, 0x46, 0x51, 0xab, 0x49, 0x55, 0xba, +0x46, 0x51, 0xbe, 0x42, 0x4d, 0xc1, 0x3f, 0x49, 0xc6, 0x74, 0x79, 0x89, +0xe0, 0xde, 0x25, 0xdd, 0xd6, 0x1c, 0xd1, 0xca, 0x1a, 0xce, 0xc7, 0x19, +0xd9, 0xd2, 0x1c, 0xde, 0xdb, 0x1d, 0x44, 0x52, 0xdf, 0x4b, 0x59, 0xde, +0x54, 0x63, 0xdd, 0x56, 0x65, 0xdc, 0x55, 0x64, 0xdb, 0x53, 0x64, 0xd9, +0x4d, 0x5d, 0xd8, 0x47, 0x57, 0xd7, 0x51, 0x62, 0xd5, 0x13, 0x1a, 0x44, +0x14, 0x1b, 0x47, 0x2b, 0x31, 0x42, 0xe0, 0xda, 0x25, 0xe3, 0xdd, 0x30, +0xdf, 0xd8, 0x20, 0xe0, 0xda, 0x25, 0xe6, 0xdf, 0x37, 0xe2, 0xe0, 0x2d, +0xd0, 0xca, 0x12, 0x6a, 0x6f, 0x4f, 0x36, 0x40, 0x7f, 0x3b, 0x45, 0x86, +0x38, 0x42, 0x84, 0x34, 0x3e, 0x81, 0x30, 0x3b, 0x7e, 0x2f, 0x39, 0x7c, +0x2c, 0x36, 0x7a, 0x91, 0x92, 0x39, 0xdf, 0xd8, 0x20, 0xe0, 0xde, 0x25, +0xe4, 0xde, 0x33, 0xdb, 0xd4, 0x1c, 0xd7, 0xd5, 0x1c, 0xcf, 0xca, 0x11, +0x35, 0x3c, 0x56, 0x1e, 0x26, 0x5c, 0x1d, 0x24, 0x58, 0x42, 0x51, 0xa1, +0x19, 0x21, 0x50, 0x18, 0x1f, 0x4e, 0x47, 0x56, 0xab, 0x54, 0x65, 0xd7, +0x4e, 0x5f, 0xd8, 0x43, 0x50, 0x9e, 0x12, 0x18, 0x3e, 0x12, 0x17, 0x3c, +0x11, 0x16, 0x3a, 0x10, 0x16, 0x38, 0x35, 0x3f, 0x7a, 0xd2, 0xcc, 0x1b, +0xd9, 0xd2, 0x1c, 0xe1, 0xdb, 0x28, 0xd7, 0xd5, 0x1c, 0xbb, 0xb5, 0x14, +0xd1, 0xcf, 0x1a, 0xde, 0xd7, 0x1d, 0x99, 0x9a, 0x60, 0x38, 0x43, 0xcb, +0x37, 0x41, 0xc7, 0x35, 0x3f, 0xc3, 0x33, 0x3d, 0xbf, 0x31, 0x3b, 0xbc, +0x33, 0x3c, 0xb8, 0x35, 0x3d, 0xb5, 0x35, 0x3e, 0xb2, 0x36, 0x3f, 0xae, +0x37, 0x3f, 0xab, 0x37, 0x40, 0xa8, 0x38, 0x41, 0xa5, 0x39, 0x42, 0xa2, +0xdf, 0xd8, 0x20, 0xd2, 0xcc, 0x1b, 0xe2, 0xdc, 0x2b, 0xd4, 0xcd, 0x1b, +0xe2, 0xe0, 0x2d, 0xe6, 0xe0, 0x3b, 0xbd, 0xb9, 0x25, 0x31, 0x38, 0x8e, +0x30, 0x36, 0x8c, 0x2f, 0x35, 0x8a, 0x2d, 0x35, 0x87, 0x2d, 0x34, 0x86, +0x2c, 0x33, 0x84, 0x2b, 0x32, 0x82, 0x2a, 0x32, 0x80, 0x7d, 0x7d, 0x49, +0xdf, 0xd8, 0x20, 0xe0, 0xde, 0x25, 0xe1, 0xda, 0x26, 0xdf, 0xd8, 0x20, +0xde, 0xdc, 0x1f, 0xde, 0xdb, 0x1d, 0xba, 0xb6, 0x1e, 0x39, 0x3c, 0x65, +0x23, 0x29, 0x6f, 0x22, 0x28, 0x6f, 0x22, 0x28, 0x6d, 0x21, 0x27, 0x6c, +0x21, 0x26, 0x6a, 0x77, 0x77, 0x3d, 0xcf, 0xc9, 0x12, 0xd9, 0xd2, 0x1c, +0xdb, 0xd4, 0x1c, 0xd5, 0xcf, 0x1c, 0x1d, 0x23, 0x63, 0x1d, 0x23, 0x62, +0x1d, 0x22, 0x61, 0x1c, 0x22, 0x60, 0x1d, 0x22, 0x5f, 0x1c, 0x21, 0x5e, +0x1c, 0x21, 0x5d, 0x1c, 0x21, 0x5c, 0xe0, 0xda, 0x25, 0xe3, 0xdd, 0x30, +0xdf, 0xd8, 0x20, 0xe0, 0xda, 0x25, 0xe6, 0xdf, 0x37, 0xe2, 0xe0, 0x2d, +0xb8, 0xb3, 0x18, 0x19, 0x1e, 0x54, 0x19, 0x1d, 0x53, 0x19, 0x1d, 0x53, +0x18, 0x1c, 0x52, 0x18, 0x1c, 0x51, 0x18, 0x1c, 0x50, 0x18, 0x1c, 0x50, +0x5c, 0x5c, 0x37, 0xcf, 0xc9, 0x1a, 0xdf, 0xd8, 0x20, 0xe0, 0xde, 0x25, +0xe4, 0xde, 0x33, 0xdb, 0xd4, 0x1c, 0xd7, 0xd5, 0x1c, 0xdf, 0xd8, 0x20, +0x5a, 0x5b, 0x33, 0x15, 0x19, 0x49, 0x15, 0x19, 0x48, 0x15, 0x18, 0x48, +0x14, 0x18, 0x47, 0x14, 0x18, 0x46, 0x14, 0x18, 0x45, 0x14, 0x17, 0x45, +0x14, 0x17, 0x45, 0x14, 0x17, 0x44, 0x14, 0x17, 0x44, 0x13, 0x17, 0x43, +0x13, 0x16, 0x42, 0x12, 0x16, 0x41, 0x12, 0x16, 0x41, 0x12, 0x15, 0x40, +0x12, 0x15, 0x40, 0x11, 0x15, 0x3f, 0x11, 0x14, 0x3f, 0x11, 0x14, 0x3e, +0x10, 0x14, 0x3e, 0x10, 0x13, 0x3d, 0x0f, 0x11, 0x37, 0x01, 0x01, 0x05, +0x16, 0x19, 0x48, 0x2d, 0x33, 0x92, 0x2f, 0x37, 0x97, 0x29, 0x2f, 0x81, +0x26, 0x2d, 0x78, 0x28, 0x2f, 0x7a, 0x2a, 0x2f, 0x7b, 0x2b, 0x32, 0x7d, +0x2d, 0x34, 0x7f, 0x2f, 0x36, 0x81, 0x32, 0x39, 0x82, 0x35, 0x3c, 0x85, +0x34, 0x3c, 0x80, 0x31, 0x38, 0x75, 0x2d, 0x33, 0x69, 0x29, 0x2f, 0x5e, +0x23, 0x29, 0x50, 0x1b, 0x1f, 0x40, 0x17, 0x1b, 0x37, 0x2a, 0x2c, 0x2b, +0xcd, 0xc8, 0x0b, 0xe6, 0xe0, 0x3b, 0xe0, 0xde, 0x25, 0xe0, 0xde, 0x25, +0xde, 0xd7, 0x1d, 0xe0, 0xde, 0x25, 0xde, 0xd7, 0x1d, 0xdc, 0xda, 0x1d, +0x9d, 0x9d, 0x52, 0x65, 0x6b, 0x8c, 0x3f, 0x49, 0xb6, 0x3b, 0x45, 0xb9, +0x39, 0x43, 0xbc, 0x36, 0x40, 0xc0, 0x33, 0x3d, 0xc4, 0x82, 0x85, 0x71, +0xe4, 0xde, 0x33, 0xe1, 0xda, 0x26, 0xdc, 0xda, 0x1d, 0xd1, 0xcf, 0x1a, +0xde, 0xd8, 0x1f, 0xaf, 0xaf, 0x4f, 0x49, 0x56, 0xdf, 0x4d, 0x5a, 0xde, +0x4c, 0x5b, 0xdd, 0x4b, 0x59, 0xdd, 0x48, 0x57, 0xdc, 0x43, 0x52, 0xdb, +0x3f, 0x4d, 0xd9, 0x54, 0x64, 0xd8, 0x11, 0x18, 0x40, 0x12, 0x18, 0x41, +0x13, 0x19, 0x44, 0x14, 0x1b, 0x47, 0x5b, 0x5d, 0x34, 0xd4, 0xcd, 0x1b, +0xe1, 0xda, 0x26, 0xe5, 0xdf, 0x34, 0xe0, 0xde, 0x25, 0xe3, 0xdd, 0x2e, +0xe6, 0xe0, 0x3b, 0xe0, 0xde, 0x25, 0xbd, 0xba, 0x20, 0x6f, 0x73, 0x53, +0x44, 0x4c, 0x6b, 0x2e, 0x38, 0x76, 0x69, 0x6d, 0x4f, 0x7c, 0x7f, 0x42, +0xd0, 0xcb, 0x12, 0xe0, 0xd9, 0x23, 0xe2, 0xe0, 0x2b, 0xe2, 0xdc, 0x2b, +0xd2, 0xcc, 0x1b, 0xc3, 0xbd, 0x16, 0xb9, 0xb6, 0x1b, 0x34, 0x3b, 0x54, +0x1d, 0x25, 0x5a, 0x1c, 0x24, 0x57, 0x1b, 0x22, 0x53, 0x21, 0x2a, 0x5e, +0x53, 0x65, 0xd0, 0x28, 0x31, 0x67, 0x22, 0x2b, 0x5c, 0x54, 0x66, 0xd3, +0x4d, 0x5e, 0xd9, 0x48, 0x58, 0xda, 0x4e, 0x5d, 0xdb, 0x31, 0x3b, 0x74, +0x10, 0x16, 0x38, 0x10, 0x15, 0x36, 0x19, 0x20, 0x46, 0xd4, 0xcd, 0x1b, +0xe2, 0xdc, 0x2b, 0xde, 0xdb, 0x1d, 0xd7, 0xd0, 0x1c, 0xcb, 0xc4, 0x18, +0xdc, 0xda, 0x1d, 0xb0, 0xae, 0x4a, 0x3f, 0x4a, 0xcd, 0x3c, 0x46, 0xc9, +0x39, 0x43, 0xc5, 0x37, 0x40, 0xc1, 0x34, 0x3e, 0xbe, 0x33, 0x3c, 0xba, +0x31, 0x3b, 0xb7, 0x30, 0x38, 0xb3, 0x2f, 0x38, 0xb0, 0x30, 0x38, 0xad, +0x31, 0x3a, 0xaa, 0x31, 0x3a, 0xa7, 0x33, 0x3a, 0xa4, 0x33, 0x3a, 0xa1, +0xde, 0xd7, 0x1d, 0xd2, 0xcc, 0x1b, 0xd1, 0xca, 0x1a, 0xcc, 0xc6, 0x19, +0xe2, 0xe0, 0x2d, 0xe1, 0xdf, 0x2a, 0xe6, 0xe4, 0x39, 0xa9, 0xa7, 0x33, +0x6c, 0x6e, 0x5f, 0x6b, 0x6d, 0x5d, 0x93, 0x93, 0x40, 0xbc, 0xb8, 0x23, +0x69, 0x6b, 0x59, 0x2a, 0x31, 0x81, 0x2a, 0x31, 0x7f, 0x2a, 0x30, 0x7d, +0xd0, 0xca, 0x14, 0xe0, 0xd9, 0x23, 0xe1, 0xda, 0x26, 0xe1, 0xdf, 0x2a, +0xe2, 0xdc, 0x2b, 0xd7, 0xd0, 0x1c, 0xde, 0xd8, 0x1f, 0xe0, 0xde, 0x25, +0xa5, 0xa2, 0x29, 0xa4, 0xa2, 0x29, 0xa4, 0xa1, 0x28, 0xa4, 0xa1, 0x28, +0xde, 0xd8, 0x1f, 0xe1, 0xdb, 0x28, 0xde, 0xd8, 0x1f, 0xe1, 0xda, 0x26, +0xcf, 0xc9, 0x11, 0x49, 0x4d, 0x4f, 0x1d, 0x23, 0x63, 0x1d, 0x22, 0x62, +0x1c, 0x22, 0x61, 0x1c, 0x21, 0x60, 0x1c, 0x21, 0x5e, 0x1b, 0x21, 0x5d, +0x1b, 0x20, 0x5c, 0x1b, 0x20, 0x5b, 0xce, 0xc9, 0x10, 0xd4, 0xcd, 0x1b, +0xe1, 0xda, 0x26, 0xe5, 0xdf, 0x34, 0xe0, 0xde, 0x25, 0xe3, 0xdd, 0x2e, +0x46, 0x48, 0x43, 0x18, 0x1d, 0x54, 0x18, 0x1c, 0x53, 0x18, 0x1c, 0x53, +0x18, 0x1c, 0x52, 0x18, 0x1c, 0x51, 0x17, 0x1b, 0x50, 0x17, 0x1b, 0x4f, +0x5c, 0x5c, 0x37, 0xe0, 0xd9, 0x23, 0xe2, 0xe0, 0x2b, 0xe2, 0xdc, 0x2b, +0xd2, 0xcc, 0x1b, 0xc3, 0xbd, 0x16, 0xdb, 0xd4, 0x1c, 0x88, 0x86, 0x24, +0x15, 0x18, 0x49, 0x15, 0x18, 0x49, 0x15, 0x18, 0x48, 0x15, 0x18, 0x48, +0x14, 0x18, 0x47, 0x14, 0x17, 0x45, 0x14, 0x17, 0x45, 0x13, 0x17, 0x45, +0x13, 0x17, 0x45, 0x13, 0x16, 0x44, 0x13, 0x16, 0x44, 0x13, 0x16, 0x42, +0x13, 0x16, 0x42, 0x12, 0x16, 0x41, 0x12, 0x16, 0x41, 0x12, 0x15, 0x40, +0x12, 0x15, 0x40, 0x12, 0x15, 0x3f, 0x11, 0x15, 0x3f, 0x11, 0x14, 0x3e, +0x11, 0x14, 0x3e, 0x11, 0x14, 0x3d, 0x10, 0x12, 0x37, 0x01, 0x01, 0x05, +0x17, 0x1a, 0x48, 0x2f, 0x37, 0x90, 0x32, 0x3b, 0x97, 0x2c, 0x32, 0x80, +0x2a, 0x30, 0x77, 0x2c, 0x32, 0x79, 0x2d, 0x34, 0x7b, 0x2f, 0x35, 0x7d, +0x32, 0x39, 0x7f, 0x32, 0x39, 0x7a, 0x30, 0x36, 0x72, 0x2d, 0x32, 0x68, +0x27, 0x2d, 0x5c, 0x23, 0x29, 0x51, 0x23, 0x28, 0x4f, 0x22, 0x27, 0x4a, +0x1e, 0x23, 0x45, 0x1e, 0x23, 0x45, 0x23, 0x29, 0x51, 0x28, 0x2f, 0x5c, +0x41, 0x46, 0x5d, 0xbd, 0xba, 0x20, 0xdd, 0xd6, 0x1c, 0xd7, 0xd0, 0x1c, +0xe3, 0xdd, 0x2e, 0xdf, 0xd9, 0x22, 0xd5, 0xcf, 0x1c, 0xe0, 0xde, 0x25, +0xd1, 0xca, 0x1a, 0xd4, 0xcd, 0x1b, 0xe0, 0xd9, 0x23, 0xbd, 0xba, 0x2e, +0xa9, 0xa8, 0x43, 0xaa, 0xa8, 0x44, 0xcf, 0xc9, 0x1a, 0xe2, 0xe0, 0x2d, +0xe0, 0xde, 0x25, 0xdd, 0xd6, 0x1c, 0xd9, 0xd2, 0x1c, 0xd9, 0xd2, 0x1c, +0xe1, 0xda, 0x26, 0x9e, 0x9f, 0x67, 0x44, 0x51, 0xe0, 0x44, 0x51, 0xdf, +0x44, 0x51, 0xde, 0x3f, 0x4d, 0xdd, 0x3b, 0x48, 0xdc, 0x3a, 0x48, 0xdb, +0x56, 0x66, 0xda, 0x10, 0x15, 0x3b, 0x11, 0x16, 0x3d, 0x11, 0x18, 0x40, +0x12, 0x19, 0x42, 0x13, 0x1a, 0x44, 0x15, 0x1b, 0x47, 0x54, 0x5a, 0x58, +0xce, 0xc9, 0x0e, 0xd4, 0xcd, 0x1b, 0xe3, 0xdd, 0x30, 0xe2, 0xe0, 0x2d, +0xdc, 0xda, 0x1d, 0xd1, 0xca, 0x1a, 0xe1, 0xdf, 0x2a, 0xe2, 0xe0, 0x2b, +0xce, 0xcc, 0x19, 0xcb, 0xc4, 0x18, 0xcb, 0xc4, 0x18, 0xce, 0xcc, 0x19, +0xe2, 0xdc, 0x2d, 0xe0, 0xde, 0x25, 0xe3, 0xdd, 0x30, 0xe1, 0xdf, 0x2a, +0xde, 0xd8, 0x1f, 0x77, 0x78, 0x36, 0x1e, 0x26, 0x5b, 0x1d, 0x24, 0x58, +0x1c, 0x24, 0x56, 0x1a, 0x22, 0x53, 0x19, 0x20, 0x50, 0x18, 0x1f, 0x4d, +0x46, 0x55, 0xa8, 0x4f, 0x61, 0xd7, 0x43, 0x50, 0x9f, 0x3d, 0x4a, 0x91, +0x50, 0x61, 0xda, 0x47, 0x56, 0xdb, 0x43, 0x51, 0xdc, 0x41, 0x4f, 0xdd, +0x55, 0x64, 0xdd, 0x24, 0x2b, 0x58, 0x0e, 0x13, 0x33, 0xe1, 0xdb, 0x2a, +0xcc, 0xc6, 0x19, 0xce, 0xc7, 0x19, 0xdf, 0xd8, 0x20, 0xe1, 0xdf, 0x2a, +0xb3, 0xb2, 0x4b, 0x49, 0x55, 0xcf, 0x44, 0x4f, 0xcb, 0x3f, 0x4a, 0xc7, +0x3c, 0x46, 0xc3, 0x39, 0x42, 0xc0, 0x36, 0x3f, 0xbc, 0x34, 0x3e, 0xb9, +0x32, 0x3b, 0xb5, 0x30, 0x3a, 0xb2, 0x2f, 0x38, 0xaf, 0x2e, 0x36, 0xac, +0x2c, 0x35, 0xa9, 0x2c, 0x34, 0xa6, 0x2d, 0x35, 0xa4, 0x2e, 0x36, 0xa0, +0xbc, 0xb9, 0x28, 0xc9, 0xc3, 0x18, 0xce, 0xc7, 0x19, 0xe1, 0xdf, 0x2a, +0xeb, 0xe6, 0x4a, 0xe6, 0xe4, 0x39, 0xdb, 0xd4, 0x1c, 0xe0, 0xd9, 0x23, +0xe2, 0xdc, 0x2b, 0xde, 0xd8, 0x1f, 0xdd, 0xd6, 0x1c, 0xd7, 0xd0, 0x1c, +0x68, 0x6b, 0x59, 0x2a, 0x31, 0x81, 0x2a, 0x30, 0x7f, 0x29, 0x2e, 0x7d, +0x3c, 0x41, 0x6f, 0xd0, 0xca, 0x14, 0xe0, 0xd9, 0x23, 0xe1, 0xda, 0x26, +0xd4, 0xcd, 0x1b, 0xde, 0xd7, 0x1d, 0xcf, 0xc9, 0x1a, 0xe2, 0xe0, 0x2d, +0xe0, 0xde, 0x25, 0xdd, 0xd6, 0x1c, 0xd9, 0xd2, 0x1c, 0xd9, 0xd2, 0x1c, +0xe1, 0xda, 0x26, 0xdf, 0xd8, 0x20, 0xe1, 0xda, 0x26, 0x8c, 0x8b, 0x31, +0x1e, 0x24, 0x65, 0x1d, 0x23, 0x64, 0x1d, 0x23, 0x63, 0x1d, 0x22, 0x62, +0x1c, 0x21, 0x60, 0x1c, 0x21, 0x5f, 0x1c, 0x21, 0x5e, 0x1b, 0x20, 0x5d, +0x1b, 0x20, 0x5c, 0x1b, 0x20, 0x5b, 0xa2, 0x9f, 0x22, 0xdb, 0xd4, 0x1c, +0xe1, 0xda, 0x26, 0xd4, 0xcd, 0x1b, 0xe3, 0xdd, 0x30, 0xb8, 0xb3, 0x18, +0x18, 0x1d, 0x55, 0x18, 0x1d, 0x54, 0x18, 0x1c, 0x53, 0x17, 0x1c, 0x52, +0x17, 0x1c, 0x52, 0x17, 0x1c, 0x51, 0x17, 0x1b, 0x50, 0x16, 0x1b, 0x4f, +0x5b, 0x5c, 0x37, 0xe0, 0xde, 0x25, 0xe3, 0xdd, 0x30, 0xe1, 0xdf, 0x2a, +0xde, 0xd8, 0x1f, 0xd1, 0xcf, 0x1a, 0xb7, 0xb2, 0x16, 0x15, 0x19, 0x4a, +0x14, 0x18, 0x49, 0x14, 0x18, 0x49, 0x14, 0x18, 0x48, 0x14, 0x18, 0x48, +0x13, 0x17, 0x47, 0x13, 0x17, 0x45, 0x13, 0x17, 0x45, 0x13, 0x17, 0x45, +0x13, 0x17, 0x45, 0x13, 0x16, 0x44, 0x13, 0x16, 0x44, 0x12, 0x16, 0x42, +0x12, 0x16, 0x42, 0x12, 0x16, 0x41, 0x12, 0x15, 0x41, 0x12, 0x15, 0x40, +0x12, 0x15, 0x40, 0x11, 0x15, 0x3f, 0x11, 0x15, 0x3f, 0x11, 0x14, 0x3e, +0x11, 0x14, 0x3e, 0x11, 0x14, 0x3d, 0x10, 0x12, 0x37, 0x01, 0x01, 0x05, +0x19, 0x1d, 0x48, 0x33, 0x3b, 0x90, 0x37, 0x3f, 0x97, 0x30, 0x36, 0x80, +0x2d, 0x34, 0x77, 0x2f, 0x35, 0x79, 0x2f, 0x35, 0x74, 0x2e, 0x34, 0x71, +0x2c, 0x32, 0x67, 0x2b, 0x30, 0x63, 0x2a, 0x30, 0x5f, 0x2b, 0x30, 0x5c, +0x28, 0x2e, 0x57, 0x26, 0x2a, 0x53, 0x25, 0x2b, 0x54, 0x29, 0x2f, 0x5e, +0x2d, 0x33, 0x68, 0x32, 0x39, 0x76, 0x35, 0x3d, 0x80, 0x39, 0x41, 0x8b, +0x3c, 0x45, 0x97, 0x3b, 0x43, 0x99, 0x85, 0x87, 0x59, 0xd2, 0xcd, 0x18, +0xd2, 0xcc, 0x1b, 0xde, 0xd8, 0x1f, 0xe2, 0xdc, 0x2b, 0xdf, 0xd9, 0x22, +0xe0, 0xd9, 0x23, 0xe0, 0xd9, 0x23, 0xdb, 0xd4, 0x1c, 0xdf, 0xd8, 0x20, +0xdd, 0xd6, 0x1c, 0xdd, 0xd6, 0x1c, 0xd9, 0xd2, 0x1c, 0xdf, 0xd8, 0x20, +0xe3, 0xe1, 0x32, 0xde, 0xdc, 0x1f, 0xdf, 0xd9, 0x22, 0xc1, 0xbe, 0x34, +0x89, 0x8d, 0x7a, 0x50, 0x5a, 0xc3, 0x3d, 0x49, 0xdf, 0x3b, 0x47, 0xdf, +0x38, 0x44, 0xdf, 0x35, 0x41, 0xde, 0x3b, 0x48, 0xdd, 0x57, 0x66, 0xdc, +0x0f, 0x14, 0x38, 0x0f, 0x15, 0x39, 0x10, 0x16, 0x3b, 0x11, 0x17, 0x3e, +0x11, 0x18, 0x40, 0x12, 0x19, 0x42, 0x45, 0x53, 0xa8, 0x31, 0x3c, 0x79, +0x47, 0x50, 0x73, 0xa5, 0xa4, 0x26, 0xe6, 0xdf, 0x37, 0xcc, 0xc6, 0x19, +0xce, 0xc7, 0x19, 0xe1, 0xda, 0x26, 0xe2, 0xe0, 0x2d, 0xd7, 0xd5, 0x1c, +0xbc, 0xb6, 0x15, 0xc6, 0xc4, 0x17, 0xdf, 0xd8, 0x20, 0xdf, 0xd8, 0x20, +0xe2, 0xe0, 0x2d, 0xde, 0xd8, 0x1f, 0xd9, 0xd2, 0x1c, 0xd9, 0xd2, 0x1c, +0x76, 0x77, 0x34, 0x1d, 0x24, 0x58, 0x1b, 0x23, 0x55, 0x1b, 0x22, 0x53, +0x1a, 0x21, 0x51, 0x19, 0x20, 0x4e, 0x18, 0x1f, 0x4c, 0x17, 0x1d, 0x49, +0x29, 0x32, 0x68, 0x53, 0x65, 0xd8, 0x49, 0x5a, 0xd9, 0x55, 0x67, 0xd5, +0x4f, 0x5f, 0xbf, 0x4c, 0x5b, 0xdb, 0x41, 0x50, 0xdc, 0x3e, 0x4b, 0xdd, +0x3a, 0x46, 0xde, 0x46, 0x53, 0xdf, 0x77, 0x80, 0xab, 0xd7, 0xd0, 0x1c, +0xd7, 0xd0, 0x1c, 0xdb, 0xd4, 0x1c, 0xe2, 0xdc, 0x2b, 0xd5, 0xd0, 0x1e, +0x5f, 0x69, 0xb9, 0x4b, 0x57, 0xcd, 0x48, 0x52, 0xc9, 0x43, 0x4f, 0xc5, +0x40, 0x4a, 0xc2, 0x3c, 0x46, 0xbe, 0x38, 0x42, 0xba, 0x35, 0x3f, 0xb7, +0x34, 0x3d, 0xb4, 0x32, 0x3a, 0xb1, 0x30, 0x39, 0xae, 0x2e, 0x37, 0xaa, +0x2d, 0x35, 0xa7, 0x2c, 0x35, 0xa5, 0x2a, 0x33, 0xa2, 0x29, 0x31, 0x9f, +0x68, 0x6b, 0x6b, 0xe1, 0xdb, 0x2a, 0xe5, 0xdf, 0x36, 0xe6, 0xdf, 0x37, +0xe4, 0xe2, 0x35, 0xe0, 0xd9, 0x23, 0xe1, 0xdb, 0x2a, 0xe2, 0xdc, 0x2d, +0xd4, 0xcd, 0x1b, 0xcc, 0xc6, 0x19, 0xbc, 0xb8, 0x23, 0x7d, 0x7e, 0x4c, +0x2a, 0x30, 0x82, 0x2a, 0x30, 0x80, 0x28, 0x2e, 0x7e, 0x28, 0x2e, 0x7c, +0x28, 0x2e, 0x7c, 0x3b, 0x3f, 0x6d, 0xd0, 0xca, 0x13, 0xdf, 0xd8, 0x20, +0xdd, 0xd6, 0x1c, 0xdd, 0xd6, 0x1c, 0xd9, 0xd2, 0x1c, 0xdf, 0xd8, 0x20, +0xe3, 0xe1, 0x32, 0xde, 0xdc, 0x1f, 0xdf, 0xd9, 0x22, 0xe2, 0xdc, 0x2b, +0xd7, 0xd0, 0x1c, 0x8d, 0x8b, 0x32, 0x34, 0x39, 0x5c, 0x1e, 0x24, 0x66, +0x1e, 0x24, 0x65, 0x1d, 0x23, 0x64, 0x1d, 0x22, 0x62, 0x1c, 0x22, 0x61, +0x1c, 0x21, 0x60, 0x1c, 0x21, 0x5f, 0x1c, 0x20, 0x5e, 0x1b, 0x20, 0x5d, +0x1b, 0x20, 0x5c, 0x1b, 0x1f, 0x5b, 0xce, 0xc9, 0x10, 0xdd, 0xd6, 0x1c, +0xd4, 0xcd, 0x1b, 0xe2, 0xe0, 0x2b, 0xe6, 0xdf, 0x37, 0x2f, 0x32, 0x4d, +0x18, 0x1c, 0x55, 0x18, 0x1c, 0x54, 0x17, 0x1c, 0x53, 0x17, 0x1c, 0x52, +0x17, 0x1c, 0x52, 0x17, 0x1b, 0x51, 0x16, 0x1b, 0x50, 0x16, 0x1b, 0x4f, +0x5b, 0x5c, 0x37, 0xde, 0xd8, 0x1f, 0xd9, 0xd2, 0x1c, 0xd9, 0xd2, 0x1c, +0xe2, 0xe0, 0x2b, 0xce, 0xc8, 0x0e, 0x2b, 0x2e, 0x42, 0x15, 0x19, 0x4a, +0x14, 0x18, 0x49, 0x14, 0x18, 0x49, 0x14, 0x17, 0x48, 0x13, 0x17, 0x47, +0x13, 0x17, 0x47, 0x13, 0x17, 0x45, 0x13, 0x17, 0x45, 0x13, 0x16, 0x45, +0x13, 0x16, 0x45, 0x12, 0x16, 0x44, 0x12, 0x16, 0x44, 0x12, 0x15, 0x42, +0x12, 0x15, 0x42, 0x12, 0x15, 0x41, 0x12, 0x15, 0x41, 0x11, 0x15, 0x40, +0x11, 0x15, 0x40, 0x11, 0x14, 0x3f, 0x11, 0x14, 0x3f, 0x11, 0x14, 0x3e, +0x11, 0x14, 0x3e, 0x10, 0x14, 0x3d, 0x0f, 0x12, 0x37, 0x01, 0x01, 0x05, +0x1a, 0x1e, 0x48, 0x38, 0x3e, 0x90, 0x3b, 0x45, 0x96, 0x33, 0x3b, 0x7e, +0x2e, 0x34, 0x6f, 0x2f, 0x34, 0x6d, 0x2e, 0x34, 0x6b, 0x2f, 0x35, 0x68, +0x2e, 0x35, 0x65, 0x2d, 0x33, 0x62, 0x2a, 0x30, 0x5f, 0x28, 0x2d, 0x5c, +0x2c, 0x32, 0x66, 0x2f, 0x36, 0x6f, 0x31, 0x39, 0x78, 0x35, 0x3d, 0x82, +0x38, 0x40, 0x8d, 0x37, 0x3f, 0x8f, 0x36, 0x3e, 0x91, 0x35, 0x3e, 0x93, +0x35, 0x3c, 0x96, 0x33, 0x3b, 0x98, 0x32, 0x3a, 0x9b, 0x31, 0x39, 0x9d, +0x6c, 0x6f, 0x6d, 0xa8, 0xa6, 0x3b, 0xd0, 0xcb, 0x19, 0xe1, 0xda, 0x26, +0xe5, 0xdf, 0x36, 0xe1, 0xdf, 0x2a, 0xe1, 0xdf, 0x2a, 0xd4, 0xcd, 0x1b, +0xd5, 0xcf, 0x1c, 0xdf, 0xd8, 0x20, 0xdd, 0xd6, 0x1c, 0xab, 0xaa, 0x45, +0x99, 0x99, 0x5c, 0x75, 0x7a, 0x88, 0x3d, 0x49, 0xcd, 0x3c, 0x48, 0xd0, +0x3c, 0x47, 0xd5, 0x39, 0x45, 0xd9, 0x36, 0x41, 0xdd, 0x31, 0x3d, 0xdf, +0x2f, 0x3a, 0xdf, 0x3c, 0x48, 0xde, 0x58, 0x67, 0xdd, 0x0e, 0x13, 0x34, +0x0e, 0x13, 0x35, 0x0f, 0x14, 0x38, 0x0f, 0x15, 0x39, 0x10, 0x16, 0x3c, +0x2a, 0x34, 0x6b, 0x53, 0x64, 0xd7, 0x4b, 0x5b, 0xb8, 0x44, 0x53, 0xa6, +0x4d, 0x5d, 0xbe, 0x17, 0x1e, 0x4a, 0x30, 0x35, 0x47, 0x8c, 0x8b, 0x28, +0xcf, 0xca, 0x10, 0xe4, 0xe2, 0x33, 0xdf, 0xd9, 0x22, 0xd4, 0xcd, 0x1b, +0xc9, 0xc7, 0x18, 0xd4, 0xcd, 0x1b, 0xe2, 0xdc, 0x2b, 0xe1, 0xdb, 0x2a, +0xe2, 0xe0, 0x2d, 0xde, 0xd7, 0x1d, 0xdb, 0xd4, 0x1c, 0xcf, 0xc9, 0x1a, +0xd1, 0xcc, 0x13, 0x1a, 0x22, 0x53, 0x19, 0x21, 0x50, 0x19, 0x20, 0x4f, +0x18, 0x1f, 0x4d, 0x17, 0x1e, 0x4a, 0x16, 0x1d, 0x48, 0x15, 0x1c, 0x46, +0x39, 0x46, 0x88, 0x48, 0x56, 0xab, 0x4a, 0x5a, 0xda, 0x45, 0x54, 0xdb, +0x51, 0x61, 0xdb, 0x56, 0x66, 0xdc, 0x47, 0x56, 0xdd, 0x3c, 0x4a, 0xde, +0x39, 0x45, 0xdf, 0x36, 0x42, 0xdf, 0x5f, 0x67, 0xb0, 0xb2, 0xb1, 0x4f, +0xb3, 0xb3, 0x42, 0xa8, 0xa6, 0x27, 0xaf, 0xae, 0x36, 0x5f, 0x69, 0xa9, +0x52, 0x5e, 0xce, 0x4e, 0x59, 0xca, 0x49, 0x54, 0xc7, 0x46, 0x51, 0xc3, +0x42, 0x4d, 0xbf, 0x40, 0x4a, 0xbd, 0x3c, 0x46, 0xb9, 0x38, 0x43, 0xb6, +0x36, 0x3f, 0xb2, 0x34, 0x3d, 0xaf, 0x32, 0x3a, 0xac, 0x2f, 0x38, 0xaa, +0x2e, 0x36, 0xa7, 0x2d, 0x35, 0xa4, 0x2b, 0x34, 0xa1, 0x2a, 0x32, 0x9e, +0x29, 0x31, 0x9c, 0x7b, 0x7c, 0x58, 0xd0, 0xca, 0x17, 0xdb, 0xd4, 0x1c, +0xd4, 0xcd, 0x1b, 0xde, 0xd7, 0x1d, 0xa6, 0xa4, 0x33, 0xa6, 0xa4, 0x33, +0x67, 0x6a, 0x5d, 0x29, 0x2f, 0x87, 0x29, 0x2f, 0x85, 0x29, 0x2f, 0x84, +0x29, 0x2f, 0x82, 0x29, 0x2f, 0x80, 0x28, 0x2e, 0x7e, 0x27, 0x2d, 0x7c, +0x27, 0x2c, 0x7b, 0x26, 0x2c, 0x79, 0x26, 0x2b, 0x78, 0x65, 0x66, 0x51, +0xa5, 0xa2, 0x2b, 0xdf, 0xd8, 0x20, 0xdd, 0xd6, 0x1c, 0xe0, 0xda, 0x25, +0xe4, 0xde, 0x33, 0xe4, 0xde, 0x33, 0xa4, 0xa1, 0x28, 0x77, 0x77, 0x3e, +0x35, 0x3a, 0x5e, 0x20, 0x25, 0x68, 0x1f, 0x25, 0x67, 0x1e, 0x24, 0x66, +0x1e, 0x24, 0x65, 0x1d, 0x23, 0x63, 0x1d, 0x22, 0x62, 0x1c, 0x22, 0x61, +0x1c, 0x21, 0x60, 0x1c, 0x21, 0x5f, 0x1c, 0x20, 0x5e, 0x1b, 0x20, 0x5d, +0x1b, 0x20, 0x5c, 0x1b, 0x1f, 0x5b, 0xa2, 0x9f, 0x22, 0xa2, 0x9e, 0x22, +0xa2, 0x9e, 0x22, 0xa1, 0x9e, 0x21, 0x73, 0x72, 0x32, 0x18, 0x1c, 0x55, +0x18, 0x1c, 0x55, 0x18, 0x1c, 0x54, 0x17, 0x1c, 0x53, 0x17, 0x1b, 0x52, +0x17, 0x1b, 0x51, 0x17, 0x1b, 0x51, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, +0x2c, 0x2f, 0x46, 0xa0, 0x9d, 0x1e, 0xa0, 0x9d, 0x1e, 0xa0, 0x9d, 0x1e, +0xa0, 0x9d, 0x1e, 0x42, 0x44, 0x3c, 0x15, 0x18, 0x4a, 0x14, 0x17, 0x4a, +0x13, 0x17, 0x49, 0x13, 0x17, 0x49, 0x13, 0x17, 0x48, 0x13, 0x16, 0x47, +0x13, 0x16, 0x47, 0x13, 0x16, 0x45, 0x13, 0x16, 0x45, 0x12, 0x16, 0x45, +0x12, 0x16, 0x45, 0x12, 0x15, 0x44, 0x12, 0x15, 0x43, 0x12, 0x15, 0x42, +0x11, 0x15, 0x41, 0x11, 0x15, 0x41, 0x11, 0x14, 0x40, 0x11, 0x14, 0x40, +0x11, 0x14, 0x40, 0x11, 0x14, 0x3f, 0x11, 0x14, 0x3f, 0x10, 0x14, 0x3e, +0x10, 0x14, 0x3e, 0x10, 0x13, 0x3d, 0x0f, 0x11, 0x37, 0x01, 0x01, 0x05, +0x1c, 0x21, 0x48, 0x3b, 0x42, 0x8f, 0x40, 0x48, 0x96, 0x36, 0x3f, 0x7d, +0x32, 0x39, 0x71, 0x32, 0x38, 0x6d, 0x30, 0x35, 0x6b, 0x2e, 0x34, 0x6a, +0x2c, 0x32, 0x67, 0x2c, 0x34, 0x6b, 0x2e, 0x35, 0x70, 0x32, 0x39, 0x7b, +0x35, 0x3c, 0x84, 0x34, 0x3b, 0x86, 0x34, 0x3b, 0x88, 0x32, 0x3b, 0x8a, +0x31, 0x39, 0x8c, 0x30, 0x39, 0x8e, 0x30, 0x37, 0x90, 0x2f, 0x37, 0x93, +0x2f, 0x36, 0x95, 0x2d, 0x35, 0x98, 0x2c, 0x34, 0x9a, 0x2b, 0x32, 0x9d, +0x2a, 0x32, 0x9f, 0x29, 0x31, 0xa1, 0x2a, 0x33, 0xa5, 0x2b, 0x33, 0xa7, +0x54, 0x5a, 0x86, 0x6a, 0x6e, 0x75, 0x6b, 0x6f, 0x77, 0x6c, 0x70, 0x79, +0x59, 0x5f, 0x8f, 0x34, 0x3e, 0xb9, 0x37, 0x41, 0xbc, 0x3a, 0x44, 0xc0, +0x3b, 0x46, 0xc3, 0x3a, 0x45, 0xc7, 0x3a, 0x44, 0xca, 0x39, 0x43, 0xcf, +0x37, 0x41, 0xd2, 0x32, 0x3d, 0xd6, 0x2e, 0x39, 0xda, 0x2d, 0x37, 0xde, +0x3c, 0x49, 0xdf, 0x59, 0x68, 0xdf, 0x1e, 0x24, 0x4e, 0x1c, 0x22, 0x4c, +0x1e, 0x25, 0x50, 0x0e, 0x14, 0x36, 0x0f, 0x14, 0x38, 0x3c, 0x48, 0x8e, +0x4e, 0x5e, 0xd9, 0x53, 0x63, 0xd8, 0x51, 0x62, 0xcd, 0x52, 0x64, 0xd7, +0x42, 0x50, 0x9e, 0x17, 0x1d, 0x48, 0x44, 0x52, 0x9f, 0x1c, 0x23, 0x50, +0x20, 0x27, 0x54, 0x5a, 0x6c, 0xd0, 0x5e, 0x6c, 0x9d, 0x62, 0x65, 0x3d, +0x62, 0x64, 0x3c, 0x60, 0x63, 0x3b, 0xdf, 0xd8, 0x20, 0xe2, 0xe0, 0x2d, +0xde, 0xd7, 0x1d, 0xe0, 0xde, 0x25, 0xdd, 0xd6, 0x1c, 0xd7, 0xd5, 0x1c, +0xdf, 0xd9, 0x22, 0x73, 0x74, 0x2e, 0x18, 0x1f, 0x4c, 0x17, 0x1e, 0x4a, +0x16, 0x1d, 0x48, 0x16, 0x1c, 0x47, 0x15, 0x1b, 0x45, 0x14, 0x1b, 0x43, +0x43, 0x50, 0x9e, 0x4e, 0x5d, 0xbb, 0x54, 0x65, 0xdb, 0x43, 0x52, 0xdb, +0x3f, 0x4e, 0xdc, 0x4a, 0x59, 0xdd, 0x50, 0x5f, 0xde, 0x44, 0x51, 0xdf, +0x39, 0x45, 0xdf, 0x35, 0x41, 0xe0, 0x32, 0x3d, 0xe1, 0x31, 0x3d, 0xdf, +0x3f, 0x4b, 0xdb, 0x51, 0x5d, 0xd7, 0x33, 0x3c, 0x74, 0x3d, 0x46, 0x8a, +0x48, 0x52, 0xa9, 0x50, 0x5c, 0xc8, 0x4a, 0x56, 0xc4, 0x48, 0x53, 0xc1, +0x44, 0x4f, 0xbe, 0x41, 0x4c, 0xba, 0x3f, 0x49, 0xb7, 0x3b, 0x45, 0xb4, +0x38, 0x41, 0xb0, 0x36, 0x3f, 0xad, 0x34, 0x3c, 0xab, 0x31, 0x39, 0xa8, +0x2f, 0x37, 0xa6, 0x2d, 0x35, 0xa2, 0x2c, 0x34, 0xa0, 0x2b, 0x33, 0x9d, +0x29, 0x31, 0x9b, 0x28, 0x30, 0x98, 0x27, 0x2e, 0x96, 0x27, 0x2d, 0x93, +0x25, 0x2c, 0x91, 0x25, 0x2c, 0x8f, 0x25, 0x2b, 0x8d, 0x26, 0x2c, 0x8b, +0x26, 0x2c, 0x89, 0x25, 0x2c, 0x86, 0x25, 0x2c, 0x85, 0x26, 0x2d, 0x83, +0x26, 0x2c, 0x81, 0x26, 0x2d, 0x7f, 0x26, 0x2d, 0x7d, 0x26, 0x2c, 0x7c, +0x26, 0x2c, 0x7b, 0x26, 0x2b, 0x79, 0x25, 0x2b, 0x77, 0x24, 0x2a, 0x75, +0x23, 0x2a, 0x74, 0x23, 0x29, 0x72, 0x23, 0x29, 0x71, 0x22, 0x28, 0x6f, +0x21, 0x28, 0x6e, 0x21, 0x27, 0x6c, 0x20, 0x26, 0x6c, 0x20, 0x26, 0x6a, +0x1f, 0x25, 0x69, 0x1f, 0x25, 0x68, 0x1f, 0x25, 0x67, 0x1e, 0x24, 0x65, +0x1e, 0x23, 0x64, 0x1d, 0x23, 0x63, 0x1c, 0x22, 0x62, 0x1c, 0x22, 0x61, +0x1c, 0x21, 0x60, 0x1c, 0x21, 0x5f, 0x1c, 0x20, 0x5e, 0x1b, 0x20, 0x5d, +0x1b, 0x20, 0x5c, 0x1b, 0x1f, 0x5b, 0x1a, 0x1f, 0x5a, 0x1a, 0x1e, 0x59, +0x1a, 0x1e, 0x58, 0x19, 0x1d, 0x57, 0x19, 0x1d, 0x56, 0x18, 0x1c, 0x55, +0x18, 0x1c, 0x54, 0x17, 0x1c, 0x54, 0x17, 0x1c, 0x53, 0x17, 0x1b, 0x52, +0x17, 0x1b, 0x51, 0x17, 0x1b, 0x50, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, +0x16, 0x1a, 0x4e, 0x16, 0x1a, 0x4e, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4c, +0x15, 0x19, 0x4c, 0x15, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x14, 0x17, 0x4a, +0x13, 0x17, 0x49, 0x13, 0x17, 0x48, 0x13, 0x17, 0x48, 0x13, 0x16, 0x47, +0x13, 0x16, 0x47, 0x12, 0x16, 0x45, 0x12, 0x16, 0x45, 0x12, 0x16, 0x45, +0x12, 0x15, 0x44, 0x12, 0x15, 0x44, 0x12, 0x15, 0x43, 0x11, 0x15, 0x42, +0x11, 0x15, 0x41, 0x11, 0x15, 0x41, 0x11, 0x14, 0x40, 0x11, 0x14, 0x40, +0x11, 0x14, 0x3f, 0x11, 0x14, 0x3f, 0x10, 0x14, 0x3f, 0x10, 0x13, 0x3e, +0x10, 0x13, 0x3e, 0x10, 0x13, 0x3d, 0x0f, 0x11, 0x37, 0x01, 0x01, 0x05, +0x1e, 0x22, 0x47, 0x3f, 0x48, 0x8f, 0x41, 0x4b, 0x95, 0x35, 0x3f, 0x7d, +0x30, 0x36, 0x70, 0x2e, 0x34, 0x6f, 0x2d, 0x33, 0x6e, 0x2f, 0x35, 0x74, +0x31, 0x38, 0x7d, 0x31, 0x38, 0x7f, 0x30, 0x37, 0x80, 0x30, 0x37, 0x81, +0x2f, 0x36, 0x84, 0x2f, 0x36, 0x86, 0x2e, 0x35, 0x87, 0x2d, 0x34, 0x89, +0x2c, 0x34, 0x8c, 0x2c, 0x33, 0x8d, 0x2c, 0x32, 0x90, 0x2b, 0x31, 0x92, +0x29, 0x31, 0x94, 0x28, 0x30, 0x97, 0x27, 0x2e, 0x98, 0x27, 0x2f, 0x9b, +0x28, 0x30, 0x9d, 0x29, 0x32, 0xa1, 0x2b, 0x32, 0xa3, 0x2c, 0x33, 0xa5, +0x2c, 0x35, 0xa8, 0x2d, 0x36, 0xab, 0x2f, 0x38, 0xae, 0x31, 0x3a, 0xb1, +0x33, 0x3d, 0xb5, 0x36, 0x3f, 0xb8, 0x38, 0x42, 0xba, 0x38, 0x42, 0xbe, +0x37, 0x41, 0xc1, 0x37, 0x41, 0xc5, 0x35, 0x40, 0xc8, 0x32, 0x3c, 0xcc, +0x2f, 0x3a, 0xd0, 0x2c, 0x36, 0xd3, 0x2f, 0x3b, 0xd6, 0x3e, 0x4a, 0xdb, +0x59, 0x67, 0xde, 0x39, 0x43, 0x84, 0x39, 0x43, 0x84, 0x3c, 0x47, 0x8c, +0x2d, 0x36, 0x6c, 0x1e, 0x25, 0x51, 0x4a, 0x58, 0xb0, 0x4c, 0x5b, 0xdb, +0x4b, 0x5a, 0xda, 0x51, 0x60, 0xd9, 0x4d, 0x5e, 0xd9, 0x50, 0x60, 0xd9, +0x2d, 0x37, 0x6e, 0x3d, 0x49, 0x8d, 0x50, 0x61, 0xbe, 0x1b, 0x22, 0x4c, +0x47, 0x54, 0x9e, 0x5c, 0x6e, 0xdf, 0x51, 0x61, 0xb9, 0x1e, 0x25, 0x53, +0x1d, 0x24, 0x52, 0x1c, 0x23, 0x51, 0x8b, 0x8a, 0x27, 0xe3, 0xdd, 0x2e, +0xe1, 0xda, 0x26, 0xe1, 0xda, 0x26, 0xd5, 0xcf, 0x1c, 0xdb, 0xd4, 0x1c, +0xdd, 0xd6, 0x1c, 0xd4, 0xcd, 0x1b, 0x2c, 0x32, 0x40, 0x16, 0x1c, 0x47, +0x15, 0x1b, 0x45, 0x14, 0x1b, 0x43, 0x14, 0x1a, 0x42, 0x13, 0x19, 0x40, +0x12, 0x18, 0x3e, 0x54, 0x63, 0xd0, 0x56, 0x65, 0xdc, 0x4b, 0x5a, 0xdc, +0x3d, 0x4a, 0xdd, 0x3b, 0x48, 0xde, 0x45, 0x53, 0xdf, 0x4a, 0x58, 0xdf, +0x3f, 0x4b, 0xe0, 0x35, 0x42, 0xe1, 0x31, 0x3d, 0xe0, 0x30, 0x3b, 0xdc, +0x2f, 0x3a, 0xd7, 0x37, 0x42, 0xd4, 0x45, 0x51, 0xd1, 0x4d, 0x58, 0xb9, +0x39, 0x42, 0x82, 0x45, 0x4f, 0xa2, 0x4c, 0x57, 0xb9, 0x4a, 0x55, 0xbf, +0x46, 0x50, 0xbb, 0x43, 0x4d, 0xb8, 0x3f, 0x49, 0xb5, 0x3d, 0x46, 0xb2, +0x3a, 0x44, 0xaf, 0x38, 0x42, 0xac, 0x36, 0x3f, 0xa9, 0x33, 0x3b, 0xa6, +0x31, 0x39, 0xa4, 0x2f, 0x36, 0xa1, 0x2d, 0x35, 0x9e, 0x2b, 0x33, 0x9c, +0x29, 0x31, 0x99, 0x29, 0x31, 0x97, 0x27, 0x2f, 0x95, 0x27, 0x2e, 0x92, +0x26, 0x2d, 0x91, 0x25, 0x2c, 0x8e, 0x25, 0x2a, 0x8c, 0x23, 0x2a, 0x8a, +0x23, 0x29, 0x88, 0x23, 0x29, 0x86, 0x23, 0x29, 0x85, 0x23, 0x29, 0x82, +0x24, 0x2a, 0x80, 0x24, 0x2a, 0x7f, 0x24, 0x2a, 0x7d, 0x23, 0x2a, 0x7b, +0x24, 0x2a, 0x7a, 0x23, 0x2a, 0x78, 0x23, 0x2a, 0x77, 0x23, 0x2a, 0x75, +0x23, 0x29, 0x73, 0x23, 0x29, 0x72, 0x22, 0x28, 0x70, 0x21, 0x28, 0x6f, +0x21, 0x27, 0x6e, 0x20, 0x26, 0x6c, 0x20, 0x26, 0x6b, 0x1f, 0x25, 0x6a, +0x1f, 0x25, 0x69, 0x1f, 0x25, 0x68, 0x1e, 0x24, 0x66, 0x1e, 0x23, 0x65, +0x1d, 0x23, 0x64, 0x1d, 0x22, 0x63, 0x1c, 0x22, 0x62, 0x1c, 0x22, 0x61, +0x1c, 0x21, 0x5f, 0x1c, 0x20, 0x5e, 0x1b, 0x20, 0x5d, 0x1b, 0x20, 0x5c, +0x1b, 0x1f, 0x5b, 0x1b, 0x1f, 0x5a, 0x1a, 0x1f, 0x5a, 0x1a, 0x1e, 0x59, +0x1a, 0x1e, 0x58, 0x19, 0x1d, 0x57, 0x18, 0x1d, 0x56, 0x18, 0x1c, 0x55, +0x18, 0x1c, 0x54, 0x17, 0x1c, 0x53, 0x17, 0x1c, 0x53, 0x17, 0x1b, 0x52, +0x17, 0x1b, 0x51, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, +0x16, 0x1a, 0x4e, 0x16, 0x19, 0x4d, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4c, +0x15, 0x18, 0x4b, 0x15, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x13, 0x17, 0x49, +0x13, 0x16, 0x49, 0x13, 0x16, 0x48, 0x13, 0x16, 0x48, 0x13, 0x16, 0x47, +0x13, 0x16, 0x47, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, +0x12, 0x15, 0x44, 0x12, 0x15, 0x44, 0x12, 0x14, 0x43, 0x11, 0x14, 0x42, +0x11, 0x14, 0x41, 0x11, 0x14, 0x41, 0x11, 0x14, 0x40, 0x11, 0x14, 0x40, +0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3e, 0x10, 0x13, 0x3e, +0x10, 0x13, 0x3e, 0x10, 0x13, 0x3d, 0x0f, 0x11, 0x37, 0x01, 0x01, 0x05, +0x1e, 0x22, 0x47, 0x3c, 0x43, 0x8e, 0x3e, 0x46, 0x95, 0x32, 0x3a, 0x7e, +0x2e, 0x34, 0x75, 0x2e, 0x34, 0x77, 0x2d, 0x33, 0x78, 0x2d, 0x33, 0x7a, +0x2c, 0x33, 0x7c, 0x2c, 0x34, 0x7e, 0x2b, 0x32, 0x7f, 0x2b, 0x32, 0x81, +0x2b, 0x32, 0x83, 0x2a, 0x30, 0x85, 0x29, 0x30, 0x86, 0x29, 0x2f, 0x88, +0x28, 0x2f, 0x8b, 0x27, 0x2e, 0x8c, 0x26, 0x2e, 0x8f, 0x26, 0x2d, 0x91, +0x26, 0x2c, 0x93, 0x26, 0x2d, 0x95, 0x26, 0x2e, 0x97, 0x27, 0x2f, 0x9a, +0x29, 0x31, 0x9c, 0x2a, 0x31, 0x9f, 0x2a, 0x32, 0xa1, 0x2b, 0x34, 0xa4, +0x2d, 0x36, 0xa7, 0x2f, 0x37, 0xaa, 0x31, 0x3a, 0xac, 0x33, 0x3c, 0xaf, +0x36, 0x3f, 0xb2, 0x36, 0x3e, 0xb5, 0x35, 0x3e, 0xb9, 0x35, 0x3e, 0xbc, +0x34, 0x3e, 0xbf, 0x32, 0x3c, 0xc2, 0x2f, 0x39, 0xc5, 0x2d, 0x36, 0xc9, +0x2a, 0x34, 0xcd, 0x32, 0x3d, 0xd0, 0x41, 0x4d, 0xd4, 0x4f, 0x5b, 0xbf, +0x46, 0x50, 0xa1, 0x4c, 0x58, 0xb4, 0x4d, 0x58, 0xb5, 0x46, 0x51, 0xa2, +0x3c, 0x47, 0x8c, 0x54, 0x62, 0xcd, 0x49, 0x58, 0xdc, 0x44, 0x52, 0xdc, +0x4a, 0x59, 0xdb, 0x49, 0x58, 0xdb, 0x47, 0x56, 0xda, 0x56, 0x66, 0xd5, +0x37, 0x42, 0x81, 0x56, 0x67, 0xdc, 0x3a, 0x45, 0x85, 0x1a, 0x20, 0x49, +0x56, 0x67, 0xe0, 0x56, 0x68, 0xdf, 0x54, 0x64, 0xc1, 0x1c, 0x22, 0x4d, +0x1b, 0x21, 0x4d, 0x1a, 0x20, 0x4c, 0x2f, 0x34, 0x43, 0xd4, 0xcf, 0x19, +0xd1, 0xcf, 0x1a, 0xce, 0xc7, 0x19, 0xcc, 0xc6, 0x19, 0xe0, 0xde, 0x25, +0xde, 0xd8, 0x1f, 0xde, 0xd7, 0x1d, 0xce, 0xc8, 0x0e, 0x2b, 0x30, 0x3c, +0x14, 0x1a, 0x42, 0x13, 0x19, 0x40, 0x13, 0x19, 0x3f, 0x12, 0x18, 0x3e, +0x11, 0x17, 0x3c, 0x3f, 0x4b, 0x93, 0x51, 0x61, 0xdd, 0x4e, 0x5c, 0xdd, +0x43, 0x52, 0xde, 0x38, 0x44, 0xdf, 0x37, 0x43, 0xdf, 0x40, 0x4c, 0xe0, +0x46, 0x53, 0xe0, 0x3b, 0x46, 0xe0, 0x34, 0x3f, 0xdd, 0x31, 0x3c, 0xd9, +0x2f, 0x3a, 0xd5, 0x2f, 0x39, 0xd1, 0x31, 0x3c, 0xce, 0x3c, 0x47, 0xca, +0x49, 0x55, 0xc6, 0x3d, 0x46, 0x8b, 0x41, 0x4a, 0x96, 0x49, 0x54, 0xb0, +0x49, 0x54, 0xba, 0x44, 0x4e, 0xb6, 0x40, 0x4b, 0xb3, 0x3d, 0x48, 0xb0, +0x3b, 0x45, 0xad, 0x39, 0x42, 0xab, 0x37, 0x40, 0xa8, 0x34, 0x3e, 0xa5, +0x33, 0x3b, 0xa2, 0x31, 0x39, 0xa0, 0x2f, 0x36, 0x9d, 0x2d, 0x35, 0x9b, +0x2b, 0x33, 0x98, 0x29, 0x31, 0x96, 0x28, 0x30, 0x94, 0x27, 0x2f, 0x92, +0x26, 0x2d, 0x90, 0x25, 0x2c, 0x8d, 0x25, 0x2b, 0x8c, 0x24, 0x2a, 0x89, +0x23, 0x29, 0x87, 0x22, 0x28, 0x85, 0x21, 0x28, 0x84, 0x21, 0x28, 0x82, +0x22, 0x27, 0x80, 0x22, 0x27, 0x7e, 0x21, 0x27, 0x7c, 0x22, 0x27, 0x7b, +0x21, 0x27, 0x79, 0x22, 0x28, 0x78, 0x22, 0x27, 0x76, 0x22, 0x27, 0x74, +0x21, 0x27, 0x73, 0x21, 0x27, 0x71, 0x21, 0x27, 0x70, 0x21, 0x27, 0x6e, +0x20, 0x26, 0x6d, 0x20, 0x26, 0x6c, 0x1f, 0x25, 0x6b, 0x1f, 0x25, 0x6a, +0x1f, 0x25, 0x69, 0x1e, 0x24, 0x67, 0x1e, 0x23, 0x66, 0x1e, 0x23, 0x65, +0x1d, 0x22, 0x64, 0x1c, 0x22, 0x63, 0x1c, 0x21, 0x61, 0x1c, 0x21, 0x60, +0x1c, 0x21, 0x5f, 0x1b, 0x20, 0x5e, 0x1b, 0x20, 0x5d, 0x1b, 0x20, 0x5c, +0x1b, 0x1f, 0x5b, 0x1a, 0x1f, 0x5a, 0x1a, 0x1e, 0x59, 0x1a, 0x1e, 0x58, +0x19, 0x1d, 0x57, 0x19, 0x1d, 0x57, 0x18, 0x1d, 0x56, 0x18, 0x1c, 0x55, +0x18, 0x1c, 0x54, 0x17, 0x1c, 0x53, 0x17, 0x1b, 0x52, 0x17, 0x1b, 0x52, +0x17, 0x1b, 0x51, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, 0x16, 0x1a, 0x4f, +0x16, 0x1a, 0x4e, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4c, +0x15, 0x18, 0x4b, 0x15, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x13, 0x16, 0x49, +0x13, 0x16, 0x49, 0x13, 0x16, 0x48, 0x13, 0x16, 0x48, 0x13, 0x16, 0x47, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, +0x12, 0x15, 0x44, 0x12, 0x15, 0x44, 0x12, 0x14, 0x43, 0x11, 0x14, 0x42, +0x11, 0x14, 0x41, 0x11, 0x14, 0x41, 0x10, 0x14, 0x40, 0x10, 0x14, 0x40, +0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3e, 0x10, 0x13, 0x3e, +0x10, 0x13, 0x3e, 0x0f, 0x13, 0x3d, 0x0f, 0x11, 0x37, 0x01, 0x01, 0x05, +0x1b, 0x1f, 0x46, 0x37, 0x3e, 0x8e, 0x38, 0x40, 0x94, 0x2f, 0x35, 0x7e, +0x2a, 0x30, 0x75, 0x2a, 0x30, 0x76, 0x2a, 0x30, 0x78, 0x29, 0x2f, 0x7a, +0x29, 0x2f, 0x7b, 0x28, 0x2e, 0x7d, 0x28, 0x2e, 0x7e, 0x27, 0x2e, 0x80, +0x27, 0x2e, 0x82, 0x26, 0x2d, 0x84, 0x25, 0x2c, 0x86, 0x25, 0x2c, 0x87, +0x25, 0x2b, 0x8a, 0x24, 0x2a, 0x8c, 0x24, 0x2b, 0x8d, 0x24, 0x2b, 0x90, +0x26, 0x2c, 0x92, 0x26, 0x2d, 0x94, 0x27, 0x2f, 0x97, 0x27, 0x2f, 0x99, +0x28, 0x30, 0x9c, 0x2a, 0x31, 0x9e, 0x2b, 0x33, 0xa0, 0x2c, 0x35, 0xa3, +0x2f, 0x36, 0xa5, 0x30, 0x39, 0xa8, 0x32, 0x3a, 0xab, 0x33, 0x3c, 0xae, +0x32, 0x3c, 0xb1, 0x31, 0x3b, 0xb4, 0x32, 0x3b, 0xb7, 0x32, 0x3b, 0xba, +0x2f, 0x38, 0xbd, 0x2d, 0x37, 0xc0, 0x2b, 0x34, 0xc3, 0x2a, 0x34, 0xc7, +0x34, 0x3e, 0xca, 0x43, 0x4f, 0xce, 0x47, 0x52, 0xa7, 0x48, 0x54, 0xab, +0x4e, 0x5b, 0xbc, 0x53, 0x5f, 0xca, 0x53, 0x60, 0xca, 0x4d, 0x58, 0xb5, +0x56, 0x64, 0xde, 0x45, 0x53, 0xde, 0x3e, 0x4b, 0xde, 0x43, 0x51, 0xdd, +0x45, 0x53, 0xdc, 0x43, 0x51, 0xdc, 0x4a, 0x59, 0xdc, 0x4b, 0x59, 0xb2, +0x58, 0x68, 0xdd, 0x51, 0x61, 0xdd, 0x17, 0x1d, 0x43, 0x4e, 0x5c, 0xb1, +0x4f, 0x5e, 0xe1, 0x52, 0x62, 0xe0, 0x57, 0x68, 0xcd, 0x1a, 0x20, 0x49, +0x19, 0x1f, 0x48, 0x18, 0x1e, 0x48, 0x2f, 0x3a, 0x72, 0x86, 0x8f, 0x8f, +0xde, 0xd8, 0x1f, 0xd4, 0xcd, 0x1b, 0xcc, 0xc6, 0x19, 0xe0, 0xde, 0x25, +0xe0, 0xde, 0x25, 0xdd, 0xd6, 0x1c, 0xc9, 0xc3, 0x18, 0xce, 0xc8, 0x0d, +0x41, 0x44, 0x32, 0x12, 0x18, 0x3e, 0x12, 0x17, 0x3c, 0x11, 0x17, 0x3b, +0x11, 0x16, 0x39, 0x27, 0x2c, 0x32, 0x84, 0x8b, 0x95, 0xb2, 0xb2, 0x4e, +0x48, 0x56, 0xdf, 0x3d, 0x4a, 0xdf, 0x33, 0x3e, 0xe0, 0x34, 0x40, 0xe0, +0x3b, 0x46, 0xe0, 0x41, 0x4e, 0xdd, 0x3a, 0x45, 0xd9, 0x33, 0x3f, 0xd6, +0x30, 0x3a, 0xd2, 0x2f, 0x39, 0xce, 0x2e, 0x38, 0xcb, 0x2f, 0x38, 0xc8, +0x37, 0x40, 0xc4, 0x41, 0x4b, 0xc1, 0x4c, 0x58, 0xbe, 0x3f, 0x49, 0x95, +0x45, 0x50, 0xa8, 0x48, 0x52, 0xb4, 0x44, 0x4d, 0xb1, 0x3f, 0x49, 0xae, +0x3d, 0x46, 0xab, 0x3a, 0x43, 0xa9, 0x37, 0x41, 0xa6, 0x36, 0x3f, 0xa4, +0x34, 0x3d, 0xa1, 0x33, 0x3a, 0x9f, 0x30, 0x38, 0x9c, 0x2e, 0x35, 0x9a, +0x2d, 0x34, 0x97, 0x2a, 0x32, 0x95, 0x29, 0x30, 0x93, 0x28, 0x2f, 0x91, +0x26, 0x2e, 0x8e, 0x25, 0x2c, 0x8c, 0x24, 0x2b, 0x8b, 0x24, 0x2a, 0x88, +0x23, 0x29, 0x86, 0x22, 0x28, 0x84, 0x22, 0x28, 0x83, 0x21, 0x27, 0x81, +0x20, 0x26, 0x7f, 0x1f, 0x25, 0x7d, 0x1f, 0x25, 0x7b, 0x20, 0x25, 0x7b, +0x20, 0x25, 0x79, 0x20, 0x25, 0x77, 0x1f, 0x25, 0x75, 0x20, 0x25, 0x74, +0x20, 0x25, 0x72, 0x20, 0x25, 0x71, 0x20, 0x25, 0x6f, 0x20, 0x25, 0x6e, +0x1f, 0x25, 0x6c, 0x1f, 0x25, 0x6c, 0x1f, 0x25, 0x6a, 0x1f, 0x25, 0x69, +0x1f, 0x24, 0x68, 0x1e, 0x23, 0x67, 0x1e, 0x23, 0x66, 0x1e, 0x23, 0x65, +0x1c, 0x22, 0x63, 0x1c, 0x22, 0x62, 0x1c, 0x21, 0x61, 0x1c, 0x21, 0x60, +0x1c, 0x21, 0x5f, 0x1b, 0x20, 0x5e, 0x1b, 0x20, 0x5d, 0x1b, 0x1f, 0x5c, +0x1a, 0x1f, 0x5b, 0x1a, 0x1f, 0x5a, 0x1a, 0x1e, 0x59, 0x1a, 0x1e, 0x58, +0x19, 0x1d, 0x57, 0x18, 0x1d, 0x56, 0x18, 0x1d, 0x56, 0x18, 0x1c, 0x55, +0x18, 0x1c, 0x54, 0x17, 0x1c, 0x53, 0x17, 0x1b, 0x52, 0x17, 0x1b, 0x52, +0x17, 0x1b, 0x51, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, 0x16, 0x1a, 0x4f, +0x16, 0x1a, 0x4e, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4c, +0x15, 0x18, 0x4b, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x13, 0x16, 0x49, +0x13, 0x16, 0x49, 0x13, 0x16, 0x48, 0x13, 0x16, 0x48, 0x13, 0x16, 0x47, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, +0x12, 0x15, 0x44, 0x12, 0x15, 0x44, 0x11, 0x14, 0x42, 0x11, 0x14, 0x42, +0x11, 0x14, 0x41, 0x10, 0x14, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, +0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3e, 0x10, 0x13, 0x3e, +0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05, +0x1a, 0x1d, 0x46, 0x32, 0x39, 0x8d, 0x34, 0x3b, 0x94, 0x2a, 0x30, 0x7d, +0x27, 0x2d, 0x75, 0x27, 0x2d, 0x76, 0x26, 0x2d, 0x77, 0x26, 0x2c, 0x79, +0x25, 0x2c, 0x7b, 0x24, 0x2b, 0x7d, 0x25, 0x2a, 0x7e, 0x24, 0x2a, 0x7f, +0x24, 0x2a, 0x81, 0x23, 0x29, 0x83, 0x22, 0x29, 0x85, 0x22, 0x29, 0x87, +0x22, 0x2a, 0x89, 0x23, 0x2a, 0x8b, 0x24, 0x2a, 0x8c, 0x25, 0x2b, 0x8f, +0x25, 0x2c, 0x91, 0x26, 0x2d, 0x93, 0x26, 0x2e, 0x96, 0x28, 0x30, 0x97, +0x29, 0x31, 0x9a, 0x2b, 0x32, 0x9c, 0x2c, 0x35, 0x9f, 0x2e, 0x35, 0xa1, +0x2f, 0x38, 0xa4, 0x31, 0x3a, 0xa7, 0x31, 0x3a, 0xa9, 0x30, 0x39, 0xac, +0x30, 0x39, 0xaf, 0x2f, 0x39, 0xb1, 0x2e, 0x37, 0xb4, 0x2c, 0x36, 0xb7, +0x2b, 0x34, 0xbb, 0x28, 0x32, 0xbe, 0x2c, 0x35, 0xc0, 0x35, 0x3f, 0xc4, +0x44, 0x50, 0xc7, 0x46, 0x50, 0xa6, 0x49, 0x54, 0xaf, 0x50, 0x5c, 0xc1, +0x55, 0x62, 0xd2, 0x53, 0x62, 0xce, 0x53, 0x5f, 0xca, 0x51, 0x5f, 0xdf, +0x43, 0x50, 0xdf, 0x3a, 0x46, 0xdf, 0x3e, 0x4a, 0xde, 0x41, 0x4f, 0xde, +0x3f, 0x4d, 0xdd, 0x3f, 0x4d, 0xdd, 0x51, 0x60, 0xdd, 0x59, 0x68, 0xdc, +0x4b, 0x5a, 0xde, 0x5a, 0x6a, 0xdf, 0x16, 0x1c, 0x41, 0x53, 0x62, 0xe1, +0x4b, 0x5a, 0xe1, 0x4f, 0x5f, 0xe0, 0x59, 0x69, 0xd4, 0x18, 0x1e, 0x45, +0x17, 0x1d, 0x45, 0x16, 0x1c, 0x43, 0x47, 0x55, 0xa7, 0x53, 0x63, 0xda, +0xb6, 0xb7, 0x4d, 0xd7, 0xd5, 0x1c, 0xdb, 0xd4, 0x1c, 0xe0, 0xd9, 0x23, +0xdd, 0xd6, 0x1c, 0xd4, 0xcd, 0x1b, 0xd7, 0xd5, 0x1c, 0xd4, 0xcd, 0x1b, +0xdb, 0xd4, 0x1c, 0xcd, 0xc8, 0x0c, 0xa3, 0xa1, 0x20, 0xa2, 0x9f, 0x1d, +0xcd, 0xc8, 0x0c, 0xde, 0xdb, 0x1d, 0xe3, 0xdd, 0x30, 0xdd, 0xd6, 0x1c, +0x46, 0x52, 0xdf, 0x42, 0x4f, 0xe0, 0x37, 0x43, 0xe1, 0x2e, 0x39, 0xe0, +0x31, 0x3c, 0xdd, 0x39, 0x44, 0xda, 0x40, 0x4b, 0xd6, 0x39, 0x44, 0xd3, +0x33, 0x3e, 0xcf, 0x2f, 0x39, 0xcc, 0x2f, 0x38, 0xc8, 0x2c, 0x36, 0xc5, +0x2b, 0x34, 0xc1, 0x31, 0x3b, 0xbe, 0x39, 0x43, 0xbc, 0x43, 0x4d, 0xb8, +0x41, 0x4a, 0x9a, 0x43, 0x4d, 0xa0, 0x47, 0x50, 0xb0, 0x42, 0x4b, 0xad, +0x3e, 0x48, 0xaa, 0x3b, 0x44, 0xa7, 0x39, 0x41, 0xa5, 0x37, 0x40, 0xa2, +0x35, 0x3e, 0xa0, 0x33, 0x3b, 0x9d, 0x31, 0x39, 0x9b, 0x30, 0x38, 0x98, +0x2e, 0x35, 0x96, 0x2c, 0x34, 0x94, 0x2a, 0x32, 0x91, 0x29, 0x30, 0x90, +0x27, 0x2e, 0x8d, 0x26, 0x2d, 0x8b, 0x25, 0x2c, 0x8a, 0x24, 0x2b, 0x88, +0x23, 0x2a, 0x85, 0x23, 0x29, 0x84, 0x22, 0x28, 0x82, 0x21, 0x27, 0x80, +0x20, 0x26, 0x7e, 0x20, 0x25, 0x7d, 0x1f, 0x25, 0x7b, 0x1e, 0x24, 0x7a, +0x1e, 0x24, 0x78, 0x1e, 0x24, 0x77, 0x1e, 0x24, 0x75, 0x1e, 0x23, 0x73, +0x1e, 0x23, 0x72, 0x1e, 0x23, 0x70, 0x1e, 0x23, 0x6f, 0x1e, 0x23, 0x6e, +0x1e, 0x23, 0x6c, 0x1e, 0x23, 0x6c, 0x1e, 0x23, 0x6a, 0x1e, 0x23, 0x69, +0x1e, 0x23, 0x68, 0x1e, 0x23, 0x67, 0x1e, 0x22, 0x65, 0x1d, 0x22, 0x64, +0x1c, 0x22, 0x63, 0x1c, 0x21, 0x62, 0x1c, 0x21, 0x61, 0x1c, 0x20, 0x60, +0x1c, 0x20, 0x5f, 0x1b, 0x20, 0x5e, 0x1b, 0x20, 0x5d, 0x1b, 0x1f, 0x5c, +0x1a, 0x1f, 0x5b, 0x1a, 0x1e, 0x5a, 0x1a, 0x1e, 0x59, 0x19, 0x1d, 0x58, +0x19, 0x1d, 0x57, 0x18, 0x1d, 0x56, 0x18, 0x1c, 0x55, 0x18, 0x1c, 0x55, +0x18, 0x1c, 0x54, 0x17, 0x1c, 0x53, 0x17, 0x1b, 0x52, 0x17, 0x1b, 0x51, +0x17, 0x1b, 0x51, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, 0x16, 0x1a, 0x4e, +0x16, 0x19, 0x4e, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4c, 0x15, 0x19, 0x4c, +0x14, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x14, 0x18, 0x4a, 0x13, 0x16, 0x49, +0x13, 0x16, 0x49, 0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x13, 0x16, 0x47, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, +0x12, 0x15, 0x44, 0x12, 0x15, 0x44, 0x11, 0x14, 0x42, 0x11, 0x14, 0x42, +0x10, 0x14, 0x41, 0x10, 0x14, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, +0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3e, 0x0f, 0x12, 0x3e, +0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05, +0x17, 0x1b, 0x45, 0x2e, 0x37, 0x8d, 0x2f, 0x37, 0x93, 0x28, 0x2e, 0x7d, +0x24, 0x29, 0x74, 0x24, 0x29, 0x75, 0x24, 0x29, 0x77, 0x23, 0x29, 0x78, +0x22, 0x28, 0x7a, 0x22, 0x27, 0x7c, 0x21, 0x28, 0x7e, 0x21, 0x28, 0x7f, +0x21, 0x27, 0x80, 0x20, 0x27, 0x82, 0x21, 0x28, 0x85, 0x22, 0x29, 0x86, +0x23, 0x29, 0x88, 0x23, 0x2a, 0x8a, 0x24, 0x2a, 0x8c, 0x25, 0x2b, 0x8e, +0x25, 0x2c, 0x90, 0x26, 0x2d, 0x92, 0x27, 0x2f, 0x94, 0x28, 0x30, 0x97, +0x2a, 0x31, 0x99, 0x2b, 0x33, 0x9c, 0x2d, 0x35, 0x9d, 0x2f, 0x37, 0xa0, +0x2f, 0x36, 0xa3, 0x2f, 0x36, 0xa5, 0x2e, 0x36, 0xa7, 0x2e, 0x36, 0xab, +0x2e, 0x36, 0xad, 0x2b, 0x35, 0xb0, 0x2b, 0x33, 0xb3, 0x29, 0x32, 0xb6, +0x27, 0x30, 0xb9, 0x2d, 0x36, 0xbc, 0x37, 0x40, 0xbe, 0x45, 0x50, 0xc1, +0x46, 0x51, 0xa7, 0x4b, 0x56, 0xb7, 0x4f, 0x5b, 0xc5, 0x51, 0x5f, 0xce, +0x53, 0x60, 0xd1, 0x55, 0x62, 0xd2, 0x4f, 0x5d, 0xd8, 0x40, 0x4d, 0xdc, +0x36, 0x41, 0xdf, 0x39, 0x45, 0xdf, 0x3d, 0x49, 0xdf, 0x3c, 0x48, 0xdf, +0x3a, 0x46, 0xde, 0x45, 0x52, 0xde, 0x58, 0x67, 0xde, 0x4c, 0x5b, 0xdf, +0x46, 0x55, 0xe0, 0x50, 0x5e, 0xb9, 0x56, 0x64, 0xc8, 0x45, 0x54, 0xe2, +0x47, 0x56, 0xe2, 0x4d, 0x5c, 0xe1, 0x5c, 0x6c, 0xde, 0x16, 0x1c, 0x42, +0x15, 0x1b, 0x41, 0x14, 0x1a, 0x40, 0x57, 0x68, 0xd7, 0x4e, 0x5e, 0xdc, +0x50, 0x60, 0xdb, 0xb2, 0xb3, 0x41, 0xe1, 0xdf, 0x2a, 0xd7, 0xd5, 0x1c, +0xbb, 0xb5, 0x14, 0xd7, 0xd0, 0x1c, 0xd9, 0xd2, 0x1c, 0xd1, 0xcf, 0x1a, +0xdf, 0xd8, 0x20, 0xde, 0xd8, 0x1f, 0xe1, 0xda, 0x26, 0xdf, 0xd9, 0x22, +0xdf, 0xd9, 0x22, 0xdd, 0xd6, 0x1c, 0xd5, 0xcf, 0x1c, 0xc5, 0xc3, 0x37, +0x42, 0x4f, 0xe0, 0x40, 0x4d, 0xe1, 0x3c, 0x49, 0xe0, 0x33, 0x3f, 0xdd, +0x2d, 0x37, 0xd9, 0x31, 0x3c, 0xd6, 0x37, 0x42, 0xd3, 0x3f, 0x4a, 0xcf, +0x37, 0x42, 0xcc, 0x32, 0x3c, 0xc8, 0x2e, 0x38, 0xc6, 0x2d, 0x36, 0xc2, +0x2c, 0x35, 0xbf, 0x2b, 0x34, 0xbc, 0x2d, 0x36, 0xb9, 0x34, 0x3d, 0xb6, +0x3c, 0x46, 0xb3, 0x45, 0x4f, 0xb1, 0x4a, 0x54, 0xad, 0x45, 0x4f, 0xab, +0x41, 0x4a, 0xa8, 0x3e, 0x47, 0xa6, 0x3a, 0x43, 0xa3, 0x38, 0x41, 0xa1, +0x36, 0x3e, 0x9e, 0x33, 0x3c, 0x9c, 0x32, 0x3a, 0x9a, 0x30, 0x38, 0x97, +0x2e, 0x36, 0x95, 0x2d, 0x34, 0x93, 0x2c, 0x33, 0x90, 0x29, 0x31, 0x8f, +0x28, 0x2f, 0x8c, 0x27, 0x2e, 0x8a, 0x26, 0x2d, 0x89, 0x25, 0x2c, 0x87, +0x23, 0x2a, 0x85, 0x22, 0x29, 0x83, 0x22, 0x28, 0x81, 0x22, 0x27, 0x80, +0x21, 0x26, 0x7e, 0x20, 0x25, 0x7c, 0x1f, 0x25, 0x7a, 0x1f, 0x24, 0x79, +0x1e, 0x23, 0x78, 0x1d, 0x23, 0x76, 0x1c, 0x22, 0x74, 0x1c, 0x22, 0x73, +0x1c, 0x22, 0x71, 0x1c, 0x22, 0x70, 0x1d, 0x21, 0x6e, 0x1d, 0x21, 0x6d, +0x1d, 0x22, 0x6c, 0x1d, 0x21, 0x6b, 0x1c, 0x21, 0x6a, 0x1d, 0x22, 0x69, +0x1c, 0x21, 0x67, 0x1c, 0x21, 0x66, 0x1c, 0x21, 0x65, 0x1c, 0x21, 0x64, +0x1c, 0x21, 0x63, 0x1c, 0x21, 0x62, 0x1c, 0x21, 0x61, 0x1c, 0x20, 0x5f, +0x1b, 0x20, 0x5e, 0x1b, 0x1f, 0x5d, 0x1a, 0x1f, 0x5c, 0x1a, 0x1f, 0x5b, +0x1a, 0x1e, 0x5a, 0x1a, 0x1e, 0x5a, 0x1a, 0x1e, 0x59, 0x19, 0x1d, 0x58, +0x18, 0x1d, 0x57, 0x18, 0x1c, 0x56, 0x18, 0x1c, 0x55, 0x18, 0x1c, 0x54, +0x17, 0x1c, 0x54, 0x17, 0x1b, 0x53, 0x17, 0x1b, 0x52, 0x17, 0x1b, 0x51, +0x16, 0x1a, 0x50, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, 0x16, 0x19, 0x4e, +0x16, 0x19, 0x4e, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4c, 0x15, 0x19, 0x4c, +0x14, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x13, 0x17, 0x49, 0x13, 0x16, 0x49, +0x13, 0x16, 0x48, 0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x13, 0x16, 0x47, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, +0x12, 0x15, 0x44, 0x12, 0x14, 0x43, 0x11, 0x14, 0x42, 0x11, 0x14, 0x41, +0x10, 0x14, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, +0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, +0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x05, +0x16, 0x1a, 0x45, 0x2c, 0x32, 0x8b, 0x2d, 0x35, 0x93, 0x26, 0x2b, 0x7c, +0x21, 0x27, 0x74, 0x21, 0x26, 0x74, 0x20, 0x26, 0x76, 0x20, 0x26, 0x78, +0x1f, 0x26, 0x79, 0x1f, 0x26, 0x7b, 0x1f, 0x25, 0x7d, 0x1f, 0x25, 0x7e, +0x20, 0x26, 0x80, 0x20, 0x27, 0x82, 0x21, 0x28, 0x84, 0x22, 0x28, 0x85, +0x23, 0x28, 0x87, 0x23, 0x29, 0x89, 0x24, 0x2a, 0x8b, 0x24, 0x2b, 0x8d, +0x25, 0x2c, 0x8f, 0x26, 0x2e, 0x91, 0x28, 0x2f, 0x93, 0x2a, 0x31, 0x96, +0x2b, 0x33, 0x97, 0x2c, 0x34, 0x9a, 0x2d, 0x35, 0x9c, 0x2d, 0x35, 0x9f, +0x2c, 0x35, 0xa1, 0x2d, 0x35, 0xa4, 0x2b, 0x34, 0xa6, 0x2b, 0x34, 0xa8, +0x2a, 0x32, 0xab, 0x29, 0x31, 0xae, 0x27, 0x2f, 0xb1, 0x27, 0x2f, 0xb4, +0x2e, 0x37, 0xb7, 0x37, 0x40, 0xb9, 0x46, 0x50, 0xbc, 0x48, 0x52, 0xaf, +0x4c, 0x58, 0xc0, 0x4e, 0x5a, 0xc5, 0x4e, 0x5a, 0xc8, 0x50, 0x5c, 0xcb, +0x51, 0x5f, 0xce, 0x4c, 0x59, 0xd1, 0x40, 0x4c, 0xd5, 0x36, 0x41, 0xd8, +0x36, 0x41, 0xdb, 0x38, 0x44, 0xde, 0x39, 0x44, 0xe0, 0x36, 0x42, 0xdf, +0x3b, 0x47, 0xdf, 0x4b, 0x58, 0xe0, 0x4e, 0x5b, 0xe0, 0x42, 0x50, 0xe0, +0x4d, 0x5b, 0xe1, 0x3d, 0x48, 0x88, 0x50, 0x5e, 0xe2, 0x41, 0x4f, 0xe3, +0x43, 0x51, 0xe2, 0x4b, 0x5a, 0xe1, 0x5c, 0x6c, 0xe0, 0x14, 0x1a, 0x3e, +0x14, 0x19, 0x3d, 0x13, 0x19, 0x3d, 0x54, 0x64, 0xdd, 0x4a, 0x58, 0xdc, +0x4b, 0x5a, 0xdc, 0x57, 0x68, 0xdc, 0xa0, 0xa3, 0x66, 0xe0, 0xd9, 0x23, +0xdb, 0xd4, 0x1c, 0xd1, 0xcf, 0x1a, 0xcb, 0xc4, 0x18, 0xcf, 0xc9, 0x1a, +0xce, 0xcc, 0x19, 0xdb, 0xd4, 0x1c, 0xe5, 0xdf, 0x34, 0xe2, 0xdc, 0x2d, +0xd3, 0xcf, 0x18, 0x8c, 0x8a, 0x25, 0x3d, 0x3f, 0x28, 0x3e, 0x48, 0x8d, +0x47, 0x54, 0xe1, 0x3f, 0x4b, 0xdf, 0x3d, 0x49, 0xdc, 0x39, 0x45, 0xd9, +0x31, 0x3c, 0xd6, 0x2c, 0x36, 0xd3, 0x2f, 0x3a, 0xcf, 0x37, 0x40, 0xcc, +0x3c, 0x46, 0xc9, 0x37, 0x40, 0xc6, 0x32, 0x3b, 0xc3, 0x2e, 0x36, 0xc0, +0x2b, 0x35, 0xbd, 0x2a, 0x33, 0xb9, 0x2a, 0x32, 0xb7, 0x2a, 0x32, 0xb4, +0x2f, 0x39, 0xb1, 0x36, 0x3f, 0xae, 0x3d, 0x47, 0xac, 0x46, 0x50, 0xa9, +0x43, 0x4d, 0xa6, 0x40, 0x48, 0xa4, 0x3d, 0x45, 0xa2, 0x39, 0x42, 0x9f, +0x36, 0x3f, 0x9d, 0x34, 0x3d, 0x9a, 0x32, 0x3a, 0x98, 0x31, 0x39, 0x96, +0x2f, 0x37, 0x94, 0x2e, 0x35, 0x91, 0x2d, 0x34, 0x90, 0x2b, 0x32, 0x8e, +0x29, 0x31, 0x8b, 0x28, 0x2f, 0x8a, 0x27, 0x2d, 0x88, 0x25, 0x2c, 0x86, +0x24, 0x2b, 0x84, 0x23, 0x2a, 0x82, 0x22, 0x29, 0x81, 0x22, 0x27, 0x7f, +0x21, 0x26, 0x7d, 0x20, 0x26, 0x7b, 0x1f, 0x25, 0x7a, 0x1f, 0x24, 0x79, +0x1e, 0x23, 0x77, 0x1e, 0x23, 0x75, 0x1d, 0x23, 0x74, 0x1c, 0x22, 0x72, +0x1c, 0x22, 0x71, 0x1b, 0x21, 0x6f, 0x1b, 0x21, 0x6e, 0x1b, 0x20, 0x6c, +0x1b, 0x20, 0x6c, 0x1b, 0x20, 0x6b, 0x1b, 0x20, 0x6a, 0x1b, 0x20, 0x68, +0x1b, 0x20, 0x67, 0x1c, 0x20, 0x66, 0x1b, 0x20, 0x65, 0x1b, 0x1f, 0x63, +0x1b, 0x20, 0x62, 0x1b, 0x20, 0x61, 0x1b, 0x1f, 0x60, 0x1b, 0x20, 0x5f, +0x1b, 0x1f, 0x5e, 0x1b, 0x1f, 0x5d, 0x1a, 0x1f, 0x5c, 0x1a, 0x1e, 0x5b, +0x1a, 0x1e, 0x5a, 0x19, 0x1d, 0x59, 0x19, 0x1d, 0x58, 0x19, 0x1d, 0x57, +0x18, 0x1d, 0x57, 0x18, 0x1c, 0x56, 0x18, 0x1c, 0x55, 0x17, 0x1b, 0x54, +0x17, 0x1b, 0x53, 0x17, 0x1b, 0x53, 0x17, 0x1b, 0x52, 0x17, 0x1b, 0x51, +0x16, 0x1a, 0x50, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, 0x16, 0x19, 0x4e, +0x15, 0x19, 0x4d, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4c, 0x14, 0x18, 0x4b, +0x14, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x13, 0x17, 0x49, 0x13, 0x16, 0x49, +0x13, 0x16, 0x48, 0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x13, 0x16, 0x47, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x44, +0x12, 0x15, 0x44, 0x12, 0x14, 0x43, 0x11, 0x14, 0x42, 0x10, 0x14, 0x41, +0x10, 0x14, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, +0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, +0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x05, +0x14, 0x17, 0x45, 0x29, 0x2f, 0x8b, 0x2a, 0x31, 0x90, 0x23, 0x29, 0x7c, +0x1e, 0x24, 0x72, 0x1e, 0x24, 0x74, 0x1e, 0x24, 0x75, 0x1e, 0x24, 0x77, +0x1d, 0x24, 0x79, 0x1d, 0x24, 0x7a, 0x1e, 0x25, 0x7c, 0x1f, 0x25, 0x7d, +0x20, 0x26, 0x7f, 0x20, 0x27, 0x81, 0x21, 0x28, 0x83, 0x21, 0x28, 0x84, +0x22, 0x28, 0x86, 0x24, 0x29, 0x88, 0x24, 0x2a, 0x8a, 0x24, 0x2c, 0x8b, +0x26, 0x2d, 0x8e, 0x27, 0x2f, 0x90, 0x29, 0x30, 0x92, 0x2a, 0x31, 0x94, +0x2a, 0x32, 0x96, 0x2a, 0x32, 0x98, 0x2a, 0x32, 0x9b, 0x2b, 0x33, 0x9d, +0x2b, 0x32, 0xa0, 0x2a, 0x32, 0xa2, 0x29, 0x31, 0xa4, 0x28, 0x30, 0xa7, +0x27, 0x2f, 0xa9, 0x27, 0x2e, 0xac, 0x28, 0x30, 0xae, 0x2e, 0x37, 0xb1, +0x38, 0x41, 0xb4, 0x46, 0x51, 0xb7, 0x4c, 0x57, 0xb9, 0x4a, 0x55, 0xbc, +0x4a, 0x56, 0xbf, 0x4b, 0x56, 0xc2, 0x4c, 0x57, 0xc5, 0x4e, 0x5a, 0xc8, +0x4a, 0x57, 0xcb, 0x3f, 0x4b, 0xce, 0x36, 0x40, 0xd1, 0x35, 0x40, 0xd4, +0x36, 0x41, 0xd7, 0x37, 0x43, 0xda, 0x34, 0x40, 0xdd, 0x33, 0x3e, 0xe0, +0x3f, 0x4b, 0xe0, 0x4f, 0x5d, 0xe0, 0x42, 0x50, 0xe1, 0x3d, 0x49, 0xe1, +0x54, 0x62, 0xe2, 0x5d, 0x6c, 0xe1, 0x42, 0x50, 0xe3, 0x3e, 0x4b, 0xe3, +0x40, 0x4e, 0xe3, 0x4a, 0x58, 0xe2, 0x5c, 0x6c, 0xe1, 0x13, 0x18, 0x3b, +0x13, 0x18, 0x3b, 0x12, 0x17, 0x3a, 0x4d, 0x5c, 0xde, 0x45, 0x53, 0xde, +0x47, 0x55, 0xdd, 0x52, 0x61, 0xdd, 0x49, 0x56, 0xdd, 0x65, 0x6e, 0xae, +0x9d, 0x9f, 0x66, 0xd2, 0xcd, 0x1f, 0xd4, 0xcd, 0x1b, 0xd4, 0xcd, 0x1b, +0xc1, 0xbf, 0x16, 0x9f, 0x9c, 0x18, 0x97, 0x97, 0x3a, 0x74, 0x7e, 0xa3, +0x55, 0x63, 0xcc, 0x4e, 0x5a, 0xb6, 0x1c, 0x22, 0x49, 0x0d, 0x11, 0x2f, +0x58, 0x66, 0xde, 0x3e, 0x4a, 0xdb, 0x3c, 0x48, 0xd7, 0x3c, 0x47, 0xd5, +0x36, 0x41, 0xd2, 0x2f, 0x3a, 0xcf, 0x2b, 0x35, 0xcc, 0x2f, 0x39, 0xc9, +0x34, 0x3e, 0xc6, 0x3b, 0x45, 0xc3, 0x34, 0x3e, 0xc0, 0x31, 0x39, 0xbd, +0x2d, 0x36, 0xba, 0x2b, 0x34, 0xb7, 0x2a, 0x32, 0xb5, 0x2a, 0x32, 0xb2, +0x29, 0x31, 0xaf, 0x2c, 0x34, 0xac, 0x31, 0x3a, 0xa9, 0x37, 0x40, 0xa7, +0x3e, 0x47, 0xa5, 0x42, 0x4c, 0xa2, 0x3e, 0x47, 0xa0, 0x3b, 0x44, 0x9e, +0x38, 0x40, 0x9b, 0x35, 0x3d, 0x99, 0x33, 0x3b, 0x97, 0x31, 0x39, 0x94, +0x30, 0x37, 0x93, 0x2e, 0x36, 0x90, 0x2d, 0x34, 0x8f, 0x2b, 0x32, 0x8c, +0x2b, 0x32, 0x8a, 0x29, 0x30, 0x89, 0x28, 0x2e, 0x87, 0x27, 0x2d, 0x85, +0x25, 0x2c, 0x83, 0x24, 0x2b, 0x82, 0x23, 0x2a, 0x80, 0x22, 0x28, 0x7e, +0x21, 0x27, 0x7c, 0x20, 0x26, 0x7a, 0x20, 0x26, 0x79, 0x1f, 0x24, 0x78, +0x1e, 0x23, 0x76, 0x1e, 0x23, 0x75, 0x1d, 0x22, 0x73, 0x1c, 0x22, 0x72, +0x1c, 0x21, 0x70, 0x1c, 0x21, 0x6f, 0x1b, 0x20, 0x6e, 0x1a, 0x20, 0x6c, +0x1a, 0x1f, 0x6c, 0x1a, 0x1f, 0x6a, 0x1a, 0x1f, 0x69, 0x1a, 0x1f, 0x68, +0x1a, 0x1f, 0x67, 0x19, 0x1e, 0x65, 0x1a, 0x1e, 0x64, 0x1a, 0x1e, 0x63, +0x1a, 0x1e, 0x62, 0x1a, 0x1e, 0x61, 0x1a, 0x1e, 0x60, 0x1a, 0x1f, 0x5f, +0x19, 0x1e, 0x5e, 0x1a, 0x1e, 0x5d, 0x1a, 0x1e, 0x5c, 0x19, 0x1e, 0x5b, +0x1a, 0x1e, 0x5a, 0x19, 0x1d, 0x59, 0x19, 0x1d, 0x58, 0x18, 0x1c, 0x57, +0x18, 0x1c, 0x56, 0x18, 0x1c, 0x56, 0x18, 0x1c, 0x55, 0x17, 0x1b, 0x54, +0x17, 0x1b, 0x53, 0x17, 0x1b, 0x52, 0x17, 0x1b, 0x52, 0x16, 0x1a, 0x51, +0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, 0x16, 0x1a, 0x4f, 0x16, 0x19, 0x4e, +0x15, 0x19, 0x4d, 0x15, 0x19, 0x4d, 0x15, 0x18, 0x4c, 0x14, 0x18, 0x4b, +0x14, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, +0x13, 0x16, 0x48, 0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x44, +0x12, 0x15, 0x44, 0x12, 0x14, 0x43, 0x11, 0x14, 0x42, 0x10, 0x14, 0x41, +0x10, 0x14, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, +0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, +0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x05, +0x13, 0x16, 0x45, 0x25, 0x2d, 0x8a, 0x27, 0x2e, 0x90, 0x21, 0x27, 0x7b, +0x1d, 0x22, 0x72, 0x1d, 0x22, 0x74, 0x1d, 0x22, 0x75, 0x1d, 0x23, 0x76, +0x1d, 0x23, 0x78, 0x1e, 0x24, 0x7a, 0x1e, 0x25, 0x7b, 0x1f, 0x25, 0x7d, +0x20, 0x26, 0x7e, 0x21, 0x27, 0x80, 0x21, 0x27, 0x82, 0x22, 0x28, 0x84, +0x23, 0x28, 0x85, 0x24, 0x2a, 0x87, 0x24, 0x2b, 0x89, 0x26, 0x2d, 0x8b, +0x26, 0x2e, 0x8c, 0x28, 0x2f, 0x8f, 0x29, 0x30, 0x91, 0x29, 0x30, 0x93, +0x29, 0x30, 0x95, 0x29, 0x30, 0x97, 0x29, 0x30, 0x99, 0x29, 0x30, 0x9b, +0x28, 0x30, 0x9e, 0x27, 0x2f, 0xa0, 0x26, 0x2e, 0xa3, 0x26, 0x2d, 0xa5, +0x24, 0x2d, 0xa7, 0x28, 0x31, 0xaa, 0x2f, 0x38, 0xad, 0x38, 0x41, 0xaf, +0x45, 0x50, 0xb2, 0x48, 0x52, 0xb4, 0x47, 0x52, 0xb7, 0x48, 0x52, 0xba, +0x47, 0x53, 0xbc, 0x49, 0x54, 0xbf, 0x4b, 0x56, 0xc2, 0x49, 0x55, 0xc5, +0x3f, 0x49, 0xc7, 0x36, 0x40, 0xcb, 0x33, 0x3d, 0xce, 0x35, 0x3f, 0xd1, +0x37, 0x41, 0xd3, 0x34, 0x3f, 0xd6, 0x32, 0x3d, 0xd9, 0x38, 0x43, 0xdc, +0x44, 0x50, 0xdf, 0x43, 0x50, 0xe2, 0x3a, 0x46, 0xe2, 0x42, 0x4f, 0xe2, +0x5c, 0x6b, 0xe3, 0x4c, 0x5a, 0xe3, 0x39, 0x45, 0xe4, 0x3b, 0x47, 0xe4, +0x3f, 0x4b, 0xe3, 0x49, 0x56, 0xe2, 0x5d, 0x6c, 0xe2, 0x12, 0x17, 0x39, +0x11, 0x16, 0x38, 0x21, 0x29, 0x54, 0x47, 0x56, 0xdf, 0x41, 0x4f, 0xde, +0x42, 0x50, 0xde, 0x4c, 0x5a, 0xde, 0x46, 0x53, 0xde, 0x3d, 0x4a, 0xde, +0x3f, 0x4c, 0xde, 0x3b, 0x47, 0xdf, 0x32, 0x3e, 0xdf, 0x3e, 0x4b, 0xdf, +0x54, 0x62, 0xdf, 0x44, 0x4f, 0x9c, 0x35, 0x3f, 0x7b, 0x56, 0x63, 0xcf, +0x59, 0x68, 0xe1, 0x5a, 0x68, 0xe1, 0x48, 0x54, 0xa8, 0x0d, 0x11, 0x30, +0x2e, 0x35, 0x69, 0x4b, 0x58, 0xd7, 0x3b, 0x47, 0xd4, 0x3a, 0x46, 0xd1, +0x3a, 0x44, 0xce, 0x34, 0x3e, 0xcc, 0x2f, 0x38, 0xc8, 0x2a, 0x33, 0xc6, +0x2e, 0x37, 0xc3, 0x33, 0x3d, 0xc0, 0x39, 0x42, 0xbd, 0x33, 0x3d, 0xbb, +0x2f, 0x39, 0xb8, 0x2c, 0x34, 0xb5, 0x2a, 0x32, 0xb3, 0x29, 0x31, 0xb0, +0x28, 0x30, 0xad, 0x27, 0x2f, 0xaa, 0x29, 0x31, 0xa8, 0x2d, 0x35, 0xa6, +0x33, 0x3c, 0xa3, 0x39, 0x41, 0xa1, 0x3f, 0x48, 0x9e, 0x3d, 0x45, 0x9c, +0x3a, 0x42, 0x99, 0x37, 0x40, 0x98, 0x35, 0x3c, 0x95, 0x31, 0x3a, 0x94, +0x30, 0x37, 0x91, 0x2e, 0x37, 0x8f, 0x2d, 0x35, 0x8d, 0x2d, 0x33, 0x8b, +0x2b, 0x31, 0x89, 0x2a, 0x31, 0x88, 0x28, 0x2f, 0x86, 0x27, 0x2e, 0x84, +0x27, 0x2d, 0x82, 0x25, 0x2b, 0x81, 0x23, 0x2a, 0x7f, 0x22, 0x29, 0x7d, +0x21, 0x28, 0x7b, 0x21, 0x27, 0x7a, 0x20, 0x26, 0x78, 0x20, 0x25, 0x77, +0x1f, 0x24, 0x76, 0x1e, 0x23, 0x74, 0x1e, 0x22, 0x73, 0x1d, 0x22, 0x71, +0x1c, 0x21, 0x70, 0x1c, 0x21, 0x6e, 0x1b, 0x20, 0x6d, 0x1b, 0x1f, 0x6b, +0x1a, 0x1f, 0x6b, 0x1a, 0x1e, 0x69, 0x19, 0x1e, 0x69, 0x19, 0x1d, 0x67, +0x19, 0x1d, 0x66, 0x19, 0x1d, 0x65, 0x19, 0x1d, 0x64, 0x19, 0x1d, 0x63, +0x19, 0x1d, 0x62, 0x19, 0x1d, 0x61, 0x19, 0x1d, 0x60, 0x19, 0x1d, 0x5e, +0x18, 0x1d, 0x5d, 0x19, 0x1d, 0x5d, 0x19, 0x1d, 0x5c, 0x18, 0x1d, 0x5b, +0x19, 0x1d, 0x5a, 0x18, 0x1d, 0x59, 0x18, 0x1c, 0x58, 0x18, 0x1c, 0x57, +0x18, 0x1c, 0x56, 0x17, 0x1b, 0x55, 0x17, 0x1b, 0x54, 0x17, 0x1b, 0x54, +0x17, 0x1b, 0x53, 0x17, 0x1b, 0x52, 0x16, 0x1a, 0x51, 0x16, 0x1a, 0x51, +0x16, 0x1a, 0x50, 0x16, 0x19, 0x4f, 0x15, 0x19, 0x4e, 0x15, 0x19, 0x4e, +0x15, 0x19, 0x4d, 0x15, 0x18, 0x4c, 0x15, 0x18, 0x4c, 0x14, 0x18, 0x4b, +0x14, 0x18, 0x4a, 0x14, 0x18, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, +0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x44, +0x12, 0x15, 0x44, 0x11, 0x14, 0x42, 0x10, 0x14, 0x42, 0x10, 0x14, 0x41, +0x10, 0x14, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, +0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, +0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x05, +0x12, 0x16, 0x44, 0x24, 0x2b, 0x8a, 0x25, 0x2c, 0x8f, 0x1f, 0x25, 0x7a, +0x1c, 0x21, 0x72, 0x1c, 0x21, 0x72, 0x1d, 0x22, 0x74, 0x1d, 0x23, 0x76, +0x1d, 0x23, 0x77, 0x1e, 0x24, 0x79, 0x1e, 0x25, 0x7b, 0x1f, 0x25, 0x7c, +0x1f, 0x26, 0x7d, 0x20, 0x27, 0x7f, 0x21, 0x27, 0x81, 0x22, 0x28, 0x83, +0x23, 0x29, 0x84, 0x24, 0x2a, 0x86, 0x25, 0x2c, 0x88, 0x26, 0x2e, 0x8a, +0x27, 0x2e, 0x8b, 0x27, 0x2f, 0x8d, 0x27, 0x2f, 0x90, 0x27, 0x2f, 0x91, +0x28, 0x2f, 0x94, 0x27, 0x2f, 0x96, 0x27, 0x2f, 0x98, 0x26, 0x2d, 0x9a, +0x25, 0x2d, 0x9c, 0x25, 0x2c, 0x9f, 0x24, 0x2b, 0xa1, 0x24, 0x2c, 0xa3, +0x29, 0x31, 0xa6, 0x2f, 0x38, 0xa8, 0x38, 0x41, 0xaa, 0x44, 0x4e, 0xad, +0x44, 0x4e, 0xb0, 0x44, 0x4f, 0xb2, 0x44, 0x4e, 0xb4, 0x45, 0x4f, 0xb7, +0x46, 0x50, 0xba, 0x47, 0x53, 0xbc, 0x47, 0x51, 0xbf, 0x3d, 0x48, 0xc2, +0x36, 0x40, 0xc5, 0x31, 0x3b, 0xc8, 0x33, 0x3d, 0xca, 0x35, 0x3f, 0xcd, +0x34, 0x3e, 0xd0, 0x32, 0x3c, 0xd2, 0x33, 0x3e, 0xd5, 0x3d, 0x49, 0xd8, +0x46, 0x52, 0xdb, 0x3c, 0x47, 0xde, 0x36, 0x42, 0xe1, 0x48, 0x54, 0xe3, +0x59, 0x67, 0xe4, 0x40, 0x4d, 0xe4, 0x36, 0x42, 0xe5, 0x38, 0x44, 0xe4, +0x3d, 0x49, 0xe3, 0x47, 0x54, 0xe3, 0x5d, 0x6b, 0xe1, 0x19, 0x1f, 0x44, +0x10, 0x15, 0x36, 0x41, 0x4c, 0x93, 0x42, 0x50, 0xe0, 0x3d, 0x4a, 0xe0, +0x3e, 0x4b, 0xe0, 0x47, 0x54, 0xdf, 0x43, 0x50, 0xdf, 0x39, 0x45, 0xdf, +0x3b, 0x48, 0xdf, 0x39, 0x46, 0xdf, 0x30, 0x3c, 0xdf, 0x35, 0x42, 0xe0, +0x48, 0x56, 0xe0, 0x5b, 0x6a, 0xe0, 0x35, 0x3f, 0x7a, 0x56, 0x64, 0xd0, +0x53, 0x61, 0xdf, 0x55, 0x62, 0xdd, 0x57, 0x64, 0xda, 0x39, 0x42, 0x82, +0x0b, 0x10, 0x2b, 0x4b, 0x56, 0xb0, 0x43, 0x4f, 0xd1, 0x3a, 0x44, 0xce, +0x39, 0x43, 0xcb, 0x38, 0x42, 0xc8, 0x32, 0x3c, 0xc6, 0x2c, 0x36, 0xc3, +0x2a, 0x32, 0xc0, 0x2e, 0x36, 0xbd, 0x31, 0x3b, 0xbb, 0x37, 0x40, 0xb8, +0x32, 0x3b, 0xb5, 0x2e, 0x37, 0xb3, 0x2b, 0x33, 0xb1, 0x29, 0x30, 0xad, +0x28, 0x30, 0xab, 0x27, 0x30, 0xa9, 0x26, 0x2e, 0xa6, 0x26, 0x2f, 0xa4, +0x2a, 0x33, 0xa2, 0x2f, 0x37, 0x9f, 0x34, 0x3b, 0x9d, 0x39, 0x41, 0x9a, +0x3c, 0x44, 0x98, 0x39, 0x41, 0x96, 0x36, 0x3e, 0x94, 0x34, 0x3c, 0x92, +0x31, 0x39, 0x90, 0x2f, 0x37, 0x8e, 0x2d, 0x35, 0x8c, 0x2d, 0x33, 0x8a, +0x2c, 0x32, 0x89, 0x2a, 0x31, 0x87, 0x29, 0x30, 0x85, 0x27, 0x2f, 0x83, +0x27, 0x2d, 0x81, 0x26, 0x2c, 0x80, 0x25, 0x2a, 0x7e, 0x23, 0x29, 0x7c, +0x22, 0x29, 0x7b, 0x21, 0x28, 0x79, 0x20, 0x26, 0x78, 0x20, 0x25, 0x77, +0x1f, 0x24, 0x75, 0x1e, 0x23, 0x73, 0x1e, 0x23, 0x72, 0x1d, 0x22, 0x70, +0x1c, 0x21, 0x6f, 0x1c, 0x21, 0x6e, 0x1b, 0x20, 0x6c, 0x1b, 0x1f, 0x6b, +0x1a, 0x1f, 0x6a, 0x1a, 0x1e, 0x69, 0x1a, 0x1e, 0x68, 0x19, 0x1d, 0x67, +0x19, 0x1d, 0x66, 0x18, 0x1c, 0x65, 0x17, 0x1c, 0x63, 0x18, 0x1c, 0x62, +0x18, 0x1c, 0x61, 0x18, 0x1c, 0x60, 0x18, 0x1c, 0x5f, 0x18, 0x1c, 0x5e, +0x18, 0x1c, 0x5d, 0x17, 0x1c, 0x5c, 0x17, 0x1c, 0x5b, 0x18, 0x1c, 0x5a, +0x18, 0x1c, 0x59, 0x18, 0x1c, 0x58, 0x18, 0x1c, 0x58, 0x18, 0x1c, 0x57, +0x17, 0x1b, 0x56, 0x17, 0x1b, 0x55, 0x17, 0x1b, 0x54, 0x17, 0x1b, 0x53, +0x17, 0x1b, 0x53, 0x16, 0x1a, 0x52, 0x16, 0x1a, 0x51, 0x16, 0x1a, 0x50, +0x16, 0x1a, 0x50, 0x16, 0x19, 0x4f, 0x15, 0x19, 0x4e, 0x15, 0x19, 0x4e, +0x15, 0x19, 0x4d, 0x15, 0x18, 0x4c, 0x14, 0x18, 0x4c, 0x14, 0x18, 0x4b, +0x14, 0x18, 0x4a, 0x13, 0x17, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, +0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x44, +0x12, 0x15, 0x44, 0x11, 0x14, 0x42, 0x10, 0x14, 0x42, 0x10, 0x14, 0x41, +0x10, 0x14, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, +0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, +0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x05, +0x11, 0x14, 0x44, 0x23, 0x28, 0x89, 0x24, 0x2a, 0x8e, 0x1f, 0x25, 0x7a, +0x1c, 0x21, 0x71, 0x1c, 0x21, 0x72, 0x1d, 0x22, 0x74, 0x1d, 0x22, 0x75, +0x1d, 0x23, 0x76, 0x1e, 0x24, 0x78, 0x1e, 0x25, 0x7a, 0x1f, 0x25, 0x7b, +0x20, 0x26, 0x7d, 0x21, 0x27, 0x7e, 0x22, 0x28, 0x80, 0x23, 0x29, 0x82, +0x24, 0x2a, 0x84, 0x24, 0x2b, 0x85, 0x25, 0x2d, 0x87, 0x26, 0x2d, 0x89, +0x26, 0x2e, 0x8b, 0x26, 0x2d, 0x8c, 0x26, 0x2d, 0x8e, 0x26, 0x2e, 0x91, +0x25, 0x2d, 0x92, 0x25, 0x2c, 0x94, 0x25, 0x2c, 0x96, 0x24, 0x2b, 0x99, +0x23, 0x2a, 0x9b, 0x22, 0x2a, 0x9d, 0x25, 0x2c, 0x9f, 0x29, 0x30, 0xa1, +0x30, 0x38, 0xa3, 0x39, 0x41, 0xa6, 0x40, 0x4a, 0xa8, 0x41, 0x4a, 0xaa, +0x40, 0x4b, 0xad, 0x41, 0x4b, 0xb0, 0x41, 0x4b, 0xb2, 0x43, 0x4e, 0xb5, +0x45, 0x4f, 0xb7, 0x45, 0x4f, 0xba, 0x3c, 0x46, 0xbc, 0x35, 0x3f, 0xbf, +0x30, 0x3a, 0xc1, 0x31, 0x3c, 0xc4, 0x33, 0x3d, 0xc7, 0x33, 0x3d, 0xc9, +0x32, 0x3c, 0xcc, 0x2f, 0x3a, 0xcf, 0x38, 0x43, 0xd1, 0x42, 0x4e, 0xd4, +0x3e, 0x4a, 0xd7, 0x36, 0x42, 0xd9, 0x3c, 0x47, 0xdc, 0x4f, 0x5c, 0xdf, +0x49, 0x56, 0xe2, 0x37, 0x42, 0xe4, 0x33, 0x3e, 0xe5, 0x35, 0x41, 0xe5, +0x3c, 0x47, 0xe4, 0x45, 0x52, 0xe3, 0x5d, 0x6c, 0xe3, 0x27, 0x2e, 0x5c, +0x10, 0x14, 0x34, 0x54, 0x60, 0xc6, 0x3e, 0x4a, 0xe1, 0x3a, 0x46, 0xe1, +0x3b, 0x46, 0xe0, 0x43, 0x50, 0xe0, 0x40, 0x4d, 0xe0, 0x38, 0x43, 0xe0, +0x37, 0x44, 0xe0, 0x39, 0x44, 0xe0, 0x30, 0x3b, 0xe0, 0x2f, 0x3a, 0xe1, +0x3e, 0x4a, 0xe1, 0x4f, 0x5d, 0xe0, 0x4f, 0x5c, 0xba, 0x4f, 0x5b, 0xb9, +0x54, 0x61, 0xdb, 0x51, 0x5d, 0xd8, 0x52, 0x60, 0xd6, 0x50, 0x5b, 0xc0, +0x2a, 0x31, 0x61, 0x1e, 0x25, 0x4a, 0x4e, 0x5b, 0xcc, 0x3b, 0x46, 0xca, +0x37, 0x42, 0xc8, 0x37, 0x41, 0xc5, 0x35, 0x3f, 0xc2, 0x2f, 0x39, 0xc0, +0x2a, 0x34, 0xbd, 0x29, 0x31, 0xbb, 0x2d, 0x36, 0xb8, 0x30, 0x39, 0xb6, +0x35, 0x3d, 0xb3, 0x31, 0x39, 0xb1, 0x2d, 0x36, 0xae, 0x2a, 0x32, 0xab, +0x28, 0x30, 0xa9, 0x27, 0x2f, 0xa6, 0x25, 0x2e, 0xa4, 0x25, 0x2d, 0xa2, +0x25, 0x2c, 0xa0, 0x27, 0x2f, 0x9d, 0x2b, 0x32, 0x9b, 0x30, 0x37, 0x99, +0x34, 0x3c, 0x97, 0x39, 0x40, 0x94, 0x38, 0x3f, 0x93, 0x35, 0x3d, 0x91, +0x33, 0x3a, 0x8e, 0x31, 0x38, 0x8d, 0x2f, 0x35, 0x8b, 0x2d, 0x34, 0x89, +0x2c, 0x33, 0x88, 0x2b, 0x31, 0x86, 0x29, 0x30, 0x84, 0x28, 0x2f, 0x82, +0x27, 0x2d, 0x81, 0x26, 0x2c, 0x7f, 0x25, 0x2b, 0x7d, 0x24, 0x2a, 0x7b, +0x23, 0x29, 0x7a, 0x22, 0x28, 0x78, 0x20, 0x27, 0x77, 0x20, 0x26, 0x76, +0x20, 0x25, 0x74, 0x1f, 0x24, 0x73, 0x1e, 0x23, 0x71, 0x1d, 0x22, 0x70, +0x1d, 0x21, 0x6e, 0x1c, 0x21, 0x6d, 0x1c, 0x20, 0x6c, 0x1b, 0x1f, 0x6b, +0x1a, 0x1f, 0x69, 0x1a, 0x1f, 0x69, 0x1a, 0x1e, 0x68, 0x19, 0x1d, 0x66, +0x18, 0x1d, 0x65, 0x18, 0x1c, 0x64, 0x18, 0x1c, 0x63, 0x18, 0x1b, 0x62, +0x17, 0x1b, 0x61, 0x17, 0x1b, 0x60, 0x17, 0x1b, 0x5f, 0x17, 0x1b, 0x5e, +0x17, 0x1b, 0x5d, 0x17, 0x1b, 0x5c, 0x16, 0x1b, 0x5b, 0x17, 0x1b, 0x5a, +0x17, 0x1b, 0x59, 0x17, 0x1b, 0x58, 0x17, 0x1b, 0x57, 0x16, 0x1a, 0x56, +0x17, 0x1b, 0x56, 0x16, 0x1a, 0x55, 0x16, 0x1a, 0x54, 0x16, 0x1a, 0x53, +0x16, 0x1a, 0x52, 0x16, 0x1a, 0x52, 0x16, 0x1a, 0x51, 0x16, 0x1a, 0x50, +0x16, 0x19, 0x4f, 0x16, 0x19, 0x4f, 0x15, 0x19, 0x4e, 0x15, 0x19, 0x4d, +0x15, 0x19, 0x4d, 0x15, 0x18, 0x4c, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4b, +0x14, 0x18, 0x4a, 0x13, 0x17, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, +0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x44, 0x12, 0x14, 0x44, +0x11, 0x14, 0x43, 0x10, 0x14, 0x42, 0x10, 0x14, 0x41, 0x10, 0x14, 0x41, +0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, +0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, +0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3c, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x05, +0x11, 0x14, 0x44, 0x23, 0x28, 0x89, 0x24, 0x2a, 0x8e, 0x20, 0x24, 0x79, +0x1c, 0x21, 0x71, 0x1c, 0x22, 0x72, 0x1c, 0x22, 0x73, 0x1d, 0x23, 0x74, +0x1d, 0x23, 0x76, 0x1e, 0x24, 0x77, 0x1e, 0x25, 0x79, 0x1f, 0x26, 0x7b, +0x20, 0x26, 0x7c, 0x21, 0x27, 0x7d, 0x22, 0x28, 0x7f, 0x23, 0x29, 0x81, +0x24, 0x2b, 0x83, 0x24, 0x2b, 0x84, 0x24, 0x2b, 0x85, 0x24, 0x2b, 0x87, +0x24, 0x2c, 0x8a, 0x24, 0x2b, 0x8b, 0x24, 0x2c, 0x8d, 0x25, 0x2b, 0x8f, +0x24, 0x2b, 0x91, 0x23, 0x2a, 0x93, 0x22, 0x2a, 0x95, 0x22, 0x29, 0x97, +0x21, 0x29, 0x99, 0x25, 0x2c, 0x9b, 0x29, 0x31, 0x9d, 0x2f, 0x38, 0x9f, +0x39, 0x41, 0xa2, 0x3e, 0x48, 0xa4, 0x3e, 0x48, 0xa6, 0x3e, 0x48, 0xa9, +0x3f, 0x47, 0xab, 0x3e, 0x48, 0xad, 0x40, 0x4b, 0xb0, 0x41, 0x4b, 0xb2, +0x43, 0x4c, 0xb4, 0x3b, 0x44, 0xb7, 0x34, 0x3d, 0xb9, 0x2e, 0x38, 0xbc, +0x30, 0x3a, 0xbf, 0x31, 0x3b, 0xc1, 0x33, 0x3d, 0xc3, 0x30, 0x3b, 0xc5, +0x2f, 0x39, 0xc8, 0x33, 0x3e, 0xcb, 0x3c, 0x46, 0xce, 0x41, 0x4d, 0xd0, +0x39, 0x44, 0xd3, 0x34, 0x3e, 0xd5, 0x41, 0x4d, 0xd8, 0x56, 0x63, 0xdb, +0x40, 0x4c, 0xdd, 0x31, 0x3b, 0xdf, 0x32, 0x3d, 0xe1, 0x33, 0x3f, 0xe2, +0x3b, 0x46, 0xe3, 0x45, 0x52, 0xe4, 0x5c, 0x6a, 0xe3, 0x37, 0x41, 0x7c, +0x20, 0x27, 0x4f, 0x58, 0x67, 0xe2, 0x3a, 0x46, 0xe1, 0x37, 0x43, 0xe1, +0x37, 0x43, 0xe1, 0x3e, 0x4b, 0xe1, 0x3e, 0x4a, 0xe1, 0x35, 0x41, 0xe1, +0x35, 0x40, 0xe1, 0x36, 0x42, 0xe1, 0x2f, 0x3a, 0xe0, 0x2a, 0x34, 0xde, +0x37, 0x42, 0xdd, 0x48, 0x55, 0xdb, 0x56, 0x64, 0xda, 0x46, 0x52, 0xa3, +0x56, 0x62, 0xd6, 0x4d, 0x5a, 0xd4, 0x4f, 0x5c, 0xd2, 0x4f, 0x5c, 0xd0, +0x45, 0x50, 0xa1, 0x20, 0x25, 0x4d, 0x3d, 0x47, 0x8c, 0x46, 0x51, 0xc6, +0x37, 0x41, 0xc4, 0x36, 0x40, 0xc1, 0x35, 0x3f, 0xbf, 0x33, 0x3d, 0xbd, +0x2d, 0x36, 0xba, 0x2a, 0x32, 0xb8, 0x28, 0x30, 0xb5, 0x2b, 0x34, 0xb3, +0x2e, 0x38, 0xb1, 0x32, 0x3b, 0xae, 0x2f, 0x38, 0xac, 0x2c, 0x34, 0xa9, +0x29, 0x31, 0xa7, 0x26, 0x2e, 0xa5, 0x26, 0x2e, 0xa2, 0x25, 0x2d, 0xa0, +0x24, 0x2c, 0x9e, 0x24, 0x2b, 0x9c, 0x25, 0x2c, 0x99, 0x28, 0x30, 0x98, +0x2c, 0x33, 0x95, 0x30, 0x38, 0x93, 0x34, 0x3c, 0x91, 0x36, 0x3f, 0x8f, +0x34, 0x3b, 0x8d, 0x31, 0x39, 0x8c, 0x30, 0x37, 0x8a, 0x2d, 0x35, 0x87, +0x2c, 0x33, 0x86, 0x2a, 0x31, 0x84, 0x2a, 0x30, 0x83, 0x28, 0x2f, 0x81, +0x27, 0x2e, 0x7f, 0x26, 0x2c, 0x7e, 0x25, 0x2b, 0x7c, 0x25, 0x2b, 0x7b, +0x24, 0x29, 0x79, 0x22, 0x29, 0x78, 0x21, 0x28, 0x77, 0x20, 0x27, 0x75, +0x1f, 0x26, 0x74, 0x1f, 0x25, 0x72, 0x1f, 0x24, 0x71, 0x1e, 0x23, 0x6f, +0x1d, 0x22, 0x6e, 0x1d, 0x21, 0x6d, 0x1c, 0x20, 0x6b, 0x1b, 0x20, 0x6b, +0x1a, 0x1f, 0x69, 0x1a, 0x1f, 0x68, 0x19, 0x1e, 0x67, 0x19, 0x1e, 0x66, +0x19, 0x1d, 0x65, 0x18, 0x1d, 0x64, 0x18, 0x1c, 0x63, 0x18, 0x1c, 0x62, +0x17, 0x1b, 0x61, 0x17, 0x1b, 0x5f, 0x17, 0x1a, 0x5e, 0x16, 0x1a, 0x5d, +0x16, 0x1a, 0x5c, 0x16, 0x1a, 0x5c, 0x16, 0x1a, 0x5b, 0x16, 0x1a, 0x5a, +0x16, 0x1a, 0x59, 0x16, 0x1a, 0x58, 0x16, 0x1a, 0x57, 0x16, 0x1a, 0x56, +0x15, 0x19, 0x55, 0x16, 0x1a, 0x55, 0x15, 0x19, 0x54, 0x16, 0x1a, 0x53, +0x15, 0x19, 0x52, 0x15, 0x19, 0x51, 0x15, 0x19, 0x51, 0x15, 0x19, 0x50, +0x15, 0x19, 0x4f, 0x16, 0x19, 0x4f, 0x15, 0x19, 0x4e, 0x15, 0x19, 0x4d, +0x15, 0x19, 0x4d, 0x14, 0x18, 0x4c, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4b, +0x14, 0x17, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, +0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x13, 0x16, 0x46, 0x12, 0x15, 0x45, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x14, 0x44, 0x12, 0x14, 0x44, +0x11, 0x14, 0x43, 0x10, 0x14, 0x42, 0x10, 0x14, 0x41, 0x10, 0x14, 0x41, +0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, +0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, +0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3c, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x05, +0x11, 0x14, 0x44, 0x22, 0x28, 0x87, 0x24, 0x2a, 0x8d, 0x1f, 0x24, 0x79, +0x1b, 0x21, 0x70, 0x1b, 0x21, 0x71, 0x1c, 0x22, 0x72, 0x1c, 0x22, 0x73, +0x1d, 0x23, 0x75, 0x1e, 0x24, 0x76, 0x1f, 0x25, 0x78, 0x20, 0x26, 0x7a, +0x20, 0x26, 0x7b, 0x21, 0x27, 0x7d, 0x22, 0x28, 0x7e, 0x24, 0x2a, 0x80, +0x23, 0x29, 0x81, 0x23, 0x29, 0x83, 0x23, 0x2a, 0x84, 0x24, 0x2a, 0x86, +0x24, 0x2a, 0x88, 0x24, 0x2a, 0x8a, 0x23, 0x29, 0x8b, 0x23, 0x2a, 0x8e, +0x22, 0x29, 0x90, 0x21, 0x29, 0x91, 0x21, 0x28, 0x93, 0x21, 0x29, 0x96, +0x25, 0x2c, 0x97, 0x2a, 0x31, 0x9a, 0x30, 0x38, 0x9b, 0x37, 0x41, 0x9e, +0x3c, 0x45, 0xa0, 0x3c, 0x45, 0xa2, 0x3c, 0x45, 0xa4, 0x3b, 0x44, 0xa6, +0x3c, 0x46, 0xa9, 0x3e, 0x47, 0xab, 0x3f, 0x49, 0xae, 0x40, 0x4b, 0xb0, +0x39, 0x43, 0xb2, 0x33, 0x3d, 0xb4, 0x2e, 0x37, 0xb7, 0x2e, 0x37, 0xb9, +0x30, 0x3a, 0xbc, 0x32, 0x3b, 0xbe, 0x30, 0x3a, 0xc0, 0x2e, 0x38, 0xc2, +0x2f, 0x3a, 0xc5, 0x37, 0x41, 0xc8, 0x3f, 0x4a, 0xca, 0x3b, 0x45, 0xcc, +0x34, 0x3f, 0xcf, 0x38, 0x43, 0xd1, 0x46, 0x53, 0xd4, 0x4a, 0x56, 0xd6, +0x39, 0x43, 0xd9, 0x31, 0x3b, 0xdb, 0x33, 0x3d, 0xdc, 0x34, 0x3f, 0xdd, +0x3c, 0x47, 0xde, 0x47, 0x54, 0xdf, 0x59, 0x67, 0xd9, 0x3c, 0x45, 0x87, +0x2b, 0x32, 0x62, 0x52, 0x5f, 0xdf, 0x36, 0x42, 0xe0, 0x35, 0x40, 0xe0, +0x34, 0x40, 0xe0, 0x3b, 0x46, 0xdf, 0x3c, 0x48, 0xde, 0x35, 0x40, 0xde, +0x33, 0x3e, 0xdd, 0x34, 0x3f, 0xdc, 0x30, 0x3b, 0xdb, 0x2a, 0x34, 0xda, +0x31, 0x3c, 0xd8, 0x41, 0x4d, 0xd7, 0x4e, 0x5a, 0xd5, 0x49, 0x54, 0xab, +0x52, 0x5d, 0xc5, 0x4d, 0x59, 0xd0, 0x4c, 0x58, 0xce, 0x4b, 0x58, 0xcc, +0x51, 0x5d, 0xca, 0x3a, 0x43, 0x85, 0x17, 0x1c, 0x3c, 0x4d, 0x59, 0xbd, +0x3e, 0x49, 0xc1, 0x35, 0x3f, 0xbe, 0x34, 0x3e, 0xbc, 0x33, 0x3d, 0xb9, +0x31, 0x39, 0xb7, 0x2c, 0x34, 0xb5, 0x28, 0x31, 0xb3, 0x28, 0x2f, 0xb1, +0x2a, 0x33, 0xae, 0x2d, 0x36, 0xac, 0x30, 0x39, 0xa9, 0x2e, 0x36, 0xa7, +0x2b, 0x33, 0xa5, 0x28, 0x30, 0xa2, 0x26, 0x2e, 0xa1, 0x24, 0x2d, 0x9e, +0x24, 0x2b, 0x9c, 0x24, 0x2b, 0x9a, 0x23, 0x2a, 0x98, 0x23, 0x2a, 0x96, +0x26, 0x2d, 0x93, 0x29, 0x31, 0x92, 0x2c, 0x34, 0x90, 0x30, 0x37, 0x8e, +0x34, 0x3b, 0x8c, 0x32, 0x3b, 0x8a, 0x31, 0x38, 0x88, 0x2f, 0x35, 0x87, +0x2c, 0x34, 0x85, 0x2c, 0x32, 0x83, 0x2a, 0x30, 0x81, 0x28, 0x2f, 0x80, +0x27, 0x2e, 0x7f, 0x26, 0x2c, 0x7d, 0x25, 0x2c, 0x7b, 0x25, 0x2b, 0x7a, +0x24, 0x2a, 0x78, 0x23, 0x28, 0x77, 0x22, 0x27, 0x76, 0x21, 0x27, 0x74, +0x20, 0x26, 0x73, 0x1f, 0x25, 0x71, 0x1e, 0x25, 0x70, 0x1e, 0x24, 0x6f, +0x1e, 0x22, 0x6d, 0x1d, 0x22, 0x6c, 0x1c, 0x21, 0x6b, 0x1b, 0x20, 0x69, +0x1b, 0x1f, 0x68, 0x1a, 0x1f, 0x68, 0x1a, 0x1e, 0x66, 0x19, 0x1e, 0x66, +0x19, 0x1d, 0x64, 0x18, 0x1d, 0x63, 0x18, 0x1c, 0x62, 0x17, 0x1c, 0x61, +0x17, 0x1b, 0x60, 0x17, 0x1b, 0x5f, 0x17, 0x1a, 0x5e, 0x16, 0x1a, 0x5d, +0x16, 0x1a, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x1a, 0x5a, 0x15, 0x19, 0x59, +0x15, 0x19, 0x58, 0x15, 0x19, 0x58, 0x15, 0x19, 0x57, 0x15, 0x19, 0x56, +0x15, 0x19, 0x55, 0x15, 0x19, 0x54, 0x15, 0x19, 0x54, 0x15, 0x19, 0x53, +0x15, 0x19, 0x52, 0x15, 0x19, 0x51, 0x14, 0x18, 0x50, 0x15, 0x19, 0x50, +0x15, 0x18, 0x4f, 0x15, 0x18, 0x4e, 0x15, 0x18, 0x4e, 0x14, 0x18, 0x4d, +0x14, 0x18, 0x4c, 0x14, 0x18, 0x4c, 0x14, 0x18, 0x4b, 0x14, 0x17, 0x4a, +0x14, 0x17, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, +0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x14, 0x44, 0x12, 0x14, 0x44, +0x10, 0x14, 0x42, 0x10, 0x14, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, +0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, +0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3c, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x04, +0x11, 0x14, 0x43, 0x22, 0x28, 0x86, 0x23, 0x2a, 0x8d, 0x1f, 0x24, 0x78, +0x1b, 0x21, 0x6f, 0x1b, 0x21, 0x71, 0x1c, 0x22, 0x71, 0x1d, 0x23, 0x73, +0x1e, 0x24, 0x74, 0x1f, 0x24, 0x76, 0x1f, 0x25, 0x77, 0x20, 0x26, 0x79, +0x21, 0x27, 0x7a, 0x22, 0x27, 0x7b, 0x22, 0x28, 0x7d, 0x22, 0x28, 0x7f, +0x22, 0x28, 0x80, 0x22, 0x28, 0x82, 0x22, 0x28, 0x84, 0x23, 0x28, 0x85, +0x23, 0x28, 0x87, 0x22, 0x29, 0x89, 0x21, 0x28, 0x8b, 0x21, 0x27, 0x8c, +0x20, 0x27, 0x8e, 0x20, 0x26, 0x90, 0x21, 0x28, 0x92, 0x25, 0x2c, 0x94, +0x2a, 0x31, 0x96, 0x2f, 0x37, 0x98, 0x37, 0x3f, 0x9a, 0x3a, 0x42, 0x9c, +0x39, 0x42, 0x9e, 0x3a, 0x42, 0xa0, 0x3a, 0x43, 0xa3, 0x3a, 0x43, 0xa4, +0x3b, 0x44, 0xa6, 0x3c, 0x46, 0xa9, 0x3e, 0x48, 0xab, 0x38, 0x41, 0xae, +0x32, 0x3b, 0xb0, 0x2e, 0x37, 0xb2, 0x2d, 0x36, 0xb4, 0x2e, 0x37, 0xb7, +0x2f, 0x39, 0xb9, 0x2f, 0x39, 0xbb, 0x2e, 0x37, 0xbd, 0x2d, 0x37, 0xc0, +0x32, 0x3c, 0xc2, 0x3a, 0x44, 0xc4, 0x3c, 0x47, 0xc7, 0x36, 0x40, 0xc9, +0x31, 0x3b, 0xcb, 0x3d, 0x47, 0xcd, 0x4d, 0x58, 0xd0, 0x41, 0x4c, 0xd2, +0x32, 0x3d, 0xd5, 0x31, 0x3b, 0xd6, 0x31, 0x3b, 0xd7, 0x35, 0x3f, 0xd8, +0x3b, 0x46, 0xd9, 0x48, 0x54, 0xd9, 0x52, 0x5e, 0xc1, 0x3e, 0x48, 0x8b, +0x2b, 0x33, 0x62, 0x4d, 0x59, 0xda, 0x35, 0x40, 0xda, 0x34, 0x3f, 0xdb, +0x34, 0x3e, 0xda, 0x39, 0x45, 0xda, 0x3d, 0x47, 0xd9, 0x35, 0x40, 0xd9, +0x32, 0x3d, 0xd7, 0x34, 0x3f, 0xd7, 0x30, 0x3b, 0xd6, 0x2b, 0x35, 0xd5, +0x2d, 0x37, 0xd4, 0x3a, 0x45, 0xd3, 0x47, 0x53, 0xd1, 0x52, 0x60, 0xcf, +0x4c, 0x58, 0xb6, 0x4e, 0x5a, 0xcc, 0x48, 0x54, 0xca, 0x49, 0x54, 0xc8, +0x4a, 0x55, 0xc6, 0x4a, 0x55, 0xb4, 0x32, 0x3a, 0x70, 0x32, 0x3a, 0x72, +0x47, 0x51, 0xbe, 0x38, 0x43, 0xbc, 0x34, 0x3d, 0xb9, 0x33, 0x3c, 0xb7, +0x31, 0x3b, 0xb5, 0x2e, 0x38, 0xb3, 0x2a, 0x33, 0xb1, 0x27, 0x2f, 0xae, +0x27, 0x2f, 0xac, 0x29, 0x31, 0xa9, 0x2c, 0x34, 0xa7, 0x2e, 0x37, 0xa5, +0x2d, 0x36, 0xa3, 0x2a, 0x32, 0xa1, 0x28, 0x2f, 0x9e, 0x25, 0x2d, 0x9d, +0x24, 0x2b, 0x9a, 0x23, 0x2a, 0x98, 0x22, 0x29, 0x96, 0x22, 0x29, 0x94, +0x22, 0x28, 0x93, 0x23, 0x2b, 0x90, 0x27, 0x2d, 0x8e, 0x29, 0x30, 0x8d, +0x2c, 0x34, 0x8b, 0x30, 0x37, 0x89, 0x32, 0x39, 0x87, 0x30, 0x37, 0x86, +0x2d, 0x35, 0x84, 0x2c, 0x33, 0x82, 0x2b, 0x31, 0x80, 0x29, 0x30, 0x7f, +0x27, 0x2e, 0x7e, 0x26, 0x2d, 0x7c, 0x25, 0x2c, 0x7a, 0x25, 0x2b, 0x79, +0x24, 0x2a, 0x77, 0x23, 0x29, 0x76, 0x22, 0x27, 0x75, 0x21, 0x27, 0x74, +0x21, 0x26, 0x72, 0x20, 0x26, 0x71, 0x1f, 0x25, 0x6f, 0x1e, 0x24, 0x6e, +0x1d, 0x23, 0x6d, 0x1d, 0x22, 0x6b, 0x1d, 0x21, 0x6a, 0x1c, 0x21, 0x69, +0x1b, 0x20, 0x68, 0x1a, 0x1f, 0x66, 0x1a, 0x1f, 0x66, 0x19, 0x1e, 0x65, +0x19, 0x1d, 0x64, 0x19, 0x1d, 0x63, 0x18, 0x1c, 0x62, 0x18, 0x1c, 0x61, +0x18, 0x1c, 0x60, 0x17, 0x1b, 0x5f, 0x17, 0x1b, 0x5e, 0x16, 0x1a, 0x5d, +0x16, 0x1a, 0x5c, 0x16, 0x1a, 0x5b, 0x15, 0x1a, 0x5a, 0x15, 0x19, 0x59, +0x14, 0x19, 0x58, 0x14, 0x18, 0x57, 0x14, 0x18, 0x56, 0x15, 0x18, 0x56, +0x14, 0x18, 0x55, 0x15, 0x18, 0x54, 0x14, 0x18, 0x53, 0x14, 0x18, 0x52, +0x14, 0x18, 0x52, 0x14, 0x18, 0x51, 0x14, 0x18, 0x50, 0x14, 0x18, 0x50, +0x14, 0x18, 0x4f, 0x14, 0x18, 0x4e, 0x14, 0x17, 0x4d, 0x14, 0x17, 0x4d, +0x14, 0x17, 0x4c, 0x14, 0x17, 0x4c, 0x14, 0x17, 0x4b, 0x14, 0x17, 0x4a, +0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, 0x13, 0x16, 0x48, +0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x14, 0x44, 0x12, 0x14, 0x44, +0x10, 0x14, 0x42, 0x10, 0x14, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, +0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, +0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3c, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x04, +0x11, 0x13, 0x42, 0x22, 0x28, 0x86, 0x23, 0x29, 0x8c, 0x1f, 0x24, 0x77, +0x1b, 0x21, 0x6f, 0x1b, 0x22, 0x70, 0x1c, 0x22, 0x71, 0x1d, 0x23, 0x72, +0x1e, 0x24, 0x73, 0x1f, 0x24, 0x75, 0x1f, 0x25, 0x76, 0x20, 0x26, 0x78, +0x21, 0x26, 0x79, 0x21, 0x27, 0x7b, 0x21, 0x27, 0x7c, 0x21, 0x27, 0x7d, +0x21, 0x27, 0x7f, 0x21, 0x27, 0x81, 0x21, 0x27, 0x83, 0x21, 0x27, 0x84, +0x20, 0x27, 0x86, 0x20, 0x27, 0x88, 0x1f, 0x26, 0x8a, 0x1f, 0x26, 0x8b, +0x1f, 0x25, 0x8d, 0x21, 0x28, 0x8f, 0x25, 0x2c, 0x91, 0x29, 0x30, 0x92, +0x2f, 0x38, 0x95, 0x37, 0x3f, 0x96, 0x37, 0x40, 0x98, 0x37, 0x40, 0x9b, +0x37, 0x40, 0x9c, 0x37, 0x41, 0x9f, 0x38, 0x41, 0xa0, 0x3a, 0x42, 0xa3, +0x3a, 0x43, 0xa4, 0x3b, 0x44, 0xa6, 0x37, 0x3f, 0xa9, 0x32, 0x3a, 0xab, +0x2d, 0x36, 0xad, 0x2b, 0x34, 0xaf, 0x2d, 0x36, 0xb1, 0x2e, 0x37, 0xb4, +0x2f, 0x37, 0xb6, 0x2e, 0x37, 0xb7, 0x2c, 0x35, 0xba, 0x2f, 0x38, 0xbc, +0x35, 0x3f, 0xbe, 0x3d, 0x47, 0xc1, 0x37, 0x41, 0xc3, 0x32, 0x3c, 0xc5, +0x34, 0x3e, 0xc8, 0x41, 0x4c, 0xca, 0x49, 0x55, 0xcc, 0x39, 0x43, 0xce, +0x2e, 0x38, 0xd0, 0x30, 0x3a, 0xd1, 0x31, 0x3b, 0xd2, 0x35, 0x40, 0xd3, +0x3c, 0x47, 0xd3, 0x49, 0x55, 0xd4, 0x4d, 0x58, 0xb2, 0x3f, 0x49, 0x8e, +0x31, 0x3a, 0x6f, 0x49, 0x55, 0xd5, 0x35, 0x3f, 0xd6, 0x33, 0x3e, 0xd6, +0x33, 0x3e, 0xd6, 0x38, 0x42, 0xd5, 0x3b, 0x47, 0xd5, 0x34, 0x3f, 0xd4, +0x31, 0x3c, 0xd3, 0x32, 0x3d, 0xd3, 0x31, 0x3c, 0xd1, 0x2b, 0x35, 0xd0, +0x2a, 0x34, 0xcf, 0x34, 0x3f, 0xce, 0x42, 0x4c, 0xcc, 0x4c, 0x57, 0xcb, +0x46, 0x52, 0xa5, 0x4f, 0x5b, 0xc8, 0x48, 0x53, 0xc6, 0x46, 0x51, 0xc4, +0x47, 0x53, 0xc2, 0x49, 0x55, 0xc1, 0x43, 0x4d, 0x9f, 0x2a, 0x31, 0x60, +0x42, 0x4b, 0x9b, 0x3f, 0x49, 0xb8, 0x34, 0x3d, 0xb6, 0x31, 0x3a, 0xb4, +0x31, 0x3a, 0xb2, 0x30, 0x39, 0xb0, 0x2d, 0x35, 0xad, 0x29, 0x30, 0xab, +0x26, 0x2e, 0xa9, 0x26, 0x2d, 0xa7, 0x28, 0x30, 0xa5, 0x2b, 0x33, 0xa3, +0x2d, 0x35, 0xa1, 0x2d, 0x34, 0x9f, 0x29, 0x31, 0x9d, 0x27, 0x2e, 0x9b, +0x24, 0x2b, 0x98, 0x23, 0x2a, 0x97, 0x22, 0x2a, 0x95, 0x22, 0x28, 0x93, +0x22, 0x28, 0x91, 0x21, 0x27, 0x8f, 0x21, 0x28, 0x8d, 0x24, 0x2b, 0x8c, +0x26, 0x2e, 0x8a, 0x2a, 0x30, 0x88, 0x2c, 0x34, 0x86, 0x30, 0x37, 0x85, +0x2f, 0x36, 0x83, 0x2d, 0x34, 0x81, 0x2b, 0x32, 0x7f, 0x2a, 0x30, 0x7e, +0x28, 0x2f, 0x7d, 0x27, 0x2e, 0x7b, 0x25, 0x2c, 0x79, 0x25, 0x2b, 0x78, +0x24, 0x2a, 0x77, 0x23, 0x29, 0x76, 0x22, 0x27, 0x74, 0x21, 0x27, 0x73, +0x21, 0x26, 0x71, 0x20, 0x26, 0x70, 0x1f, 0x25, 0x6f, 0x1e, 0x24, 0x6d, +0x1d, 0x24, 0x6c, 0x1d, 0x23, 0x6b, 0x1c, 0x21, 0x69, 0x1c, 0x21, 0x68, +0x1b, 0x20, 0x68, 0x1b, 0x20, 0x66, 0x1b, 0x1f, 0x66, 0x19, 0x1e, 0x65, +0x19, 0x1d, 0x63, 0x19, 0x1d, 0x62, 0x18, 0x1c, 0x61, 0x18, 0x1c, 0x60, +0x18, 0x1c, 0x5f, 0x17, 0x1b, 0x5e, 0x17, 0x1b, 0x5d, 0x16, 0x1a, 0x5c, +0x16, 0x1a, 0x5b, 0x16, 0x1a, 0x5b, 0x16, 0x1a, 0x5a, 0x15, 0x19, 0x59, +0x15, 0x19, 0x58, 0x14, 0x19, 0x57, 0x14, 0x18, 0x56, 0x14, 0x18, 0x55, +0x14, 0x18, 0x55, 0x14, 0x18, 0x54, 0x14, 0x17, 0x53, 0x14, 0x17, 0x52, +0x13, 0x17, 0x51, 0x14, 0x17, 0x51, 0x14, 0x17, 0x50, 0x14, 0x17, 0x4f, +0x14, 0x17, 0x4f, 0x14, 0x17, 0x4e, 0x13, 0x17, 0x4d, 0x13, 0x17, 0x4d, +0x13, 0x17, 0x4c, 0x13, 0x16, 0x4b, 0x13, 0x17, 0x4b, 0x13, 0x16, 0x4a, +0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, 0x13, 0x16, 0x48, +0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, +0x12, 0x14, 0x45, 0x12, 0x14, 0x44, 0x12, 0x14, 0x44, 0x11, 0x14, 0x43, +0x10, 0x14, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x13, 0x40, +0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3f, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, +0x0f, 0x12, 0x3c, 0x0f, 0x12, 0x3c, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x04, +0x11, 0x14, 0x42, 0x22, 0x28, 0x85, 0x23, 0x2a, 0x8b, 0x1f, 0x25, 0x77, +0x1c, 0x21, 0x6e, 0x1c, 0x22, 0x6f, 0x1d, 0x23, 0x71, 0x1e, 0x23, 0x71, +0x1e, 0x23, 0x72, 0x1f, 0x24, 0x74, 0x1f, 0x25, 0x75, 0x20, 0x25, 0x77, +0x20, 0x25, 0x79, 0x20, 0x25, 0x7a, 0x20, 0x25, 0x7b, 0x20, 0x26, 0x7c, +0x20, 0x26, 0x7e, 0x20, 0x26, 0x80, 0x1f, 0x26, 0x82, 0x1f, 0x26, 0x83, +0x1f, 0x25, 0x84, 0x1e, 0x25, 0x86, 0x1e, 0x25, 0x88, 0x1e, 0x24, 0x8a, +0x21, 0x28, 0x8b, 0x24, 0x2c, 0x8d, 0x29, 0x30, 0x8f, 0x2f, 0x36, 0x90, +0x35, 0x3d, 0x93, 0x35, 0x3d, 0x95, 0x36, 0x3d, 0x96, 0x35, 0x3d, 0x98, +0x36, 0x3d, 0x9b, 0x36, 0x3e, 0x9c, 0x36, 0x3f, 0x9f, 0x38, 0x41, 0xa0, +0x3a, 0x42, 0xa3, 0x35, 0x3d, 0xa4, 0x31, 0x39, 0xa6, 0x2c, 0x35, 0xa8, +0x2a, 0x32, 0xab, 0x2b, 0x34, 0xad, 0x2d, 0x36, 0xae, 0x2e, 0x36, 0xb1, +0x2c, 0x36, 0xb3, 0x2c, 0x34, 0xb5, 0x2c, 0x35, 0xb7, 0x31, 0x3a, 0xb9, +0x38, 0x41, 0xbb, 0x39, 0x42, 0xbd, 0x33, 0x3c, 0xbf, 0x2f, 0x38, 0xc2, +0x38, 0x42, 0xc3, 0x44, 0x50, 0xc6, 0x40, 0x4b, 0xc8, 0x34, 0x3d, 0xca, +0x2f, 0x38, 0xcc, 0x2f, 0x39, 0xcd, 0x31, 0x3b, 0xce, 0x36, 0x40, 0xce, +0x3d, 0x47, 0xcf, 0x4a, 0x56, 0xd0, 0x4a, 0x55, 0xab, 0x3e, 0x47, 0x8b, +0x3b, 0x44, 0x85, 0x45, 0x51, 0xd1, 0x33, 0x3e, 0xd1, 0x32, 0x3c, 0xd1, +0x31, 0x3c, 0xd1, 0x37, 0x42, 0xd0, 0x3b, 0x47, 0xd0, 0x34, 0x3f, 0xcf, +0x30, 0x3a, 0xcf, 0x31, 0x3b, 0xce, 0x31, 0x3c, 0xcd, 0x2d, 0x36, 0xcc, +0x28, 0x32, 0xcb, 0x2f, 0x3a, 0xca, 0x3c, 0x46, 0xc8, 0x46, 0x51, 0xc7, +0x4f, 0x5a, 0xc3, 0x4e, 0x5a, 0xc2, 0x49, 0x53, 0xc2, 0x44, 0x4f, 0xc1, +0x44, 0x4f, 0xbe, 0x44, 0x50, 0xbd, 0x4b, 0x56, 0xbb, 0x3c, 0x44, 0x8b, +0x27, 0x2e, 0x5a, 0x47, 0x51, 0xb5, 0x3a, 0x43, 0xb3, 0x31, 0x3a, 0xb1, +0x31, 0x39, 0xaf, 0x2f, 0x38, 0xad, 0x2e, 0x37, 0xab, 0x2b, 0x33, 0xa9, +0x28, 0x30, 0xa7, 0x25, 0x2c, 0xa5, 0x24, 0x2c, 0xa3, 0x27, 0x2f, 0xa1, +0x29, 0x32, 0x9f, 0x2c, 0x34, 0x9d, 0x2a, 0x32, 0x9b, 0x27, 0x2f, 0x98, +0x26, 0x2d, 0x97, 0x24, 0x2b, 0x95, 0x22, 0x29, 0x93, 0x22, 0x28, 0x91, +0x22, 0x28, 0x8f, 0x21, 0x27, 0x8d, 0x21, 0x26, 0x8c, 0x21, 0x27, 0x8a, +0x22, 0x29, 0x88, 0x25, 0x2b, 0x86, 0x26, 0x2d, 0x85, 0x2a, 0x30, 0x83, +0x2c, 0x33, 0x82, 0x2e, 0x34, 0x80, 0x2c, 0x33, 0x7e, 0x2a, 0x31, 0x7d, +0x29, 0x2f, 0x7c, 0x28, 0x2e, 0x7a, 0x26, 0x2d, 0x79, 0x25, 0x2b, 0x77, +0x24, 0x2a, 0x75, 0x23, 0x29, 0x75, 0x22, 0x28, 0x73, 0x22, 0x27, 0x72, +0x21, 0x26, 0x71, 0x20, 0x26, 0x6f, 0x1f, 0x25, 0x6e, 0x1f, 0x25, 0x6d, +0x1e, 0x24, 0x6b, 0x1d, 0x23, 0x6a, 0x1d, 0x22, 0x69, 0x1d, 0x22, 0x68, +0x1c, 0x21, 0x67, 0x1c, 0x20, 0x66, 0x1b, 0x1f, 0x65, 0x1a, 0x1f, 0x64, +0x1a, 0x1e, 0x63, 0x19, 0x1d, 0x62, 0x18, 0x1d, 0x61, 0x18, 0x1c, 0x60, +0x18, 0x1c, 0x5f, 0x17, 0x1b, 0x5e, 0x17, 0x1b, 0x5d, 0x16, 0x1a, 0x5c, +0x16, 0x1a, 0x5b, 0x16, 0x1a, 0x5a, 0x15, 0x19, 0x59, 0x15, 0x19, 0x58, +0x15, 0x19, 0x58, 0x14, 0x19, 0x57, 0x14, 0x18, 0x56, 0x14, 0x18, 0x55, +0x14, 0x17, 0x54, 0x13, 0x17, 0x53, 0x13, 0x17, 0x53, 0x13, 0x17, 0x52, +0x13, 0x17, 0x51, 0x13, 0x17, 0x50, 0x13, 0x17, 0x50, 0x13, 0x17, 0x4f, +0x13, 0x16, 0x4e, 0x13, 0x17, 0x4e, 0x13, 0x16, 0x4d, 0x13, 0x16, 0x4c, +0x13, 0x16, 0x4c, 0x12, 0x16, 0x4b, 0x13, 0x16, 0x4b, 0x12, 0x16, 0x4a, +0x12, 0x16, 0x49, 0x12, 0x16, 0x49, 0x12, 0x16, 0x48, 0x12, 0x16, 0x48, +0x12, 0x15, 0x47, 0x12, 0x14, 0x45, 0x12, 0x15, 0x45, 0x12, 0x14, 0x45, +0x12, 0x14, 0x45, 0x12, 0x14, 0x44, 0x12, 0x14, 0x44, 0x11, 0x14, 0x43, +0x10, 0x14, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x13, 0x40, +0x10, 0x13, 0x40, 0x10, 0x12, 0x3f, 0x10, 0x12, 0x3f, 0x0f, 0x12, 0x3f, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, +0x0f, 0x12, 0x3c, 0x0f, 0x12, 0x3c, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x04, +0x11, 0x14, 0x42, 0x22, 0x28, 0x84, 0x23, 0x2a, 0x8b, 0x1f, 0x25, 0x76, +0x1c, 0x21, 0x6d, 0x1d, 0x22, 0x6f, 0x1d, 0x23, 0x70, 0x1e, 0x23, 0x71, +0x1e, 0x24, 0x72, 0x1e, 0x24, 0x73, 0x1f, 0x24, 0x75, 0x1f, 0x25, 0x76, +0x1f, 0x25, 0x78, 0x1f, 0x25, 0x79, 0x1f, 0x25, 0x7b, 0x1f, 0x25, 0x7b, +0x1f, 0x25, 0x7d, 0x1e, 0x25, 0x7f, 0x1e, 0x24, 0x80, 0x1e, 0x24, 0x82, +0x1d, 0x24, 0x83, 0x1e, 0x23, 0x85, 0x1e, 0x25, 0x87, 0x21, 0x28, 0x89, +0x24, 0x2c, 0x8a, 0x29, 0x30, 0x8c, 0x2e, 0x36, 0x8e, 0x32, 0x3b, 0x90, +0x33, 0x3b, 0x91, 0x33, 0x3b, 0x93, 0x32, 0x3b, 0x95, 0x33, 0x3b, 0x96, +0x34, 0x3d, 0x99, 0x36, 0x3d, 0x9b, 0x36, 0x3e, 0x9c, 0x36, 0x3f, 0x9f, +0x34, 0x3d, 0xa0, 0x30, 0x38, 0xa2, 0x2c, 0x34, 0xa4, 0x29, 0x31, 0xa6, +0x2b, 0x32, 0xa8, 0x2b, 0x34, 0xaa, 0x2c, 0x35, 0xac, 0x2b, 0x34, 0xae, +0x2b, 0x33, 0xb0, 0x2b, 0x33, 0xb2, 0x2d, 0x37, 0xb4, 0x34, 0x3d, 0xb6, +0x39, 0x44, 0xb8, 0x34, 0x3d, 0xba, 0x2f, 0x39, 0xbd, 0x32, 0x3b, 0xbe, +0x3b, 0x46, 0xc0, 0x48, 0x52, 0xc2, 0x39, 0x43, 0xc4, 0x2f, 0x39, 0xc6, +0x2e, 0x38, 0xc7, 0x2e, 0x39, 0xc8, 0x30, 0x3b, 0xca, 0x35, 0x40, 0xca, +0x3d, 0x48, 0xca, 0x4b, 0x57, 0xcc, 0x49, 0x54, 0xab, 0x3f, 0x48, 0x8f, +0x43, 0x4d, 0x99, 0x42, 0x4c, 0xcd, 0x32, 0x3d, 0xcd, 0x31, 0x3b, 0xcc, +0x31, 0x3b, 0xcc, 0x36, 0x40, 0xcc, 0x3b, 0x45, 0xcb, 0x34, 0x3f, 0xcb, +0x2f, 0x38, 0xca, 0x2f, 0x3a, 0xca, 0x31, 0x3c, 0xc8, 0x2d, 0x37, 0xc8, +0x29, 0x32, 0xc7, 0x2c, 0x37, 0xc6, 0x37, 0x40, 0xc4, 0x40, 0x4a, 0xc3, +0x49, 0x54, 0xc1, 0x49, 0x53, 0xb0, 0x49, 0x53, 0xbe, 0x43, 0x4d, 0xbd, +0x41, 0x4c, 0xbc, 0x42, 0x4d, 0xb9, 0x43, 0x4d, 0xb8, 0x46, 0x51, 0xaa, +0x35, 0x3d, 0x7a, 0x3a, 0x42, 0x85, 0x40, 0x4a, 0xb1, 0x34, 0x3d, 0xae, +0x30, 0x38, 0xac, 0x2f, 0x38, 0xaa, 0x2e, 0x36, 0xa9, 0x2c, 0x34, 0xa6, +0x29, 0x31, 0xa5, 0x26, 0x2e, 0xa2, 0x24, 0x2b, 0xa1, 0x24, 0x2c, 0x9f, +0x26, 0x2e, 0x9d, 0x27, 0x30, 0x9b, 0x2a, 0x32, 0x99, 0x2a, 0x31, 0x97, +0x27, 0x2e, 0x95, 0x25, 0x2c, 0x93, 0x23, 0x2a, 0x92, 0x22, 0x29, 0x90, +0x21, 0x27, 0x8e, 0x21, 0x26, 0x8d, 0x21, 0x26, 0x8b, 0x20, 0x25, 0x89, +0x1f, 0x25, 0x87, 0x20, 0x27, 0x86, 0x22, 0x29, 0x84, 0x25, 0x2b, 0x82, +0x27, 0x2d, 0x80, 0x2a, 0x30, 0x7f, 0x2b, 0x33, 0x7e, 0x2b, 0x32, 0x7c, +0x2a, 0x30, 0x7b, 0x29, 0x2e, 0x79, 0x27, 0x2d, 0x78, 0x25, 0x2c, 0x76, +0x24, 0x2b, 0x75, 0x24, 0x29, 0x74, 0x23, 0x28, 0x73, 0x22, 0x27, 0x71, +0x21, 0x26, 0x70, 0x20, 0x26, 0x6f, 0x1f, 0x25, 0x6d, 0x1f, 0x24, 0x6c, +0x1e, 0x24, 0x6b, 0x1d, 0x23, 0x69, 0x1d, 0x23, 0x68, 0x1d, 0x22, 0x68, +0x1c, 0x21, 0x66, 0x1c, 0x20, 0x66, 0x1b, 0x20, 0x65, 0x1b, 0x1f, 0x64, +0x1a, 0x1e, 0x63, 0x19, 0x1d, 0x61, 0x18, 0x1d, 0x60, 0x18, 0x1d, 0x5f, +0x18, 0x1c, 0x5e, 0x17, 0x1b, 0x5d, 0x17, 0x1b, 0x5d, 0x17, 0x1b, 0x5c, +0x16, 0x1a, 0x5b, 0x16, 0x1a, 0x5a, 0x16, 0x1a, 0x59, 0x15, 0x19, 0x58, +0x15, 0x19, 0x57, 0x15, 0x18, 0x56, 0x14, 0x18, 0x56, 0x14, 0x18, 0x55, +0x14, 0x18, 0x54, 0x13, 0x17, 0x53, 0x13, 0x17, 0x52, 0x13, 0x17, 0x52, +0x13, 0x16, 0x51, 0x12, 0x16, 0x50, 0x13, 0x16, 0x50, 0x12, 0x16, 0x4f, +0x12, 0x16, 0x4e, 0x12, 0x16, 0x4d, 0x12, 0x16, 0x4d, 0x12, 0x16, 0x4c, +0x12, 0x16, 0x4c, 0x12, 0x16, 0x4b, 0x12, 0x15, 0x4a, 0x12, 0x15, 0x49, +0x12, 0x15, 0x49, 0x12, 0x15, 0x49, 0x12, 0x16, 0x48, 0x12, 0x15, 0x47, +0x12, 0x15, 0x47, 0x12, 0x14, 0x45, 0x12, 0x14, 0x45, 0x11, 0x14, 0x45, +0x12, 0x14, 0x45, 0x11, 0x14, 0x44, 0x11, 0x14, 0x44, 0x10, 0x13, 0x42, +0x10, 0x13, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x13, 0x40, +0x10, 0x13, 0x40, 0x10, 0x12, 0x3f, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3e, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, +0x0e, 0x11, 0x3c, 0x0e, 0x11, 0x3c, 0x0e, 0x10, 0x35, 0x01, 0x01, 0x04, +0x11, 0x14, 0x42, 0x22, 0x28, 0x84, 0x24, 0x2a, 0x8a, 0x1f, 0x25, 0x75, +0x1c, 0x22, 0x6d, 0x1d, 0x23, 0x6e, 0x1d, 0x23, 0x6f, 0x1d, 0x23, 0x70, +0x1e, 0x23, 0x71, 0x1d, 0x23, 0x72, 0x1e, 0x24, 0x74, 0x1e, 0x24, 0x75, +0x1e, 0x24, 0x77, 0x1e, 0x24, 0x78, 0x1e, 0x24, 0x7a, 0x1d, 0x24, 0x7b, +0x1e, 0x23, 0x7c, 0x1d, 0x23, 0x7e, 0x1d, 0x23, 0x7f, 0x1d, 0x22, 0x81, +0x1d, 0x22, 0x83, 0x1e, 0x24, 0x83, 0x21, 0x27, 0x85, 0x24, 0x2c, 0x87, +0x29, 0x30, 0x89, 0x2e, 0x35, 0x8a, 0x31, 0x38, 0x8c, 0x31, 0x38, 0x8e, +0x32, 0x39, 0x90, 0x32, 0x39, 0x91, 0x31, 0x39, 0x93, 0x32, 0x3a, 0x95, +0x33, 0x3b, 0x96, 0x34, 0x3d, 0x99, 0x36, 0x3d, 0x9b, 0x32, 0x3b, 0x9c, +0x2f, 0x37, 0x9e, 0x2b, 0x33, 0xa0, 0x28, 0x30, 0xa2, 0x29, 0x32, 0xa4, +0x2a, 0x32, 0xa6, 0x2b, 0x33, 0xa7, 0x2b, 0x33, 0xa9, 0x2a, 0x32, 0xab, +0x2a, 0x32, 0xad, 0x2b, 0x33, 0xaf, 0x30, 0x38, 0xb1, 0x36, 0x40, 0xb3, +0x35, 0x3e, 0xb5, 0x31, 0x3a, 0xb7, 0x2e, 0x36, 0xb9, 0x34, 0x3e, 0xbb, +0x3e, 0x49, 0xbc, 0x3f, 0x49, 0xbe, 0x34, 0x3d, 0xc0, 0x2d, 0x36, 0xc2, +0x2d, 0x36, 0xc3, 0x2e, 0x37, 0xc4, 0x31, 0x3a, 0xc5, 0x36, 0x40, 0xc6, +0x3e, 0x48, 0xc6, 0x4b, 0x56, 0xc7, 0x49, 0x54, 0xaa, 0x41, 0x4a, 0x92, +0x49, 0x54, 0xab, 0x3e, 0x4a, 0xc8, 0x31, 0x3b, 0xc8, 0x30, 0x3a, 0xc8, +0x2f, 0x3a, 0xc8, 0x34, 0x3e, 0xc7, 0x39, 0x43, 0xc7, 0x33, 0x3d, 0xc7, +0x2f, 0x38, 0xc6, 0x2f, 0x39, 0xc6, 0x31, 0x3b, 0xc4, 0x2d, 0x37, 0xc4, +0x29, 0x32, 0xc3, 0x2a, 0x33, 0xc1, 0x32, 0x3c, 0xc1, 0x3c, 0x46, 0xbf, +0x44, 0x4f, 0xbe, 0x4a, 0x54, 0xb6, 0x49, 0x54, 0xbb, 0x43, 0x4e, 0xb9, +0x3f, 0x49, 0xb8, 0x40, 0x4a, 0xb6, 0x40, 0x4a, 0xb5, 0x44, 0x4e, 0xb3, +0x40, 0x49, 0x99, 0x31, 0x39, 0x71, 0x44, 0x4e, 0xa8, 0x3a, 0x43, 0xac, +0x30, 0x39, 0xa9, 0x2e, 0x37, 0xa8, 0x2d, 0x35, 0xa6, 0x2d, 0x35, 0xa4, +0x2a, 0x33, 0xa2, 0x28, 0x2f, 0xa1, 0x24, 0x2d, 0x9e, 0x23, 0x2a, 0x9d, +0x23, 0x2a, 0x9b, 0x25, 0x2c, 0x99, 0x27, 0x2e, 0x97, 0x29, 0x31, 0x95, +0x28, 0x30, 0x93, 0x27, 0x2d, 0x92, 0x24, 0x2b, 0x90, 0x22, 0x29, 0x8e, +0x21, 0x27, 0x8d, 0x21, 0x27, 0x8b, 0x20, 0x26, 0x89, 0x20, 0x25, 0x87, +0x1f, 0x25, 0x86, 0x1f, 0x24, 0x84, 0x1f, 0x25, 0x83, 0x20, 0x27, 0x81, +0x22, 0x28, 0x7f, 0x25, 0x2b, 0x7e, 0x27, 0x2d, 0x7d, 0x2a, 0x2f, 0x7b, +0x2b, 0x31, 0x7a, 0x29, 0x2f, 0x78, 0x28, 0x2e, 0x77, 0x26, 0x2d, 0x75, +0x25, 0x2b, 0x75, 0x24, 0x2a, 0x73, 0x24, 0x29, 0x72, 0x22, 0x27, 0x70, +0x21, 0x27, 0x6f, 0x21, 0x26, 0x6e, 0x20, 0x25, 0x6d, 0x1f, 0x24, 0x6b, +0x1e, 0x24, 0x6a, 0x1d, 0x23, 0x69, 0x1d, 0x23, 0x68, 0x1c, 0x22, 0x67, +0x1c, 0x22, 0x65, 0x1b, 0x21, 0x65, 0x1a, 0x20, 0x63, 0x1a, 0x1f, 0x63, +0x1a, 0x1f, 0x62, 0x1a, 0x1e, 0x61, 0x19, 0x1d, 0x60, 0x19, 0x1d, 0x5f, +0x18, 0x1c, 0x5e, 0x17, 0x1c, 0x5d, 0x17, 0x1b, 0x5c, 0x16, 0x1b, 0x5b, +0x16, 0x1a, 0x5a, 0x16, 0x1a, 0x59, 0x16, 0x1a, 0x59, 0x15, 0x19, 0x58, +0x15, 0x19, 0x57, 0x15, 0x18, 0x56, 0x14, 0x18, 0x55, 0x14, 0x18, 0x54, +0x14, 0x18, 0x54, 0x14, 0x17, 0x53, 0x13, 0x17, 0x52, 0x13, 0x17, 0x51, +0x13, 0x17, 0x51, 0x13, 0x16, 0x50, 0x12, 0x16, 0x4f, 0x12, 0x16, 0x4f, +0x12, 0x16, 0x4e, 0x12, 0x15, 0x4d, 0x12, 0x16, 0x4d, 0x12, 0x15, 0x4c, +0x12, 0x15, 0x4b, 0x12, 0x15, 0x4b, 0x12, 0x15, 0x4a, 0x11, 0x15, 0x49, +0x11, 0x15, 0x49, 0x12, 0x15, 0x48, 0x12, 0x15, 0x48, 0x11, 0x14, 0x47, +0x12, 0x15, 0x47, 0x11, 0x14, 0x45, 0x11, 0x14, 0x45, 0x11, 0x14, 0x45, +0x11, 0x14, 0x45, 0x11, 0x14, 0x44, 0x11, 0x14, 0x43, 0x10, 0x13, 0x42, +0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x13, 0x40, +0x10, 0x13, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3e, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, +0x0e, 0x11, 0x3c, 0x0e, 0x11, 0x3c, 0x0e, 0x10, 0x35, 0x01, 0x01, 0x04, +0x11, 0x14, 0x41, 0x22, 0x29, 0x83, 0x24, 0x2a, 0x88, 0x20, 0x25, 0x75, +0x1c, 0x22, 0x6c, 0x1d, 0x22, 0x6d, 0x1c, 0x22, 0x6e, 0x1d, 0x23, 0x70, +0x1c, 0x23, 0x71, 0x1d, 0x23, 0x71, 0x1d, 0x23, 0x73, 0x1d, 0x23, 0x74, +0x1d, 0x23, 0x76, 0x1d, 0x23, 0x77, 0x1d, 0x23, 0x79, 0x1c, 0x23, 0x7a, +0x1c, 0x22, 0x7b, 0x1d, 0x22, 0x7c, 0x1c, 0x22, 0x7e, 0x1d, 0x22, 0x80, +0x1e, 0x24, 0x81, 0x21, 0x27, 0x83, 0x24, 0x2b, 0x84, 0x29, 0x30, 0x86, +0x2e, 0x35, 0x87, 0x2f, 0x37, 0x89, 0x2f, 0x37, 0x8a, 0x2f, 0x38, 0x8c, +0x2f, 0x37, 0x8e, 0x2f, 0x37, 0x90, 0x31, 0x38, 0x91, 0x31, 0x39, 0x93, +0x32, 0x3a, 0x95, 0x33, 0x3b, 0x96, 0x31, 0x39, 0x98, 0x2e, 0x36, 0x9b, +0x2a, 0x32, 0x9c, 0x27, 0x2f, 0x9e, 0x28, 0x2f, 0x9f, 0x28, 0x31, 0xa1, +0x2a, 0x32, 0xa4, 0x2a, 0x32, 0xa5, 0x29, 0x32, 0xa7, 0x29, 0x31, 0xa8, +0x29, 0x31, 0xab, 0x2d, 0x35, 0xac, 0x31, 0x3b, 0xae, 0x36, 0x3f, 0xb0, +0x31, 0x3b, 0xb2, 0x2d, 0x37, 0xb4, 0x2e, 0x37, 0xb6, 0x37, 0x41, 0xb8, +0x42, 0x4c, 0xba, 0x39, 0x42, 0xbb, 0x2f, 0x38, 0xbc, 0x2c, 0x35, 0xbe, +0x2c, 0x36, 0xc0, 0x2e, 0x37, 0xc0, 0x31, 0x3b, 0xc1, 0x36, 0x40, 0xc2, +0x3f, 0x49, 0xc3, 0x4b, 0x56, 0xc3, 0x48, 0x53, 0xaa, 0x41, 0x4b, 0x96, +0x4d, 0x58, 0xb8, 0x3c, 0x46, 0xc3, 0x31, 0x3a, 0xc4, 0x30, 0x39, 0xc4, +0x2e, 0x38, 0xc4, 0x33, 0x3c, 0xc3, 0x37, 0x41, 0xc3, 0x32, 0x3c, 0xc2, +0x2e, 0x38, 0xc2, 0x2d, 0x37, 0xc2, 0x2f, 0x39, 0xc1, 0x2e, 0x37, 0xc0, +0x29, 0x32, 0xbe, 0x27, 0x30, 0xbe, 0x2e, 0x37, 0xbd, 0x37, 0x40, 0xbc, +0x3f, 0x4a, 0xba, 0x47, 0x51, 0xb9, 0x49, 0x54, 0xb8, 0x43, 0x4d, 0xb6, +0x3f, 0x48, 0xb5, 0x3f, 0x48, 0xb3, 0x3e, 0x47, 0xb1, 0x3e, 0x48, 0xb0, +0x45, 0x4e, 0xae, 0x3b, 0x44, 0x8c, 0x33, 0x3a, 0x74, 0x40, 0x4a, 0xa9, +0x35, 0x3e, 0xa7, 0x2d, 0x35, 0xa6, 0x2d, 0x35, 0xa4, 0x2c, 0x34, 0xa2, +0x2b, 0x33, 0xa0, 0x29, 0x31, 0x9e, 0x26, 0x2e, 0x9d, 0x24, 0x2b, 0x9b, +0x22, 0x28, 0x98, 0x22, 0x2a, 0x97, 0x24, 0x2b, 0x95, 0x26, 0x2d, 0x93, +0x28, 0x30, 0x92, 0x27, 0x2e, 0x90, 0x25, 0x2c, 0x8e, 0x23, 0x2a, 0x8d, +0x21, 0x29, 0x8b, 0x20, 0x26, 0x89, 0x20, 0x25, 0x87, 0x1f, 0x25, 0x86, +0x1f, 0x24, 0x85, 0x1e, 0x24, 0x83, 0x1d, 0x23, 0x81, 0x1e, 0x24, 0x80, +0x1f, 0x25, 0x7e, 0x20, 0x27, 0x7d, 0x23, 0x28, 0x7c, 0x24, 0x2b, 0x7a, +0x27, 0x2d, 0x79, 0x29, 0x2f, 0x77, 0x28, 0x2e, 0x76, 0x27, 0x2d, 0x75, +0x25, 0x2c, 0x74, 0x24, 0x2b, 0x72, 0x24, 0x29, 0x71, 0x23, 0x28, 0x70, +0x21, 0x27, 0x6e, 0x21, 0x26, 0x6d, 0x20, 0x25, 0x6c, 0x1f, 0x24, 0x6b, +0x1e, 0x23, 0x69, 0x1e, 0x23, 0x68, 0x1d, 0x23, 0x67, 0x1c, 0x22, 0x66, +0x1c, 0x22, 0x65, 0x1b, 0x21, 0x65, 0x1b, 0x21, 0x63, 0x1a, 0x20, 0x63, +0x1a, 0x1f, 0x62, 0x1a, 0x1e, 0x60, 0x19, 0x1e, 0x5f, 0x19, 0x1d, 0x5f, +0x18, 0x1c, 0x5e, 0x18, 0x1c, 0x5d, 0x17, 0x1c, 0x5c, 0x17, 0x1b, 0x5b, +0x17, 0x1b, 0x5a, 0x16, 0x1a, 0x59, 0x16, 0x1a, 0x58, 0x15, 0x19, 0x57, +0x15, 0x19, 0x57, 0x15, 0x19, 0x56, 0x14, 0x18, 0x55, 0x14, 0x18, 0x54, +0x14, 0x17, 0x53, 0x14, 0x17, 0x53, 0x13, 0x17, 0x52, 0x13, 0x17, 0x51, +0x13, 0x16, 0x50, 0x13, 0x16, 0x50, 0x12, 0x16, 0x4f, 0x12, 0x16, 0x4e, +0x12, 0x16, 0x4e, 0x12, 0x15, 0x4d, 0x12, 0x15, 0x4c, 0x12, 0x15, 0x4c, +0x11, 0x15, 0x4b, 0x11, 0x15, 0x4a, 0x11, 0x15, 0x4a, 0x11, 0x15, 0x49, +0x11, 0x15, 0x49, 0x11, 0x14, 0x48, 0x11, 0x14, 0x48, 0x11, 0x14, 0x47, +0x11, 0x14, 0x45, 0x11, 0x14, 0x45, 0x11, 0x14, 0x45, 0x11, 0x14, 0x45, +0x11, 0x14, 0x44, 0x11, 0x14, 0x44, 0x11, 0x14, 0x43, 0x10, 0x13, 0x42, +0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, +0x10, 0x12, 0x3f, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3e, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0e, 0x11, 0x3c, +0x0e, 0x11, 0x3c, 0x0e, 0x11, 0x3c, 0x0e, 0x10, 0x35, 0x01, 0x01, 0x04, +0x10, 0x14, 0x41, 0x22, 0x29, 0x83, 0x23, 0x2a, 0x82, 0x1b, 0x21, 0x68, +0x19, 0x1d, 0x5c, 0x18, 0x1d, 0x5d, 0x19, 0x1e, 0x5f, 0x19, 0x1e, 0x60, +0x19, 0x1e, 0x61, 0x19, 0x1e, 0x62, 0x19, 0x1e, 0x63, 0x19, 0x1e, 0x64, +0x19, 0x1e, 0x65, 0x19, 0x1d, 0x66, 0x19, 0x1e, 0x67, 0x19, 0x1d, 0x68, +0x19, 0x1d, 0x6a, 0x18, 0x1c, 0x6a, 0x19, 0x1e, 0x6c, 0x1a, 0x20, 0x6d, +0x1e, 0x22, 0x6f, 0x20, 0x25, 0x70, 0x24, 0x29, 0x71, 0x27, 0x2e, 0x72, +0x28, 0x2e, 0x73, 0x28, 0x2e, 0x75, 0x28, 0x2e, 0x77, 0x28, 0x2e, 0x77, +0x28, 0x2f, 0x79, 0x29, 0x30, 0x7b, 0x29, 0x30, 0x7d, 0x2b, 0x31, 0x7d, +0x2b, 0x32, 0x7e, 0x2a, 0x31, 0x80, 0x27, 0x2e, 0x81, 0x25, 0x2b, 0x83, +0x22, 0x29, 0x85, 0x22, 0x28, 0x86, 0x22, 0x29, 0x88, 0x23, 0x2b, 0x8a, +0x25, 0x2b, 0x8a, 0x24, 0x2b, 0x8c, 0x23, 0x2a, 0x8d, 0x22, 0x29, 0x8f, +0x25, 0x2d, 0x91, 0x29, 0x30, 0x92, 0x2e, 0x35, 0x94, 0x2c, 0x32, 0x96, +0x28, 0x30, 0x96, 0x25, 0x2d, 0x97, 0x2b, 0x32, 0x99, 0x32, 0x3a, 0x9b, +0x36, 0x3e, 0x9d, 0x2d, 0x34, 0x9f, 0x26, 0x2e, 0xa0, 0x25, 0x2e, 0xa1, +0x26, 0x2e, 0xa2, 0x27, 0x2f, 0xa2, 0x2b, 0x33, 0xa3, 0x2f, 0x37, 0xa3, +0x36, 0x3e, 0xa3, 0x40, 0x4b, 0xa3, 0x3f, 0x48, 0x96, 0x39, 0x40, 0x81, +0x43, 0x4b, 0xa4, 0x32, 0x3b, 0xa5, 0x29, 0x32, 0xa5, 0x28, 0x31, 0xa5, +0x28, 0x31, 0xa5, 0x2b, 0x33, 0xa5, 0x2e, 0x37, 0xa4, 0x2c, 0x34, 0xa4, +0x28, 0x30, 0xa3, 0x27, 0x2f, 0xa3, 0x28, 0x30, 0xa2, 0x28, 0x30, 0xa2, +0x24, 0x2c, 0xa2, 0x22, 0x29, 0xa1, 0x25, 0x2e, 0xa0, 0x2d, 0x35, 0x9f, +0x32, 0x3b, 0x9d, 0x39, 0x41, 0x9d, 0x3f, 0x48, 0x9b, 0x3b, 0x44, 0x9a, +0x37, 0x3e, 0x98, 0x34, 0x3b, 0x97, 0x34, 0x3d, 0x96, 0x34, 0x3d, 0x95, +0x37, 0x3f, 0x94, 0x39, 0x42, 0x8d, 0x30, 0x37, 0x6f, 0x35, 0x3c, 0x7e, +0x32, 0x3b, 0x8e, 0x2b, 0x32, 0x8c, 0x26, 0x2e, 0x8b, 0x26, 0x2d, 0x8a, +0x25, 0x2d, 0x89, 0x24, 0x2c, 0x87, 0x22, 0x29, 0x85, 0x21, 0x26, 0x83, +0x1e, 0x25, 0x82, 0x1d, 0x23, 0x80, 0x1e, 0x23, 0x7e, 0x1f, 0x25, 0x7e, +0x21, 0x26, 0x7d, 0x22, 0x28, 0x7b, 0x22, 0x27, 0x7a, 0x20, 0x25, 0x78, +0x1e, 0x25, 0x77, 0x1d, 0x23, 0x75, 0x1c, 0x22, 0x73, 0x1b, 0x20, 0x73, +0x1a, 0x20, 0x71, 0x1a, 0x20, 0x70, 0x1a, 0x20, 0x6f, 0x19, 0x1f, 0x6d, +0x19, 0x1e, 0x6d, 0x1a, 0x1f, 0x6b, 0x1b, 0x22, 0x6a, 0x1d, 0x22, 0x68, +0x1f, 0x23, 0x67, 0x20, 0x25, 0x66, 0x22, 0x26, 0x65, 0x22, 0x27, 0x64, +0x22, 0x26, 0x64, 0x21, 0x26, 0x63, 0x20, 0x25, 0x61, 0x1f, 0x24, 0x60, +0x1e, 0x22, 0x5f, 0x1d, 0x22, 0x5d, 0x1c, 0x21, 0x5c, 0x1b, 0x20, 0x5c, +0x1b, 0x20, 0x5b, 0x1a, 0x1f, 0x5a, 0x19, 0x1e, 0x58, 0x19, 0x1e, 0x57, +0x19, 0x1e, 0x57, 0x18, 0x1d, 0x56, 0x18, 0x1d, 0x56, 0x17, 0x1c, 0x55, +0x17, 0x1b, 0x54, 0x17, 0x1a, 0x53, 0x17, 0x1a, 0x52, 0x17, 0x19, 0x51, +0x16, 0x19, 0x50, 0x16, 0x19, 0x50, 0x15, 0x19, 0x4f, 0x15, 0x18, 0x4e, +0x15, 0x18, 0x4e, 0x15, 0x18, 0x4d, 0x14, 0x17, 0x4c, 0x13, 0x17, 0x4b, +0x13, 0x17, 0x4b, 0x13, 0x16, 0x4a, 0x13, 0x16, 0x4a, 0x12, 0x16, 0x49, +0x12, 0x16, 0x48, 0x12, 0x15, 0x47, 0x11, 0x15, 0x47, 0x11, 0x15, 0x46, +0x11, 0x15, 0x45, 0x10, 0x14, 0x45, 0x10, 0x14, 0x45, 0x10, 0x14, 0x44, +0x10, 0x13, 0x43, 0x10, 0x13, 0x43, 0x10, 0x13, 0x42, 0x10, 0x13, 0x42, +0x0f, 0x13, 0x41, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f, +0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, +0x0f, 0x12, 0x3c, 0x0f, 0x12, 0x3c, 0x0e, 0x12, 0x3c, 0x0f, 0x12, 0x3c, +0x0e, 0x12, 0x3b, 0x0e, 0x12, 0x3b, 0x0e, 0x10, 0x39, 0x0e, 0x10, 0x39, +0x0e, 0x10, 0x39, 0x0e, 0x10, 0x39, 0x0e, 0x10, 0x38, 0x0e, 0x10, 0x38, +0x0d, 0x10, 0x37, 0x0d, 0x10, 0x37, 0x0d, 0x10, 0x36, 0x0d, 0x10, 0x36, +0x0d, 0x10, 0x36, 0x0d, 0x10, 0x35, 0x0d, 0x10, 0x35, 0x0c, 0x0f, 0x34, +0x0c, 0x0f, 0x34, 0x0c, 0x0f, 0x34, 0x0c, 0x0f, 0x32, 0x01, 0x01, 0x04, +0x02, 0x02, 0x08, 0x0a, 0x0d, 0x29, 0x02, 0x03, 0x09, 0x00, 0x00, 0x02, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x00, 0x01, +0x00, 0x01, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; diff --git a/src/main.c b/src/main.c new file mode 100644 index 00000000..157b9ac0 --- /dev/null +++ b/src/main.c @@ -0,0 +1,436 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" +#include /* for keyboard values */ + +static void parse_command_line(int argc, char *argv[], gchar **path, gchar **file); +static void setup_default_options(); + +/* + *----------------------------------------------------------------------------- + * path manipulation routines (public) + *----------------------------------------------------------------------------- + */ + +gchar *filename_from_path(char *t) +{ + char *p; + + p = t + strlen(t); + while(p > t && p[0] != '/') p--; + if (p[0] == '/') p++; + return p; +} + +gchar *remove_level_from_path(gchar *path) +{ + gchar *new_path; + gchar *ptr = path; + gint p; + + if (!path) return NULL; + + p = strlen(path) - 1; + if (p < 0) return NULL; + while(ptr[p] != '/' && p > 0) p--; + if (p == 0 && ptr[p] == '/') p++; + new_path = g_strndup(path, (guint)p); + return new_path; +} + +void parse_out_relatives(gchar *path) +{ + gint s, t; + + if (!path) return; + + s = t = 0; + + while (path[s] != '\0') + { + if (path[s] == '/' && path[s+1] == '.' && (path[s+2] == '/' || path[s+2] == '\0') ) + { + s += 2; + } + else if (path[s] == '/' && path[s+1] == '.' && path[s+2] == '.' && (path[s+3] == '/' || path[s+3] == '\0') ) + { + s += 3; + if (t > 0) t--; + while (path[t] != '/' && t > 0) t--; + } + else + { + if (s != t) path[t] = path[s]; + t++; + s++; + } + } + if (t == 0 && path[t] == '/') t++; + if (t > 1 && path[t-1] == '/') t--; + path[t] = '\0'; +} + +/* + *----------------------------------------------------------------------------- + * external editor start routines (public) + *----------------------------------------------------------------------------- + */ + +void start_editor_from_file(gint n, gchar *path) +{ + gchar *cmd; + if (!path) return; + cmd = g_strdup_printf("%s \"%s\" &", editor_command[n], path); + printf(_("GQview running: %s\n"),cmd); + system(cmd); + g_free(cmd); +} + +void start_editor_from_image(gint n) +{ + start_editor_from_file(n, image_get_path()); +} + +void start_editor_from_list(gint n) +{ + gchar *cmd; + gchar *buf; + GList *list = file_get_selected_list(); + GList *work; + if (!list) return; + work = list; + cmd = g_strconcat(editor_command[n], " ", NULL); + while(work) + { + buf = cmd; + cmd = g_strconcat(buf, "\"", work->data, "\" ", NULL); + g_free(buf); + work = work->next; + } + buf = cmd; + cmd = g_strconcat(buf, "&", NULL); + g_free(buf); + printf(_("GQview running: %s\n"),cmd); + system(cmd); + g_free(cmd); + free_selected_list(list); +} + +/* + *----------------------------------------------------------------------------- + * keyboard functions + *----------------------------------------------------------------------------- + */ + +void keyboard_scroll_calc(gint *x, gint *y, GdkEventKey *event) +{ + static gint delta = 0; + static guint32 time_old = 0; + static guint keyval_old = 0; + + if (progressive_key_scrolling) + { + guint32 time_diff; + + time_diff = event->time - time_old; + + /* key pressed within 125ms ? (1/8 second) */ + if (time_diff > 125 || event->keyval != keyval_old) delta = 0; + + time_old = event->time; + keyval_old = event->keyval; + + delta += 2; + } + else + { + delta = 8; + } + + *x = *x * delta; + *y = *y * delta; +} + +gint key_press_cb(GtkWidget *widget, GdkEventKey *event) +{ + gint stop_signal = FALSE; + gint x = 0; + gint y = 0; + + if (GTK_WIDGET_HAS_FOCUS(path_entry)) + { + if (event->keyval == GDK_Escape) + gtk_entry_set_text(GTK_ENTRY(path_entry), current_path); + return stop_signal; + } + + if (full_screen_window || GTK_WIDGET_HAS_FOCUS(main_image->viewport)) + { + switch (event->keyval) + { + case GDK_Left: + x -= 1; + stop_signal = TRUE; + break; + case GDK_Right: + x += 1; + stop_signal = TRUE; + break; + case GDK_Up: + y -= 1; + stop_signal = TRUE; + break; + case GDK_Down: + y += 1; + stop_signal = TRUE; + break; + case GDK_BackSpace: + file_prev_image(); + stop_signal = TRUE; + break; + case GDK_space: + file_next_image(); + stop_signal = TRUE; + break; + } + } + + switch (event->keyval) + { + case '+': + image_adjust_zoom(1); + break; + case GDK_Page_Up: + file_prev_image(); + stop_signal = TRUE; + break; + case GDK_Page_Down: + file_next_image(); + stop_signal = TRUE; + break; + case GDK_Home: + file_first_image(); + stop_signal = TRUE; + break; + case GDK_End: + file_last_image(); + stop_signal = TRUE; + break; + case GDK_Delete: + file_util_delete(image_get_path(), NULL); + stop_signal = TRUE; + break; + case GDK_Escape: + interrupt_thumbs(); + stop_signal = TRUE; + break; + case 'Q': case 'q': + if (event->state == 0 || (event->state & GDK_MODIFIER_MASK) == GDK_LOCK_MASK) + { + exit_gqview(); + return FALSE; + } + break; + } + + if (event->state & GDK_SHIFT_MASK) + { + x *= 3; + y *= 3; + } + + if (x != 0 || y!= 0) + { + keyboard_scroll_calc(&x, &y, event); + image_scroll(x, y); + } + + if (stop_signal) gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "key_press_event"); + + return stop_signal; +} + +/* + *----------------------------------------------------------------------------- + * command line parser (private) + *----------------------------------------------------------------------------- + */ + +static void parse_command_line(int argc, char *argv[], gchar **path, gchar **file) +{ + if (argc > 1) + { + gint i; + gchar *base_dir = get_current_dir(); + i = 1; + while (i < argc) + { + gchar *cmd_line = argv[i]; + gchar *cmd_all = g_strconcat(base_dir, "/", cmd_line, NULL); + + if (!*path && cmd_line[0] == '/' && isdir(cmd_line)) + { + *path = g_strdup(cmd_line); + } + else if (!*path && isdir(cmd_all)) + { + *path = g_strdup(cmd_all); + } + else if (!*file && cmd_line[0] == '/' && isfile(cmd_line)) + { + g_free(*path); + *path = remove_level_from_path(cmd_line); + *file = g_strdup(cmd_line); + } + else if (!*file && isfile(cmd_all)) + { + g_free(*path); + *path = remove_level_from_path(cmd_all); + *file = g_strdup(cmd_all); + } + else if (strcmp(cmd_line, "-debug") == 0) + { + debug = TRUE; + printf("debugging output enabled\n"); + } + else if (strcmp(cmd_line, "+t") == 0 || + strcmp(cmd_line, "+tools") == 0) + { + tools_float = FALSE; + tools_hidden = FALSE; + } + else if (strcmp(cmd_line, "-t") == 0 || + strcmp(cmd_line, "-tools") == 0) + { + tools_hidden = TRUE; + } + else if (strcmp(cmd_line, "-help") == 0) + { + printf("GQview version %s\n", VERSION); + printf(_("Usage: gqview [options] [path]\n\n")); + printf(_("valid options are:\n")); + printf(_(" +t, +tools force show of tools\n")); + printf(_(" -t, -tools force hide of tools\n")); + printf(_(" -debug turn on debug output\n")); + printf(_(" -help this message\n\n")); + exit (0); + } + else + { + printf(_("invalid or ignored: %s\nUse -help for options\n"), cmd_line); + } + g_free(cmd_all); + i++; + } + g_free(base_dir); + parse_out_relatives(*path); + parse_out_relatives(*file); + } +} + +/* + *----------------------------------------------------------------------------- + * startup, init, and exit + *----------------------------------------------------------------------------- + */ + +static void setup_default_options() +{ + gint i; + + for(i=0; i<8; i++) + { + editor_name[i] = NULL; + editor_command[i] = NULL; + } + + editor_name[0] = g_strdup(_("The Gimp")); + editor_command[0] = g_strdup("gimp"); + + editor_name[1] = g_strdup(_("Electric Eyes")); + editor_command[1] = g_strdup("ee"); + + editor_name[2] = g_strdup(_("XV")); + editor_command[2] = g_strdup("xv"); + + editor_name[3] = g_strdup(_("Xpaint")); + editor_command[3] = g_strdup("xpaint"); + + custom_filter = g_strdup(".eim;"); +} + +void exit_gqview() +{ + full_screen_stop(); + + gdk_window_get_position (mainwindow->window, &main_window_x, &main_window_y); + gdk_window_get_size(mainwindow->window, &main_window_w, &main_window_h); + + if (toolwindow) + { + gdk_window_get_position (toolwindow->window, &float_window_x, &float_window_y); + gdk_window_get_size(toolwindow->window, &float_window_w, &float_window_h); + } + save_options(); + + gtk_main_quit(); +} + +int main (int argc, char *argv[]) +{ + gchar *cmd_path = NULL; + gchar *cmd_file = NULL; + + /* setup locale, i18n */ + gtk_set_locale(); + bindtextdomain (PACKAGE, LOCALEDIR); + textdomain (PACKAGE); + + /* setup random seed for random slideshow */ + srand (time (0)); + + gtk_init (&argc, &argv); + gdk_imlib_init(); + + /* push the correct color depths to gtk, (for 8-bit psuedo color displays) + * they should be popped, too, I guess... + */ + gtk_widget_push_visual(gdk_imlib_get_visual()); + gtk_widget_push_colormap(gdk_imlib_get_colormap()); + + setup_default_options(); + load_options(); + + parse_command_line(argc, argv, &cmd_path, &cmd_file); + + if (cmd_path) + current_path = g_strdup(cmd_path); + else if (startup_path_enable && startup_path && isdir(startup_path)) + current_path = g_strdup(startup_path); + else + current_path = get_current_dir(); + + create_main_window(); + update_edit_menus(mainwindow_accel_grp); + rebuild_file_filter(); + filelist_refresh(); + + init_dnd(); + + while(gtk_events_pending()) gtk_main_iteration(); + image_change_to(cmd_file); + + g_free(cmd_path); + g_free(cmd_file); + + gtk_main (); + return 0; +} + + diff --git a/src/menu.c b/src/menu.c new file mode 100644 index 00000000..36818d0b --- /dev/null +++ b/src/menu.c @@ -0,0 +1,671 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" + +#include "icons/icon_thumb.xpm" +#include "icons/icon_home.xpm" +#include "icons/icon_reload.xpm" +#include "icons/icon_zoom_in.xpm" +#include "icons/icon_zoom_out.xpm" +#include "icons/icon_zoom_fit.xpm" +#include "icons/icon_zoom_norm.xpm" +#include "icons/icon_config.xpm" +#include "icons/icon_float.xpm" + +static void set_thumbnails(gint mode); + +static void add_menu_item(GtkWidget *menu, gchar *label, GtkAccelGroup *accel_group, + guint accel_key, guint accel_mods, GtkSignalFunc func, gpointer data); + +static void add_edit_items(GtkWidget *menu, GtkSignalFunc func, GtkAccelGroup *accel_grp); + +static void add_button_to_bar(GtkWidget *hbox, gchar **pixmap_data, + GtkTooltips *tooltips, gchar *tip_text, + GtkSignalFunc func, gpointer data); + +static void set_thumbnails(gint mode) +{ + if (thumbnails_enabled == mode) return; + thumbnails_enabled = mode; + gtk_check_menu_item_set_state(GTK_CHECK_MENU_ITEM(thumb_menu_item), thumbnails_enabled); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(thumb_button), thumbnails_enabled); + filelist_populate_clist(); +} + +/* + *----------------------------------------------------------------------------- + * menu and button callbacks (private) + *----------------------------------------------------------------------------- + */ + +static void exit_cb(GtkWidget *widget, gpointer data) +{ + exit_gqview(); +} + +static void about_cb(GtkWidget *widget, gpointer data) +{ + show_about_window(); +} + +static void create_dir_cb(GtkWidget *widget, gpointer data) +{ + file_util_create_dir(current_path); +} + +static void zoom_in_cb(GtkWidget *widget, gpointer data) +{ + image_adjust_zoom(1); +} + +static void zoom_out_cb(GtkWidget *widget, gpointer data) +{ + image_adjust_zoom(-1); +} + +static void zoom_1_1_cb(GtkWidget *widget, gpointer data) +{ + image_set_zoom(1); +} + +static void zoom_fit_cb(GtkWidget *widget, gpointer data) +{ + image_set_zoom(0); +} + +static void thumb_menu_cb(GtkWidget *widget, gpointer data) +{ + set_thumbnails(GTK_CHECK_MENU_ITEM(widget)->active); +} + +static void thumb_button_cb(GtkWidget *widget, gpointer data) +{ + set_thumbnails(GTK_TOGGLE_BUTTON(widget)->active); +} + +static void refresh_cb(GtkWidget *widget, gpointer data) +{ + gchar *buf = g_strdup(current_path); + filelist_change_to(buf); + g_free(buf); +} + +static void float_cb(GtkWidget *widget, gpointer data) +{ + toolwindow_float(); +} + +static void hide_cb(GtkWidget *widget, gpointer data) +{ + toolwindow_hide(); +} + +static void slideshow_cb(GtkWidget *widget, gpointer data) +{ + slideshow_toggle(); +} + +static void home_dir_cb(GtkWidget *widget, gpointer data) +{ + gchar *path = homedir(); + if (path) filelist_change_to(path); +} + +static void config_cb(GtkWidget *widget, gpointer data) +{ + show_config_window(); +} + +static void remove_thumb_cb(GtkWidget *widget, gpointer data) +{ + maintain_thumbnail_dir("/", TRUE); +} + +static void full_screen_cb(GtkWidget *widget, gpointer data) +{ + full_screen_toggle(); +} + + +/* + *----------------------------------------------------------------------------- + * image menu callbacks (private) + *----------------------------------------------------------------------------- + */ + +static void copy_image_cb(GtkWidget *widget, gpointer data) +{ + full_screen_stop(); + file_util_copy(image_get_path(), NULL, current_path); +} + +static void move_image_cb(GtkWidget *widget, gpointer data) +{ + full_screen_stop(); + file_util_move(image_get_path(), NULL, current_path); +} + +static void rename_image_cb(GtkWidget *widget, gpointer data) +{ + full_screen_stop(); + file_util_rename(image_get_path(), NULL); +} + +static void delete_image_cb(GtkWidget *widget, gpointer data) +{ + full_screen_stop(); + file_util_delete(image_get_path(), NULL); +} + +/* + *----------------------------------------------------------------------------- + * file menu callbacks (private) + *----------------------------------------------------------------------------- + */ + +static void copy_file_cb(GtkWidget *widget, gpointer data) +{ + file_util_copy(NULL, file_get_selected_list(), current_path); +} + +static void move_file_cb(GtkWidget *widget, gpointer data) +{ + file_util_move(NULL, file_get_selected_list(), current_path); +} + +static void rename_file_cb(GtkWidget *widget, gpointer data) +{ + file_util_rename(NULL, file_get_selected_list()); +} + +static void delete_file_cb(GtkWidget *widget, gpointer data) +{ + file_util_delete(NULL, file_get_selected_list()); +} + +/* + *----------------------------------------------------------------------------- + * filelist popup menu callbacks (private) + *----------------------------------------------------------------------------- + */ + +static void popup_copy_file_cb(GtkWidget *widget, gpointer data) +{ + if (file_clicked_is_selected()) + { + file_util_copy(NULL, file_get_selected_list(), current_path); + } + else + { + gchar *path = file_clicked_get_path(); + file_util_copy(path, NULL, current_path); + g_free(path); + } +} + +static void popup_move_file_cb(GtkWidget *widget, gpointer data) +{ + if (file_clicked_is_selected()) + { + file_util_move(NULL, file_get_selected_list(), current_path); + } + else + { + gchar *path = file_clicked_get_path(); + file_util_move(path, NULL, current_path); + g_free(path); + } +} + +static void popup_rename_file_cb(GtkWidget *widget, gpointer data) +{ + if (file_clicked_is_selected()) + { + file_util_rename(NULL, file_get_selected_list()); + } + else + { + gchar *path = file_clicked_get_path(); + file_util_rename(path, NULL); + g_free(path); + } +} + +static void popup_delete_file_cb(GtkWidget *widget, gpointer data) +{ + if (file_clicked_is_selected()) + { + file_util_delete(NULL, file_get_selected_list()); + } + else + { + gchar *path = file_clicked_get_path(); + file_util_delete(path, NULL); + g_free(path); + } +} + +static void edit_image_cb(GtkWidget *widget, gpointer data) +{ + gint n = GPOINTER_TO_INT(data); + start_editor_from_image(n); +} + +static void edit_list_cb(GtkWidget *widget, gpointer data) +{ + gint n = GPOINTER_TO_INT(data); + start_editor_from_list(n); +} + +static void edit_full_cb(GtkWidget *widget, gpointer data) +{ + gint n = GPOINTER_TO_INT(data); + full_screen_stop(); + start_editor_from_image(n); +} + +static void edit_view_cb(GtkWidget *widget, gpointer data) +{ + gint n = GPOINTER_TO_INT(data); + view_window_active_edit(n); +} + +static void popup_edit_list_cb(GtkWidget *widget, gpointer data) +{ + gint n = GPOINTER_TO_INT(data); + + if (file_clicked_is_selected()) + { + start_editor_from_list(n); + } + else + { + gchar *path; + start_editor_from_file(n, path); + g_free(path); + } +} + +static void new_window_file_cb(GtkWidget *widget, gpointer data) +{ + gchar *path = file_clicked_get_path(); + view_window_new(path); + g_free(path); +} + +static void new_window_image_cb(GtkWidget *widget, gpointer data) +{ + view_window_new(image_get_path()); +} + +static void menu_file_popup_hide_cb(GtkWidget *widget, gpointer data) +{ + file_clist_highlight_unset(); +} + + +/* + *----------------------------------------------------------------------------- + * menu addition utilities (private) + *----------------------------------------------------------------------------- + */ + +static void add_menu_item(GtkWidget *menu, gchar *label, GtkAccelGroup *accel_group, + guint accel_key, guint accel_mods, GtkSignalFunc func, gpointer data) +{ + GtkWidget *item; + + item = gtk_menu_item_new_with_label(label); + gtk_widget_add_accelerator (item, "activate", accel_group, accel_key, accel_mods, GTK_ACCEL_VISIBLE); + gtk_signal_connect (GTK_OBJECT (item), "activate",(GtkSignalFunc) func, data); + gtk_menu_append(GTK_MENU(menu), item); + gtk_widget_show(item); +} + +void add_menu_popup_item(GtkWidget *menu, gchar *label, + GtkSignalFunc func, gpointer data) +{ + GtkWidget *item; + + item = gtk_menu_item_new_with_label(label); + gtk_signal_connect (GTK_OBJECT (item), "activate",(GtkSignalFunc) func, data); + gtk_menu_append(GTK_MENU(menu), item); + gtk_widget_show(item); +} + +void add_menu_divider(GtkWidget *menu) +{ + GtkWidget *item = gtk_menu_item_new(); + gtk_menu_append(GTK_MENU(menu),item); + gtk_widget_show(item); +} + +/* + *----------------------------------------------------------------------------- + * edit menu routines + *----------------------------------------------------------------------------- + */ + +static void add_edit_items(GtkWidget *menu, GtkSignalFunc func, GtkAccelGroup *accel_grp) +{ + gint i; + for (i = 0; i < 8; i++) + { + if (editor_command[i] && strlen(editor_command[i]) > 0) + { + gchar *text; + if (editor_name[i] && strlen(editor_name[i]) > 0) + text = g_strdup_printf(_("in %s..."), editor_name[i]); + else + text = g_strdup(_("in (unknown)...")); + if (accel_grp) + add_menu_item(menu, text, accel_grp, i + 49, GDK_CONTROL_MASK, func, GINT_TO_POINTER(i)); + else + add_menu_popup_item(menu, text, func, GINT_TO_POINTER(i)); + g_free(text); + } + } +} + +void update_edit_menus(GtkAccelGroup *accel_grp) +{ + GtkWidget *menu; + + /* main edit menu */ + + menu = gtk_menu_new(); + add_edit_items(menu, edit_list_cb, accel_grp); + add_menu_divider(menu); + add_menu_item(menu, _("Options..."), accel_grp, 'O', GDK_CONTROL_MASK, config_cb, NULL); + add_menu_divider(menu); + add_menu_item(menu, _("Remove old thumbnails"), accel_grp, 'T', GDK_CONTROL_MASK, remove_thumb_cb, NULL); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_edit), menu); + + /* file edit popup */ + menu = gtk_menu_new(); + add_edit_items(menu, popup_edit_list_cb, NULL); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_filelist_edit), menu); + + /* image edit popup */ + menu = gtk_menu_new(); + add_edit_items(menu, edit_image_cb, NULL); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_image_edit), menu); + + /* full screen edit popup */ + menu = gtk_menu_new(); + add_edit_items(menu, edit_full_cb, NULL); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_window_full_edit), menu); + + /* view edit popup */ + menu = gtk_menu_new(); + add_edit_items(menu, edit_view_cb, NULL); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_window_view_edit), menu); +} + +/* + *----------------------------------------------------------------------------- + * menu bar setup routines + *----------------------------------------------------------------------------- + */ + +GtkWidget *create_menu_bar(GtkAccelGroup *accel_grp) +{ + GtkWidget *bar; + GtkWidget *menu; + + bar = gtk_menu_bar_new(); + + /* file menu */ + menu_file = gtk_menu_item_new_with_label(_("File")); + gtk_widget_show(menu_file); + + menu = gtk_menu_new(); + add_menu_item(menu, _("Create Dir..."), accel_grp, 'N', GDK_CONTROL_MASK, create_dir_cb, NULL); + add_menu_divider(menu); + add_menu_item(menu, _("Copy..."), accel_grp, 'C', GDK_CONTROL_MASK, copy_file_cb, NULL); + add_menu_item(menu, _("Move..."), accel_grp, 'M', GDK_CONTROL_MASK, move_file_cb, NULL); + add_menu_item(menu, _("Rename..."), accel_grp, 'R', GDK_CONTROL_MASK, rename_file_cb, NULL); + add_menu_item(menu, _("Delete..."), accel_grp, 'D', GDK_CONTROL_MASK, delete_file_cb, NULL); + add_menu_divider(menu); + add_menu_item(menu, _("Exit"), accel_grp, 'Q', GDK_CONTROL_MASK, exit_cb, NULL); + + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_file),menu); + gtk_menu_bar_append(GTK_MENU_BAR(bar),menu_file); + + /* edit menu */ + menu_edit = gtk_menu_item_new_with_label(_("Edit")); + gtk_widget_show(menu_edit); + + menu = gtk_menu_new(); + + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_edit), menu); + gtk_menu_bar_append(GTK_MENU_BAR(bar), menu_edit); + + /* view menu */ + menu_view = gtk_menu_item_new_with_label(_("View")); + gtk_widget_show(menu_view); + + menu = gtk_menu_new(); + add_menu_item(menu, _("Zoom in"), accel_grp, '=', FALSE, zoom_in_cb, NULL); + add_menu_item(menu, _("Zoom out"), accel_grp, '-', FALSE, zoom_out_cb, NULL); + add_menu_item(menu, _("Zoom 1:1"), accel_grp, 'Z', FALSE, zoom_1_1_cb, NULL); + add_menu_item(menu, _("Fit image to window"), accel_grp, 'X', FALSE, zoom_fit_cb, NULL); + add_menu_divider(menu); + + add_menu_item(menu, _("Full screen"), accel_grp, 'F', GDK_CONTROL_MASK, full_screen_cb, NULL); + thumb_menu_item = gtk_check_menu_item_new_with_label(_("Thumbnails")); + gtk_widget_add_accelerator (thumb_menu_item, "activate", accel_grp, 'T', FALSE, GTK_ACCEL_VISIBLE); + gtk_signal_connect (GTK_OBJECT (thumb_menu_item), "activate",(GtkSignalFunc) thumb_menu_cb, thumb_menu_item); + gtk_menu_append(GTK_MENU(menu), thumb_menu_item); + gtk_widget_show(thumb_menu_item); + + add_menu_divider(menu); + add_menu_item(menu, _("Refresh Lists"), accel_grp, 'R', FALSE, refresh_cb, NULL); + add_menu_item(menu, _("(Un)Float file list"), accel_grp, 'F', FALSE, float_cb, NULL); + add_menu_item(menu, _("(Un)Hide file list"), accel_grp, 'H', FALSE, hide_cb, NULL); + + add_menu_divider(menu); + add_menu_item(menu, _("Toggle slideshow"), accel_grp, 'S', FALSE, slideshow_cb, NULL); + + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_view), menu); + gtk_menu_bar_append(GTK_MENU_BAR(bar), menu_view); + + /* help menu */ + menu_help = gtk_menu_item_new_with_label(_("Help")); + gtk_widget_show(menu_help); + + menu = gtk_menu_new(); + add_menu_item(menu, _("About"), accel_grp, 'A', GDK_CONTROL_MASK, about_cb, NULL); + + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_help), menu); + gtk_menu_bar_append(GTK_MENU_BAR(bar), menu_help); + + return bar; +} + +/* + *----------------------------------------------------------------------------- + * menu file list routines (private) + *----------------------------------------------------------------------------- + */ + +static void create_menu_file_list_popup() +{ + menu_file_popup = gtk_menu_new(); + gtk_signal_connect(GTK_OBJECT(menu_file_popup), "hide", (GtkSignalFunc) menu_file_popup_hide_cb, NULL); + + menu_filelist_edit = gtk_menu_item_new_with_label(_("Edit")); + gtk_menu_append(GTK_MENU(menu_file_popup), menu_filelist_edit); + gtk_widget_show(menu_filelist_edit); + + add_menu_popup_item(menu_file_popup, _("View in new window"), new_window_file_cb, NULL); + + add_menu_divider(menu_file_popup); + add_menu_popup_item(menu_file_popup, _("Copy..."), popup_copy_file_cb, NULL); + add_menu_popup_item(menu_file_popup, _("Move..."), popup_move_file_cb, NULL); + add_menu_popup_item(menu_file_popup, _("Rename..."), popup_rename_file_cb, NULL); + add_menu_popup_item(menu_file_popup, _("Delete..."), popup_delete_file_cb, NULL); + add_menu_divider(menu_file_popup); + add_menu_popup_item(menu_file_popup, _("Refresh"), refresh_cb, NULL); +} + +/* + *----------------------------------------------------------------------------- + * menu image routines (private) + *----------------------------------------------------------------------------- + */ + +static void create_menu_image_popup() +{ + menu_image_popup = gtk_menu_new(); + + add_menu_popup_item(menu_image_popup, _("Zoom in"), zoom_in_cb, NULL); + add_menu_popup_item(menu_image_popup, _("Zoom out"), zoom_out_cb, NULL); + add_menu_popup_item(menu_image_popup, _("Zoom 1:1"), zoom_1_1_cb, NULL); + add_menu_popup_item(menu_image_popup, _("Fit image to window"), zoom_fit_cb, NULL); + add_menu_divider(menu_image_popup); + + menu_image_edit = gtk_menu_item_new_with_label(_("Edit")); + gtk_menu_append(GTK_MENU(menu_image_popup), menu_image_edit); + gtk_widget_show(menu_image_edit); + + add_menu_popup_item(menu_image_popup, _("View in new window"), new_window_image_cb, NULL); + + add_menu_divider(menu_image_popup); + add_menu_popup_item(menu_image_popup, _("Copy..."), copy_image_cb, NULL); + add_menu_popup_item(menu_image_popup, _("Move..."), move_image_cb, NULL); + add_menu_popup_item(menu_image_popup, _("Rename..."), rename_image_cb, NULL); + add_menu_popup_item(menu_image_popup, _("Delete..."), delete_image_cb, NULL); + add_menu_divider(menu_image_popup); + add_menu_popup_item(menu_image_popup, _("(Un)Hide file list"), hide_cb, NULL); + add_menu_popup_item(menu_image_popup, _("Full screen"), full_screen_cb, NULL); +} + +/* + *----------------------------------------------------------------------------- + * menu full screen routines (private) + *----------------------------------------------------------------------------- + */ + +/* this re-grabs the keyboard when the menu closes, needed for override redirect */ +static void menu_full_popup_hide_cb(GtkWidget *widget, gpointer data) +{ + if (full_screen_window) + { + gdk_keyboard_grab(full_screen_window->window, TRUE, GDK_CURRENT_TIME); + } +} + +static void create_menu_full_screen_popup() +{ + menu_window_full = gtk_menu_new(); + add_menu_popup_item(menu_window_full, _("Zoom in"), zoom_in_cb, NULL); + add_menu_popup_item(menu_window_full, _("Zoom out"), zoom_out_cb, NULL); + add_menu_popup_item(menu_window_full, _("Zoom 1:1"), zoom_1_1_cb, NULL); + add_menu_popup_item(menu_window_full, _("Fit image to window"), zoom_fit_cb, NULL); + add_menu_divider(menu_window_full); + + menu_window_full_edit = gtk_menu_item_new_with_label(_("Edit")); + gtk_menu_append(GTK_MENU(menu_window_full), menu_window_full_edit); + gtk_widget_show(menu_window_full_edit); + + add_menu_divider(menu_window_full); + add_menu_popup_item(menu_window_full, _("Copy..."), copy_image_cb, NULL); + add_menu_popup_item(menu_window_full, _("Move..."), move_image_cb, NULL); + add_menu_popup_item(menu_window_full, _("Rename..."), rename_image_cb, NULL); + add_menu_popup_item(menu_window_full, _("Delete..."), delete_image_cb, NULL); + + add_menu_divider(menu_window_full); + add_menu_popup_item(menu_window_full, _("Exit full screen"), full_screen_cb, NULL); + + gtk_signal_connect(GTK_OBJECT(menu_window_full), "hide", (GtkSignalFunc) menu_full_popup_hide_cb, NULL); +} + +void create_menu_popups() +{ + create_menu_file_list_popup(); + create_menu_image_popup(); + create_menu_full_screen_popup(); + create_menu_view_popup(); +} + +/* + *----------------------------------------------------------------------------- + * toolbar routines + *----------------------------------------------------------------------------- + */ + +static void add_button_to_bar(GtkWidget *hbox, gchar **pixmap_data, + GtkTooltips *tooltips, gchar *tip_text, + GtkSignalFunc func, gpointer data) +{ + GtkWidget *button; + GtkStyle *style; + GtkWidget *pixmapwid; + GdkPixmap *pixmap; + GdkBitmap *mask; + + style = gtk_widget_get_style(mainwindow); + + button = gtk_button_new (); + gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) func, thumb_button); + gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); + gtk_tooltips_set_tip (tooltips, button, tip_text, NULL); + + pixmap = gdk_pixmap_create_from_xpm_d(mainwindow->window, &mask, + &style->bg[GTK_STATE_NORMAL], (gchar **)pixmap_data); + pixmapwid = gtk_pixmap_new(pixmap, mask); + gtk_widget_show(pixmapwid); + gtk_container_add(GTK_CONTAINER(button), pixmapwid); +} + +GtkWidget *create_button_bar(GtkTooltips *tooltips) +{ + GtkWidget *hbox; + GtkStyle *style; + GtkWidget *pixmapwid; + GdkPixmap *pixmap; + GdkBitmap *mask; + + style = gtk_widget_get_style(mainwindow); + hbox = gtk_hbox_new(FALSE, 0); + + thumb_button = gtk_toggle_button_new (); + gtk_signal_connect (GTK_OBJECT (thumb_button), "clicked",(GtkSignalFunc) thumb_button_cb, thumb_button); + gtk_box_pack_start (GTK_BOX (hbox), thumb_button, FALSE, FALSE, 0); + gtk_widget_show (thumb_button); + gtk_tooltips_set_tip (tooltips, thumb_button, _("Create thumbnails"), NULL); + + pixmap = gdk_pixmap_create_from_xpm_d(mainwindow->window, &mask, + &style->bg[GTK_STATE_NORMAL], (gchar **)icon_thumb_xpm ); + pixmapwid = gtk_pixmap_new(pixmap, mask); + gtk_widget_show(pixmapwid); + gtk_container_add(GTK_CONTAINER(thumb_button), pixmapwid); + + add_button_to_bar(hbox, (gchar **)icon_home_xpm, + tooltips, _("Change to home directory"), home_dir_cb, NULL); + add_button_to_bar(hbox, (gchar **)icon_reload_xpm, + tooltips, _("Refresh file list"), refresh_cb, NULL); + add_button_to_bar(hbox, (gchar **)icon_zoom_in_xpm, + tooltips, _("Zoom in"), zoom_in_cb, NULL); + add_button_to_bar(hbox, (gchar **)icon_zoom_out_xpm, + tooltips, _("Zoom out"), zoom_out_cb, NULL); + add_button_to_bar(hbox, (gchar **)icon_zoom_fit_xpm, + tooltips, _("Fit image to window"), zoom_fit_cb, NULL); + add_button_to_bar(hbox, (gchar **)icon_zoom_norm_xpm, + tooltips, _("Set zoom 1:1"), zoom_1_1_cb, NULL); + add_button_to_bar(hbox, (gchar **)icon_config_xpm, + tooltips, _("Configure options"), config_cb, NULL); + add_button_to_bar(hbox, (gchar **)icon_float_xpm, + tooltips, _("Float Controls"), float_cb, NULL); + + return hbox; +} + diff --git a/src/pathsel.c b/src/pathsel.c new file mode 100644 index 00000000..914d57b9 --- /dev/null +++ b/src/pathsel.c @@ -0,0 +1,294 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" + +#define DEST_WIDTH 250 +#define DEST_HEIGHT 100 + +typedef struct _Dest_Data Dest_Data; +struct _Dest_Data +{ + GtkWidget *d_clist; + GtkWidget *f_clist; + GtkWidget *entry; + gchar *filter; + gchar *path; +}; + +static void dest_free_data(GtkWidget *widget, gpointer data); +static gint dest_check_filter(gchar *filter, gchar *file); +static gint dest_sort_cb(void *a, void *b); +static void dest_populate(Dest_Data *dd, gchar *path); +static void dest_select_cb(GtkWidget *clist, gint row, gint column, + GdkEventButton *bevent, gpointer data); + +/* + *----------------------------------------------------------------------------- + * destination widget routines (private) + *----------------------------------------------------------------------------- + */ + +static void dest_free_data(GtkWidget *widget, gpointer data) +{ + Dest_Data *dd = data; + g_free(dd->filter); + g_free(dd->path); + g_free(dd); +} + +static gint dest_check_filter(gchar *filter, gchar *file) +{ + gchar *f_ptr = filter; + gchar *file_ptr; + gchar *strt_ptr; + gint i; + + if (filter[0] == '*') return TRUE; + while (f_ptr < filter + strlen(filter)) + { + strt_ptr = f_ptr; + i=0; + while (*f_ptr != ';' && *f_ptr != '\0') + { + f_ptr++; + i++; + } + f_ptr++; + file_ptr = file + strlen(file) - i; + if (!strncasecmp(file_ptr, strt_ptr, i)) return TRUE; + } + return FALSE; +} + +static gint dest_sort_cb(void *a, void *b) +{ + return strcmp((gchar *)a, (gchar *)b); +} + +static void dest_populate(Dest_Data *dd, gchar *path) +{ + DIR *dp; + struct dirent *dir; + struct stat ent_sbuf; + gchar *buf[2]; + GList *path_list = NULL; + GList *file_list = NULL; + GList *list; + + buf[1] = NULL; + + if((dp = opendir(path))==NULL) + { + /* dir not found */ + return; + } + while ((dir = readdir(dp)) != NULL) + { + /* skips removed files */ + if (dir->d_ino > 0) + { + gchar *name = dir->d_name; + gchar *filepath = g_strconcat(path, "/", name, NULL); + if (stat(filepath,&ent_sbuf) >= 0 && S_ISDIR(ent_sbuf.st_mode)) + { + path_list = g_list_prepend(path_list, g_strdup(name)); + } + else if (dd->f_clist) + { + if (!dd->filter || (dd->filter && dest_check_filter(dd->filter, name))) + file_list = g_list_prepend(file_list, g_strdup(name)); + } + g_free(filepath); + } + } + closedir(dp); + + path_list = g_list_sort(path_list, (GCompareFunc) dest_sort_cb); + file_list = g_list_sort(file_list, (GCompareFunc) dest_sort_cb); + + gtk_clist_freeze(GTK_CLIST(dd->d_clist)); + gtk_clist_clear(GTK_CLIST(dd->d_clist)); + + list = path_list; + while (list) + { + gint row; + gchar *filepath; + if (strcmp(list->data, ".") == 0) + { + filepath = g_strdup(path); + } + else if (strcmp(list->data, "..") == 0) + { + gchar *p; + filepath = g_strdup(path); + p = filename_from_path(filepath); + if (p - 1 != filepath) p--; + p[0] = '\0'; + } + else if (strcmp(path, "/") == 0) + { + filepath = g_strconcat("/", list->data, NULL); + } + else + filepath = g_strconcat(path, "/", list->data, NULL); + + buf[0] = list->data; + row = gtk_clist_append(GTK_CLIST(dd->d_clist),buf); + gtk_clist_set_row_data_full(GTK_CLIST(dd->d_clist), row, + filepath, (GtkDestroyNotify) g_free); + g_free(list->data); + list = list->next; + } + + g_list_free(path_list); + + gtk_clist_thaw(GTK_CLIST(dd->d_clist)); + + if (dd->f_clist) + { + gtk_clist_freeze(GTK_CLIST(dd->f_clist)); + gtk_clist_clear(GTK_CLIST(dd->f_clist)); + + list = file_list; + while (list) + { + gint row; + gchar *filepath; + filepath = g_strconcat(path, "/", list->data, NULL); + + buf[0] = list->data; + row = gtk_clist_append(GTK_CLIST(dd->f_clist),buf); + gtk_clist_set_row_data_full(GTK_CLIST(dd->f_clist), row, + filepath, (GtkDestroyNotify) g_free); + g_free(list->data); + list = list->next; + } + + g_list_free(file_list); + + gtk_clist_thaw(GTK_CLIST(dd->f_clist)); + } + + g_free(dd->path); + dd->path = g_strdup(path); +} + +static void dest_select_cb(GtkWidget *clist, gint row, gint column, + GdkEventButton *bevent, gpointer data) +{ + Dest_Data *dd = data; + gchar *path = g_strdup(gtk_clist_get_row_data(GTK_CLIST(clist), row)); + gtk_entry_set_text(GTK_ENTRY(dd->entry),path); + + if (clist == dd->d_clist) dest_populate(dd, path); + g_free(path); +} + +/* + *----------------------------------------------------------------------------- + * destination widget setup routines (public) + *----------------------------------------------------------------------------- + */ + +GtkWidget *destination_widget_new_with_files(gchar *path, gchar *filter, GtkWidget *entry) +{ + GtkWidget *vbox; + Dest_Data *dd; + GtkWidget *scrolled; + + dd = g_new0(Dest_Data, 1); + + vbox = gtk_vbox_new(FALSE, 5); + gtk_widget_show(vbox); + + dd->entry = entry; + gtk_object_set_data(GTK_OBJECT(dd->entry), "destination_data", dd); + + scrolled = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); + gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 0); + gtk_widget_show(scrolled); + + dd->d_clist=gtk_clist_new (1); + gtk_clist_set_column_auto_resize(GTK_CLIST(dd->d_clist), 0, TRUE); + gtk_signal_connect (GTK_OBJECT (dd->d_clist), "select_row",(GtkSignalFunc) dest_select_cb, dd); + gtk_signal_connect(GTK_OBJECT(dd->d_clist), "destroy", (GtkSignalFunc) dest_free_data, dd); + gtk_widget_set_usize(dd->d_clist, DEST_WIDTH, DEST_HEIGHT); + gtk_container_add (GTK_CONTAINER (scrolled), dd->d_clist); + gtk_widget_show (dd->d_clist); + + if (filter) + { + scrolled = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); + gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 0); + gtk_widget_show(scrolled); + + dd->f_clist=gtk_clist_new (1); + gtk_clist_set_column_auto_resize(GTK_CLIST(dd->f_clist), 0, TRUE); + gtk_widget_set_usize(dd->f_clist, DEST_WIDTH, DEST_HEIGHT); + gtk_signal_connect (GTK_OBJECT (dd->f_clist), "select_row",(GtkSignalFunc) dest_select_cb, dd); + gtk_container_add (GTK_CONTAINER (scrolled), dd->f_clist); + gtk_widget_show (dd->f_clist); + + dd->filter = g_strdup(filter); + } + + if (isdir(path)) + { + dest_populate(dd, path); + } + else + { + gchar *buf = remove_level_from_path(path); + if (isdir(buf)) + { + dest_populate(dd, buf); + } + else + { + dest_populate(dd, homedir()); + } + g_free(buf); + } + return vbox; +} + +GtkWidget *destination_widget_new(gchar *path, GtkWidget *entry) +{ + return destination_widget_new_with_files(path, NULL, entry); +} + +void destination_widget_sync_to_entry(GtkWidget *entry) +{ + Dest_Data *dd = gtk_object_get_data(GTK_OBJECT(entry), "destination_data"); + gchar *path; + + if (!dd) return; + + path = gtk_entry_get_text(GTK_ENTRY(entry)); + + if (isdir(path) && strcmp(path, dd->path) != 0) + { + dest_populate(dd, path); + } + else + { + gchar *buf = remove_level_from_path(path); + if (isdir(buf) && strcmp(buf, dd->path) != 0) + { + dest_populate(dd, buf); + } + g_free(buf); + } +} + diff --git a/src/rcfile.c b/src/rcfile.c new file mode 100644 index 00000000..91ff2168 --- /dev/null +++ b/src/rcfile.c @@ -0,0 +1,434 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" + +static gchar *quoted_value(gchar *text); +static void write_char_option(FILE *f, gchar *label, gchar *text); +static gchar *read_char_option(FILE *f, gchar *option, gchar *label, gchar *value, gchar *text); +static void write_int_option(FILE *f, gchar *label, gint n); +static gint read_int_option(FILE *f, gchar *option, gchar *label, gchar *value, gint n); +static void write_bool_option(FILE *f, gchar *label, gint n); +static gint read_bool_option(FILE *f, gchar *option, gchar *label, gchar *value, gint n); + +/* + *----------------------------------------------------------------------------- + * line write/parse routines (private) + *----------------------------------------------------------------------------- + */ + +static gchar *quoted_value(gchar *text) +{ + gchar *ptr; + gint c = 0; + gint l = strlen(text); + + if (l == 0) return NULL; + + while (c < l && text[c] !='"') c++; + if (text[c] == '"') + { + c++; + ptr = text + c; + while (c < l && text[c] !='"') c++; + if (text[c] == '"') + { + text[c] = '\0'; + if (strlen(ptr) > 0) + { + return g_strdup(ptr); + } + } + } + else + /* for compatibility with older formats (<0.3.7) + * read a line without quotes too */ + { + c = 0; + while (c < l && text[c] !=' ' && text[c] !=8 && text[c] != '\n') c++; + if (c != 0) + { + text[c] = '\0'; + return g_strdup(text); + } + } + + return NULL; +} + +static void write_char_option(FILE *f, gchar *label, gchar *text) +{ + if (text) + fprintf(f,"%s: \"%s\"\n", label, text); + else + fprintf(f,"%s: \n", label); +} + +static gchar *read_char_option(FILE *f, gchar *option, gchar *label, gchar *value, gchar *text) +{ + if (!strcasecmp(option, label)) + { + g_free(text); + text = quoted_value(value); + } + return text; +} + +static void write_int_option(FILE *f, gchar *label, gint n) +{ + fprintf(f,"%s: %d\n\n", label, n); +} + +static gint read_int_option(FILE *f, gchar *option, gchar *label, gchar *value, gint n) +{ + if (!strcasecmp(option, label)) + { + n = strtol(value,NULL,0); + } + return n; +} + +static void write_bool_option(FILE *f, gchar *label, gint n) +{ + fprintf(f,"%s: ", label); + if (n) fprintf(f,"true\n"); else fprintf(f,"false\n"); + fprintf(f,"\n"); +} + +static gint read_bool_option(FILE *f, gchar *option, gchar *label, gchar *value, gint n) +{ + if (!strcasecmp(option, label)) + { + if (!strcasecmp(value, "true")) + n = TRUE; + else + n = FALSE; + } + return n; +} + +/* + *----------------------------------------------------------------------------- + * save configuration (public) + *----------------------------------------------------------------------------- + */ + +void save_options() +{ + FILE *f; + gchar *rc_path; + gint i; + + rc_path = g_strconcat(homedir(), "/", RC_FILE_NAME, NULL); + + f = fopen(rc_path,"w"); + if (!f) + { + printf(_("error saving config file: %s\n"), rc_path); + g_free(rc_path); + return; + } + + fprintf(f,"######################################################################\n"); + fprintf(f,"# GQview config file version %7s #\n", VERSION); + fprintf(f,"# #\n"); + fprintf(f,"# Everything in this file can be changed in the option dialogs. #\n"); + fprintf(f,"# (so there should be no need to edit this file by hand) #\n"); + fprintf(f,"# #\n"); + fprintf(f,"######################################################################\n"); + fprintf(f,"\n"); + fprintf(f,"##### General Options #####\n\n"); + + write_bool_option(f, "enable_startup_path", startup_path_enable); + write_char_option(f, "startup_path", startup_path); + fprintf(f,"\n"); + + fprintf(f,"zoom_mode: "); + if (zoom_mode == ZOOM_RESET_ORIGINAL) fprintf(f,"original\n"); + if (zoom_mode == ZOOM_RESET_FIT_WINDOW) fprintf(f,"fit\n"); + if (zoom_mode == ZOOM_RESET_NONE) fprintf(f,"dont_change\n"); + fprintf(f,"\n"); + + write_bool_option(f, "fit_window_to_image", fit_window); + write_bool_option(f, "limit_window_size", limit_window_size); + write_int_option(f, "max_window_size", max_window_size); + fprintf(f,"\n"); + + write_bool_option(f, "progressive_keyboard_scrolling", progressive_key_scrolling); + fprintf(f,"\n"); + + write_int_option(f, "thumbnail_width", thumb_max_width); + write_int_option(f, "thumbnail_height", thumb_max_height); + write_bool_option(f, "cache_thumbnails", enable_thumb_caching); + write_bool_option(f, "use_xvpics_thumbnails", use_xvpics_thumbnails); + fprintf(f,"\n"); + + write_bool_option(f, "confirm_delete", confirm_delete); + fprintf(f,"\n"); + write_bool_option(f, "tools_float", tools_float); + write_bool_option(f, "tools_hidden", tools_hidden); + write_bool_option(f, "restore_tool_state", restore_tool); + + fprintf(f,"\n##### Slideshow Options #####\n\n"); + + write_int_option(f, "slideshow_delay", slideshow_delay); + + write_bool_option(f, "slideshow_random", slideshow_random); + write_bool_option(f, "slideshow_repeat", slideshow_repeat); + + fprintf(f,"\n##### Filtering Options #####\n\n"); + + write_bool_option(f, "show_dotfiles", show_dot_files); + write_bool_option(f, "disable_filtering", file_filter_disable); + fprintf(f,"\n"); + write_bool_option(f, "filter_ppm", filter_include_ppm); + write_bool_option(f, "filter_png", filter_include_png); + write_bool_option(f, "filter_jpg", filter_include_jpg); + write_bool_option(f, "filter_tif", filter_include_tif); + write_bool_option(f, "filter_pgm", filter_include_pgm); + write_bool_option(f, "filter_xpm", filter_include_xpm); + write_bool_option(f, "filter_gif", filter_include_gif); + write_bool_option(f, "filter_pcx", filter_include_pcx); + write_bool_option(f, "filter_bmp", filter_include_bmp); + fprintf(f,"\n"); + write_char_option(f, "custom_filter", custom_filter); + + fprintf(f,"\n##### External Programs #####\n"); + fprintf(f,"# Maximum of 8 programs (external_1 through external 8)\n"); + fprintf(f,"# format: external_n: \"menu name\" \"command line\"\n\n"); + + for (i=0; i<8; i++) + { + fprintf(f,"external_%d: \"", i+1); + if (editor_name[i]) fprintf(f, editor_name[i]); + fprintf(f, "\" \""); + if (editor_command[i]) fprintf(f, editor_command[i]); + fprintf(f, "\"\n"); + } + + fprintf(f,"\n##### Window Positions #####\n\n"); + + write_bool_option(f, "restore_window_positions", save_window_positions); + fprintf(f,"\n"); + write_int_option(f, "main_window_x", main_window_x); + write_int_option(f, "main_window_y", main_window_y); + write_int_option(f, "main_window_width", main_window_w); + write_int_option(f, "main_window_height", main_window_h); + write_int_option(f, "float_window_x", float_window_x); + write_int_option(f, "float_window_y", float_window_y); + write_int_option(f, "float_window_width", float_window_w); + write_int_option(f, "float_window_height", float_window_h); + + fprintf(f,"######################################################################\n"); + fprintf(f,"# end of GQview config file #\n"); + fprintf(f,"######################################################################\n"); + + fclose(f); + + g_free(rc_path); +} + +/* + *----------------------------------------------------------------------------- + * load configuration (public) + *----------------------------------------------------------------------------- + */ + +void load_options() +{ + FILE *f; + gchar *rc_path; + gchar s_buf[1024]; + gchar *s_buf_ptr; + gchar option[1024]; + gchar value[1024]; + gchar value_all[1024]; + gint c,l,i; + rc_path = g_strconcat(homedir(), "/", RC_FILE_NAME, NULL); + + f = fopen(rc_path,"r"); + if (!f) + { + g_free(rc_path); + return; + } + + while (fgets(s_buf,1024,f)) + { + if (s_buf[0]=='#') continue; + if (s_buf[0]=='\n') continue; + c = 0; + l = strlen(s_buf); + while (s_buf[c] != ':' && c < l) c++; + if (c >= l) continue; + s_buf[c] = '\0'; + c++; + while (s_buf[c] == ' ' && c < l) c++; + while (s_buf[c] == 8 && c < l) c++; + while (s_buf[c] == ' ' && c < l) c++; + s_buf_ptr = s_buf + c; + strcpy(value_all,s_buf_ptr); + while (s_buf[c] != 8 && s_buf[c] != ' ' && s_buf[c] != '\n' && c < l) c++; + s_buf[c] = '\0'; + strcpy(option,s_buf); + strcpy(value,s_buf_ptr); + + /* general options */ + + startup_path_enable = read_bool_option(f, option, + "enable_startup_path", value, startup_path_enable); + startup_path = read_char_option(f, option, + "startup_path", value_all, startup_path); + + if (!strcasecmp(option,"zoom_mode")) + { + if (!strcasecmp(value,"original")) zoom_mode = ZOOM_RESET_ORIGINAL; + if (!strcasecmp(value,"fit")) zoom_mode = ZOOM_RESET_FIT_WINDOW; + if (!strcasecmp(value,"dont_change")) zoom_mode = ZOOM_RESET_NONE; + } + + fit_window = read_bool_option(f, option, + "fit_window_to_image", value, fit_window); + limit_window_size = read_bool_option(f, option, + "limit_window_size", value, limit_window_size); + max_window_size = read_int_option(f, option, + "max_window_size", value, max_window_size); + progressive_key_scrolling = read_bool_option(f, option, + "progressive_keyboard_scrolling", value, progressive_key_scrolling); + + thumb_max_width = read_int_option(f, option, + "thumbnail_width", value, thumb_max_width); + thumb_max_height = read_int_option(f, option, + "thumbnail_height", value, thumb_max_height); + enable_thumb_caching = read_bool_option(f, option, + "cache_thumbnails", value, enable_thumb_caching); + use_xvpics_thumbnails = read_bool_option(f, option, + "use_xvpics_thumbnails", value, use_xvpics_thumbnails); + + confirm_delete = read_bool_option(f, option, + "confirm_delete", value, confirm_delete); + + tools_float = read_bool_option(f, option, + "tools_float", value, tools_float); + tools_hidden = read_bool_option(f, option, + "tools_hidden", value, tools_hidden); + restore_tool = read_bool_option(f, option, + "restore_tool_state", value, restore_tool); + + /* slideshow opitons */ + + slideshow_delay = read_int_option(f, option, + "slideshow_delay", value, slideshow_delay); + slideshow_random = read_bool_option(f, option, + "slideshow_random", value, slideshow_random); + slideshow_repeat = read_bool_option(f, option, + "slideshow_repeat", value, slideshow_repeat); + + /* filtering options */ + + show_dot_files = read_bool_option(f, option, + "show_dotfiles", value, show_dot_files); + file_filter_disable = read_bool_option(f, option, + "disable_filtering", value, file_filter_disable); + + filter_include_ppm = read_bool_option(f, option, + "filter_ppm", value, filter_include_ppm); + filter_include_png = read_bool_option(f, option, + "filter_png", value, filter_include_png); + filter_include_jpg = read_bool_option(f, option, + "filter_jpg", value, filter_include_jpg); + filter_include_tif = read_bool_option(f, option, + "filter_tif", value, filter_include_tif); + filter_include_pgm = read_bool_option(f, option, + "filter_pgm", value, filter_include_pgm); + filter_include_xpm = read_bool_option(f, option, + "filter_xpm", value, filter_include_xpm); + filter_include_gif = read_bool_option(f, option, + "filter_gif", value, filter_include_gif); + filter_include_pcx = read_bool_option(f, option, + "filter_pcx", value, filter_include_pcx); + filter_include_bmp = read_bool_option(f, option, + "filter_bmp", value, filter_include_bmp); + + custom_filter = read_char_option(f, option, + "custom_filter", value_all, custom_filter); + + /* External Programs */ + + if (!strncasecmp(option,"external_",9)) + { + i = strtol(option + 9, NULL, 0); + if (i>0 && i<9) + { + gchar *ptr1, *ptr2; + i--; + c = 0; + l = strlen(value_all); + ptr1 = value_all; + + g_free(editor_name[i]); + editor_name[i] = NULL; + g_free(editor_command[i]); + editor_command[i] = NULL; + + while (cselection; + while(work) + { + list = g_list_prepend(list, work->data); + work = work->next; + } + slide_sel_list = TRUE; + } + list = g_list_reverse(list); + + return list; +} + +static GList *generate_random_list() +{ + GList *src_list = NULL; + GList *list = NULL; + GList *work; + + src_list = generate_list(); + + while(src_list) + { + gint p = (float)rand() / RAND_MAX * g_list_length(src_list); + work = g_list_nth(src_list, p); + list = g_list_prepend(list, work->data); + src_list = g_list_remove(src_list, work->data); + } + + return list; +} + +static void slideshow_init_list() +{ + if (slide_list) + { + g_list_free(slide_list); + } + + if (slideshow_random) + { + slide_list = generate_random_list(); + } + else + { + slide_list = generate_list(); + } +} + +static gint slideshow_should_continue() +{ + if (!slide_active || !slide_list || !slide_path || + slide_count != file_count() || + (slide_img && image_get_path() && strcmp(image_get_path(), slide_img) != 0) || + current_path == NULL || + strcmp(current_path, slide_path) != 0) + { + return FALSE; + } + + return TRUE; +} + +static gint slideshow_loop_cb(gpointer data) +{ + gint row; + gchar *buf; + + if (!slideshow_should_continue()) + { + slideshow_free_all(); + slide_timeout_id = -1; + return FALSE; + } + + row = GPOINTER_TO_INT(slide_list->data); + + g_free(slide_img); + slide_img = NULL; + buf = file_get_path(row); + slide_list = g_list_remove(slide_list, slide_list->data); + + if (!slide_list && slideshow_repeat) + { + slideshow_init_list(); + } + + if (slide_sel_list) + { + image_change_to(buf); + update_status_label(NULL); + } + else + { + file_image_change_to(row); + } + + slide_img = buf; + + if (!slide_list) + { + slideshow_free_all(); + slide_timeout_id = -1; + return FALSE; + } + + return TRUE; +} + +void slideshow_start() +{ + gint row; + gchar *buf; + + if (slide_active) return; + + if (file_count() < 2) return; + + slideshow_init_list(); + if (!slide_list) return; + + row = GPOINTER_TO_INT(slide_list->data); + + slide_active = TRUE; + slide_path = g_strdup(current_path); + slide_count = file_count(); + g_free(slide_img); + slide_img = NULL; + buf = file_get_path(row); + slide_list = g_list_remove(slide_list, slide_list->data); + + if (slide_sel_list) + { + image_change_to(buf); + update_status_label(NULL); + } + else + { + file_image_change_to(row); + } + + slide_img = buf; + + slide_timeout_id = gtk_timeout_add(slideshow_delay * 1000, slideshow_loop_cb, NULL); +} + +void slideshow_stop() +{ + if (!slide_active) return; + + slideshow_free_all(); + if (slide_timeout_id != -1) + { + gtk_timeout_remove(slide_timeout_id); + slide_timeout_id = -1; + } + update_status_label(NULL); +} + +void slideshow_toggle() +{ + if (!slide_active) + { + slideshow_start(); + } + else + { + slideshow_stop(); + } +} + +gint slideshow_is_running() +{ + if (!slide_active) return FALSE; + + if (!slideshow_should_continue()) + { + slideshow_free_all(); + if (slide_timeout_id != -1) + { + gtk_timeout_remove(slide_timeout_id); + slide_timeout_id = -1; + } + return FALSE; + } + + return TRUE; +} + diff --git a/src/tabcomp.c b/src/tabcomp.c new file mode 100644 index 00000000..0d861339 --- /dev/null +++ b/src/tabcomp.c @@ -0,0 +1,629 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" +#include /* for key values */ + +#include "tabcomp.xpm" + +/* ---------------------------------------------------------------- + Tab completion routines, can be connected to any gtkentry widget + using the tab_completion_add_to_entry() function. + Use remove_trailing_slash() to strip the trailing '/'. + ----------------------------------------------------------------*/ + +typedef struct _TabCompData TabCompData; +struct _TabCompData +{ + GtkWidget *entry; + gchar *dir_path; + GList *file_list; + void (*enter_func)(gchar *, gpointer); + void (*tab_func)(gchar *, gpointer); + gpointer enter_data; + gpointer tab_data; + + GtkWidget *combo; + gint has_history; + gchar *history_key; + gint history_levels; +}; + +typedef struct _HistoryData HistoryData; +struct _HistoryData +{ + gchar *key; + GList *list; +}; + +static GList *history_list = NULL; + +static void tab_completion_free_list(TabCompData *td); +static void tab_completion_read_dir(TabCompData *td, gchar *path); +static void tab_completion_destroy(GtkWidget *widget, gpointer data); +static void tab_completion_emit_enter_signal(TabCompData *td); +static void tab_completion_emit_tab_signal(TabCompData *td); +static gint tab_completion_do(TabCompData *td); +static gint tab_completion_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data); +static void tab_completion_button_pressed(GtkWidget *widget, gpointer data); +static GtkWidget *tab_completion_create_complete_button(GtkWidget *window, GtkWidget *entry); + +static void history_list_free(HistoryData *hd); +static HistoryData *history_list_find_by_key(const gchar* key); +static gchar *history_list_find_last_path_by_key(const gchar* key); +static void history_list_free_key(const gchar *key); +static void history_list_add_to_key(const gchar *key, const gchar *path, gint max); + +static void history_list_free(HistoryData *hd) +{ + GList *work; + + if (!hd) return; + + work = hd->list; + while(work) + { + g_free(work->data); + work = work->next; + } + + g_free(hd->key); + g_free(hd); +} + +static HistoryData *history_list_find_by_key(const gchar* key) +{ + GList *work = history_list; + while(work) + { + HistoryData *hd = work->data; + if (strcmp(hd->key, key) == 0) return hd; + work = work->next; + } + return NULL; +} + +static gchar *history_list_find_last_path_by_key(const gchar* key) +{ + HistoryData *hd; + hd = history_list_find_by_key(key); + if (!hd || !hd->list) return NULL; + + return hd->list->data; +} + +static void history_list_free_key(const gchar *key) +{ + HistoryData *hd; + hd = history_list_find_by_key(key); + if (!hd) return; + + history_list = g_list_remove(history_list, hd); + history_list_free(hd); +} + +static void history_list_add_to_key(const gchar *key, const gchar *path, gint max) +{ + HistoryData *hd; + GList *work; + + hd = history_list_find_by_key(key); + if (!hd) + { + hd = g_new(HistoryData, 1); + hd->key = g_strdup(key); + hd->list = NULL; + history_list = g_list_prepend(history_list, hd); + } + + /* if already in the list, simply move it to the top */ + work = hd->list; + while(work) + { + gchar *buf = work->data; + work = work->next; + if (strcmp(buf, path) == 0) + { + hd->list = g_list_remove(hd->list, buf); + hd->list = g_list_prepend(hd->list, buf); + return; + } + } + + hd->list = g_list_prepend(hd->list, g_strdup(path)); + + if (max > 0) + { + while(hd->list && g_list_length(hd->list) > max) + { + GList *work = g_list_last(hd->list); + gchar *buf = work->data; + hd->list = g_list_remove(hd->list, buf); + g_free(buf); + } + } +} + +static void tab_completion_free_list(TabCompData *td) +{ + GList *list; + + g_free(td->dir_path); + td->dir_path = NULL; + + list = td->file_list; + + while(list) + { + g_free(list->data); + list = list->next; + } + + g_list_free(td->file_list); + td->file_list = NULL; +} + +static void tab_completion_read_dir(TabCompData *td, gchar *path) +{ + DIR *dp; + struct dirent *dir; + GList *list = NULL; + + tab_completion_free_list(td); + + if((dp = opendir(path))==NULL) + { + /* dir not found */ + return; + } + while ((dir = readdir(dp)) != NULL) + { + /* skips removed files */ + if (dir->d_ino > 0) + { + gchar *name = dir->d_name; + if (strcmp(name, ".") != 0 && strcmp(name, "..") != 0) + { + list = g_list_prepend(list, g_strdup(name)); + } + } + } + closedir(dp); + + td->dir_path = g_strdup(path); + td->file_list = list; +} + +static void tab_completion_destroy(GtkWidget *widget, gpointer data) +{ + TabCompData *td = data; + tab_completion_free_list(td); + g_free(td->history_key); + g_free(td); +} + +static void tab_completion_emit_enter_signal(TabCompData *td) +{ + gchar *text; + if (!td->enter_func) return; + + text = g_strdup(gtk_entry_get_text(GTK_ENTRY(td->entry))); + + if (text[0] == '~') + { + gchar *t = text; + text = g_strconcat(homedir(), t + 1, NULL); + g_free(t); + } + + td->enter_func(text, td->enter_data); + g_free(text); +} + +static void tab_completion_emit_tab_signal(TabCompData *td) +{ + gchar *text; + if (!td->tab_func) return; + + text = g_strdup(gtk_entry_get_text(GTK_ENTRY(td->entry))); + + if (text[0] == '~') + { + gchar *t = text; + text = g_strconcat(homedir(), t + 1, NULL); + g_free(t); + } + + td->tab_func(text, td->tab_data); + g_free(text); +} + +static gint tab_completion_do(TabCompData *td) +{ + gchar *entry_text = gtk_entry_get_text(GTK_ENTRY(td->entry)); + gchar *entry_file; + gchar *entry_dir; + gchar *ptr; + gint home_exp = FALSE; + + /* home dir expansion */ + if (entry_text[0] == '~') + { + entry_dir = g_strconcat(homedir(), entry_text + 1, NULL); + home_exp = TRUE; + } + else + { + entry_dir = g_strdup(entry_text); + } + + entry_file = filename_from_path(entry_text); + + if (isfile(entry_dir)) + { + if (home_exp) + { + gtk_entry_set_text(GTK_ENTRY(td->entry), entry_dir); + gtk_entry_set_position(GTK_ENTRY(td->entry), strlen(entry_dir)); + } + g_free(entry_dir); + return home_exp; + } + if (isdir(entry_dir) && strcmp(entry_file, ".") != 0 && strcmp(entry_file, "..") != 0) + { + ptr = entry_dir + strlen(entry_dir) - 1; + if (ptr[0] == '/') + { + if (home_exp) + { + gtk_entry_set_text(GTK_ENTRY(td->entry), entry_dir); + gtk_entry_set_position(GTK_ENTRY(td->entry), strlen(entry_dir)); + } + g_free(entry_dir); + return home_exp; + } + else + { + gchar *buf = g_strconcat(entry_dir, "/", NULL); + gtk_entry_set_text(GTK_ENTRY(td->entry), buf); + gtk_entry_set_position(GTK_ENTRY(td->entry), strlen(buf)); + g_free(buf); + g_free(entry_dir); + return TRUE; + } + } + + ptr = filename_from_path(entry_dir); + if (ptr > entry_dir) ptr--; + ptr[0] = '\0'; + + if (strlen(entry_dir) == 0) + { + g_free(entry_dir); + entry_dir = g_strdup("/"); + } + + if (isdir(entry_dir)) + { + GList *list; + GList *poss = NULL; + gint l = strlen(entry_file); + + if (!td->dir_path || !td->file_list || strcmp(td->dir_path, entry_dir) != 0) + { + tab_completion_read_dir(td, entry_dir); + } + + if (strcmp(entry_dir, "/") == 0) entry_dir[0] = '\0'; + + list = td->file_list; + while(list) + { + gchar *file = list->data; + if (strncmp(entry_file, file, l) == 0) + { + poss = g_list_prepend(poss, file); + } + list = list->next; + } + + if (poss) + { + if (!poss->next) + { + gchar *file = poss->data; + gchar *buf; + + buf = g_strconcat(entry_dir, "/", file, NULL); + + if (isdir(buf)) + { + g_free(buf); + buf = g_strconcat(entry_dir, "/", file, "/", NULL); + } + gtk_entry_set_text(GTK_ENTRY(td->entry), buf); + gtk_entry_set_position(GTK_ENTRY(td->entry), strlen(buf)); + g_free(buf); + g_list_free(poss); + g_free(entry_dir); + return TRUE; + } + else + { + gint c = strlen(entry_file); + gint done = FALSE; + gchar *test_file = poss->data; + + while (!done) + { + list = poss; + if (!list) done = TRUE; + while(list && !done) + { + gchar *file = list->data; + if (strlen(file) < c || strncmp(test_file, file, c) != 0) + { + done = TRUE; + } + list = list->next; + } + c++; + } + c -= 2; + if (c > 0) + { + gchar *file; + gchar *buf; + file = g_strdup(test_file); + file[c] = '\0'; + buf = g_strconcat(entry_dir, "/", file, NULL); + gtk_entry_set_text(GTK_ENTRY(td->entry), buf); + gtk_entry_set_position(GTK_ENTRY(td->entry), strlen(buf)); + g_free(file); + g_free(buf); + g_list_free(poss); + g_free(entry_dir); + return TRUE; + } + } + g_list_free(poss); + } + } + + g_free(entry_dir); + + return FALSE; +} + +static gint tab_completion_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data) +{ + TabCompData *td = data; + gint stop_signal = FALSE; + + switch (event->keyval) + { + case GDK_Tab: + if (tab_completion_do(td)) + { + tab_completion_emit_tab_signal(td); + } + stop_signal = TRUE; + break; + case GDK_Return: + tab_completion_emit_enter_signal(td); + stop_signal = TRUE; + break; + default: + break; + } + + if (stop_signal) + { + if (stop_signal) gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "key_press_event"); + return TRUE; + } + + return FALSE; +} + +static void tab_completion_button_pressed(GtkWidget *widget, gpointer data) +{ + TabCompData *td; + GtkWidget *entry = data; + + td = gtk_object_get_data(GTK_OBJECT(entry), "tab_completion_data"); + + if (!td) return; + + if (!GTK_WIDGET_HAS_FOCUS(entry)) + { + gtk_widget_grab_focus(entry); + } + + if (tab_completion_do(td)) + { + tab_completion_emit_tab_signal(td); + } +} + +static GtkWidget *tab_completion_create_complete_button(GtkWidget *window, GtkWidget *entry) +{ + GtkWidget *button; + GtkWidget *icon; + GdkPixmap *pixmap = NULL; + GdkBitmap *mask = NULL; + GtkStyle *style; + + style = gtk_widget_get_style(window); + pixmap = gdk_pixmap_create_from_xpm_d(window->window, &mask, + &style->bg[GTK_STATE_NORMAL], (gchar **)tabcomp_xpm); + + button = gtk_button_new(); + GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_FOCUS); + gtk_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) tab_completion_button_pressed, entry); + + icon = gtk_pixmap_new(pixmap, mask); + gtk_container_add(GTK_CONTAINER(button), icon); + gtk_widget_show(icon); + + return button; +} + +/* + *---------------------------------------------------------------------------- + * public interface + *---------------------------------------------------------------------------- + */ + +GtkWidget *tab_completion_new_with_history(GtkWidget **entry, GtkWidget *window, gchar *text, + const gchar *history_key, gint max_levels, + void (*enter_func)(gchar *, gpointer), gpointer data) +{ + GtkWidget *combo; + GtkWidget *button; + HistoryData *hd; + TabCompData *td; + + combo = gtk_combo_new(); + gtk_combo_set_use_arrows(GTK_COMBO(combo), FALSE); + + button = tab_completion_create_complete_button(window, GTK_COMBO(combo)->entry); + gtk_box_pack_start(GTK_BOX(combo), button, FALSE, FALSE, 0); + gtk_box_reorder_child(GTK_BOX(combo), button, 1); + gtk_widget_show(button); + + tab_completion_add_to_entry(GTK_COMBO(combo)->entry, enter_func, data); + + td = gtk_object_get_data(GTK_OBJECT(GTK_COMBO(combo)->entry), "tab_completion_data"); + if (!td) return; /* this should never happen! */ + + td->combo = combo; + td->has_history = TRUE; + td->history_key = g_strdup(history_key); + td->history_levels = max_levels; + + hd = history_list_find_by_key(td->history_key); + if (hd && hd->list) + { + gtk_combo_set_popdown_strings(GTK_COMBO(combo), hd->list); + } + + if (text) gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry), text); + + if (entry) *entry = GTK_COMBO(combo)->entry; + return combo; +} + +gchar *tab_completion_set_to_last_history(GtkWidget *entry) +{ + TabCompData *td = gtk_object_get_data(GTK_OBJECT(entry), "tab_completion_data"); + gchar *buf; + + if (!td || !td->has_history) return NULL; + + buf = history_list_find_last_path_by_key(td->history_key); + if (buf) + { + gtk_entry_set_text(GTK_ENTRY(td->entry), buf); + } + + return buf; +} + +void tab_completion_append_to_history(GtkWidget *entry, gchar *path) +{ + TabCompData *td = gtk_object_get_data(GTK_OBJECT(entry), "tab_completion_data"); + HistoryData *hd; + + if (!td || !td->has_history) return; + + history_list_add_to_key(td->history_key, path, td->history_levels); + hd = history_list_find_by_key(td->history_key); + if (hd && hd->list) + { + gtk_combo_set_popdown_strings(GTK_COMBO(td->combo), hd->list); + } +} + +GtkWidget *tab_completion_new(GtkWidget **entry, GtkWidget *window, gchar *text, + void (*enter_func)(gchar *, gpointer), gpointer data) +{ + GtkWidget *hbox; + GtkWidget *button; + GtkWidget *newentry; + + hbox = gtk_hbox_new(FALSE, 0); + + newentry = gtk_entry_new(); + if (text) gtk_entry_set_text(GTK_ENTRY(newentry), text); + gtk_box_pack_start(GTK_BOX(hbox), newentry, TRUE, TRUE, 0); + gtk_widget_show(newentry); + + button = tab_completion_create_complete_button(window, newentry); + gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); + gtk_widget_show(button); + + tab_completion_add_to_entry(newentry, enter_func, data); + + if (entry) *entry = newentry; + return hbox; +} + +void tab_completion_add_to_entry(GtkWidget *entry, void (*enter_func)(gchar *, gpointer), gpointer data) +{ + TabCompData *td; + if (!entry) + { + printf("Tab completion error: entry != NULL\n"); + return; + } + + td = g_new0(TabCompData, 1); + td->entry = entry; + td->dir_path = NULL; + td->file_list = NULL; + td->enter_func = enter_func; + td->enter_data = data; + td->tab_func = NULL; + td->tab_data = NULL; + + td->has_history = FALSE; + td->history_key = NULL; + td->history_levels = 0; + + gtk_object_set_data(GTK_OBJECT(td->entry), "tab_completion_data", td); + + gtk_signal_connect(GTK_OBJECT(entry), "key_press_event", + (GtkSignalFunc) tab_completion_key_pressed, td); + gtk_signal_connect(GTK_OBJECT(entry), "destroy", + (GtkSignalFunc) tab_completion_destroy, td); +} + +void tab_completion_add_tab_func(GtkWidget *entry, void (*tab_func)(gchar *, gpointer), gpointer data) +{ + TabCompData *td = gtk_object_get_data(GTK_OBJECT(entry), "tab_completion_data"); + + if (!td) return; + + td->tab_func = tab_func; + td->tab_data = data; +} + +gchar *remove_trailing_slash(gchar *path) +{ + gchar *ret; + gint l; + if (!path) return NULL; + + ret = g_strdup(path); + l = strlen(ret); + if (l > 1 && ret[l - 1] == '/') ret[l - 1] = '\0'; + + return ret; +} + diff --git a/src/tabcomp.xpm b/src/tabcomp.xpm new file mode 100644 index 00000000..e73bf90b --- /dev/null +++ b/src/tabcomp.xpm @@ -0,0 +1,15 @@ +/* XPM */ +static char * tabcomp_xpm[] = { +"10 10 2 1", +" c None", +". c #000000", +" .", +" . .", +" .. .", +" ... .", +"........ .", +"........ .", +" ... .", +" .. .", +" . .", +" ."}; diff --git a/src/thumb.c b/src/thumb.c new file mode 100644 index 00000000..13e1fb2d --- /dev/null +++ b/src/thumb.c @@ -0,0 +1,371 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" +#include "icons/img_unknown.xpm" /* fixme! duplicate, included in image.c too */ + +#define THUMBNAIL_CACHE_DIR "/.gqview_thmb" + +static guchar *load_xv_thumbnail(gchar *filename, gint *widthp, gint *heightp); +static void normalize_thumb(gint *width, gint *height); +static gint get_xv_thumbnail(gchar *thumb_filename, GdkPixmap **thumb_pixmap, GdkBitmap **thumb_mask); + +/* + *----------------------------------------------------------------------------- + * thumbnail routines: creation, caching, and maintenance (public) + *----------------------------------------------------------------------------- + */ + +gint create_thumbnail(gchar *path, GdkPixmap **thumb_pixmap, GdkBitmap **thumb_mask) +{ + gint width, height; + gint space; + GdkImlibImage *thumb = NULL; + GdkImlibImage *image = NULL; + gint cached = FALSE; + + if (debug) printf("Gen thumbnail:%s\n",path); + + /* if xvpics enabled, check for that first */ + if (use_xvpics_thumbnails) + { + space = get_xv_thumbnail(path, thumb_pixmap, thumb_mask); + if (space != -1) + { + if (debug) printf("XV thumbnail found, loaded\n"); + return space; + } + } + + /* start load from cache */ + + if (enable_thumb_caching) + { + gchar *cache_path; + cache_path = g_strconcat(homedir(), THUMBNAIL_CACHE_DIR, path, ".png", NULL); + + if (isfile(cache_path) && filetime(cache_path) >= filetime(path)) + { + if (debug) printf("Found in cache:%s\n", path); + image = gdk_imlib_load_image(cache_path); + if (image && image->rgb_width != thumb_max_width && image->rgb_height != thumb_max_height) + { + if (debug) printf("Thumbnail size may have changed, reloading:%s\n", path); + unlink(cache_path); + gdk_imlib_destroy_image(image); + image = gdk_imlib_load_image(path); + } + else + { + cached = TRUE; + } + } + else + image = gdk_imlib_load_image(path); + + } + else + image = gdk_imlib_load_image(path); + + if (!image) + { + image = gdk_imlib_create_image_from_xpm_data((gchar **)img_unknown_xpm); + cached = TRUE; /* no need to save a thumbnail of the unknown pixmap */ + } + + if (image) + { + if (image->rgb_width > thumb_max_width || image->rgb_height > thumb_max_height) + { + if (((float)thumb_max_width / image->rgb_width) < ((float)thumb_max_height / image->rgb_height)) + { + width = thumb_max_width; + height = (float)width / image->rgb_width * image->rgb_height; + if (height < 1) height = 1; + } + else + { + height = thumb_max_height; + width = (float)height / image->rgb_height * image->rgb_width; + if (width < 1) width = 1; + } + } + else + { + width = image->rgb_width; + height = image->rgb_height; + cached = TRUE; /* don't cache images smaller than thumbnail size */ + } + if (*thumb_pixmap) gdk_imlib_free_pixmap(*thumb_pixmap); + *thumb_pixmap = NULL; + *thumb_mask = NULL; + + /* start save cache */ + + if (enable_thumb_caching && !cached) + { + gchar *thumb_path; + gchar *base_dir; + gchar *thumb_dir; + gchar *image_dir; + + /* attempt at speed-up? move this here */ + thumb = gdk_imlib_clone_scaled_image(image, width, height); + gdk_imlib_destroy_image(image); + image = NULL; + + base_dir = g_strconcat(homedir(), THUMBNAIL_CACHE_DIR, NULL); + if (!isdir(base_dir)) + { + if (debug) printf("creating thumbnail dir:%s\n", base_dir); + if (mkdir(base_dir, 0755) < 0) + printf(_("create dir failed: %s\n"), base_dir); + } + + image_dir = remove_level_from_path(path); + thumb_dir = g_strconcat(base_dir, image_dir, NULL); + g_free(image_dir); + if (!isdir(thumb_dir)) + { + gchar *p = thumb_dir; + while (p[0] != '\0') + { + p++; + if (p[0] == '/' || p[0] == '\0') + { + gint end = TRUE; + if (p[0] != '\0') + { + p[0] = '\0'; + end = FALSE; + } + if (!isdir(thumb_dir)) + { + if (debug) printf("creating sub dir:%s\n",thumb_dir); + if (mkdir(thumb_dir, 0755) < 0) + printf(_("create dir failed: %s\n"), thumb_dir); + } + if (!end) p[0] = '/'; + } + } + } + g_free(thumb_dir); + + thumb_path = g_strconcat(base_dir, path, ".png", NULL); + if (debug) printf("Saving thumb: %s\n",thumb_path); + + gdk_imlib_save_image(thumb, thumb_path, NULL); + + g_free(base_dir); + g_free(thumb_path); + } + else + { + thumb = image; + } + + /* end save cache */ + + gdk_imlib_render(thumb, width, height); + *thumb_pixmap = gdk_imlib_move_image(thumb); + *thumb_mask = gdk_imlib_move_mask(thumb); + if (*thumb_pixmap) + space = thumb_max_width - width; + gdk_imlib_destroy_image(thumb); + thumb = NULL; + } + else + { + space = -1; + } + return space; +} + +gint maintain_thumbnail_dir(gchar *dir, gint recursive) +{ + gchar *thumb_dir; + gint base_length; + gint still_have_a_file = FALSE; + + if (debug) printf("maintainance check: %s\n", dir); + + base_length = strlen(homedir()) + strlen(THUMBNAIL_CACHE_DIR); + thumb_dir = g_strconcat(homedir(), THUMBNAIL_CACHE_DIR, dir, NULL); + + if (isdir(thumb_dir)) + { + DIR *dp; + struct dirent *dirent; + struct stat ent_sbuf; + + if((dp = opendir(thumb_dir))==NULL) + { + /* dir not found */ + g_free(thumb_dir); + return FALSE; + } + + while ((dirent = readdir(dp)) != NULL) + { + /* skips removed files */ + if (dirent->d_ino > 0) + { + int l = 0; + gchar *path_buf; + if (strcmp(dirent->d_name, ".") == 0 || strcmp(dirent->d_name, "..") == 0) + continue; + path_buf = g_strconcat(thumb_dir, "/", dirent->d_name, NULL); + if (strlen(path_buf) > 4) l = strlen(path_buf) - 4; + + if (stat(path_buf,&ent_sbuf) >= 0 && S_ISDIR(ent_sbuf.st_mode)) + { + /* recurse dir then delete it */ + gchar *rdir = g_strconcat(dir, "/", dirent->d_name, NULL); + if (recursive && !maintain_thumbnail_dir(rdir, TRUE)) + { + if (debug) printf("Deleting thumb dir: %s\n",path_buf); + if ( (rmdir (path_buf) < 0) ) + printf(_("Unable to delete dir: %s\n"), path_buf); + } + else + still_have_a_file = TRUE; + g_free(rdir); + } + else + { + gchar *fp = path_buf + l; + fp[0] = '\0'; + if (strlen(path_buf) > base_length && + !isfile(path_buf + base_length)) + { + fp[0] = '.'; + if (debug) printf("Deleting thumb: %s\n",path_buf); + if ( (unlink (path_buf) < 0) ) + printf(_("failed to delete:%s\n"),path_buf); + } + else + still_have_a_file = TRUE; + } + g_free(path_buf); + } + } + closedir(dp); + } + g_free(thumb_dir); + return still_have_a_file; +} + +/* + *----------------------------------------------------------------------------- + * xvpics thumbnail support, read-only (private) + *----------------------------------------------------------------------------- + */ + +/* + * xvpics code originally supplied by: + * "Diederen Damien" + * + * Note: Code has been modified to fit the style of the other code, and to use + * a few more glib-isms. + */ + +#define XV_BUFFER 2048 +static guchar *load_xv_thumbnail(gchar *filename, gint *widthp, gint *heightp) +{ + FILE *file; + gchar buffer[XV_BUFFER]; + guchar *data; + gint width, height, depth; + + file = fopen(filename, "rt"); + if(!file) return NULL; + + fgets(buffer, XV_BUFFER, file); + if(strncmp(buffer, "P7 332", 6) != 0) + { + fclose(file); + return NULL; + } + + while(fgets(buffer, XV_BUFFER, file) && buffer[0] == '#') /* do_nothing() */; + + if(sscanf(buffer, "%d %d %d", &width, &height, &depth) != 3) + { + fclose(file); + return NULL; + } + + data = g_new(guchar, width * height); + fread(data, 1, width * height, file); + + fclose(file); + *widthp = width; + *heightp = height; + return data; +} +#undef XV_BUFFER + +static void normalize_thumb(gint *width, gint *height) +{ + if(*width > thumb_max_width || *height > thumb_max_height) + { + gfloat factor = MAX((gfloat) *width / thumb_max_width, (gfloat) *height / thumb_max_height); + *width = (gfloat) *width / factor; + *height = (gfloat) *height / factor; + } +} + +static gint get_xv_thumbnail(gchar *thumb_filename, GdkPixmap **thumb_pixmap, GdkBitmap **thumb_mask) +{ + gint width, height; + gchar *thumb_name; + gchar *tmp_string; + gchar *last_slash; + guchar *packed_data; + + tmp_string = g_strdup(thumb_filename); + last_slash = strrchr(tmp_string, '/'); + if(!last_slash) return -1; + *last_slash++ = '\0'; + + thumb_name = g_strconcat(tmp_string, "/.xvpics/", last_slash, NULL); + packed_data = load_xv_thumbnail(thumb_name, &width, &height); + g_free(tmp_string); + g_free(thumb_name); + + if(packed_data) + { + guchar *rgb_data; + GdkImlibImage *image; + gint i; + + rgb_data = g_new(guchar, width * height * 3); + for(i = 0; i < width * height; i++) + { + rgb_data[i * 3 + 0] = (packed_data[i] >> 5) * 36; + rgb_data[i * 3 + 1] = ((packed_data[i] & 28) >> 2) * 36; + rgb_data[i * 3 + 2] = (packed_data[i] & 3) * 85; + } + + g_free(packed_data); + image = gdk_imlib_create_image_from_data(rgb_data, NULL, width, height); + g_free(rgb_data); + normalize_thumb(&width, &height); + gdk_imlib_render(image, width, height); + + if(*thumb_pixmap) gdk_imlib_free_pixmap(*thumb_pixmap); + + *thumb_pixmap = gdk_imlib_move_image(image); + *thumb_mask = gdk_imlib_move_mask(image); + gdk_imlib_destroy_image(image); + return thumb_max_width - width; + } + + return -1; +} + diff --git a/src/utildlg.c b/src/utildlg.c new file mode 100644 index 00000000..29035d2b --- /dev/null +++ b/src/utildlg.c @@ -0,0 +1,226 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" + +static void warning_dialog_close(GtkWidget *w, gpointer data); +static void warning_dialog_destroy(GtkWidget *w, GdkEvent *event, gpointer data); + +static void confirm_dialog_click_cb(GtkWidget *w, gpointer data); +static void confirm_dialog_delete_cb(GtkWidget *w, GdkEvent *event, gpointer data); + +static void generic_dialog_delete_cb(GtkWidget *widget, GdkEvent *event, gpointer data); + + +/* + *----------------------------------------------------------------------------- + * warning dialog routines + *----------------------------------------------------------------------------- + */ + +static void warning_dialog_close(GtkWidget *w, gpointer data) +{ + GtkWidget *warning_window = data; + gtk_widget_destroy(warning_window); +} + +static void warning_dialog_destroy(GtkWidget *w, GdkEvent *event, gpointer data) +{ + warning_dialog_close(NULL, data); +} + +void warning_dialog(gchar *title, gchar *message) +{ + GtkWidget *warning_window; + GtkWidget *hbox; + GtkWidget *vbox; + GtkWidget *label; + GtkWidget *button; + + warning_window = gtk_window_new(GTK_WINDOW_DIALOG); + gtk_signal_connect (GTK_OBJECT (warning_window), "delete_event",(GtkSignalFunc) warning_dialog_destroy, warning_window); + gtk_window_set_policy (GTK_WINDOW(warning_window), FALSE, FALSE, TRUE); + gtk_window_set_title (GTK_WINDOW (warning_window), title); + gtk_container_border_width (GTK_CONTAINER (warning_window), 10); + + vbox = gtk_vbox_new(FALSE, 5); + gtk_container_add(GTK_CONTAINER(warning_window),vbox); + gtk_widget_show(vbox); + + label = gtk_label_new(message); + gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); + gtk_widget_show(label); + + label = gtk_hseparator_new(); + gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); + gtk_widget_show(label); + + hbox = gtk_hbox_new(TRUE, 5); + gtk_container_add(GTK_CONTAINER(vbox),hbox); + gtk_widget_show(hbox); + + button = gtk_button_new_with_label(_(" Ok ")); + gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) warning_dialog_close, warning_window); + gtk_box_pack_start(GTK_BOX(hbox),button,FALSE,FALSE,0); + gtk_widget_show(button); + + gtk_widget_show(warning_window); +} + +/* + *----------------------------------------------------------------------------- + * confirmation dialog + *----------------------------------------------------------------------------- + */ + +static void confirm_dialog_click_cb(GtkWidget *w, gpointer data) +{ + ConfirmDialog *cd = data; + gtk_widget_destroy(cd->dialog); + g_free(cd); +} + +static void confirm_dialog_delete_cb(GtkWidget *w, GdkEvent *event, gpointer data) +{ + ConfirmDialog *cd = data; + cd->cancel_cb(NULL, cd->data); + confirm_dialog_click_cb(w, data); +} + +void confirm_dialog_add(ConfirmDialog *cd, gchar *text, void (*func_cb)(GtkWidget *, gpointer)) +{ + GtkWidget *button; + button = gtk_button_new_with_label(text); + gtk_signal_connect(GTK_OBJECT(button), "clicked", func_cb, cd->data); + gtk_signal_connect(GTK_OBJECT(button), "clicked", confirm_dialog_click_cb, cd); + gtk_box_pack_end(GTK_BOX(cd->hbox), button, TRUE, TRUE, 0); + gtk_widget_grab_focus(button); + gtk_widget_show(button); +} + +ConfirmDialog *confirm_dialog_new(gchar *title, gchar *message, void (*cancel_cb)(GtkWidget *, gpointer), gpointer data) +{ + ConfirmDialog *cd; + GtkWidget *vbox; + GtkWidget *label; + + cd = g_new0(ConfirmDialog, 1); + cd->data = data; + cd->cancel_cb = cancel_cb; + + cd->dialog = gtk_window_new(GTK_WINDOW_DIALOG); + gtk_signal_connect (GTK_OBJECT (cd->dialog), "delete_event", confirm_dialog_delete_cb, cd); + gtk_window_set_policy (GTK_WINDOW(cd->dialog), FALSE, FALSE, TRUE); + gtk_window_set_title (GTK_WINDOW (cd->dialog), title); + gtk_container_border_width (GTK_CONTAINER (cd->dialog), 10); + + vbox = gtk_vbox_new(FALSE, 15); + gtk_container_add(GTK_CONTAINER(cd->dialog),vbox); + gtk_widget_show(vbox); + + label = gtk_label_new(message); + gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); + gtk_widget_show(label); + + label = gtk_hseparator_new(); + gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); + gtk_widget_show(label); + + cd->hbox = gtk_hbox_new(TRUE, 15); + gtk_container_add(GTK_CONTAINER(vbox),cd->hbox); + gtk_widget_show(cd->hbox); + + gtk_widget_show(cd->dialog); + + confirm_dialog_add(cd, _("Cancel"), cd->cancel_cb); + + return cd; +} + +/* + *----------------------------------------------------------------------------- + * generic file ops dialog routines + *----------------------------------------------------------------------------- + */ + +void generic_dialog_close(GtkWidget *widget, gpointer data) +{ + FileDialog *fd = data; + if(fd->dialog) gtk_widget_destroy(fd->dialog); + g_free(fd->source_path); + g_free(fd->dest_path); + if (fd->source_list) free_selected_list(fd->source_list); + g_free(fd); +} + +static void generic_dialog_delete_cb(GtkWidget *widget, GdkEvent *event, gpointer data) +{ + generic_dialog_close(NULL, data); +} + +FileDialog *generic_dialog_new(gchar *title, gchar *text, gchar *btn1, gchar *btn2, + void (*btn1_cb)(GtkWidget *, gpointer), + void (*btn2_cb)(GtkWidget *, gpointer)) +{ + FileDialog *fd = NULL; + GtkWidget *button; + GtkWidget *hbox; + GtkWidget *label; + + fd = g_new0(FileDialog, 1); + + fd->dialog = gtk_window_new(GTK_WINDOW_DIALOG); + gtk_signal_connect (GTK_OBJECT (fd->dialog), "delete_event", (GtkSignalFunc)generic_dialog_delete_cb, fd); + gtk_window_set_policy (GTK_WINDOW(fd->dialog), FALSE, TRUE, FALSE); + gtk_window_set_title (GTK_WINDOW (fd->dialog), title); + gtk_container_border_width (GTK_CONTAINER (fd->dialog), 10); + + fd->vbox = gtk_vbox_new(FALSE,5); + gtk_container_add (GTK_CONTAINER(fd->dialog), fd->vbox); + gtk_widget_show(fd->vbox); + + if (text) + { + label = gtk_label_new(text); + gtk_box_pack_start(GTK_BOX(fd->vbox), label, FALSE, FALSE, 0); + gtk_widget_show(label); + } + + if (btn1_cb || btn2_cb) + { + GtkWidget *sep; + hbox = gtk_hbox_new(TRUE, 15); + gtk_box_pack_end(GTK_BOX(fd->vbox), hbox, FALSE, FALSE, 5); + gtk_widget_show(hbox); + + sep = gtk_hseparator_new(); + gtk_box_pack_end(GTK_BOX(fd->vbox), sep, FALSE, FALSE, 0); + gtk_widget_show(sep); + } + + if (btn1_cb) + { + button = gtk_button_new_with_label(btn1); + gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) btn1_cb, fd); + gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0); + gtk_widget_grab_focus(button); + gtk_widget_show(button); + } + + if (btn2_cb) + { + button = gtk_button_new_with_label(btn2); + gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) btn2_cb, fd); + gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0); + gtk_widget_show(button); + } + + gtk_widget_show(fd->dialog); + return fd; +} + diff --git a/src/utildlg.h b/src/utildlg.h new file mode 100644 index 00000000..bd8ab5b9 --- /dev/null +++ b/src/utildlg.h @@ -0,0 +1,44 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +typedef struct _FileDialog FileDialog; +struct _FileDialog +{ + gint type; + gint multiple_files; + + GtkWidget *dialog; + GtkWidget *vbox; + GtkWidget *entry; + + gchar *source_path; + GList *source_list; + + gchar *dest_path; +}; + +typedef struct _ConfirmDialog ConfirmDialog; +struct _ConfirmDialog +{ + GtkWidget *dialog; + GtkWidget *hbox; + void (*cancel_cb)(GtkWidget *, gpointer); + gpointer data; +}; + + +void warning_dialog(gchar *title, gchar *message); + +ConfirmDialog *confirm_dialog_new(gchar *title, gchar *message, void (*cancel_cb)(GtkWidget *, gpointer), gpointer data); +void confirm_dialog_add(ConfirmDialog *cd, gchar *text, void (*func_cb)(GtkWidget *, gpointer)); + +FileDialog *generic_dialog_new(gchar *title, gchar *text, gchar *btn1, gchar *btn2, + void (*btn1_cb)(GtkWidget *, gpointer), + void (*btn2_cb)(GtkWidget *, gpointer)); +void generic_dialog_close(GtkWidget *widget, gpointer data); + diff --git a/src/utilops.c b/src/utilops.c new file mode 100644 index 00000000..29d0c991 --- /dev/null +++ b/src/utilops.c @@ -0,0 +1,961 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" + +enum { + DIALOG_NEW_DIR, + DIALOG_COPY, + DIALOG_MOVE, + DIALOG_DELETE, + DIALOG_RENAME +}; + +typedef struct _FileDataMult FileDataMult; +struct _FileDataMult +{ + gint confirm_all; + gint confirmed; + gint skip; + GList *source_list; + GList *source_next; + gchar *dest_base; + gchar *source; + gchar *dest; + gint copy; +}; + +typedef struct _FileDataSingle FileDataSingle; +struct _FileDataSingle +{ + gint confirmed; + gchar *source; + gchar *dest; + gint copy; +}; + +static FileDataMult *file_data_multiple_new(GList *source_list, gchar *dest, gint copy); +static void file_data_multiple_free(FileDataMult *fdm); +static void file_util_move_multiple(FileDataMult *fdm); +static void file_util_move_multiple_ok_cb(GtkWidget *widget, gpointer data); +static void file_util_move_multiple_all_cb(GtkWidget *widget, gpointer data); +static void file_util_move_multiple_skip_cb(GtkWidget *widget, gpointer data); +static void file_util_move_multiple_cancel_cb(GtkWidget *widget, gpointer data); +static void file_util_move_multiple(FileDataMult *fdm); + +static FileDataSingle *file_data_single_new(gchar *source, gchar *dest, gint copy); +static void file_data_single_free(FileDataSingle *fds); +static void file_util_move_single_ok_cb(GtkWidget *widget, gpointer data); +static void file_util_move_single(FileDataSingle *fds); +static void file_util_move_single_cancel_cb(GtkWidget *widget, gpointer data); +static void file_util_move_do(FileDialog *fd); +static void file_util_move_check(FileDialog *fd); +static void file_util_move_cb(GtkWidget *widget, gpointer data); +static void file_util_move_enter_cb(gchar *path, gpointer data); +static void file_util_move_completion_sync_cb(gchar *path, gpointer data); +static void real_file_util_move(gchar *source_path, GList *source_list, gchar *dest_path, gint copy); + +static void file_util_delete_multiple_ok_cb(GtkWidget *w, gpointer data); +static void file_util_delete_multiple_cancel_cb(GtkWidget *w, gpointer data); +static void file_util_delete_multiple(GList *source_list); +static void file_util_delete_ok_cb(GtkWidget *w, gpointer data); +static void file_util_delete_cancel_cb(GtkWidget *w, gpointer data); +static void file_util_delete_single(gchar *path); + +static void file_util_rename_multiple_ok_cb(GtkWidget *w, gpointer data); +static void file_util_rename_multiple_cancel_cb(GtkWidget *w, gpointer data); +static void file_util_rename_multiple(FileDialog *fd); +static void file_util_rename_multiple_cb(GtkWidget *w, gpointer data); +static void file_util_rename_multiple_select_cb(GtkWidget *clist, + gint row, gint column, GdkEventButton *bevent, gpointer data); +static void file_util_rename_multiple_do(GList *source_list); + +static void file_util_rename_single_ok_cb(GtkWidget *w, gpointer data); +static void file_util_rename_single_cancel_cb(GtkWidget *w, gpointer data); +static void file_util_rename_single(FileDataSingle *fds); +static void file_util_rename_single_cb(GtkWidget *w, gpointer data); +static void file_util_rename_single_do(gchar *source_path); + +static void file_util_create_dir_do(gchar *source, gchar *path); +static void file_util_create_dir_cb(GtkWidget *w, gpointer data); + +/* + *-------------------------------------------------------------------------- + * Move and Copy routines + *-------------------------------------------------------------------------- + */ + +/* + * Multi file move + */ + +static FileDataMult *file_data_multiple_new(GList *source_list, gchar *dest, gint copy) +{ + FileDataMult *fdm = g_new0(FileDataMult, 1); + fdm->confirm_all = FALSE; + fdm->confirmed = FALSE; + fdm->skip = FALSE; + fdm->source_list = source_list; + fdm->source_next = fdm->source_list; + fdm->dest_base = g_strdup(dest); + fdm->source = NULL; + fdm->dest = NULL; + fdm->copy = copy; + return fdm; +} + +static void file_data_multiple_free(FileDataMult *fdm) +{ + free_selected_list(fdm->source_list); + g_free(fdm->dest_base); + g_free(fdm->dest); + g_free(fdm); +} + +static void file_util_move_multiple_ok_cb(GtkWidget *widget, gpointer data) +{ + FileDataMult *fdm = data; + fdm->confirmed = TRUE; + file_util_move_multiple(fdm); +} + +static void file_util_move_multiple_all_cb(GtkWidget *widget, gpointer data) +{ + FileDataMult *fdm = data; + fdm->confirm_all = TRUE; + file_util_move_multiple(fdm); +} + +static void file_util_move_multiple_skip_cb(GtkWidget *widget, gpointer data) +{ + FileDataMult *fdm = data; + fdm->skip = TRUE; + file_util_move_multiple(fdm); +} + +static void file_util_move_multiple_cancel_cb(GtkWidget *widget, gpointer data) +{ + FileDataMult *fdm = data; + file_data_multiple_free(fdm); +} + +static void file_util_move_multiple(FileDataMult *fdm) +{ + while (fdm->dest || fdm->source_next) + { + if (!fdm->dest) + { + GList *work = fdm->source_next; + fdm->source = work->data; + fdm->dest = g_strconcat(fdm->dest_base, "/", filename_from_path(fdm->source), NULL); + fdm->source_next = work->next; + } + + if (isfile(fdm->dest) && !fdm->confirmed && !fdm->confirm_all && !fdm->skip) + { + ConfirmDialog *cd; + gchar *text = g_strdup_printf(_("Overwrite file:\n %s\n with:\b %s"), fdm->dest, fdm->source); + cd = confirm_dialog_new(_("Overwrite file"), text, file_util_move_multiple_cancel_cb, fdm); + confirm_dialog_add(cd, _("Skip"), file_util_move_multiple_skip_cb); + confirm_dialog_add(cd, _("Yes to all"), file_util_move_multiple_all_cb); + confirm_dialog_add(cd, _("Yes"), file_util_move_multiple_ok_cb); + g_free(text); + return; + } + else + { + gint success = FALSE; + if (fdm->skip) + { + success = TRUE; + fdm->skip = FALSE; + } + else + { + if (fdm->copy) + { + success = copy_file(fdm->source, fdm->dest); + } + else + { + if (move_file(fdm->source, fdm->dest)) + { + success = TRUE; + file_is_gone(fdm->source, fdm->source_list); + } + } + } + if (!success) + { + ConfirmDialog *cd; + gchar *title; + gchar *text; + if (fdm->copy) + { + title = _("Error copying file"); + text = g_strdup_printf(_("Unable to copy file:\n%sto:\n%s\n during multiple file copy."), fdm->source, fdm->dest); + } + else + { + title = _("Error moving file"); + text = g_strdup_printf(_("Unable to move file:\n%sto:\n%s\n during multiple file move."), fdm->source, fdm->dest); + } + cd = confirm_dialog_new(title, text, file_util_move_multiple_cancel_cb, fdm); + confirm_dialog_add(cd, _("Continue"), file_util_move_multiple_skip_cb); + g_free(text); + return; + } + fdm->confirmed = FALSE; + g_free(fdm->dest); + fdm->dest = NULL; + } + } + + file_data_multiple_free(fdm); +} + +/* + * Single file move + */ + +static FileDataSingle *file_data_single_new(gchar *source, gchar *dest, gint copy) +{ + FileDataSingle *fds = g_new0(FileDataSingle, 1); + fds->confirmed = FALSE; + fds->source = g_strdup(source); + fds->dest = g_strdup(dest); + fds->copy = copy; + return fds; +} + +static void file_data_single_free(FileDataSingle *fds) +{ + g_free(fds->source); + g_free(fds->dest); + g_free(fds); +} + +static void file_util_move_single_ok_cb(GtkWidget *widget, gpointer data) +{ + FileDataSingle *fds = data; + fds->confirmed = TRUE; + file_util_move_single(fds); +} + +static void file_util_move_single_cancel_cb(GtkWidget *widget, gpointer data) +{ + FileDataSingle *fds = data; + file_data_single_free(fds); +} + +static void file_util_move_single(FileDataSingle *fds) +{ + if (isfile(fds->dest) && !fds->confirmed) + { + ConfirmDialog *cd; + gchar *text = g_strdup_printf(_("Overwrite file:\n%s\n with:\n%s"), fds->dest, fds->source); + cd = confirm_dialog_new(_("Overwrite file"), text, file_util_move_single_cancel_cb, fds); + confirm_dialog_add(cd, _("Overwrite"), file_util_move_single_ok_cb); + g_free(text); + return; + } + else + { + gint success = FALSE; + if (fds->copy) + { + success = copy_file(fds->source, fds->dest); + } + else + { + if (move_file(fds->source, fds->dest)) + { + success = TRUE; + file_is_gone(fds->source, NULL); + } + } + if (!success) + { + gchar *title; + gchar *text; + if (fds->copy) + { + title = _("Error copying file"); + text = g_strdup_printf(_("Unable to copy file:\n%s\nto:\n%s"), fds->source, fds->dest); + } + else + { + title = _("Error moving file"); + text = g_strdup_printf(_("Unable to move file:\n%s\nto:\n%s"), fds->source, fds->dest); + } + warning_dialog(title, text); + g_free(text); + } + file_data_single_free(fds); + } +} + +/* + * file move dialog + */ + +static void file_util_move_do(FileDialog *fd) +{ + tab_completion_append_to_history(fd->entry, fd->dest_path); + if (fd->multiple_files) + { + file_util_move_multiple(file_data_multiple_new(fd->source_list, fd->dest_path, fd->type)); + fd->source_list = NULL; + } + else + { + if (isdir(fd->dest_path)) + { + gchar *buf = g_strconcat(fd->dest_path, "/", filename_from_path(fd->source_path), NULL); + g_free(fd->dest_path); + fd->dest_path = buf; + } + file_util_move_single(file_data_single_new(fd->source_path, fd->dest_path, fd->type)); + } + + generic_dialog_close(NULL, fd); +} + +static void file_util_move_check(FileDialog *fd) +{ + g_free(fd->dest_path); + fd->dest_path = remove_trailing_slash(gtk_entry_get_text(GTK_ENTRY(fd->entry))); + + if (fd->multiple_files && !isdir(fd->dest_path)) + { + if (isfile(fd->dest_path)) + warning_dialog(_("Invalid destination"), _("When operating with multiple files, please select\n a directory, not file.")); + else + warning_dialog(_("Invalid directory"), _("Please select an existing directory")); + return; + } + + file_util_move_do(fd); +} + +static void file_util_move_cb(GtkWidget *widget, gpointer data) +{ + FileDialog *fd = data; + file_util_move_check(fd); +} + +static void file_util_move_enter_cb(gchar *path, gpointer data) +{ + FileDialog *fd = data; + file_util_move_check(fd); +} + +static void file_util_move_completion_sync_cb(gchar *path, gpointer data) +{ + FileDialog *fd = data; + destination_widget_sync_to_entry(fd->entry); +} + +static void real_file_util_move(gchar *source_path, GList *source_list, gchar *dest_path, gint copy) +{ + FileDialog *fd; + gchar *path = NULL; + gint multiple; + gchar *text; + gchar *title; + gchar *op_text; + GtkWidget *tabcomp; + GtkWidget *dest; + gchar *last_path; + + if (!source_path && !source_list) return; + + if (source_path) + { + path = g_strdup(source_path); + multiple = FALSE; + } + else if (source_list->next) + { + multiple = TRUE; + } + else + { + path = g_strdup(source_list->data); + free_selected_list(source_list); + source_list = NULL; + multiple = FALSE; + } + + if (copy) + { + title = _("GQview - copy"); + op_text = _("Copy"); + if (path) + text = g_strdup_printf(_("Copy file:\n%s\nto:"), path); + else + text = g_strdup_printf(_("Copy multiple files from:\n%s\nto:"), dest_path); + } + else + { + title = _("GQview - move"); + op_text = _("Move"); + if (path) + text = g_strdup_printf(_("Move file:\n%s\nto:"), path); + else + text = g_strdup_printf(_("Move multiple files from:\n%s\nto:"), dest_path); + } + + fd = generic_dialog_new(title, text, op_text, _("Cancel"), + file_util_move_cb, generic_dialog_close); + + g_free(text); + + fd->type = copy; + fd->source_path = path; + fd->source_list = source_list; + fd->multiple_files = multiple; + + tabcomp = tab_completion_new_with_history(&fd->entry, fd->dialog, dest_path, + "move_copy", 32, file_util_move_enter_cb, fd); + last_path = tab_completion_set_to_last_history(fd->entry); + if (last_path) + { + fd->dest_path = g_strdup(last_path); + } + else + { + fd->dest_path = g_strdup(dest_path); + } + +/* tabcomp = tab_completion_new(&fd->entry, fd->dialog, fd->dest_path, file_util_move_enter_cb, fd); +*/ + gtk_box_pack_start(GTK_BOX(fd->vbox), tabcomp, FALSE, FALSE, 0); + gtk_widget_show(tabcomp); + + gtk_widget_grab_focus(fd->entry); + + dest = destination_widget_new(fd->dest_path, fd->entry); + + tab_completion_add_tab_func(fd->entry, file_util_move_completion_sync_cb, fd); + + gtk_box_pack_start(GTK_BOX(fd->vbox), dest, TRUE, TRUE, 0); +} + +void file_util_move(gchar *source_path, GList *source_list, gchar *dest_path) +{ + real_file_util_move(source_path, source_list, dest_path, FALSE); +} + +void file_util_copy(gchar *source_path, GList *source_list, gchar *dest_path) +{ + real_file_util_move(source_path, source_list, dest_path, TRUE); +} + +/* + *-------------------------------------------------------------------------- + * Delete routines + *-------------------------------------------------------------------------- + */ + +/* + * delete multiple files + */ + +static void file_util_delete_multiple_ok_cb(GtkWidget *w, gpointer data) +{ + GList *source_list = data; + + while(source_list) + { + gchar *path = source_list->data; + source_list = g_list_remove(source_list, path); + if (unlink (path) < 0) + { + ConfirmDialog *cd; + gchar *text; + if (source_list) + { + text = g_strdup_printf(_("Unable to delete file:\n %s\n Continue multiple delete operation?"), path); + cd = confirm_dialog_new(_("Delete failed"), text, file_util_delete_multiple_cancel_cb, source_list); + confirm_dialog_add(cd, _("Continue"), file_util_delete_multiple_ok_cb); + } + else + { + text = g_strdup_printf(_("Unable to delete file:\n%s"), path); + warning_dialog(_("Delete failed"), text); + } + g_free(text); + g_free(path); + return; + } + else + { + file_is_gone(path, source_list); + } + g_free(path); + } +} + +static void file_util_delete_multiple_cancel_cb(GtkWidget *w, gpointer data) +{ + GList *source_list = data; + free_selected_list(source_list); +} + +static void file_util_delete_multiple(GList *source_list) +{ + if (!confirm_delete) + { + file_util_delete_multiple_ok_cb(NULL, source_list); + } + else + { + ConfirmDialog *cd; + cd = confirm_dialog_new(_("Delete files"), _("About to delete multiple files..."), file_util_delete_multiple_cancel_cb, source_list); + confirm_dialog_add(cd, _("Delete"), file_util_delete_multiple_ok_cb); + } +} + +/* + * delete single file + */ + +static void file_util_delete_ok_cb(GtkWidget *w, gpointer data) +{ + gchar *path = data; + + if (unlink (path) < 0) + { + gchar *text = g_strdup_printf(_("Unable to delete file:\n%s"), path); + warning_dialog(_("File deletion failed"), text); + g_free(text); + } + else + { + file_is_gone(path, NULL); + } + + g_free(path); +} + +static void file_util_delete_cancel_cb(GtkWidget *w, gpointer data) +{ + gchar *path = data; + g_free(path); +} + +static void file_util_delete_single(gchar *path) +{ + gchar *buf = g_strdup(path); + + if (!confirm_delete) + { + file_util_delete_ok_cb(NULL, buf); + } + else + { + ConfirmDialog *cd; + gchar *text = g_strdup_printf(_("About to delete the file:\n %s"), buf); + cd = confirm_dialog_new(_("Delete file"), text, file_util_delete_cancel_cb, buf); + confirm_dialog_add(cd, _("Delete"), file_util_delete_ok_cb); + g_free(text); + } +} + +void file_util_delete(gchar *source_path, GList *source_list) +{ + if (!source_path && !source_list) return; + + if (source_path) + { + file_util_delete_single(source_path); + } + else if (!source_list->next) + { + file_util_delete_single(source_list->data); + free_selected_list(source_list); + } + else + { + file_util_delete_multiple(source_list); + } +} + +/* + *-------------------------------------------------------------------------- + * Rename routines + *-------------------------------------------------------------------------- + */ + +/* + * rename multiple files + */ + +static void file_util_rename_multiple_ok_cb(GtkWidget *w, gpointer data) +{ + FileDialog *fd = data; + if (!GTK_WIDGET_VISIBLE(fd->dialog)) gtk_widget_show(fd->dialog); + fd->type = TRUE; + file_util_rename_multiple(fd); +} + +static void file_util_rename_multiple_cancel_cb(GtkWidget *w, gpointer data) +{ + FileDialog *fd = data; + if (!GTK_WIDGET_VISIBLE(fd->dialog)) gtk_widget_show(fd->dialog); + return; +} + +static void file_util_rename_multiple(FileDialog *fd) +{ + if (isfile(fd->dest_path) && !fd->type) + { + ConfirmDialog *cd; + gchar *text = g_strdup_printf(_("Overwrite file:\n%s\nby renaming:\n%s"), fd->dest_path, fd->source_path); + cd = confirm_dialog_new(_("Overwrite file"), text, file_util_rename_multiple_cancel_cb, fd); + confirm_dialog_add(cd, _("Overwrite"), file_util_rename_multiple_ok_cb); + g_free(text); + gtk_widget_hide(fd->dialog); + return; + } + else + { + if (rename (fd->source_path, fd->dest_path) < 0) + { + gchar *text = g_strdup_printf(_("Unable to rename file:\n%s\n to:\n%s"), filename_from_path(fd->source_path), filename_from_path(fd->dest_path)); + warning_dialog(_("Error renaming file"), text); + g_free(text); + } + else + { + gint row; + gint n; + GtkWidget *clist; + gchar *path; + + file_is_renamed(fd->source_path, fd->dest_path); + + clist = gtk_object_get_user_data(GTK_OBJECT(fd->entry)); + path = gtk_object_get_user_data(GTK_OBJECT(clist)); + row = gtk_clist_find_row_from_data(GTK_CLIST(clist), path); + + n = g_list_length(GTK_CLIST(clist)->row_list); + if (debug) printf("r=%d n=%d\n", row, n); + if (n - 1 > row) + n = row; + else if (n > 1) + n = row - 1; + else + n = -1; + + if (n >= 0) + { + gtk_object_set_user_data(GTK_OBJECT(clist), NULL); + gtk_clist_remove(GTK_CLIST(clist), row); + gtk_clist_select_row(GTK_CLIST(clist), n, -1); + } + else + { + if (debug) printf("closed by #%d\n", n); + generic_dialog_close(NULL, fd); + } + } + } +} + +static void file_util_rename_multiple_cb(GtkWidget *w, gpointer data) +{ + FileDialog *fd = data; + gchar *base; + gchar *name; + + name = gtk_entry_get_text(GTK_ENTRY(fd->entry)); + base = remove_level_from_path(fd->source_path); + g_free(fd->dest_path); + fd->dest_path = g_strconcat(base, "/", name, NULL); + g_free(base); + + if (strlen(name) == 0 || strcmp(fd->source_path, fd->dest_path) == 0) + { + return; + } + + fd->type = FALSE; + file_util_rename_multiple(fd); +} + +static void file_util_rename_multiple_select_cb(GtkWidget *clist, + gint row, gint column, GdkEventButton *bevent, gpointer data) +{ + FileDialog *fd = data; + GtkWidget *label; + gchar *name; + gchar *path; + + label = gtk_object_get_user_data(GTK_OBJECT(fd->dialog)); + path = gtk_clist_get_row_data(GTK_CLIST(clist), row); + g_free(fd->source_path); + fd->source_path = g_strdup(path); + gtk_object_set_user_data(GTK_OBJECT(clist), path); + name = filename_from_path(fd->source_path); + + gtk_label_set(GTK_LABEL(label), name); + gtk_entry_set_text(GTK_ENTRY(fd->entry), name); + + gtk_widget_grab_focus(fd->entry); +} + +static void file_util_rename_multiple_do(GList *source_list) +{ + FileDialog *fd; + GtkWidget *scrolled; + GtkWidget *clist; + GtkWidget *label; + GList *work; + + fd = generic_dialog_new(_("GQview - rename"), _("Rename multiple files:"), _("Rename"), _("Cancel"), + file_util_rename_multiple_cb, generic_dialog_close); + + fd->source_path = g_strdup(source_list->data); + fd->dest_path = NULL; + + scrolled = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); + gtk_box_pack_start(GTK_BOX(fd->vbox), scrolled, TRUE, TRUE, 0); + gtk_widget_show(scrolled); + + clist=gtk_clist_new (1); + gtk_clist_set_column_auto_resize(GTK_CLIST(clist), 0, TRUE); + gtk_signal_connect (GTK_OBJECT (clist), "select_row",(GtkSignalFunc) file_util_rename_multiple_select_cb, fd); + gtk_widget_set_usize(clist, 250, 150); + gtk_container_add (GTK_CONTAINER (scrolled), clist); + gtk_widget_show (clist); + + gtk_object_set_user_data(GTK_OBJECT(clist), source_list->data); + + work = source_list; + while(work) + { + gint row; + gchar *buf[2]; + buf[0] = filename_from_path(work->data); + buf[1] = NULL; + row = gtk_clist_append(GTK_CLIST(clist), buf); + gtk_clist_set_row_data_full(GTK_CLIST(clist), row, + work->data, (GtkDestroyNotify) g_free); + work = work->next; + } + + g_list_free(source_list); + + label = gtk_label_new(_("Rename:")); + gtk_box_pack_start(GTK_BOX(fd->vbox), label, FALSE, FALSE, 0); + gtk_widget_show(label); + + label = gtk_label_new(filename_from_path(fd->source_path)); + gtk_box_pack_start(GTK_BOX(fd->vbox), label, FALSE, FALSE, 0); + gtk_widget_show(label); + gtk_object_set_user_data(GTK_OBJECT(fd->dialog), label); + + label = gtk_label_new(_("to:")); + gtk_box_pack_start(GTK_BOX(fd->vbox), label, FALSE, FALSE, 0); + gtk_widget_show(label); + + fd->entry = gtk_entry_new(); + gtk_entry_set_text(GTK_ENTRY(fd->entry), filename_from_path(fd->source_path)); + gtk_box_pack_start(GTK_BOX(fd->vbox), fd->entry, FALSE, FALSE, 0); + gtk_widget_grab_focus(fd->entry); + gtk_widget_show(fd->entry); + + gtk_object_set_user_data(GTK_OBJECT(fd->entry), clist); +} + +/* + * rename single file + */ + +static void file_util_rename_single_ok_cb(GtkWidget *w, gpointer data) +{ + FileDataSingle *fds = data; + fds->confirmed = TRUE; + file_util_rename_single(fds); +} + +static void file_util_rename_single_cancel_cb(GtkWidget *w, gpointer data) +{ + FileDataSingle *fds = data; + file_data_single_free(fds); +} + +static void file_util_rename_single(FileDataSingle *fds) +{ + if (isfile(fds->dest) && !fds->confirmed) + { + ConfirmDialog *cd; + gchar *text = g_strdup_printf(_("Overwrite file:\n%s\nwith:\n%s"), fds->dest,fds->source); + cd = confirm_dialog_new(_("Overwrite file"), text, file_util_rename_single_cancel_cb, fds); + confirm_dialog_add(cd, _("Overwrite"), file_util_rename_single_ok_cb); + g_free(text); + return; + } + else + { + if (rename (fds->source, fds->dest) < 0) + { + gchar *text = g_strdup_printf(_("Unable to rename file:\n%s\nto:\n%s"), filename_from_path(fds->source), filename_from_path(fds->dest)); + warning_dialog(_("Error renaming file"), text); + g_free(text); + } + else + { + file_is_renamed(fds->source, fds->dest); + } + } + file_data_single_free(fds); +} + +static void file_util_rename_single_cb(GtkWidget *w, gpointer data) +{ + FileDialog *fd = data; + gchar *name = gtk_entry_get_text(GTK_ENTRY(fd->entry)); + gchar *buf = g_strconcat(fd->dest_path, "/", name, NULL); + + if (strlen(name) == 0 || strcmp(fd->source_path, buf) == 0) + { + g_free(buf); + return; + } + + g_free(fd->dest_path); + fd->dest_path = buf; + + file_util_rename_single(file_data_single_new(fd->source_path, fd->dest_path, fd->type)); + + generic_dialog_close(NULL, fd); +} + +static void file_util_rename_single_do(gchar *source_path) +{ + FileDialog *fd; + gchar *text; + gchar *name = filename_from_path(source_path); + + text = g_strdup_printf(_("Rename file:\n%s\nto:"), name); + fd = generic_dialog_new(_("GQview - rename"), text, _("Rename"), _("Cancel"), + file_util_rename_single_cb, generic_dialog_close); + g_free(text); + + fd->source_path = g_strdup(source_path); + fd->dest_path = remove_level_from_path(source_path); + + fd->entry = gtk_entry_new(); + gtk_entry_set_text(GTK_ENTRY(fd->entry), name); + gtk_box_pack_start(GTK_BOX(fd->vbox), fd->entry, FALSE, FALSE, 0); + gtk_widget_grab_focus(fd->entry); + gtk_widget_show(fd->entry); +} + +void file_util_rename(gchar *source_path, GList *source_list) +{ + if (!source_path && !source_list) return; + + if (source_path) + { + file_util_rename_single_do(source_path); + } + else if (!source_list->next) + { + file_util_rename_single_do(source_list->data); + free_selected_list(source_list); + } + else + { + file_util_rename_multiple_do(source_list); + } +} + +/* + *-------------------------------------------------------------------------- + * Create directory routines + *-------------------------------------------------------------------------- + */ + +static void file_util_create_dir_do(gchar *source, gchar *path) +{ + if (isfile(path)) + { + gchar *text = g_strdup_printf(_("The path:\n%s\nalready exists as a file."), filename_from_path(path)); + warning_dialog(_("Could not create directory"), text); + g_free(text); + } + else if (isdir(path)) + { + gchar *text = g_strdup_printf(_("The directory:\n%s\nalready exists."), filename_from_path(path)); + warning_dialog(_("Directory exists"), text); + g_free(text); + } + else + { + if (mkdir (path, 0755) < 0) + { + gchar *text = g_strdup_printf(_("Unable to create directory:\n%s"), filename_from_path(path)); + warning_dialog(_("Error creating directory"), text); + g_free(text); + } + else + { + if (strcmp(source, current_path) == 0) + { + gchar *buf = g_strdup(current_path); + filelist_change_to(buf); + g_free(buf); + } + } + } +} + +static void file_util_create_dir_cb(GtkWidget *w, gpointer data) +{ + FileDialog *fd = data; + gchar *name = gtk_entry_get_text(GTK_ENTRY(fd->entry)); + + if (strlen(name) == 0) return; + + g_free(fd->dest_path); + fd->dest_path = g_strconcat(fd->source_path, "/", name, NULL); + + file_util_create_dir_do(fd->source_path, fd->dest_path); + + generic_dialog_close(NULL, fd); +} + +void file_util_create_dir(gchar *path) +{ + FileDialog *fd; + gchar *text; + gchar *name; + + if (!isdir(path)) return; + name = filename_from_path(path); + + text = g_strdup_printf(_("Create directory in:\n%s\nnamed:"), path); + fd = generic_dialog_new(_("GQview - new directory"), text, _("Create"), _("Cancel"), + file_util_create_dir_cb, generic_dialog_close); + g_free(text); + + fd->source_path = g_strdup(path); + fd->dest_path = NULL; + + fd->entry = gtk_entry_new(); + gtk_box_pack_start(GTK_BOX(fd->vbox), fd->entry, FALSE, FALSE, 0); + gtk_widget_grab_focus(fd->entry); + gtk_widget_show(fd->entry); +} + diff --git a/src/window.c b/src/window.c new file mode 100644 index 00000000..85b2281a --- /dev/null +++ b/src/window.c @@ -0,0 +1,501 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" + +#define MAINWINDOW_DEF_WIDTH 500 +#define MAINWINDOW_DEF_HEIGHT 400 +#define TOOLWINDOW_DEF_WIDTH 224 +#define TOOLWINDOW_DEF_HEIGHT 450 +#define LIST_DEFAULT_WIDTH -1 +#define LIST_DEFAULT_HEIGHT 100 + +static GtkWidget *add_label(gchar *text, GtkWidget *box, gint start, gint size, gint expand); +static void info_area_create(GtkWidget *vbox); + +static void toolwindow_create(); +static void toolwindow_destroy(); +static void toolwindow_show(); + +static void image_focus_paint(GtkWidget *widget); +static gint image_focus_expose (GtkWidget *widget, GdkEventExpose *event, gpointer data); +static gint image_focus_in_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data); +static gint image_focus_out_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data); + +static void create_tools(GtkAccelGroup *accel_grp, GtkTooltips *tooltips); +static void mainwindow_destroy_cb(GtkWidget *widget, gpointer data); + +/* + *----------------------------------------------------------------------------- + * information widget creation routines (private) + *----------------------------------------------------------------------------- + */ + +static GtkWidget *add_label(gchar *text, GtkWidget *box, gint start, gint size, gint expand) +{ + GtkWidget *label; + GtkWidget *frame; + + frame = gtk_frame_new (NULL); + if (size) + gtk_widget_set_usize (frame, size, -1); + gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_IN); + if (start) + gtk_box_pack_start(GTK_BOX(box), frame, expand, expand, 0); + else + gtk_box_pack_end(GTK_BOX(box), frame, expand, expand, 0); + gtk_widget_show(frame); + + label = gtk_label_new(text); + gtk_container_add (GTK_CONTAINER (frame), label); + gtk_widget_show(label); + + return label; +} + +static void info_area_create(GtkWidget *vbox) +{ + gchar *status_text; + gchar *details_text; + gchar *zoom_text; + gchar *buf; + + if (info_status) + { + gtk_label_get(GTK_LABEL(info_status), &buf); + status_text = g_strdup(buf); + + gtk_label_get(GTK_LABEL(info_details), &buf); + details_text = g_strdup(buf); + + gtk_label_get(GTK_LABEL(info_zoom), &buf); + zoom_text = g_strdup(buf); + } + else + { + status_text = g_strdup(""); + details_text = g_strdup("GQview"); + zoom_text = g_strdup(":"); + } + + if (info_box) + { + gtk_widget_destroy(info_box); + info_box = NULL; + } + + if (vbox) + { + GtkWidget *hbox; + hbox = gtk_hbox_new(FALSE, 0); + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); + gtk_widget_show(hbox); + + info_progress_bar = gtk_progress_bar_new(); + gtk_widget_set_usize(info_progress_bar,150,-1); + gtk_box_pack_start (GTK_BOX (hbox), info_progress_bar, FALSE, FALSE, 0); + gtk_widget_show(info_progress_bar); + + info_zoom = add_label(zoom_text, hbox, FALSE, 48, FALSE); + + info_status = add_label(status_text, vbox, TRUE, 0, FALSE); + info_details = add_label(details_text, vbox, TRUE, 0, FALSE); + } + else + { + info_box = gtk_hbox_new(FALSE, 0); + + info_progress_bar = gtk_progress_bar_new(); + gtk_widget_set_usize(info_progress_bar,150,-1); + gtk_box_pack_start (GTK_BOX (info_box), info_progress_bar, FALSE, FALSE, 0); + gtk_widget_show(info_progress_bar); + + info_status = add_label(status_text, info_box, TRUE, 0, TRUE); + info_details = add_label(details_text, info_box, TRUE, 0, TRUE); + info_zoom = add_label(zoom_text, info_box, FALSE, 48, FALSE); + + gtk_widget_show(info_box); + } + + image_set_labels(info_details, info_zoom); + + g_free(status_text); + g_free(details_text); + g_free(zoom_text); +} + +/* + *----------------------------------------------------------------------------- + * tool window create/show/hide routines (private) + *----------------------------------------------------------------------------- + */ + +static void toolwindow_destroy_cb(GtkWidget *widget, gpointer data) +{ + toolwindow_float(); +} + +static void toolwindow_create() +{ + GtkWidget *vbox; + GtkAllocation req_size; + + toolwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_signal_connect (GTK_OBJECT (toolwindow), "delete_event",(GtkSignalFunc) toolwindow_destroy_cb, NULL); + gtk_window_set_policy(GTK_WINDOW(toolwindow), TRUE, TRUE, FALSE); + gtk_window_set_title (GTK_WINDOW (toolwindow), _("GQview Tools")); + gtk_window_set_wmclass(GTK_WINDOW (toolwindow), "tools", "GQview"); + gtk_container_border_width (GTK_CONTAINER (toolwindow), 0); + gtk_window_add_accel_group(GTK_WINDOW(toolwindow),mainwindow_accel_grp); + + gtk_signal_connect(GTK_OBJECT(toolwindow), "key_press_event", GTK_SIGNAL_FUNC(key_press_cb), NULL); + + if (save_window_positions) + { + gtk_window_set_default_size (GTK_WINDOW(toolwindow), float_window_w, float_window_h); + gtk_widget_set_uposition(toolwindow, float_window_x, float_window_y); + req_size.x = req_size.y = 0; + req_size.width = float_window_w; + req_size.height = float_window_h; + } + else + { + gtk_window_set_default_size (GTK_WINDOW(toolwindow), TOOLWINDOW_DEF_WIDTH, TOOLWINDOW_DEF_HEIGHT); + req_size.x = req_size.y = 0; + req_size.width = TOOLWINDOW_DEF_WIDTH; + req_size.height = TOOLWINDOW_DEF_HEIGHT; + } + gtk_widget_size_allocate(toolwindow, &req_size); + + vbox = gtk_vbox_new(FALSE, 0); + gtk_container_add(GTK_CONTAINER(toolwindow), vbox); + + gtk_widget_realize(toolwindow); + gtk_widget_realize(vbox); + + if (tool_vbox->parent) + { + gtk_widget_ref(tool_vbox); + gtk_container_remove(GTK_CONTAINER(tool_vbox->parent), tool_vbox); + gtk_box_pack_start(GTK_BOX(vbox), tool_vbox, TRUE, TRUE, 0); + gtk_widget_unref(tool_vbox); + } + else + { + gtk_box_pack_start(GTK_BOX(vbox), tool_vbox, TRUE, TRUE, 0); + } + + info_area_create(vbox); + + gtk_widget_show_all(vbox); +} + +static void toolwindow_destroy() +{ + if (toolwindow && GTK_WIDGET_VISIBLE(toolwindow)) + { + gdk_window_get_position (toolwindow->window, &float_window_x, &float_window_y); + gdk_window_get_size(toolwindow->window, &float_window_w, &float_window_h); + } + + info_area_create(NULL); + + gtk_widget_ref(tool_vbox); + gtk_container_remove(GTK_CONTAINER(tool_vbox->parent), tool_vbox); + gtk_box_pack_start(GTK_BOX(mainwindow_hbox), tool_vbox, FALSE, FALSE, 0); + gtk_widget_unref(tool_vbox); + + gtk_box_pack_start(GTK_BOX(mainwindow_vbox), info_box, FALSE, FALSE, 0); + gtk_widget_destroy(toolwindow); + toolwindow = NULL; +} + +static void toolwindow_show() +{ + gtk_widget_show(toolwindow); + if (save_window_positions) + gdk_window_move(toolwindow->window, float_window_x, float_window_y); + +} + +/* + *----------------------------------------------------------------------------- + * tool window hide/float routines (public) + *----------------------------------------------------------------------------- + */ + +void toolwindow_float() +{ + if (toolwindow) + { + if (GTK_WIDGET_VISIBLE(toolwindow)) + { + toolwindow_destroy(); + tools_float = FALSE; + tools_hidden = FALSE; + } + else + { + toolwindow_show(); + tools_float = TRUE; + tools_hidden = FALSE; + } + } + else + { + toolwindow_create(); + toolwindow_show(); + tools_float = TRUE; + tools_hidden = FALSE; + } +} + +void toolwindow_hide() +{ + if (toolwindow) + { + if (GTK_WIDGET_VISIBLE(toolwindow)) + { + gtk_widget_hide(toolwindow); + gdk_window_get_position (toolwindow->window, &float_window_x, &float_window_y); + gdk_window_get_size(toolwindow->window, &float_window_w, &float_window_h); + tools_hidden = TRUE; + } + else + { + if (tools_float) + toolwindow_show(); + else + toolwindow_destroy(); + tools_hidden = FALSE; + } + } + else + { + toolwindow_create(); + tools_hidden = TRUE; + } +} + +/* + *----------------------------------------------------------------------------- + * image viewport focus display (private) + *----------------------------------------------------------------------------- + */ + +static void image_focus_paint(GtkWidget *widget) +{ + gint width, height; + gdk_window_get_size (widget->window, &width, &height); + gdk_draw_rectangle (widget->window, + widget->style->black_gc, + FALSE, + 0, 0, width - 1, height - 1); +} + +static gint image_focus_expose (GtkWidget *widget, GdkEventExpose *event, gpointer data) +{ + image_focus_paint (widget); + return TRUE; +} + +static gint image_focus_in_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data) +{ + gtk_signal_connect_after (GTK_OBJECT (widget), "draw", + GTK_SIGNAL_FUNC (image_focus_expose), NULL); + gtk_signal_connect (GTK_OBJECT (widget), "expose_event", + GTK_SIGNAL_FUNC (image_focus_paint), NULL); + GTK_WIDGET_SET_FLAGS(widget, GTK_HAS_FOCUS); + + gtk_widget_queue_draw (widget); + return FALSE; +} + +static gint image_focus_out_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data) +{ + gtk_signal_disconnect_by_func (GTK_OBJECT (widget), + GTK_SIGNAL_FUNC (image_focus_paint), NULL); + gtk_signal_disconnect_by_func (GTK_OBJECT (widget), + GTK_SIGNAL_FUNC (image_focus_expose), NULL); + GTK_WIDGET_UNSET_FLAGS(widget, GTK_HAS_FOCUS); + gtk_widget_queue_clear (widget); + gtk_viewport_set_shadow_type (GTK_VIEWPORT(widget), GTK_SHADOW_IN); + return FALSE; +} + +/* + *----------------------------------------------------------------------------- + * main window setup + *----------------------------------------------------------------------------- + */ + +static void create_tools(GtkAccelGroup *accel_grp, GtkTooltips *tooltips) +{ + GtkWidget *menu_bar; + GtkWidget *button_bar; + GtkWidget *vpaned; + GtkWidget *scrolled; + GtkWidget *tabcomp; + + tool_vbox = gtk_vbox_new(FALSE, 0); + + menu_bar = create_menu_bar(accel_grp); + gtk_box_pack_start (GTK_BOX(tool_vbox), menu_bar,FALSE,FALSE,0); + gtk_widget_show(menu_bar); + + button_bar = create_button_bar(tooltips); + gtk_box_pack_start (GTK_BOX(tool_vbox), button_bar,FALSE,FALSE,0); + gtk_widget_show(button_bar); + + /* path entry */ + tabcomp = tab_completion_new(&path_entry, mainwindow, NULL, path_entry_cb, NULL); + gtk_box_pack_start (GTK_BOX (tool_vbox), tabcomp, FALSE, FALSE, 0); + gtk_widget_show (tabcomp); + + /* history button */ + history_menu = gtk_option_menu_new (); + gtk_box_pack_start (GTK_BOX (tool_vbox), history_menu, FALSE, FALSE, 0); + gtk_widget_show (history_menu); + + vpaned = gtk_vpaned_new (); + gtk_paned_handle_size (GTK_PANED(vpaned), 10); + gtk_paned_gutter_size (GTK_PANED(vpaned), 10); + gtk_box_pack_start (GTK_BOX (tool_vbox), vpaned, TRUE, TRUE, 0); + gtk_widget_show (vpaned); + + /* dir list */ + scrolled = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); + gtk_paned_add1 (GTK_PANED(vpaned), scrolled); + gtk_widget_show(scrolled); + + dir_clist=gtk_clist_new(1); + gtk_signal_connect (GTK_OBJECT (dir_clist), "button_press_event",(GtkSignalFunc) dir_press_cb, NULL); + gtk_signal_connect (GTK_OBJECT (dir_clist), "select_row",(GtkSignalFunc) dir_select_cb, NULL); + gtk_clist_column_titles_passive (GTK_CLIST (dir_clist)); + gtk_widget_set_usize(dir_clist, LIST_DEFAULT_WIDTH, LIST_DEFAULT_HEIGHT); + gtk_container_add (GTK_CONTAINER (scrolled), dir_clist); + gtk_widget_show(dir_clist); + + /* file list */ + scrolled = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); + gtk_paned_add2 (GTK_PANED(vpaned), scrolled); + gtk_widget_show(scrolled); + + file_clist=gtk_clist_new(1); + gtk_clist_set_selection_mode(GTK_CLIST(file_clist), GTK_SELECTION_EXTENDED); + gtk_signal_connect (GTK_OBJECT (file_clist), "button_press_event",(GtkSignalFunc) file_press_cb, NULL); + gtk_signal_connect (GTK_OBJECT (file_clist), "select_row",(GtkSignalFunc) file_select_cb, NULL); + gtk_signal_connect_after (GTK_OBJECT (file_clist), "unselect_row",(GtkSignalFunc) file_unselect_cb, NULL); + gtk_clist_column_titles_passive (GTK_CLIST (file_clist)); + gtk_widget_set_usize(file_clist, LIST_DEFAULT_WIDTH, LIST_DEFAULT_HEIGHT); + gtk_container_add (GTK_CONTAINER (scrolled), file_clist); + gtk_widget_show(file_clist); + + gtk_widget_show(tool_vbox); +} + +static void mainwindow_destroy_cb(GtkWidget *widget, gpointer data) +{ + exit_gqview(); +} + +void create_main_window() +{ + GtkWidget *image_window; + GtkAllocation req_size; + GtkTooltips *tooltips; + GdkColormap *colormap; + static GdkColor tooltip_color = { 0, 0xffff, 0xf9f9, 0xcbcb }; /*255 249 203*/ + + mainwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_policy(GTK_WINDOW(mainwindow), TRUE, TRUE, FALSE); + + gtk_signal_connect (GTK_OBJECT (mainwindow), "delete_event",(GtkSignalFunc) mainwindow_destroy_cb, NULL); + + gtk_window_set_title(GTK_WINDOW (mainwindow), "GQview"); + gtk_window_set_wmclass(GTK_WINDOW (mainwindow), "gqview", "GQview"); + gtk_container_border_width (GTK_CONTAINER (mainwindow), 0); + + gtk_signal_connect(GTK_OBJECT(mainwindow), "key_press_event", GTK_SIGNAL_FUNC(key_press_cb), NULL); + + if (save_window_positions) + { + req_size.x = main_window_x; + req_size.y = main_window_y; + req_size.width = main_window_w; + req_size.height = main_window_h; + gtk_window_set_default_size (GTK_WINDOW(mainwindow), main_window_w, main_window_h); + gtk_widget_set_uposition(mainwindow, main_window_x, main_window_y); + + } + else + { + req_size.x = 0; + req_size.y = 0; + req_size.width = MAINWINDOW_DEF_WIDTH; + req_size.height = MAINWINDOW_DEF_HEIGHT; + gtk_window_set_default_size (GTK_WINDOW(mainwindow), MAINWINDOW_DEF_WIDTH, MAINWINDOW_DEF_HEIGHT); + } + + gtk_widget_size_allocate(mainwindow, &req_size); + + gtk_widget_realize(mainwindow); + + mainwindow_accel_grp = gtk_accel_group_new (); + gtk_window_add_accel_group(GTK_WINDOW(mainwindow),mainwindow_accel_grp); + + tooltips = gtk_tooltips_new(); + colormap = gdk_window_get_colormap (mainwindow->window); + gdk_color_alloc (colormap, &tooltip_color); + gtk_tooltips_set_colors(tooltips, &tooltip_color, &mainwindow->style->fg[GTK_STATE_NORMAL]); + + create_menu_popups(); + create_tools(mainwindow_accel_grp, tooltips); + + image_window = image_create(); + + mainwindow_vbox = gtk_vbox_new(FALSE, 0); + gtk_container_add (GTK_CONTAINER (mainwindow), mainwindow_vbox); + gtk_widget_show(mainwindow_vbox); + + mainwindow_hbox = gtk_hbox_new(FALSE, 0); + gtk_box_pack_start(GTK_BOX(mainwindow_vbox), mainwindow_hbox, TRUE, TRUE, 0); + gtk_widget_show(mainwindow_hbox); + + if (tools_float || tools_hidden) + { + toolwindow_create(); + if (!tools_hidden) + { + toolwindow_show(); + } + } + else + { + info_area_create(NULL); + gtk_box_pack_start(GTK_BOX(mainwindow_hbox), tool_vbox, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(mainwindow_vbox), info_box, FALSE, FALSE, 0); + } + + gtk_box_pack_end(GTK_BOX(mainwindow_hbox), image_window, TRUE, TRUE, 0); + gtk_widget_show_all(image_window); + + GTK_WIDGET_SET_FLAGS(main_image->viewport, GTK_CAN_FOCUS); + gtk_signal_connect(GTK_OBJECT(main_image->viewport), "focus_in_event", GTK_SIGNAL_FUNC(image_focus_in_cb), NULL); + gtk_signal_connect(GTK_OBJECT(main_image->viewport), "focus_out_event", GTK_SIGNAL_FUNC(image_focus_out_cb), NULL); + + gtk_widget_show(mainwindow); + + if (save_window_positions) + gdk_window_move(mainwindow->window, main_window_x, main_window_y); +} + -- 2.20.1