summaryrefslogtreecommitdiffstats
path: root/languages/ruby
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commit114a878c64ce6f8223cfd22d76a20eb16d177e5e (patch)
treeacaf47eb0fa12142d3896416a69e74cbf5a72242 /languages/ruby
downloadtdevelop-114a878c64ce6f8223cfd22d76a20eb16d177e5e.tar.gz
tdevelop-114a878c64ce6f8223cfd22d76a20eb16d177e5e.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdevelop@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'languages/ruby')
-rw-r--r--languages/ruby/Makefile.am31
-rw-r--r--languages/ruby/README3
-rw-r--r--languages/ruby/README.dox43
-rw-r--r--languages/ruby/app_templates/Makefile.am3
-rw-r--r--languages/ruby/app_templates/dcopservice/Makefile.am18
-rw-r--r--languages/ruby/app_templates/dcopservice/app-configure.in.in51
-rw-r--r--languages/ruby/app_templates/dcopservice/app.cpp30
-rw-r--r--languages/ruby/app_templates/dcopservice/dcopservice.desktop43
-rw-r--r--languages/ruby/app_templates/dcopservice/dcopservice.kdevelop91
-rw-r--r--languages/ruby/app_templates/dcopservice/dcopservice.rb37
-rw-r--r--languages/ruby/app_templates/dcopservice/dcopserviceruby.kdevtemplate199
-rw-r--r--languages/ruby/app_templates/dcopservice/dcopserviceruby.pngbin0 -> 23880 bytes
-rw-r--r--languages/ruby/app_templates/dcopservice/main.rb30
-rw-r--r--languages/ruby/app_templates/dcopservice/src-Makefile.am15
-rw-r--r--languages/ruby/app_templates/dcopservice/subdirs3
-rw-r--r--languages/ruby/app_templates/kapp/Makefile.am19
-rw-r--r--languages/ruby/app_templates/kapp/README81
-rw-r--r--languages/ruby/app_templates/kapp/app-Makefile.am1
-rw-r--r--languages/ruby/app_templates/kapp/app-configure.in.in45
-rw-r--r--languages/ruby/app_templates/kapp/app.cpp30
-rw-r--r--languages/ruby/app_templates/kapp/app.desktop44
-rw-r--r--languages/ruby/app_templates/kapp/app.kdevelop90
-rw-r--r--languages/ruby/app_templates/kapp/app.rb216
-rw-r--r--languages/ruby/app_templates/kapp/app_client.rb18
-rw-r--r--languages/ruby/app_templates/kapp/appiface.rb14
-rw-r--r--languages/ruby/app_templates/kapp/appui.rc8
-rw-r--r--languages/ruby/app_templates/kapp/appview.rb103
-rw-r--r--languages/ruby/app_templates/kapp/kappruby.kdevtemplate238
-rw-r--r--languages/ruby/app_templates/kapp/kappruby.pngbin0 -> 5063 bytes
-rw-r--r--languages/ruby/app_templates/kapp/main.rb40
-rw-r--r--languages/ruby/app_templates/kapp/pref.rb38
-rw-r--r--languages/ruby/app_templates/kapp/src-Makefile.am43
-rw-r--r--languages/ruby/app_templates/kapp/subdirs3
-rw-r--r--languages/ruby/app_templates/kxt/Makefile.am20
-rw-r--r--languages/ruby/app_templates/kxt/README38
-rw-r--r--languages/ruby/app_templates/kxt/app-Makefile.am1
-rw-r--r--languages/ruby/app_templates/kxt/app-configure.in.in45
-rw-r--r--languages/ruby/app_templates/kxt/app.cpp30
-rw-r--r--languages/ruby/app_templates/kxt/app.desktop40
-rw-r--r--languages/ruby/app_templates/kxt/app.kcfg21
-rw-r--r--languages/ruby/app_templates/kxt/app.kdevelop90
-rw-r--r--languages/ruby/app_templates/kxt/app.rb94
-rw-r--r--languages/ruby/app_templates/kxt/appui.rc8
-rw-r--r--languages/ruby/app_templates/kxt/appview.rb55
-rw-r--r--languages/ruby/app_templates/kxt/appview_base.ui33
-rw-r--r--languages/ruby/app_templates/kxt/kxtruby.kdevtemplate251
-rw-r--r--languages/ruby/app_templates/kxt/kxtruby.pngbin0 -> 7841 bytes
-rw-r--r--languages/ruby/app_templates/kxt/main.rb41
-rw-r--r--languages/ruby/app_templates/kxt/prefs-base.ui127
-rw-r--r--languages/ruby/app_templates/kxt/prefs.rb7
-rw-r--r--languages/ruby/app_templates/kxt/previewruby.pngbin0 -> 7712 bytes
-rw-r--r--languages/ruby/app_templates/kxt/settings.kcfgc6
-rw-r--r--languages/ruby/app_templates/kxt/src-Makefile.am48
-rw-r--r--languages/ruby/app_templates/kxt/subdirs3
-rw-r--r--languages/ruby/app_templates/qtruby/.kdev_ignore0
-rw-r--r--languages/ruby/app_templates/qtruby/Makefile.am16
-rw-r--r--languages/ruby/app_templates/qtruby/README29
-rw-r--r--languages/ruby/app_templates/qtruby/app-Makefile7
-rw-r--r--languages/ruby/app_templates/qtruby/app.filelist2
-rw-r--r--languages/ruby/app_templates/qtruby/app.kdevelop85
-rwxr-xr-xlanguages/ruby/app_templates/qtruby/app.rb12
-rw-r--r--languages/ruby/app_templates/qtruby/qtruby.kdevtemplate114
-rw-r--r--languages/ruby/app_templates/qtruby/qtruby.pngbin0 -> 3435 bytes
-rw-r--r--languages/ruby/app_templates/qtruby4app/Makefile.am20
-rw-r--r--languages/ruby/app_templates/qtruby4app/ReadMe6
-rw-r--r--languages/ruby/app_templates/qtruby4app/app-Makefile18
-rw-r--r--languages/ruby/app_templates/qtruby4app/app.filelist3
-rw-r--r--languages/ruby/app_templates/qtruby4app/application.qrc10
-rw-r--r--languages/ruby/app_templates/qtruby4app/editcopy.xpm193
-rw-r--r--languages/ruby/app_templates/qtruby4app/editcut.xpm252
-rw-r--r--languages/ruby/app_templates/qtruby4app/editpaste.xpm295
-rw-r--r--languages/ruby/app_templates/qtruby4app/filenew.xpm216
-rw-r--r--languages/ruby/app_templates/qtruby4app/fileopen.xpm295
-rw-r--r--languages/ruby/app_templates/qtruby4app/filesave.xpm295
-rw-r--r--languages/ruby/app_templates/qtruby4app/main.rb10
-rw-r--r--languages/ruby/app_templates/qtruby4app/qrc_application.rb2281
-rw-r--r--languages/ruby/app_templates/qtruby4app/qtruby4app.kdevelop83
-rw-r--r--languages/ruby/app_templates/qtruby4app/qtruby4app.kdevtemplate166
-rw-r--r--languages/ruby/app_templates/qtruby4app/qtruby4app.pngbin0 -> 16908 bytes
-rw-r--r--languages/ruby/app_templates/qtruby4app/qtruby4app.rb263
-rw-r--r--languages/ruby/app_templates/qtrubyapp/Makefile.am18
-rw-r--r--languages/ruby/app_templates/qtrubyapp/README29
-rw-r--r--languages/ruby/app_templates/qtrubyapp/app-Makefile7
-rw-r--r--languages/ruby/app_templates/qtrubyapp/app.filelist3
-rw-r--r--languages/ruby/app_templates/qtrubyapp/fileopen.xpm22
-rw-r--r--languages/ruby/app_templates/qtrubyapp/fileprint.xpm24
-rw-r--r--languages/ruby/app_templates/qtrubyapp/filesave.xpm22
-rw-r--r--languages/ruby/app_templates/qtrubyapp/main.rb10
-rw-r--r--languages/ruby/app_templates/qtrubyapp/qtrubyapp.kdevelop83
-rw-r--r--languages/ruby/app_templates/qtrubyapp/qtrubyapp.kdevtemplate140
-rw-r--r--languages/ruby/app_templates/qtrubyapp/qtrubyapp.pngbin0 -> 5245 bytes
-rw-r--r--languages/ruby/app_templates/qtrubyapp/qtrubyapp.rb253
-rw-r--r--languages/ruby/app_templates/rails/CMakeLists.txt20
-rw-r--r--languages/ruby/app_templates/rails/Makefile.am16
-rw-r--r--languages/ruby/app_templates/rails/app.kdevelop107
-rw-r--r--languages/ruby/app_templates/rails/rails.kdevtemplate72
-rw-r--r--languages/ruby/app_templates/rails/rails.pngbin0 -> 12062 bytes
-rw-r--r--languages/ruby/app_templates/ruby.appwizard2
-rw-r--r--languages/ruby/app_templates/rubyhello/.kdev_ignore0
-rw-r--r--languages/ruby/app_templates/rubyhello/Makefile.am16
-rw-r--r--languages/ruby/app_templates/rubyhello/app.kdevelop91
-rw-r--r--languages/ruby/app_templates/rubyhello/app.rb3
-rw-r--r--languages/ruby/app_templates/rubyhello/rubyhello9
-rw-r--r--languages/ruby/app_templates/rubyhello/rubyhello.kdevtemplate105
-rw-r--r--languages/ruby/app_templates/rubyhello/rubyhello.pngbin0 -> 483 bytes
-rw-r--r--languages/ruby/debugger/Makefile.am25
-rw-r--r--languages/ruby/debugger/breakpoint.cpp343
-rw-r--r--languages/ruby/debugger/breakpoint.h214
-rw-r--r--languages/ruby/debugger/dbgcommand.cpp47
-rw-r--r--languages/ruby/debugger/dbgcommand.h64
-rw-r--r--languages/ruby/debugger/dbgcontroller.cpp46
-rw-r--r--languages/ruby/debugger/dbgcontroller.h161
-rw-r--r--languages/ruby/debugger/dbgpsdlg.cpp170
-rw-r--r--languages/ruby/debugger/dbgpsdlg.h60
-rw-r--r--languages/ruby/debugger/dbgtoolbar.cpp483
-rw-r--r--languages/ruby/debugger/dbgtoolbar.h90
-rw-r--r--languages/ruby/debugger/debuggee.rb1214
-rw-r--r--languages/ruby/debugger/debuggerpart.cpp785
-rw-r--r--languages/ruby/debugger/debuggerpart.h110
-rw-r--r--languages/ruby/debugger/framestackwidget.cpp272
-rw-r--r--languages/ruby/debugger/framestackwidget.h115
-rw-r--r--languages/ruby/debugger/hi16-action-breakpoint_add.pngbin0 -> 225 bytes
-rw-r--r--languages/ruby/debugger/hi16-action-breakpoint_delete.pngbin0 -> 239 bytes
-rw-r--r--languages/ruby/debugger/hi16-action-breakpoint_delete_all.pngbin0 -> 239 bytes
-rw-r--r--languages/ruby/debugger/hi16-action-breakpoint_edit.pngbin0 -> 277 bytes
-rw-r--r--languages/ruby/debugger/kdevrbdebugger.desktop73
-rw-r--r--languages/ruby/debugger/kdevrbdebugger.rc68
-rw-r--r--languages/ruby/debugger/rdbbreakpointwidget.cpp921
-rw-r--r--languages/ruby/debugger/rdbbreakpointwidget.h120
-rw-r--r--languages/ruby/debugger/rdbcommand.cpp81
-rw-r--r--languages/ruby/debugger/rdbcommand.h99
-rw-r--r--languages/ruby/debugger/rdbcontroller.cpp1414
-rw-r--r--languages/ruby/debugger/rdbcontroller.h192
-rw-r--r--languages/ruby/debugger/rdboutputwidget.cpp171
-rw-r--r--languages/ruby/debugger/rdboutputwidget.h69
-rw-r--r--languages/ruby/debugger/rdbparser.cpp350
-rw-r--r--languages/ruby/debugger/rdbparser.h41
-rw-r--r--languages/ruby/debugger/rdbtable.cpp62
-rw-r--r--languages/ruby/debugger/rdbtable.h45
-rw-r--r--languages/ruby/debugger/stty.cpp370
-rw-r--r--languages/ruby/debugger/stty.h71
-rw-r--r--languages/ruby/debugger/variablewidget.cpp1018
-rw-r--r--languages/ruby/debugger/variablewidget.h348
-rw-r--r--languages/ruby/doc/Makefile.am6
-rw-r--r--languages/ruby/doc/qtruby.toc9
-rw-r--r--languages/ruby/doc/rails.toc9
-rw-r--r--languages/ruby/doc/ruby.toc1399
-rw-r--r--languages/ruby/doc/ruby_bugs.toc7
-rw-r--r--languages/ruby/file_templates/Makefile.am5
-rw-r--r--languages/ruby/file_templates/css11
-rw-r--r--languages/ruby/file_templates/html.erb4
-rw-r--r--languages/ruby/file_templates/js11
-rw-r--r--languages/ruby/file_templates/js.rjs7
-rw-r--r--languages/ruby/file_templates/rb7
-rw-r--r--languages/ruby/file_templates/rhtml4
-rw-r--r--languages/ruby/file_templates/rjs7
-rw-r--r--languages/ruby/file_templates/rxml7
-rw-r--r--languages/ruby/file_templates/xml.builder7
-rw-r--r--languages/ruby/kdevrubysupport.desktop84
-rw-r--r--languages/ruby/kdevrubysupport.rc20
-rw-r--r--languages/ruby/play_run.psdbin0 -> 58270 bytes
-rw-r--r--languages/ruby/qtdesignerrubyintegration.cpp93
-rw-r--r--languages/ruby/qtdesignerrubyintegration.h35
-rw-r--r--languages/ruby/ruby_config.pngbin0 -> 12433 bytes
-rw-r--r--languages/ruby/ruby_config.psdbin0 -> 55515 bytes
-rw-r--r--languages/ruby/ruby_run.pngbin0 -> 6986 bytes
-rw-r--r--languages/ruby/rubyconfigwidget.cpp53
-rw-r--r--languages/ruby/rubyconfigwidget.h27
-rw-r--r--languages/ruby/rubyconfigwidgetbase.ui363
-rw-r--r--languages/ruby/rubyimplementationwidget.cpp70
-rw-r--r--languages/ruby/rubyimplementationwidget.h35
-rw-r--r--languages/ruby/rubysupport_part.cpp908
-rw-r--r--languages/ruby/rubysupport_part.h74
-rw-r--r--languages/ruby/rubytemplates101
174 files changed, 21384 insertions, 0 deletions
diff --git a/languages/ruby/Makefile.am b/languages/ruby/Makefile.am
new file mode 100644
index 00000000..1b5fb83b
--- /dev/null
+++ b/languages/ruby/Makefile.am
@@ -0,0 +1,31 @@
+#Here resides the Ruby support part.
+
+INCLUDES = -I$(top_srcdir)/languages/lib/designer_integration \
+ -I$(top_srcdir)/lib/interfaces -I$(top_srcdir)/lib/interfaces/extensions \
+ -I$(top_srcdir)/lib/interfaces/external -I$(top_srcdir)/lib/util \
+ -I$(top_builddir)/languages/lib/designer_integration $(all_includes)
+SUBDIRS = app_templates file_templates doc debugger
+
+
+kde_module_LTLIBRARIES = libkdevrubysupport.la
+libkdevrubysupport_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkdevrubysupport_la_LIBADD = $(top_builddir)/lib/libkdevelop.la \
+ $(top_builddir)/languages/lib/designer_integration/libdesignerintegration.la $(top_builddir)/lib/util/libkdevutil.la
+
+libkdevrubysupport_la_SOURCES = rubysupport_part.cpp rubyconfigwidgetbase.ui \
+ rubyconfigwidget.cpp qtdesignerrubyintegration.cpp rubyimplementationwidget.cpp
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevrubysupport.desktop
+
+templatedir = ${kde_datadir}/kdevabbrev/templates
+template_DATA = rubytemplates
+
+rcdir = $(kde_datadir)/kdevrubysupport
+rc_DATA = kdevrubysupport.rc
+
+picsdirdir = $(kde_datadir)/kdevrubysupport/pics
+picsdir_DATA = ruby_config.png ruby_run.png
+noinst_HEADERS = qtdesignerrubyintegration.h rubyimplementationwidget.h
diff --git a/languages/ruby/README b/languages/ruby/README
new file mode 100644
index 00000000..731741e1
--- /dev/null
+++ b/languages/ruby/README
@@ -0,0 +1,3 @@
+Please read the on-line, automaticaly updated KDevelop API documentation at:
+http://www.kdevelop.org
+or read the README.dox file.
diff --git a/languages/ruby/README.dox b/languages/ruby/README.dox
new file mode 100644
index 00000000..aaa8823b
--- /dev/null
+++ b/languages/ruby/README.dox
@@ -0,0 +1,43 @@
+/** \class RubySupportPart
+This is a Ruby support plugin
+
+\authors <a href="mailto:marek AT janukowicz.net">Marek Janukowicz</a>
+
+\maintainer <a href="mailto:marek AT janukowicz.net">Marek Janukowicz</a>
+
+\feature Ruby language support
+\feature .rb template for New File
+\feature Ruby project template for Application Wizard
+\feature "Run" option in menu
+\feature Consult \ref LangSupportStatus for a up to date features/status of this programming language support part.
+
+\bug Describe a the 1st bug that you know of, but probably hasn't been reported yet.
+..
+\bug Describe a the nth bug that you know of, but probably hasn't been reported yet.
+
+\requirement Describe a the 1st requirement of your part.
+\requirement Describe a the 2nd requirement of your part.
+...
+\requirement Describe a the nth requirement of your part.
+
+\todo Describe a the 1st TODO of your part.
+\todo Describe a the 2nd TODO of your part.
+...
+\todo Describe a the nth TODO of your part.
+
+\faq <b>First frequenly asked question about your part ?</b> Answer.
+\faq <b>Second frequenly asked question about your part ?</b> Answer.
+...
+\faq <b>Last frequenly asked question about your part ?</b> Answer.
+
+\note First note text.
+\note Second note text.
+...
+\note Last note text.
+
+\warning First warning text.
+\warning Second warning text.
+...
+\warning Last warning text.
+
+*/
diff --git a/languages/ruby/app_templates/Makefile.am b/languages/ruby/app_templates/Makefile.am
new file mode 100644
index 00000000..52239564
--- /dev/null
+++ b/languages/ruby/app_templates/Makefile.am
@@ -0,0 +1,3 @@
+SUBDIRS = rubyhello qtruby qtrubyapp dcopservice kapp kxt rails qtruby4app
+profilesdir = $(kde_datadir)/kdevelop/profiles/IDE/ScriptingLanguageIDE/RubyIDE
+profiles_DATA = ruby.appwizard
diff --git a/languages/ruby/app_templates/dcopservice/Makefile.am b/languages/ruby/app_templates/dcopservice/Makefile.am
new file mode 100644
index 00000000..441e9ceb
--- /dev/null
+++ b/languages/ruby/app_templates/dcopservice/Makefile.am
@@ -0,0 +1,18 @@
+dataFiles = dcopservice.desktop app.cpp app-configure.in.in \
+ src-Makefile.am main.rb dcopservice.rb dcopservice.kdevelop \
+ subdirs
+templateName = dcopserviceruby
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/ruby/app_templates/dcopservice/app-configure.in.in b/languages/ruby/app_templates/dcopservice/app-configure.in.in
new file mode 100644
index 00000000..5d41e618
--- /dev/null
+++ b/languages/ruby/app_templates/dcopservice/app-configure.in.in
@@ -0,0 +1,51 @@
+#MIN_CONFIG(3.0.0)
+
+AM_INIT_AUTOMAKE(%{APPNAMELC}, 0.1)
+AC_C_BIGENDIAN
+AC_CHECK_KDEMAXPATHLEN
+
+AC_PROG_MAKE_SET
+
+# ruby interpreter check
+AC_PATH_PROG([RUBY],[ruby])
+if test -z "${RUBY}" ; then
+ AC_MSG_ERROR([you need Ruby to use this program])
+fi
+
+AC_CHECK_PROG(RUBY, ruby, ruby)
+
+if test -z "$RUBY"; then
+ DO_NOT_COMPILE="$DO_NOT_COMPILE qtruby"
+else
+ AC_MSG_CHECKING(for ruby dirs)
+ RUBY_ARCHDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"archdir"@:>@)'`
+ RUBY_SITEARCHDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"sitearchdir"@:>@)'`
+ RUBY_SITEDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"sitelibdir"@:>@)'`
+ RUBY_LIBDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"libdir"@:>@)'`
+ RUBY_LIBRUBYARG=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"LIBRUBYARG_SHARED"@:>@)'`
+ AC_MSG_RESULT([archdir $RUBY_ARCHDIR, sitearchdir $RUBY_SITEARCHDIR, sitedir $RUBY_SITEDIR, libdir $RUBY_LIBDIR, librubyarg $RUBY_LIBRUBYARG])
+ AC_SUBST(RUBY_ARCHDIR)
+ AC_SUBST(RUBY_SITEARCHDIR)
+ AC_SUBST(RUBY_SITEDIR)
+ AC_SUBST(RUBY_LIBDIR)
+ AC_SUBST(RUBY_LIBRUBYARG)
+fi
+
+# Korundum check
+AC_MSG_CHECKING([whether Korundum is installed])
+korundum_present=no
+cat >korundumtest.rb <<END
+require 'Korundum'
+END
+${RUBY} korundumtest.rb >/dev/null 2>&1 && korundum_present=yes
+AC_MSG_RESULT([$korundum_present])
+
+# rbuic check
+AC_PATH_PROG([RBUIC],[rbuic])
+if test -z "${RBUIC}" ; then
+ AC_MSG_ERROR([cannot find rbuic (part of the QtRuby package)])
+fi
+AC_SUBST([RBUIC])
+AC_SUBST([RUBY])
+
+
diff --git a/languages/ruby/app_templates/dcopservice/app.cpp b/languages/ruby/app_templates/dcopservice/app.cpp
new file mode 100644
index 00000000..8d6af02d
--- /dev/null
+++ b/languages/ruby/app_templates/dcopservice/app.cpp
@@ -0,0 +1,30 @@
+#include <ruby.h>
+
+#include <qstring.h>
+#include <qfileinfo.h>
+#include <kinstance.h>
+#include <kstandarddirs.h>
+
+int main(int argc, char **argv) {
+ KInstance * instance = new KInstance("%{APPNAMELC}");
+ QString appdir = ::locate("data", "%{APPNAMELC}/main.rb", instance);
+ delete instance;
+ if (appdir.isNull()) {
+ qFatal("Error: Can't find \"%{APPNAMELC}/main.rb\"\n");
+ }
+ QFileInfo program(appdir);
+
+ char ** rubyargs = (char **) calloc(argc+4, sizeof(char *));
+ rubyargs[0] = strdup(argv[0]);
+ rubyargs[1] = strdup("-KU");
+ rubyargs[2] = strdup(QString("-C%1").arg(program.dirPath()).latin1());
+ rubyargs[3] = strdup(QString("-I%1").arg(program.dirPath()).latin1());
+ rubyargs[4] = strdup(program.fileName().latin1());
+ for (int i = 1; i < argc; i++) {
+ rubyargs[i+4] = argv[i];
+ }
+
+ ruby_init();
+ ruby_options(argc+4, rubyargs);
+ ruby_run();
+}
diff --git a/languages/ruby/app_templates/dcopservice/dcopservice.desktop b/languages/ruby/app_templates/dcopservice/dcopservice.desktop
new file mode 100644
index 00000000..2ee5220f
--- /dev/null
+++ b/languages/ruby/app_templates/dcopservice/dcopservice.desktop
@@ -0,0 +1,43 @@
+[Desktop Entry]
+Type=Service
+Name=%{APPNAME}
+Exec=%{APPNAMELC}
+X-DCOP-ServiceType=Unique
+X-KDE-StartupNotify=false
+Comment=Template for dcop services
+Comment[br]=Patrom evit servijoù dcop
+Comment[ca]=Plantilla per als serveis dcop
+Comment[cy]=Patrymlun ar gyfer gwasanaethau dcop
+Comment[da]=Skabelon for DCOP-tjenester
+Comment[de]=Vorlage für DCOP-Dienste
+Comment[el]=Πρότυπο για υπηρεσίες dcop
+Comment[es]=Plantilla para servicios DCOP
+Comment[et]=DCOP-teenuste mall
+Comment[eu]=DCOP zerbitzuentzako plantilla
+Comment[fa]=قالب برای خدمات dcop
+Comment[fr]=Modèle pour les services DCOP
+Comment[ga]=Teimpléad i gcomhair seirbhísí DCOP
+Comment[gl]=Modelo para servizos dcop
+Comment[hi]=डीसीओपी सेवाओं के लिए टेम्प्लेट
+Comment[hu]=Sablon DCOP-szolgáltatásokhoz
+Comment[is]=Snið fyrir dcop þjónustur
+Comment[it]=Modello per servizi dcop
+Comment[ja]=dcop サービスのためのテンプレート
+Comment[nds]=Vörlaag för DCOP-Deensten
+Comment[ne]=dcop सेवाका लागि टेम्प्लेट
+Comment[nl]=Sjabloon voor DCOP-services
+Comment[pl]=Szablon dla usług dcop
+Comment[pt]=Modelo para serviços dcop
+Comment[pt_BR]=Modelo para serviços dcop
+Comment[ru]=Шаблон для сервисов DCOP
+Comment[sk]=Šablóna pre DCOP služby
+Comment[sl]=Predloga za storitve DCOP
+Comment[sr]=Шаблон за dcop сервисе
+Comment[sr@Latn]=Šablon za dcop servise
+Comment[sv]=Mall för DCOP-tjänster
+Comment[ta]=டிகாப்சேவைக்கான மாதரி உரு
+Comment[tg]=Қолиб барои хидмадгори DCOP
+Comment[tr]=dcop hizmetleri için şablon
+Comment[zh_CN]=dcop 服务模板
+Comment[zh_TW]=DCOP 服務樣本
+
diff --git a/languages/ruby/app_templates/dcopservice/dcopservice.kdevelop b/languages/ruby/app_templates/dcopservice/dcopservice.kdevelop
new file mode 100644
index 00000000..f4e274da
--- /dev/null
+++ b/languages/ruby/app_templates/dcopservice/dcopservice.kdevelop
@@ -0,0 +1,91 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>Ruby</primarylanguage>
+ <keywords>
+ <keyword>Ruby</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activedir/>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ </run>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.rb" name="Sources" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ </general>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="rb"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevrubysupport>
+ <run>
+ <interpreter>ruby</interpreter>
+ <terminal>false</terminal>
+ <charactercoding>3</charactercoding>
+ <mainprogram>src/main.rb</mainprogram>
+ </run>
+ </kdevrubysupport>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>%{APPNAMELC}.tag</docurl>
+ </projectdoc>
+ </kdevdocumentation>
+</kdevelop>
diff --git a/languages/ruby/app_templates/dcopservice/dcopservice.rb b/languages/ruby/app_templates/dcopservice/dcopservice.rb
new file mode 100644
index 00000000..94a03ec9
--- /dev/null
+++ b/languages/ruby/app_templates/dcopservice/dcopservice.rb
@@ -0,0 +1,37 @@
+
+class %{APPNAME} < KDE::DCOPObject
+
+ k_dcop 'QString string(int)',
+ 'QStringList list()',
+ 'void add(QString)',
+ 'bool remove(QString)',
+ 'bool exit()'
+
+ def initialize()
+ super("serviceInterface")
+ puts "Starting new service... "
+ @list = []
+ end
+
+ def string(idx)
+ return @list[idx]
+ end
+
+ def list()
+ return @list
+ end
+
+ def add(arg)
+ puts "Adding " + arg + " to the list"
+ @list << arg
+ end
+
+ def remove(arg)
+ @list.delete(arg) ? true : false
+ end
+
+ def exit()
+ $kapp.quit()
+ return true
+ end
+end
diff --git a/languages/ruby/app_templates/dcopservice/dcopserviceruby.kdevtemplate b/languages/ruby/app_templates/dcopservice/dcopserviceruby.kdevtemplate
new file mode 100644
index 00000000..adf9c172
--- /dev/null
+++ b/languages/ruby/app_templates/dcopservice/dcopserviceruby.kdevtemplate
@@ -0,0 +1,199 @@
+# KDE Config File
+[General]
+Name=DCOP Service
+Name[br]=Servij DCOP
+Name[ca]=Servei DCOP
+Name[de]=DCOP-Dienst
+Name[el]=Υπηρεσία DCOP
+Name[es]=Servicio DCOP
+Name[et]=DCOP-teenus
+Name[eu]=DCOP zerbitzua
+Name[fa]=خدمت DCOP
+Name[fr]=Service DCOP
+Name[ga]=Seirbhís DCOP
+Name[gl]=Servizo DCOP
+Name[hu]=DCOP-szolgáltatás
+Name[it]=Servizio DCOP
+Name[ja]=DCOP サービス
+Name[nds]=DCOP-Deenst
+Name[ne]=DCOP सेवा
+Name[nl]=DCOP-service
+Name[pl]=Usługa DCOP
+Name[pt]=Serviço de DCOP
+Name[pt_BR]=Serviço DCOP
+Name[ru]=Сервис DCOP
+Name[sk]=DCOP služba
+Name[sr]=DCOP сервис
+Name[sr@Latn]=DCOP servis
+Name[sv]=DCOP-tjänst
+Name[tr]=DCOP Hizmeti
+Name[zh_CN]=DCOP 服务
+Name[zh_TW]=DCOP 服務
+Icon=kdcop.png
+Category=Ruby/KDE
+Comment=Generates a framework for a KDE DCOP service and client access library.
+Comment[ca]=Genera una infraestructura per a un servei DCOP de KDE i la biblioteca d'accés del client.
+Comment[da]=Genererer et skelet for en KDE dcop-tjeneste og klientadgangsbibliotek.
+Comment[de]=Erstellt das Grundgerüst für einen KDE-DCOP-Dienst und eine Bibliothek für den Client-Zugriff.
+Comment[el]=Δημιουργεί ένα πλαίσιο για μια υπηρεσία KDE DCOP και μια βιβλιοθήκη πρόσβασης πελάτη.
+Comment[es]=Genera una infraestructura para un servicio DCOP de KDE y una biblioteca de acceso cliente.
+Comment[et]=KDE DCOP-teenuse raamistiku ja kliendi ligipääsu teegi loomine.
+Comment[eu]=KDE-ren DCOP zerbitzu baterako lan-marko bat eta bezero liburutegi bat sortzen ditu.
+Comment[fa]=چارچوبی برای خدمت KDE DCOP و کتابخانۀ دستیابی کارخواه تولید می‌کند.
+Comment[fr]=Génère une infrastructure pour un service DCOP KDE et une bibliothèque d'accès client.
+Comment[ga]=Cruthaigh creatlach do sheirbhís DCOP KDE agus leabharlann rochtana cliaint.
+Comment[gl]=Xera un contorno de traballo para un servizo DCOP de KDE e unha biblioteca de acceso para clientes.
+Comment[hu]=Létrehoz egy alap KDE DCOP-szolgáltatást és klienselérési programkönyvtárat.
+Comment[it]=Genera l'infrastruttura per un servizio DCOP di KDE e una libreria per l'accesso da client.
+Comment[ja]=KDE DCOP サービスとクライアントアクセスライブラリのためのフレームワークを作成します
+Comment[nds]=Stellt en Rahmenwark för en KDE-DCOP-Deenst un en Clienttogriep-Bibliotheek op.
+Comment[ne]=KDE DCOP सेवा र ग्राहक पहुँच लाइब्रेरीका लागि फ्रेमवर्क उत्पन्न गर्दछ ।
+Comment[nl]=Genereert een framework voor een KDE DCOP-service- en client-bibliotheek.
+Comment[pl]=Generuje schemat dla usługi KDE DCOP i biblioteki dostępu użytkownika.
+Comment[pt]=Gera a plataforma para um serviço de DCOP do KDE e a biblioteca de acesso dos clientes.
+Comment[pt_BR]=Gera a plataforma para um serviço de DCOP do KDE e a biblioteca de acesso dos clientes.
+Comment[ru]=Создание сервиса DCOP и библиотеки клиента.
+Comment[sk]=Vygeneruje framework pre KDE DCOP službu a klientskú prístupovú knižnicu.
+Comment[sr]=Прави једноставан радни оквир за KDE DCOP сервис и приступну библиотеку клијента.
+Comment[sr@Latn]=Pravi jednostavan radni okvir za KDE DCOP servis i pristupnu biblioteku klijenta.
+Comment[sv]=Skapar ett ramverk för en KDE DCOP-tjänst och klientåtkomstbibliotek.
+Comment[tr]=Bir KDE DCOP hizmeti ve istemci erişim kütüphanesi için bir çatı yaratır.
+Comment[zh_CN]=生成一个 KDE DCOP 服务和客户访问库的框架。
+Comment[zh_TW]=產生一個 KDE DCOP 服務的架構,以及客戶端存取的函式庫。
+FileTemplates=rb,ShellStyle
+ShowFilesAfterGeneration=%{dest}/src/main.rb
+Archive=dcopserviceruby.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/dcopservice.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE7]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE9]
+Type=install
+Source=%{src}/app-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[FILE10]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE11]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE12]
+Type=install
+Source=%{src}/dcopservice.rb
+Dest=%{dest}/src/%{APPNAMELC}.rb
+
+[FILE13]
+Type=install
+Source=%{src}/dcopservice.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[FILE14]
+Type=install
+Source=%{src}/main.rb
+Dest=%{dest}/src/main.rb
+
+[FILE15]
+Type=install
+Source=%{src}/app.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[MSG]
+Type=message
+Comment=A KDE DCOP Service was created in %{dest}
+Comment[ca]=Un servei DCOP de KDE ha estat creada en %{dest}
+Comment[da]=En KDE DCOP tjeneste blev oprettet i %{dest}
+Comment[de]=Ein KDE-DCOP-Dienst wurde in %{dest} erstellt.
+Comment[el]=Μια υπηρεσία KDE DCOP δημιουργήθηκε στο %{dest}
+Comment[es]=Un servicio DCOP de KDE ha sido creado en %{dest}
+Comment[et]=KDE DCOP-teenus loodi asukohta %{dest}
+Comment[eu]=KDE-ren DCOP zerbitzu bat sortu da hemen: %{dest}
+Comment[fa]=یک خدمت KDE DCOP در %{dest} ایجاد شد
+Comment[fr]=Un service DCOP KDE a été créé dans %{dest}
+Comment[ga]=Cruthaíodh Seirbhís DCOP KDE i %{dest}
+Comment[gl]=Creouse un servizo DCOP de KDE en %{dest}
+Comment[hu]=Létrejött egy KDE DCOP-szolgáltatás itt: %{dest}
+Comment[it]=È stato creato un servizio DCOP di KDE in %{dest}
+Comment[ja]=KDE DCOP サービスを %{dest} に作成しました
+Comment[nds]=In %{dest} wöör en KDE-DCOP-Deenst opstellt
+Comment[ne]=KDE DCOP सेवा %{dest} मा सिर्जना गरियो
+Comment[nl]=Een DCOP-service is aangemaakt in %{dest}
+Comment[pl]=Usługa KDE DCOP została utworzona w %{dest}
+Comment[pt]=Foi criado um serviço de DCOP do KDE em %{dest}
+Comment[pt_BR]=Foi criado um serviço de DCOP do KDE em %{dest}
+Comment[ru]=Сервис DCOP создан в %{dest}
+Comment[sk]=KDE DCOP služba bola vytvorená v %{dest}
+Comment[sl]=Storitev DCOP za KDE je bila ustvarjena v %{dest}
+Comment[sr]=KDE DCOP сервис направљен је у %{dest}
+Comment[sr@Latn]=KDE DCOP servis napravljen je u %{dest}
+Comment[sv]=En KDE DCOP-tjänst skapades i %{dest}
+Comment[tr]=Bir KDE DCOP Hizmeti %{dest} içinde yaratılmıştır.
+Comment[zh_CN]=在 %{dest} 中创建了一个 KDE DCOP 服务
+Comment[zh_TW]=KDE DCOP 服務已建立於 %{dest}
diff --git a/languages/ruby/app_templates/dcopservice/dcopserviceruby.png b/languages/ruby/app_templates/dcopservice/dcopserviceruby.png
new file mode 100644
index 00000000..2cb4f1f3
--- /dev/null
+++ b/languages/ruby/app_templates/dcopservice/dcopserviceruby.png
Binary files differ
diff --git a/languages/ruby/app_templates/dcopservice/main.rb b/languages/ruby/app_templates/dcopservice/main.rb
new file mode 100644
index 00000000..3122b087
--- /dev/null
+++ b/languages/ruby/app_templates/dcopservice/main.rb
@@ -0,0 +1,30 @@
+require 'Korundum'
+require '%{APPNAMELC}.rb'
+
+description = I18N_NOOP("A KDE DCOP Application")
+version = "0.1"
+options = []
+
+KDE::Locale.mainCatalogue = "kdelibs"
+aboutdata = KDE::AboutData.new("%{APPNAMELC}", I18N_NOOP("KDE"),
+ version, description,
+ KDE::AboutData.License_GPL, "(C) %{YEAR}, %{AUTHOR}")
+aboutdata.addAuthor("%{AUTHOR}",I18N_NOOP("Developer"),"%{EMAIL}")
+
+KDE::CmdLineArgs.init( ARGV, aboutdata )
+KDE::CmdLineArgs.addCmdLineOptions( options )
+KDE::UniqueApplication.addCmdLineOptions()
+
+if !KDE::UniqueApplication.start
+ puts "%{APPNAMELC} is already running!"
+ exit(0)
+end
+
+app = KDE::UniqueApplication.new
+puts "starting %{APPNAMELC} "
+# This app is started automatically, no need for session management
+app.disableSessionManagement
+service = %{APPNAME}.new
+puts "starting %{APPNAMELC} "
+app.exec
+
diff --git a/languages/ruby/app_templates/dcopservice/src-Makefile.am b/languages/ruby/app_templates/dcopservice/src-Makefile.am
new file mode 100644
index 00000000..220c58e3
--- /dev/null
+++ b/languages/ruby/app_templates/dcopservice/src-Makefile.am
@@ -0,0 +1,15 @@
+INCLUDES = $(all_includes) -I$(RUBY_ARCHDIR)
+
+bin_PROGRAMS = %{APPNAMELC}
+%{APPNAMELC}_LDFLAGS = $(all_libraries) $(KDE_RPATH) -L$(RUBY_LIBDIR)
+%{APPNAMELC}_LDADD = $(LIB_KIO) $(RUBY_LIBRUBYARG)
+%{APPNAMELC}_SOURCES = %{APPNAMELC}.cpp
+
+METASOURCES = AUTO
+
+rubysrc_DATA = main.rb %{APPNAMELC}.rb
+rubysrcdir = $(kde_datadir)/%{APPNAMELC}
+
+service_DATA = %{APPNAMELC}.desktop
+servicedir = $(kde_servicesdir)
+
diff --git a/languages/ruby/app_templates/dcopservice/subdirs b/languages/ruby/app_templates/dcopservice/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/ruby/app_templates/dcopservice/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/ruby/app_templates/kapp/Makefile.am b/languages/ruby/app_templates/kapp/Makefile.am
new file mode 100644
index 00000000..20cf1f3f
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/Makefile.am
@@ -0,0 +1,19 @@
+dataFiles = app_client.rb appiface.rb app.rb appview.rb main.rb pref.rb app.cpp \
+ appui.rc app.desktop app.kdevelop app-Makefile.am app-configure.in.in \
+ src-Makefile.am subdirs README
+
+templateName = kappruby
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/ruby/app_templates/kapp/README b/languages/ruby/app_templates/kapp/README
new file mode 100644
index 00000000..f04a5635
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/README
@@ -0,0 +1,81 @@
+-----------------------------------------------
+Kde application framework template quickstart
+Author: Thomas Nagy
+Date: 2004-03-22
+-----------------------------------------------
+
+This README file explains you basic things for starting with
+this application template.
+
+
+** Building and installing **
+
+* Build the configure script by "make -f Makefile.cvs"
+
+* To clean, use "make clean", and to clean everything
+(remove the makefiles, etc), use "make distclean"
+
+* To distribute your program, try "make dist".
+This will make a compact tarball archive of your release with the
+necessary scripts inside.
+
+* Modifying the auto-tools scripts
+for automake scripts there is an excellent tutorial there :
+http://developer.kde.org/documentation/other/makefile_am_howto.html
+
+* Simplify your life : install the project in your home directory for
+testing purposes.
+./configure --prefix=/home/user/dummyfolder/
+In the end when you finished the development you can
+rm -rf /home/user/dummyfolder/
+without fear.
+
+
+** Technologies **
+
+* Build the menus of your application easily
+kde applications now use an xml file (*ui.rc file) to build the menus.
+This allow a great customization of the application. However, when
+programming the menu is shown only after a "make install"
+
+For more details, consult :
+http://devel-home.kde.org/~larrosa/tutorial/p9.html
+http://developer.kde.org/documentation/tutorials/xmlui/preface.html
+
+* Use KConfig XT to create your configuration dialogs and make
+them more maintainable.
+
+For more details, consult :
+http://developer.kde.org/documentation/tutorials/kconfigxt/kconfigxt.html
+
+* With KParts, you can embed other kde components in your program, or make your program
+embeddable in other apps. For example, the kmplayer kpart can be called to play videos
+in your app.
+
+For more details, consult :
+http://www-106.ibm.com/developerworks/library/l-kparts/
+http://developer.kde.org/documentation/tutorials/dot/writing-plugins.html
+http://developer.kde.org/documentation/tutorials/developing-a-plugin-structure/index.html
+
+* With dcop, you can control your app from other applications
+Make sure to include K_DCOP and a kdcop: section in your .h file
+http://developer.kde.org/documentation/tutorials/dot/dcopiface/dcop-interface.html
+
+
+** Documentation **
+
+* For the translations :
+1. Download a patched gettext which can be found at:
+ http://public.kde.planetmirror.com/pub/kde/devel/gettext-kde/
+2. Install that gettext in ~/bin/
+3. cd ~/yourproject, export PATH=~/bin:$PATH, export
+KDEDIR=/where_your_KDE3_is
+4. make -f admin/Makefile.common package-messages
+5. make package-messages
+6. Translate the po files (not the pot!!) with kbabel or xemacs
+
+* Do not forget to write the documentation for your kde app
+edit the documentation template index.docbook in doc/
+
+
+
diff --git a/languages/ruby/app_templates/kapp/app-Makefile.am b/languages/ruby/app_templates/kapp/app-Makefile.am
new file mode 100644
index 00000000..bfe1c599
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/app-Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = $(TOPSUBDIRS)
diff --git a/languages/ruby/app_templates/kapp/app-configure.in.in b/languages/ruby/app_templates/kapp/app-configure.in.in
new file mode 100644
index 00000000..7d849466
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/app-configure.in.in
@@ -0,0 +1,45 @@
+#MIN_CONFIG(3.0.0)
+
+AM_INIT_AUTOMAKE(%{APPNAMELC}, 0.1)
+AC_C_BIGENDIAN
+AC_CHECK_KDEMAXPATHLEN
+
+AC_PROG_MAKE_SET
+
+AC_CHECK_PROG(RUBY, ruby, ruby)
+
+if test -z "$RUBY"; then
+ DO_NOT_COMPILE="$DO_NOT_COMPILE qtruby"
+else
+ AC_MSG_CHECKING(for ruby dirs)
+ RUBY_ARCHDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"archdir"@:>@)'`
+ RUBY_SITEARCHDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"sitearchdir"@:>@)'`
+ RUBY_SITEDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"sitelibdir"@:>@)'`
+ RUBY_LIBDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"libdir"@:>@)'`
+ RUBY_LIBRUBYARG=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"LIBRUBYARG_SHARED"@:>@)'`
+ AC_MSG_RESULT([archdir $RUBY_ARCHDIR, sitearchdir $RUBY_SITEARCHDIR, sitedir $RUBY_SITEDIR, libdir $RUBY_LIBDIR, librubyarg $RUBY_LIBRUBYARG])
+ AC_SUBST(RUBY_ARCHDIR)
+ AC_SUBST(RUBY_SITEARCHDIR)
+ AC_SUBST(RUBY_SITEDIR)
+ AC_SUBST(RUBY_LIBDIR)
+ AC_SUBST(RUBY_LIBRUBYARG)
+fi
+
+# Korundum check
+AC_MSG_CHECKING([whether Korundum is installed])
+korundum_present=no
+cat >korundumtest.rb <<END
+require 'Korundum'
+END
+${RUBY} korundumtest.rb >/dev/null 2>&1 && korundum_present=yes
+AC_MSG_RESULT([$korundum_present])
+
+# rbuic check
+AC_PATH_PROG([RBUIC],[rbuic])
+if test -z "${RBUIC}" ; then
+ AC_MSG_ERROR([cannot find rbuic (part of the QtRuby package)])
+fi
+AC_SUBST([RBUIC])
+AC_SUBST([RUBY])
+
+
diff --git a/languages/ruby/app_templates/kapp/app.cpp b/languages/ruby/app_templates/kapp/app.cpp
new file mode 100644
index 00000000..8d6af02d
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/app.cpp
@@ -0,0 +1,30 @@
+#include <ruby.h>
+
+#include <qstring.h>
+#include <qfileinfo.h>
+#include <kinstance.h>
+#include <kstandarddirs.h>
+
+int main(int argc, char **argv) {
+ KInstance * instance = new KInstance("%{APPNAMELC}");
+ QString appdir = ::locate("data", "%{APPNAMELC}/main.rb", instance);
+ delete instance;
+ if (appdir.isNull()) {
+ qFatal("Error: Can't find \"%{APPNAMELC}/main.rb\"\n");
+ }
+ QFileInfo program(appdir);
+
+ char ** rubyargs = (char **) calloc(argc+4, sizeof(char *));
+ rubyargs[0] = strdup(argv[0]);
+ rubyargs[1] = strdup("-KU");
+ rubyargs[2] = strdup(QString("-C%1").arg(program.dirPath()).latin1());
+ rubyargs[3] = strdup(QString("-I%1").arg(program.dirPath()).latin1());
+ rubyargs[4] = strdup(program.fileName().latin1());
+ for (int i = 1; i < argc; i++) {
+ rubyargs[i+4] = argv[i];
+ }
+
+ ruby_init();
+ ruby_options(argc+4, rubyargs);
+ ruby_run();
+}
diff --git a/languages/ruby/app_templates/kapp/app.desktop b/languages/ruby/app_templates/kapp/app.desktop
new file mode 100644
index 00000000..c8e5c86a
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/app.desktop
@@ -0,0 +1,44 @@
+[Desktop Entry]
+Name=%{APPNAME}
+Exec=ruby %{APPNAMELC}/main.rb %i -caption "%c"
+Icon=%{APPNAMELC}
+Type=Application
+X-DocPath=%{APPNAMELC}/%{APPNAMELC}.html
+Comment=A KDE KPart Application
+Comment[br]=Ur meziant Kpart evit KDE
+Comment[ca]=Una aplicació KPart per al KDE
+Comment[cy]=Cymhwysiad KPart KDE
+Comment[da]=Et KDE KPart-program
+Comment[de]=Eine auf der Komponententechnik KPart basierende KDE-Anwendung
+Comment[el]=Μια εφαρμογή KPart του KDE
+Comment[es]=Una aplicación KPart de KDE
+Comment[et]=KDE KPart rakendus
+Comment[eu]=KDE KPart aplikazio bat
+Comment[fa]=یک کاربرد KDE KPart
+Comment[fr]=Une application KPart pour KDE
+Comment[ga]=Feidhmchlár KPart KDE
+Comment[gl]=Unha aplicación KPart de KDE
+Comment[hi]=एक केडीई के-पार्ट अनुप्रयोग
+Comment[hu]=KPart-alapú KDE-alkalmazás
+Comment[is]=KDE KPart forrit
+Comment[it]=Applicazione KPart di KDE
+Comment[ja]=KDE KPart アプリケーション
+Comment[lt]=KDE KPart programa
+Comment[nds]=En KPart-Deelprogramm för KDE
+Comment[ne]=एउटा केडीई KPart अनुप्रयोग
+Comment[nl]=Een KDE KPart-toepassing
+Comment[pl]=Osadzalny element KPart KDE
+Comment[pt]=Uma Aplicação KPart do KDE
+Comment[pt_BR]=Um Aplicativo KPart do KDE
+Comment[ru]=Приложение KPart для KDE
+Comment[sk]=KDE KPart aplikácia
+Comment[sl]=Program KPart za KDE
+Comment[sr]=KDE KPart програм
+Comment[sr@Latn]=KDE KPart program
+Comment[sv]=Ett KDE Kpart-program
+Comment[ta]=கெடி கெபார்ட் பயன்பாடு
+Comment[tg]=Ба кор андохтани KPart барои KDE
+Comment[tr]=Bir KDE KPart Uygulaması
+Comment[zh_CN]=一个 KDE KPart 应用程序
+Comment[zh_TW]=KDE KPart 應用程式
+Terminal=false
diff --git a/languages/ruby/app_templates/kapp/app.kdevelop b/languages/ruby/app_templates/kapp/app.kdevelop
new file mode 100644
index 00000000..3a1efdd9
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/app.kdevelop
@@ -0,0 +1,90 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevAutoProject</projectmanagement>
+ <primarylanguage>Ruby</primarylanguage>
+ <keywords>
+ <keyword>Ruby</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ <ignoreparts>
+ <part>KDevDoxygen</part>
+ <part>KDevdistpart</part>
+ <part>KDevVisualBoyAdvance</part>
+ <part>KDevDebugger</part>
+ </ignoreparts>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activedir/>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ </run>
+ </kdevautoproject>
+ <kdevfileview>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>CVS,.svn</hidepatterns>
+ </tree>
+ <groups>
+ <group pattern="*.rb" name="Ruby files" />
+ <group pattern="*.ui" name="QT Designer files" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwindows_bugs</toc>
+ </ignoretocs>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="rb"/>
+ <type ext="ui"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevrubysupport>
+ <run>
+ <interpreter>ruby</interpreter>
+ <terminal>false</terminal>
+ <charactercoding>3</charactercoding>
+ <mainprogram>src/main.rb</mainprogram>
+ </run>
+ </kdevrubysupport>
+</kdevelop>
diff --git a/languages/ruby/app_templates/kapp/app.rb b/languages/ruby/app_templates/kapp/app.rb
new file mode 100644
index 00000000..470b0136
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/app.rb
@@ -0,0 +1,216 @@
+=begin
+ This class serves as the main window for %{APPNAME}. It handles the
+ menus, toolbars, and status bars.
+
+ @short Main window class
+ @author %{AUTHOR} <%{EMAIL}>
+ @version %{VERSION}
+=end
+
+class %{APPNAMESC} < KDE::MainWindow
+
+ slots 'fileNew()',
+ 'fileOpen()',
+ 'fileSave()',
+ 'fileSaveAs()',
+ 'filePrint()',
+ 'optionsPreferences()',
+ 'changeStatusbar(const QString&)',
+ 'changeCaption(const QString&)'
+
+ def initialize()
+ super( nil, "%{APPNAMESC}" )
+ @view = %{APPNAMESC}View.new(self)
+ @printer = nil
+ # accept dnd
+ setAcceptDrops(true)
+
+ # tell the KDE::MainWindow that this is indeed the main widget
+ setCentralWidget(@view)
+
+ # then, setup our actions
+ setupActions()
+
+ # and a status bar
+ statusBar().show()
+
+ # Apply the create the main window and ask the mainwindow to
+ # automatically save settings if changed: window size, toolbar
+ # position, icon size, etc. Also to add actions for the statusbar
+ # toolbar, and keybindings if necessary.
+ setupGUI();
+
+ # allow the view to change the statusbar and caption
+ connect(@view, SIGNAL('signalChangeStatusbar(const QString&)'),
+ self, SLOT('changeStatusbar(const QString&)'))
+ connect(@view, SIGNAL('signalChangeCaption(const QString&)'),
+ self, SLOT('changeCaption(const QString&)'))
+
+ end
+
+
+ def load(url)
+ target = ""
+ # the below code is what you should normally do. in this
+ # example when, we want the url to our own. you probably
+ # want to use this code instead for your app
+
+ if false
+ # download the contents
+ if KIO::NetAccess.download(url, target, self)
+ # set our caption
+ setCaption(url.url)
+
+ # load in the file (target is always local)
+ @view.openURL(KDE::URL.new(target))
+
+ # and remove the temp file
+ KIO::NetAccess.removeTempFile(target)
+ end
+ end
+
+ setCaption(url.prettyURL())
+ @view.openURL(url)
+ end
+
+ def setupActions()
+ KDE::StdAction.openNew(self, SLOT('fileNew()'), actionCollection())
+ KDE::StdAction.open(self, SLOT('fileOpen()'), actionCollection())
+ KDE::StdAction.save(self, SLOT('fileSave()'), actionCollection())
+ KDE::StdAction.saveAs(self, SLOT('fileSaveAs()'), actionCollection())
+ KDE::StdAction.print(self, SLOT('filePrint()'), actionCollection())
+ KDE::StdAction.quit($kapp, SLOT('quit()'), actionCollection())
+
+ KDE::StdAction.preferences(self, SLOT('optionsPreferences()'), actionCollection())
+
+ # this doesn't do anything useful. it's just here to illustrate
+ # how to insert a custom menu and menu item
+ custom = KDE::Action.new(i18n("Cus&tom Menuitem"), KDE::Shortcut.new(),
+ self, SLOT('optionsPreferences()'),
+ actionCollection(), "custom_action")
+ end
+
+ def saveProperties(config)
+ # the 'config' object points to the session managed
+ # config file. anything you write here will be available
+ # later when this app is restored
+
+ if [email protected]().empty?
+ config.writeEntry("lastURL", @view.currentURL())
+ end
+ end
+
+ def readProperties(config)
+ # the 'config' object points to the session managed
+ # config file. This function is automatically called whenever
+ # the app is being restored. read in here whatever you wrote
+ # in 'saveProperties'
+
+ url = config.readPathEntry("lastURL")
+
+ if !url.empty?
+ @view.openURL(KDE::URL.new(url))
+ end
+ end
+
+ def dragEnterEvent(event)
+ # accept uri drops only
+ event.accept(KDE::URLDrag.canDecode(event))
+ end
+
+ def dropEvent(event)
+ # This is a very simplistic implementation of a drop event. we
+ # will only accept a dropped URL. the Qt dnd code can do *much*
+ # much more, so please read the docs there
+ urls = []
+
+ # see if we can decode a URI.. if not, just ignore it
+ if KDE::URLDrag.decode(event, urls) && !urls.empty?
+ # okay, we have a URI.. process it
+ url = urls.shift
+
+ # load in the file
+ load(url)
+ end
+ end
+
+ def fileNew()
+ # This slot is called whenever the File.New menu is selected,
+ # the New shortcut is pressed (usually CTRL+N) or the New toolbar
+ # button is clicked
+
+ # create a new window
+ %{APPNAMESC}.new.show()
+ end
+
+ def fileOpen()
+ # This slot is called whenever the File.Open menu is selected,
+ # the Open shortcut is pressed (usually CTRL+O) or the Open toolbar
+ # button is clicked
+
+ # This brings up the generic open dialog
+ url = KDE::URLRequesterDlg.getURL(nil, self, i18n("Open Location") )
+
+ # standard filedialog
+ url = KDE::FileDialog.getOpenURL(nil, nil, self, i18n("Open Location"))
+ if !url.empty?
+ @view.openURL(url)
+ end
+ end
+
+ def fileSave()
+ # This slot is called whenever the File.Save menu is selected,
+ # the Save shortcut is pressed (usually CTRL+S) or the Save toolbar
+ # button is clicked
+
+ # save the current file
+ end
+
+ def fileSaveAs()
+ # This slot is called whenever the File.Save As menu is selected,
+ file_url = KDE::FileDialog.getSaveURL()
+ if !file_url.empty? && file_url.valid?
+ # save your info, here
+ end
+ end
+
+ def filePrint()
+ # This slot is called whenever the File.Print menu is selected,
+ # the Print shortcut is pressed (usually CTRL+P) or the Print toolbar
+ # button is clicked
+ if @printer.nil? then @printer = KDE::Printer.new end
+ if @printer.setup(self)
+ # setup the printer. with Qt, you always "print" to a
+ # Qt::Painter.. whether the output medium is a pixmap, a screen,
+ # or paper
+ p = Qt::Painter.new
+ p.begin(@printer)
+
+ # we let our view do the actual printing
+ metrics = Qt::PaintDeviceMetrics.new(@printer)
+ @view.print(p, metrics.height(), metrics.width())
+
+ # and send the result to the printer
+ p.end()
+ end
+ end
+
+ def optionsPreferences()
+ # popup some sort of preference dialog, here
+ dlg = %{APPNAMESC}Preferences.new
+ if dlg.exec()
+ # redo your settings
+ end
+ end
+
+ def changeStatusbar(text)
+ # display the text on the statusbar
+ statusBar().message(text)
+ end
+
+ def changeCaption(text)
+ # display the text on the caption
+ setCaption(text)
+ end
+
+end
diff --git a/languages/ruby/app_templates/kapp/app_client.rb b/languages/ruby/app_templates/kapp/app_client.rb
new file mode 100644
index 00000000..b08e9b21
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/app_client.rb
@@ -0,0 +1,18 @@
+require 'Korundum'
+include KDE
+
+about = AboutData.new("%{APPNAMELC}_client", "%{APPNAME} client", "0.1")
+CmdLineArgs.init(ARGV, about)
+
+app = Application.new
+
+# get our DCOP client and attach so that we may use it
+client = app.dcopClient
+client.attach
+
+# do a 'send' for now
+dcopRef = DCOPRef.new("%{APPNAMELC}", "%{APPNAMESC}Iface")
+dcopRef.openURL("http://www.kde.org")
+
+app.exec
+
diff --git a/languages/ruby/app_templates/kapp/appiface.rb b/languages/ruby/app_templates/kapp/appiface.rb
new file mode 100644
index 00000000..a8be16b5
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/appiface.rb
@@ -0,0 +1,14 @@
+class %{APPNAMESC}Iface < KDE::DCOPObject
+
+ k_dcop 'void openURL(QString)'
+
+ def initialize(app)
+ super("%{APPNAMESC}Iface")
+ @app = app
+ end
+
+ def openURL(url)
+ @app.openURL(url)
+ end
+end
+
diff --git a/languages/ruby/app_templates/kapp/appui.rc b/languages/ruby/app_templates/kapp/appui.rc
new file mode 100644
index 00000000..ceb4f14e
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/appui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="%{APPNAMELC}" version="1">
+<MenuBar>
+ <Menu name="custom"><text>C&amp;ustom</text>
+ <Action name="custom_action" />
+ </Menu>
+</MenuBar>
+</kpartgui>
diff --git a/languages/ruby/app_templates/kapp/appview.rb b/languages/ruby/app_templates/kapp/appview.rb
new file mode 100644
index 00000000..bc5b5140
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/appview.rb
@@ -0,0 +1,103 @@
+
+=begin
+ This is the main view class for %{APPNAME}. Most of the non-menu,
+ non-toolbar, and non-statusbar (e.g., non frame) GUI code should go
+ here.
+
+ This %{APPNAMELC} uses an HTML component as an example.
+
+ @short Main view
+ @author %{AUTHOR} <%{EMAIL}>
+ @version %{VERSION}
+=end
+class %{APPNAMESC}View < Qt::Widget
+
+ #
+ # Use this signal to change the content of the statusbar
+ #
+ signals 'signalChangeStatusbar(const QString&)'
+
+ #
+ # Use this signal to change the content of the caption
+ #
+ signals 'signalChangeCaption(const QString&)'
+
+ slots 'slotOnURL(const QString&)',
+ 'slotSetTitle(const QString&)'
+
+ def initialize(parent)
+ super(parent)
+
+ # keep a reference to the DCOP Interface so it doesn't get gc'd
+ @dcop = %{APPNAMESC}Iface.new(self)
+
+ # setup our layout manager to automatically add our widgets
+ top_layout = Qt::HBoxLayout.new(self)
+ top_layout.setAutoAdd(true)
+
+ # we want to look for all components that satisfy our needs. the
+ # trader will actually search through *all* registered KDE
+ # applications and components -- not just KParts. So we have to
+ # specify two things: a service type and a constraint
+ #
+ # the service type is like a mime type. we say that we want all
+ # applications and components that can handle HTML -- 'text/html'
+ #
+ # however, by itself, this will return such things as Netscape..
+ # not what we wanted. so we constrain it by saying that the
+ # string 'KParts/ReadOnlyPart' must be found in the ServiceTypes
+ # field. with this, only components of the type we want will be
+ # returned.
+ offers = KDE::Trader.self().query("text/html", "'KParts/ReadOnlyPart' in ServiceTypes")
+
+ factory = nil
+ # in theory, we only care about the first one.. but let's try all
+ # offers just in when the first can't be loaded for some reason
+ offers.each do |ptr|
+ # we now know that our offer can handle HTML and is a part.
+ # since it is a part, it must also have a library... let's try to
+ # load that now
+ factory = KDE::LibLoader.self().factory( ptr.library() )
+ if ! factory.nil?
+ @html = factory.create(self, ptr.name(), "KParts::ReadOnlyPart")
+ break
+ end
+ end
+
+ # if our factory is invalid, then we never found our component
+ # and we might as well just exit now
+ if factory.nil?
+ KDE::MessageBox.error(self, i18n("Could not find a suitable HTML component"))
+ return
+ end
+
+ connect(@html, SIGNAL('setWindowCaption(const QString&)'),
+ self, SLOT('slotSetTitle(const QString&)'))
+ connect(@html, SIGNAL('setStatusBarText(const QString&)'),
+ self, SLOT('slotOnURL(const QString&)'))
+
+ end
+
+
+ def print(p, height, width)
+ # do the actual printing, here
+ # p.drawText(etc..)
+ end
+
+ def currentURL()
+ return @html.url().url()
+ end
+
+ def openURL(url)
+ @html.openURL(KDE::URL.new(url))
+ end
+
+ def slotOnURL(url)
+ emit signalChangeStatusbar(url)
+ end
+
+ def slotSetTitle(title)
+ emit signalChangeCaption(title)
+ end
+
+end
diff --git a/languages/ruby/app_templates/kapp/kappruby.kdevtemplate b/languages/ruby/app_templates/kapp/kappruby.kdevtemplate
new file mode 100644
index 00000000..490d7591
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/kappruby.kdevtemplate
@@ -0,0 +1,238 @@
+# KDE Config File
+[General]
+Name=Application framework
+Name[ca]=Infraestructura d'aplicacions
+Name[da]=Programskelet
+Name[de]=Anwendungsgrundgerüst
+Name[el]=Πλαίσιο εφαρμογής
+Name[es]=Infraestructura de aplicación
+Name[et]=Rakenduse raamistik
+Name[eu]=Aplikazioen lan-markoa
+Name[fa]=چارچوب کاربرد
+Name[fr]=Infrastructure d'application
+Name[ga]=Creatlach feidhmchláir
+Name[gl]=Entorno de traballo para aplicación
+Name[hu]=Alkalmazás-keretrendszer
+Name[it]=Infrastruttura applicativa
+Name[ja]=アプリケーションフレームワーク
+Name[nds]=Programmrahmenwark
+Name[ne]=अनुप्रयोग फ्रेमवर्क
+Name[nl]=Applicationframework
+Name[pl]=Szablon programu
+Name[pt]=Plataforma de aplicações
+Name[pt_BR]=Plataforma de aplicações
+Name[ru]=Приложение KDE
+Name[sk]=Aplikačný framework
+Name[sl]=Ogrodje programa
+Name[sr]=Радни оквир програма
+Name[sr@Latn]=Radni okvir programa
+Name[sv]=Programramverk
+Name[tr]=Uygulama Çatısı
+Name[zh_CN]=应用程序框架
+Name[zh_TW]=應用程式框架
+Icon=kapp.png
+Category=Ruby/KDE
+Comment=Generates a simple Korundum application with one toplevel window, menus and toolbars. A DCOP interface is also provided, so that your application can provide a scripting interface
+Comment[ca]=Genera una simple aplicació Korundum amb una finestra principal, menús i barres d'eines. També es proveeix la interfície DCOP, de manera que la vostra aplicació podrà proveir d'una interfície per a scripts
+Comment[da]=Generere et simpelt Korundum program med et vindue på topniveau, menuer og værktøjslinjer. Der sørges også for en DCOP-grænseflade, så dit program kan give en script-grænseflade
+Comment[de]=Erstellt eine einfache Korundum-Anwendung mit einem Toplevel-Fenster, Menüs und Werkzeugleisten. Dazu kommt eine DCOP-Schnittstelle, so dass Ihre Anwendung eine Schnittstelle für Skripte anbieten kann.
+Comment[el]=Δημιουργεί μια απλή εφαρμογή Korundum με ένα ανώτερο παράθυρο, μενού και γραμμές εργαλείων. Προσφέρεται επίσης μια διασύνδεση DCOP, έτσι ώστε η εφαρμογή σας να προσφέρει ένα περιβάλλον γραφής σεναρίων
+Comment[es]=Genera una sencilla aplicación Korundum con una ventana principal, menús y barras de herramientas. También se proporciona una interfaz DCOP para que su aplicación pueda proporcionar una interfaz para guiones de órdenes.
+Comment[et]=Lihtsa Korundumi rakenduse loomine ühe tipptaseme akna, menüüde ja tööriistaribadega. Lisatakse ka DCOP-liides, mis võimaldab rakendusel pakkuda skriptikeelte toetust
+Comment[eu]=Goi-mailako lehio bat, menuak eta tresna-barrak dituen Korundum aplikazio sinple bat sortzen du . DCOP interfazea ere sortzen du, eta beraz, zure aplikazioak script-interfaze bat eskainiko du
+Comment[fa]=یک کاربرد سادۀ Korundum با یک پنجرۀ سطح بالا، گزینگان و میله ابزارها تولید می‌کند. همچنین یک واسط DCOP فراهم است. بنابراین، کاربرد شما یک واسط دست‌نوشته‌ای را می‌تواند فراهم کند
+Comment[fr]=Génère une application Korundum simple comprenant une fenêtre de premier niveau, des menus et des barres d'outils. Une interface DCOP est également fournie, afin que votre application puisse offrir une interface de scriptage
+Comment[gl]=Xera unha aplicación sinxela Korundum cunha fiestra, menús e barras de ferramentas. Proporciónase tamén unha interface DCOP de modo que a súa aplicación poida ofrecer unha interface de scripting.
+Comment[hu]=Létrehoz egy egyszerű Korundum-alkalmazást egy főablakkal, menükkel és eszköztárakkal. DCOP-felület is tartozik az alkalmazáshoz, így könnyen kialakítható hozzá szkriptelési felület.
+Comment[it]=Genera una semplice applicazione Korundum con una finestra toplevel, menu e barre degli strumenti. È anche fornita un'interfaccia DCOP, così che l'applicazione può fornire una interfaccia di scripting
+Comment[nds]=Stellt en eenfach Korundum-Programm mit een böverst Finster, Menüs un Warktüüchbalkens op. Ok warrt noch en DCOP-Koppelsteed praatstellt, so dat Dien Programm en Skriptkoppelsteed anbeden kann.
+Comment[ne]=एउटा उच्च तह सञ्झ्याल, मेनु र उपकरणपट्टीसँग साधारण Korundum अनुप्रयोग उत्पन्न गर्दछ । DCOP इन्टरफेस पनि प्रदान गरिन्छ, जसले गर्दा तपाईँको अनुप्रयोगले स्क्रिप्टिङ इन्टरफेस प्रदान गर्न सक्छ ।
+Comment[nl]=Dit genereert een eenvoudige Korundum-toepassing met één toplevel window, menu's en toolbars. Een DCOP-interface wordt ook aangeleverd, zodat uw toepassing een scripting interface kan aanleveren.
+Comment[pl]=Generuje prosty program Korundum z jednym oknem, menu i paskami narzędzi. Dostępny jest także interfejs DCOP, więc Twój program może umożliwiać korzystanie ze skryptów
+Comment[pt]=Gera uma aplicação Korundum simples com uma janela de topo, menus e barras de ferramentas. Também é fornecida uma interface de DCOP, para que a sua aplicação possa oferecer uma interface de programação
+Comment[pt_BR]=Gera uma aplicação Korundum simples com uma janela de topo, menus e barras de ferramentas. Também é fornecida uma interface de DCOP, para que a sua aplicação possa oferecer uma interface de programação
+Comment[ru]=Создание простого приложения Korundum с окном, меню, панелями инструментов и сервисом DCOP
+Comment[sk]=Vygeneruje jednoduchú Korundum aplikáciu s jedným oknom, menu a panelom nástrojov. Taktiež bude poskytnuté DCOP rozhranie, takže aj aplikáciamôže poskytnúť skriptovacie rozhranie
+Comment[sr]=Прави једноставан Korundum програм са једним прозором највишег нивоа, менијима и тракама са алатом. Дат је и DCOP интерфејс, тако да ваш програм може да омогући скриптовање
+Comment[sr@Latn]=Pravi jednostavan Korundum program sa jednim prozorom najvišeg nivoa, menijima i trakama sa alatom. Dat je i DCOP interfejs, tako da vaš program može da omogući skriptovanje
+Comment[sv]=Skapar ett enkelt Korundum-program med ett toppnivåfönster, menyer och verktygsrader. Ett DCOP-gränssnitt tillhandahålls också, så att programmet kan tillhandahålla ett skriptgränssnitt.
+Comment[tr]=Bir üst seviye penceresi, menüleri ve araç çubukları olan basit bir Korundum uygulaması yaratır. Uygulamanızın bir betik arayüzü sağlayabilmesi için bir DCOP arayüzü de sağlanmıştır.
+Comment[zh_TW]=產生一個簡單的 Korundum 應用程式,內含頂層視窗、選單與工具列。另外提供一個 DCOP 介面,讓您的應用程式可以使用文稿介面。
+FileTemplates=rb,ShellStyle
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.rb
+Archive=kappruby.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE7]
+Type=install
+Source=%{src}/app-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[FILE9]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[FILE10]
+Type=install
+Source=%{kdevelop}/template-common/hi16-app-app.png
+Dest=%{dest}/src/hi16-app-%{APPNAMELC}.png
+Process=false
+
+[FILE11]
+Type=install
+Source=%{kdevelop}/template-common/hi32-app-app.png
+Dest=%{dest}/src/hi32-app-%{APPNAMELC}.png
+Process=false
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE12]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE13]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE14]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE15]
+Type=install
+Source=%{src}/app.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE16]
+Type=install
+Source=%{src}/app.rb
+Dest=%{dest}/src/%{APPNAMELC}.rb
+
+[FILE17]
+Type=install
+Source=%{src}/appview.rb
+Dest=%{dest}/src/%{APPNAMELC}view.rb
+
+[FILE18]
+Type=install
+Source=%{src}/appiface.rb
+Dest=%{dest}/src/%{APPNAMELC}iface.rb
+
+[FILE19]
+Type=install
+Source=%{src}/app_client.rb
+Dest=%{dest}/src/%{APPNAMELC}_client.rb
+
+[FILE20]
+Type=install
+Source=%{src}/pref.rb
+Dest=%{dest}/src/pref.rb
+
+[FILE21]
+Type=install
+Source=%{src}/main.rb
+Dest=%{dest}/src/main.rb
+
+[FILE22]
+Type=install
+EscapeXML=true
+Source=%{src}/appui.rc
+Dest=%{dest}/src/%{APPNAMELC}ui.rc
+
+[FILE23]
+Type=install
+Source=%{src}/README
+Dest=%{dest}/src/README
+
+[MSG]
+Type=message
+Comment=A Korundum Application was created at %{dest}
+Comment[ca]=Una aplicació Korundum ha estat creada a %{dest}
+Comment[da]=Et Korundum program blev oprettet i %{dest}
+Comment[de]=Eine Korundum-Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια εφαρμογή Korundum δημιουργήθηκε στο %{dest}
+Comment[es]=Una aplicación Korundum ha sido creada en %{dest}
+Comment[et]=Korundumi rakendus loodi asukohta %{dest}
+Comment[eu]=Korundum aplikazio bat sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد Korundum در %{dest} ایجاد شد
+Comment[fr]=Une application Korundum a été créée dans %{dest}
+Comment[ga]=Cruthaíodh Feidhmchlár Korundum ag %{dest}
+Comment[gl]=Creouse unha aplicación Korundum en %{dest}
+Comment[hu]=Létrejött egy Korundum-alapú alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione Korundum in %{dest}
+Comment[ja]=Korundum アプリケーションを %{dest} に作成しました
+Comment[nds]=In %{dest} wöör en Korundum-Programm opstellt.
+Comment[ne]=Korundum अनुप्रयोग %{dest} मा सिर्जना गरियो
+Comment[nl]=Een Korundum-toepassing is aangemaakt in %{dest}
+Comment[pl]=Program Korundum został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação Korundum em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação Korundum em %{dest}
+Comment[ru]=Приложение Korundum создано в %{dest}
+Comment[sk]=Korundum aplikácia bola vytvorená v %{dest}
+Comment[sr]=Korundum програм је направљен у %{dest}
+Comment[sr@Latn]=Korundum program je napravljen u %{dest}
+Comment[sv]=Ett Korundum-program skapades i %{dest}
+Comment[tr]=Bir Korundum Uygulaması %{dest} içinde yaratıldı.
+Comment[zh_TW]=一個 Korundum 應用程式已建立於 %{dest}
diff --git a/languages/ruby/app_templates/kapp/kappruby.png b/languages/ruby/app_templates/kapp/kappruby.png
new file mode 100644
index 00000000..913ebb87
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/kappruby.png
Binary files differ
diff --git a/languages/ruby/app_templates/kapp/main.rb b/languages/ruby/app_templates/kapp/main.rb
new file mode 100644
index 00000000..31d5e868
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/main.rb
@@ -0,0 +1,40 @@
+#!/usr/bin/env ruby
+
+require 'Korundum'
+
+require '%{APPNAMELC}iface.rb'
+require '%{APPNAMELC}.rb'
+require '%{APPNAMELC}view.rb'
+require 'pref.rb'
+
+description = I18N_NOOP("A KDE Application")
+version = "%{VERSION}"
+options = [ [ "+[URL]", I18N_NOOP( "Document to open" ), "" ] ]
+
+about = KDE::AboutData.new("%{APPNAMELC}", I18N_NOOP("%{APPNAME}"), version, description,
+ KDE::AboutData.License_%{LICENSE}, "(C) %{YEAR} %{AUTHOR}", nil, nil, "%{EMAIL}")
+about.addAuthor( "%{AUTHOR}", nil, "%{EMAIL}" )
+KDE::CmdLineArgs.init(ARGV, about)
+KDE::CmdLineArgs.addCmdLineOptions(options)
+app = KDE::Application.new
+
+# see if we are starting with session management
+if app.restored?
+ RESTORE(%{APPNAMESC})
+else
+ # no session.. just start up normally
+ args = KDE::CmdLineArgs.parsedArgs
+ if args.count == 0
+ widget = %{APPNAMESC}.new
+ widget.show
+ else
+ for i in 0...args.count do
+ widget = %{APPNAMESC}.new
+ widget.show
+ widget.load(args.url(i))
+ end
+ end
+end
+
+app.exec
+
diff --git a/languages/ruby/app_templates/kapp/pref.rb b/languages/ruby/app_templates/kapp/pref.rb
new file mode 100644
index 00000000..98669ad2
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/pref.rb
@@ -0,0 +1,38 @@
+
+class %{APPNAMESC}Preferences < KDE::DialogBase
+
+ def initialize()
+ super(TreeList, i18n("%{APPNAMESC} Preferences"),
+ Help|Default|Ok|Apply|Cancel, Ok)
+ # this is the base class for your preferences dialog. it is now
+ # a Treelist dialog.. but there are a number of other
+ # possibilities (including Tab, Swallow, and just Plain)
+ frame = addPage(i18n("First Page"), i18n("Page One Options"))
+ @pageOne = %{APPNAMESC}PrefPageOne.new(frame)
+
+ frame = addPage(i18n("Second Page"), i18n("Page Two Options"))
+ @pageTwo = %{APPNAMESC}PrefPageTwo.new(frame)
+ end
+end
+
+class %{APPNAMESC}PrefPageOne < Qt::Frame
+
+ def initialize(parent)
+ super(parent)
+ layout = Qt::HBoxLayout.new(self)
+ layout.setAutoAdd(true)
+
+ Qt::Label.new(i18n("Add something here"), self)
+ end
+end
+
+class %{APPNAMESC}PrefPageTwo < Qt::Frame
+
+ def initialize(parent)
+ super(parent)
+ layout = Qt::HBoxLayout.new(self)
+ layout.setAutoAdd(true)
+
+ Qt::Label.new(i18n("Add something here"), self)
+ end
+end
diff --git a/languages/ruby/app_templates/kapp/src-Makefile.am b/languages/ruby/app_templates/kapp/src-Makefile.am
new file mode 100644
index 00000000..d27aa6b3
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/src-Makefile.am
@@ -0,0 +1,43 @@
+## Makefile.am for %{APPNAMELC}
+
+# this is the program that gets installed. it's name is used for all
+# of the other Makefile.am variables
+bin_PROGRAMS = %{APPNAMELC}
+
+# set the include path for X, qt and KDE
+INCLUDES = $(all_includes) -I$(RUBY_ARCHDIR)
+
+# the library search path.
+%{APPNAMELC}_LDFLAGS = $(all_libraries) $(KDE_RPATH) -L$(RUBY_LIBDIR)
+
+# the libraries to link against.
+%{APPNAMELC}_LDADD = $(LIB_KFILE) $(LIB_KDEPRINT) $(RUBY_LIBRUBYARG)
+
+# which sources should be compiled for %{APPNAMELC}
+%{APPNAMELC}_SOURCES = %{APPNAMELC}.cpp
+
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+KDE_ICON = AUTO
+
+# this is where the kdelnk file will go
+kdelnkdir = $(kde_appsdir)/Utilities
+kdelnk_DATA = %{APPNAMELC}.desktop
+
+# this is where the XML-GUI resource file goes
+rcdir = $(kde_datadir)/%{APPNAMELC}
+rc_DATA = %{APPNAMELC}ui.rc
+
+rubysrc_DATA = main.rb %{APPNAMELC}.rb %{APPNAMELC}_client.rb %{APPNAMELC}iface.rb \
+ %{APPNAMELC}view.rb pref.rb
+
+rubysrcdir = $(kde_datadir)/%{APPNAMELC}
+
+rubyui_DATA =
+
+rubyuidir = $(kde_datadir)/%{APPNAMELC}
+
+%.rb: %.ui
+ $(RBUIC) -tr ${UIC_TR} -kde $< -o $@
+
diff --git a/languages/ruby/app_templates/kapp/subdirs b/languages/ruby/app_templates/kapp/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/ruby/app_templates/kapp/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/ruby/app_templates/kxt/Makefile.am b/languages/ruby/app_templates/kxt/Makefile.am
new file mode 100644
index 00000000..b642b88b
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/Makefile.am
@@ -0,0 +1,20 @@
+dataFiles = app.rb main.rb prefs.rb app.cpp appview.rb appview_base.ui prefs-base.ui \
+ appui.rc app.desktop kxtruby.png app.kdevelop \
+ app-Makefile.am app-configure.in.in \
+ app.kcfg settings.kcfgc src-Makefile.am subdirs README
+
+templateName = kxtruby
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/ruby/app_templates/kxt/README b/languages/ruby/app_templates/kxt/README
new file mode 100644
index 00000000..490ddab8
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/README
@@ -0,0 +1,38 @@
+KConfig XT Ruby template quick start
+Author: Anne-Marie Mahfouf
+Date: 2006-12-12
+-----------------------------------------------
+
+This README file explains you some basic things for starting with
+this application template, a KConfig XT Ruby template.
+-----------------------------------------------
+
+-- REQUIREMENTS --
+you need
+- Qt version might be 3.3.4 or 3.3.5.
+- kdelibs 3.5 and kdelibs headers 3.5 (devel package) in order to build this template.
+- Korundum either from your distribution or from the kdebindings module or also
+from
+http://rubyforge.org/projects/korundum/.
+
+-----------------------------------------------
+
+-- BUILD --
+In KDevelop Build menu choose:
+Run automake & friends
+Run Configure
+Build Project
+Install (or Install as root)
+-----------------------------------------------
+
+-- RUN --
+You will see that the Build menu in KDevelop is now adapted to Ruby.
+In the Build menu, choose
+Run or use Shift + F9 to see your project running.
+
+-----------------------------------------------
+
+-- RELEVANT LINK --
+http://developer.kde.org/language-bindings/ruby/index.html
+
+In KDevelop Documentation, you can find a Ruby tutorial. \ No newline at end of file
diff --git a/languages/ruby/app_templates/kxt/app-Makefile.am b/languages/ruby/app_templates/kxt/app-Makefile.am
new file mode 100644
index 00000000..bfe1c599
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/app-Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = $(TOPSUBDIRS)
diff --git a/languages/ruby/app_templates/kxt/app-configure.in.in b/languages/ruby/app_templates/kxt/app-configure.in.in
new file mode 100644
index 00000000..7d849466
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/app-configure.in.in
@@ -0,0 +1,45 @@
+#MIN_CONFIG(3.0.0)
+
+AM_INIT_AUTOMAKE(%{APPNAMELC}, 0.1)
+AC_C_BIGENDIAN
+AC_CHECK_KDEMAXPATHLEN
+
+AC_PROG_MAKE_SET
+
+AC_CHECK_PROG(RUBY, ruby, ruby)
+
+if test -z "$RUBY"; then
+ DO_NOT_COMPILE="$DO_NOT_COMPILE qtruby"
+else
+ AC_MSG_CHECKING(for ruby dirs)
+ RUBY_ARCHDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"archdir"@:>@)'`
+ RUBY_SITEARCHDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"sitearchdir"@:>@)'`
+ RUBY_SITEDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"sitelibdir"@:>@)'`
+ RUBY_LIBDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"libdir"@:>@)'`
+ RUBY_LIBRUBYARG=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"LIBRUBYARG_SHARED"@:>@)'`
+ AC_MSG_RESULT([archdir $RUBY_ARCHDIR, sitearchdir $RUBY_SITEARCHDIR, sitedir $RUBY_SITEDIR, libdir $RUBY_LIBDIR, librubyarg $RUBY_LIBRUBYARG])
+ AC_SUBST(RUBY_ARCHDIR)
+ AC_SUBST(RUBY_SITEARCHDIR)
+ AC_SUBST(RUBY_SITEDIR)
+ AC_SUBST(RUBY_LIBDIR)
+ AC_SUBST(RUBY_LIBRUBYARG)
+fi
+
+# Korundum check
+AC_MSG_CHECKING([whether Korundum is installed])
+korundum_present=no
+cat >korundumtest.rb <<END
+require 'Korundum'
+END
+${RUBY} korundumtest.rb >/dev/null 2>&1 && korundum_present=yes
+AC_MSG_RESULT([$korundum_present])
+
+# rbuic check
+AC_PATH_PROG([RBUIC],[rbuic])
+if test -z "${RBUIC}" ; then
+ AC_MSG_ERROR([cannot find rbuic (part of the QtRuby package)])
+fi
+AC_SUBST([RBUIC])
+AC_SUBST([RUBY])
+
+
diff --git a/languages/ruby/app_templates/kxt/app.cpp b/languages/ruby/app_templates/kxt/app.cpp
new file mode 100644
index 00000000..8d6af02d
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/app.cpp
@@ -0,0 +1,30 @@
+#include <ruby.h>
+
+#include <qstring.h>
+#include <qfileinfo.h>
+#include <kinstance.h>
+#include <kstandarddirs.h>
+
+int main(int argc, char **argv) {
+ KInstance * instance = new KInstance("%{APPNAMELC}");
+ QString appdir = ::locate("data", "%{APPNAMELC}/main.rb", instance);
+ delete instance;
+ if (appdir.isNull()) {
+ qFatal("Error: Can't find \"%{APPNAMELC}/main.rb\"\n");
+ }
+ QFileInfo program(appdir);
+
+ char ** rubyargs = (char **) calloc(argc+4, sizeof(char *));
+ rubyargs[0] = strdup(argv[0]);
+ rubyargs[1] = strdup("-KU");
+ rubyargs[2] = strdup(QString("-C%1").arg(program.dirPath()).latin1());
+ rubyargs[3] = strdup(QString("-I%1").arg(program.dirPath()).latin1());
+ rubyargs[4] = strdup(program.fileName().latin1());
+ for (int i = 1; i < argc; i++) {
+ rubyargs[i+4] = argv[i];
+ }
+
+ ruby_init();
+ ruby_options(argc+4, rubyargs);
+ ruby_run();
+}
diff --git a/languages/ruby/app_templates/kxt/app.desktop b/languages/ruby/app_templates/kxt/app.desktop
new file mode 100644
index 00000000..8b36e6e0
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/app.desktop
@@ -0,0 +1,40 @@
+[Desktop Entry]
+Name=%{APPNAME}
+Exec=%{APPNAMELC}
+Icon=%{APPNAMELC}
+Type=Application
+Comment=A simple KDE Application
+Comment[br]=Ur meziant eeun evit KDE
+Comment[ca]=Una simple aplicació per al KDE
+Comment[da]=Et simpelt KDE program
+Comment[de]=Eine einfache KDE-Anwendung
+Comment[el]=Μια απλή εφαρμογή του KDE
+Comment[es]=Una aplicación de KDE sencilla
+Comment[et]=Lihtne KDE rakendus
+Comment[eu]=KDE aplikazio simple bat
+Comment[fa]=یک کاربرد سادۀ KDE
+Comment[fr]=Une application simple pour KDE
+Comment[ga]=Feidhmchlár Simplí KDE
+Comment[gl]=Unha aplicación KDE sinxela
+Comment[hi]=एक सादा केडीई अनुप्रयोग
+Comment[hu]=Egyszerű KDE-alkalmazás
+Comment[is]=Einfalt KDE forrit
+Comment[it]=Una semplice applicazione KDE
+Comment[ja]=簡単な KDE アプリケーション
+Comment[nds]=En eenfach KDE-Programm
+Comment[ne]=एउटा साधारण केडीई अनुप्रयोग
+Comment[nl]=Een eenvoudige KDE-toepassing
+Comment[pl]=Prosty program KDE
+Comment[pt]=Uma aplicação simples do KDE
+Comment[pt_BR]=Um simples Aplicativo do KDE
+Comment[ru]=Простое приложение KDE
+Comment[sk]=Jednoduchá KDE aplikácia
+Comment[sl]=Preprost program za KDE
+Comment[sr]=Једноставан KDE програм
+Comment[sr@Latn]=Jednostavan KDE program
+Comment[sv]=Ett enkelt KDE-program
+Comment[ta]=ஒரு சாதாரண கெடிஇ பயன்பாடு
+Comment[tg]=Гузориши оддиKDE
+Comment[tr]=Basit bir KDE Uygulaması
+Comment[zh_CN]=一个简单的 KDE 应用程序
+Comment[zh_TW]=簡單的 KDE 應用程式
diff --git a/languages/ruby/app_templates/kxt/app.kcfg b/languages/ruby/app_templates/kxt/app.kcfg
new file mode 100644
index 00000000..d5325b92
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/app.kcfg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+ <kcfgfile name="%{APPNAME}rc"/>
+ <group name="Preferences">
+ <entry name="col_background" type="Color">
+ <label>color of the background</label>
+ <default>black</default>
+ </entry>
+ <entry name="col_foreground" type="Color">
+ <label>color of the foreground</label>
+ <default>yellow</default>
+ </entry>
+ <entry name="val_time" type="Int">
+ <label>size of a ball</label>
+ <default>2</default>
+ </entry>
+ </group>
+</kcfg>
diff --git a/languages/ruby/app_templates/kxt/app.kdevelop b/languages/ruby/app_templates/kxt/app.kdevelop
new file mode 100644
index 00000000..3a1efdd9
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/app.kdevelop
@@ -0,0 +1,90 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevAutoProject</projectmanagement>
+ <primarylanguage>Ruby</primarylanguage>
+ <keywords>
+ <keyword>Ruby</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ <ignoreparts>
+ <part>KDevDoxygen</part>
+ <part>KDevdistpart</part>
+ <part>KDevVisualBoyAdvance</part>
+ <part>KDevDebugger</part>
+ </ignoreparts>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activedir/>
+ </general>
+ <run>
+ <mainprogram>src/%{APPNAMELC}</mainprogram>
+ </run>
+ </kdevautoproject>
+ <kdevfileview>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>CVS,.svn</hidepatterns>
+ </tree>
+ <groups>
+ <group pattern="*.rb" name="Ruby files" />
+ <group pattern="*.ui" name="QT Designer files" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwindows_bugs</toc>
+ </ignoretocs>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="rb"/>
+ <type ext="ui"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevrubysupport>
+ <run>
+ <interpreter>ruby</interpreter>
+ <terminal>false</terminal>
+ <charactercoding>3</charactercoding>
+ <mainprogram>src/main.rb</mainprogram>
+ </run>
+ </kdevrubysupport>
+</kdevelop>
diff --git a/languages/ruby/app_templates/kxt/app.rb b/languages/ruby/app_templates/kxt/app.rb
new file mode 100644
index 00000000..39da5345
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/app.rb
@@ -0,0 +1,94 @@
+=begin
+ This class serves as the main window for %{APPNAME}. It handles the
+ menus, toolbars, and status bars.
+
+ @short Main window class
+ @author %{AUTHOR} <%{EMAIL}>
+ @version %{VERSION}
+=end
+
+class %{APPNAMESC} < KDE::MainWindow
+
+ slots 'fileNew()',
+ 'optionsPreferences()',
+ 'newToolbarConfig()',
+ 'changeStatusbar(const QString&)',
+ 'changeCaption(const QString&)'
+
+ def initialize()
+ super( nil, "%{APPNAMESC}" )
+ Settings.instance.readConfig
+ @view = %{APPNAMESC}View.new(self)
+ @printer = nil
+
+ # accept dnd
+ setAcceptDrops(true)
+
+ # tell the KDE::MainWindow that this is indeed the main widget
+ setCentralWidget(@view)
+
+ # then, setup our actions
+ setupActions()
+
+ # and a status bar
+ statusBar().show()
+
+ # Apply the create the main window and ask the mainwindow to
+ # automatically save settings if changed: window size, toolbar
+ # position, icon size, etc. Also to add actions for the statusbar
+ # toolbar, and keybindings if necessary.
+ setupGUI();
+
+ # allow the view to change the statusbar and caption
+ connect(@view, SIGNAL('signalChangeStatusbar(const QString&)'),
+ self, SLOT('changeStatusbar(const QString&)'))
+ connect(@view, SIGNAL('signalChangeCaption(const QString&)'),
+ self, SLOT('changeCaption(const QString&)'))
+
+ end
+
+ def setupActions()
+ KDE::StdAction.openNew(self, SLOT('fileNew()'), actionCollection())
+ KDE::StdAction.quit($kapp, SLOT('quit()'), actionCollection())
+
+ KDE::StdAction.preferences(self, SLOT('optionsPreferences()'), actionCollection())
+
+ # this doesn't do anything useful. it's just here to illustrate
+ # how to insert a custom menu and menu item
+ custom = KDE::Action.new(i18n("Swi&tch Colors"), KDE::Shortcut.new(),
+ @view, SLOT('switchColors()'),
+ actionCollection(), "switch_action")
+ end
+
+ def fileNew()
+ # This slot is called whenever the File.New menu is selected,
+ # the New shortcut is pressed (usually CTRL+N) or the New toolbar
+ # button is clicked
+
+ # create a new window
+ %{APPNAMESC}.new.show()
+ end
+
+ def optionsPreferences()
+ # The preference dialog is derived from prefs-base.ui which is subclassed into Prefs
+ #
+ # compare the names of the widgets in the .ui file
+ # to the names of the variables in the .kcfg file
+ dialog = KDE::ConfigDialog.new(self, "settings", Settings.instance, KDE::DialogBase::Swallow)
+ dialog.addPage(Prefs.new(), i18n("General"), "package_settings")
+ connect(dialog, SIGNAL('settingsChanged()'), @view, SLOT('settingsChanged()'))
+ dialog.show()
+
+ end
+
+ def changeStatusbar(text)
+ # display the text on the statusbar
+ statusBar().message(text)
+ end
+
+ def changeCaption(text)
+ # display the text on the caption
+ setCaption(text)
+ end
+
+end
diff --git a/languages/ruby/app_templates/kxt/appui.rc b/languages/ruby/app_templates/kxt/appui.rc
new file mode 100644
index 00000000..06549878
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/appui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="%{APPNAMELC}" version="1">
+<MenuBar>
+ <Menu name="move"><text>&amp;Move</text>
+ <Action name="switch_action" />
+ </Menu>
+</MenuBar>
+</kpartgui>
diff --git a/languages/ruby/app_templates/kxt/appview.rb b/languages/ruby/app_templates/kxt/appview.rb
new file mode 100644
index 00000000..391f4c37
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/appview.rb
@@ -0,0 +1,55 @@
+
+=begin
+ This is the main view class for %{APPNAME}. Most of the non-menu,
+ non-toolbar, and non-statusbar (e.g., non frame) GUI code should go
+ here.
+
+ This %{APPNAMELC} uses an HTML component as an example.
+
+ @short Main view
+ @author %{AUTHOR} <%{EMAIL}>
+ @version %{VERSION}
+=end
+class %{APPNAMESC}View < %{APPNAMESC}view_base
+
+ #
+ # Use this signal to change the content of the statusbar
+ #
+ signals 'signalChangeStatusbar(const QString&)'
+
+ #
+ # Use this signal to change the content of the caption
+ #
+ signals 'signalChangeCaption(const QString&)'
+
+ slots 'switchColors()',
+ 'settingsChanged()'
+
+ def initialize(parent)
+ super(parent)
+
+ settingsChanged()
+ end
+
+ def switchColors()
+ color = Settings.instance.col_background
+ Settings.instance.setCol_background( Settings.instance.col_foreground )
+ Settings.instance.setCol_foreground( color )
+
+ settingsChanged()
+ end
+
+ def settingsChanged()
+ sillyLabel.setPaletteBackgroundColor( Settings.instance.col_background )
+ sillyLabel.setPaletteForegroundColor( Settings.instance.col_foreground )
+ # i18n : internationallization
+ sillyLabel.setText( i18n("This project is %d days old" % Settings.instance.val_time) )
+
+ emit signalChangeStatusbar( i18n("Settings changed") )
+ end
+
+ def slotSetTitle(title)
+ emit signalChangeCaption(title)
+ end
+
+end
diff --git a/languages/ruby/app_templates/kxt/appview_base.ui b/languages/ruby/app_templates/kxt/appview_base.ui
new file mode 100644
index 00000000..78009d08
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/appview_base.ui
@@ -0,0 +1,33 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>%{APPNAME}view_base</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>%{APPNAMESC}view_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>268</width>
+ <height>164</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>%{APPNAMESC}_base</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>sillyLabel</cstring>
+ </property>
+ <property name="text">
+ <string>hello, world</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/languages/ruby/app_templates/kxt/kxtruby.kdevtemplate b/languages/ruby/app_templates/kxt/kxtruby.kdevtemplate
new file mode 100644
index 00000000..fd2a5c1a
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/kxtruby.kdevtemplate
@@ -0,0 +1,251 @@
+# KDE Config File
+[General]
+
+Name=KConfig XT application
+Name[ca]=Aplicació KConfig XT
+Name[da]=KConfig XT program
+Name[de]=KConfigXT-Anwendung
+Name[el]=Εφαρμογή KConfig XT
+Name[es]=Aplicación KConfig XT
+Name[et]=KConfig XT rakendus
+Name[eu]=KConfig XT aplikazioa
+Name[fa]=کاربرد KConfig XT
+Name[fr]=Application KConfig XT
+Name[ga]=Feidhmchlár XT KConfig
+Name[gl]=Aplicación KConfig XT
+Name[hu]=KConfig XT-alapú alkalmazás
+Name[it]=Applicazione KConfig XT
+Name[ja]=KConfig XT アプリケーション
+Name[nds]=KConfig-XT-Programm
+Name[ne]=KConfig XT अनुप्रयोग
+Name[nl]=KConfig XT-toepassing
+Name[pl]=Program KConfig XT
+Name[pt]=Aplicação do KConfig XT
+Name[pt_BR]=Aplicação do KConfig XT
+Name[ru]=Приложение KDE с KConfig XT
+Name[sk]=KConfig XT aplikácia
+Name[sr]=KConfig XT програм
+Name[sr@Latn]=KConfig XT program
+Name[sv]=KConfig XT-program
+Name[tr]=KConfig XT uygulaması
+Name[zh_CN]=KConfig XT 应用程序
+Name[zh_TW]=KConfig XT 應用程式
+Category=Ruby/KDE
+Icon=kxtruby.png
+Comment=Generates a simple KDE application with one widget and a configuration dialog
+Comment[ca]=Genera una simple aplicació per al KDE amb un estri i un diàleg de configuració
+Comment[da]=Genererer et simpelt KDE-program med en kontrol og en indstillingsdialog
+Comment[de]=Erstellt eine einfache KDE-Anwendung mit einem Widget und einem Einstellungsdialog.
+Comment[el]=Δημιουργεί μια απλή εφαρμογή KDE με ένα γραφικό συστατικό, ένα διάλογο ρύθμισης
+Comment[en_GB]=Generates a simple KDE application with one widget and a configuration dialogue
+Comment[es]=Genera una sencilla aplicación para KDE con una ventana y un diálogo de configuración
+Comment[et]=Lihtsa KDE rakenduse loomine ühe vidina ja seadistustedialoogiga.
+Comment[eu]=Trepeta bat eta konfigurazio elkarrizketa-koadro bat duen KDE aplikazio sinple bat sortzen du
+Comment[fa]=یک کاربرد سادۀ KDE، با یک عنصر و یک محاورۀ پیکربندی تولید می‌کند
+Comment[fr]=Génère une application KDE simple comprenant un seul élément graphique (widget) et une boîte de dialogue de configuration
+Comment[ga]=Cruthaíonn sé seo feidhmchlár simplí KDE le giuirléid amháin agus dialóg chumraíochta
+Comment[gl]=Xera unha aplicación KDE sinxela cunha compoñente e un diálogo de configuración
+Comment[hu]=Létrehoz egy egyszerű KDE-alkalmazást egy grafikus elemmel és egy beállítóablakkal
+Comment[it]=Genera una semplice applicazione KDE con un elemento grafico e una finestra di configurazione
+Comment[ja]=一つのウィジェットと設定ダイアログを含む簡単な KDE アプリケーションを作成します
+Comment[nds]=Stellt en eenfach KDE-Programm mit een Element un en Instelldialoog op
+Comment[ne]=एउटा विगेट र कन्फिगरेसन संवादसँग साधारण केडीई अनुप्रयोग उत्पन्न गर्दछ
+Comment[nl]=Genereert een eenvoudige KDE-toepassing met één widget en een configuratiedialoog
+Comment[pl]=Generuje prosty program KDE z jednym widgetem i oknem konfiguracyjnym
+Comment[pt]=Gera uma aplicação simples do KDE com uma janela principal e outra para configuração
+Comment[pt_BR]=Gera uma aplicação simples do KDE com uma janela principal e outra para configuração
+Comment[ru]=Создание приложения KDE с окном конфигурации
+Comment[sk]=Vygeneruje jednoduchú KDE aplikáciu s jedným oknom a konfiguračným dialógom
+Comment[sr]=Прави једноставан KDE програм са једном контролом и дијалогом за подешавање
+Comment[sr@Latn]=Pravi jednostavan KDE program sa jednom kontrolom i dijalogom za podešavanje
+Comment[sv]=Skapar ett enkelt KDE-program med en grafisk komponent och en inställningsdialogruta
+Comment[tr]=Bir parçacığı ve ayar penceresi olan basit bir KDE uygulaması yaratır.
+Comment[zh_CN]=生成带一个部件和一个配置对话框的简单 KDE 应用程序
+Comment[zh_TW]=產生一個簡單的 KDE 應用程式,內含一個元件與一個設定對話框。
+ShowFilesAfterGeneration=%{dest}/src/%{APPNAMELC}.rb,%{dest}/src/README
+Archive=kxtruby.tar.gz
+
+[ADMIN]
+Type=include
+File=%{kdevelop}/template-common/admin.kdevtemplate
+
+[GNU]
+Type=include
+File=%{kdevelop}/template-common/gnu.kdevtemplate
+
+[MKDIR_DOCBOOK1]
+Type=mkdir
+Dir=%{dest}/doc
+
+[MKDIR_DOCBOOK2]
+Type=mkdir
+Dir=%{dest}/doc/en
+
+[FILE1]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-Makefile.am
+Dest=%{dest}/doc/Makefile.am
+
+[FILE2]
+Type=install
+Source=%{kdevelop}/template-common/kde-doc-en-Makefile.am
+Dest=%{dest}/doc/en/Makefile.am
+
+[FILE3]
+Type=install
+EscapeXML=true
+Source=%{kdevelop}/template-common/kde-index.docbook
+Dest=%{dest}/doc/en/index.docbook
+
+[FILE4]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE5]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.am
+Dest=%{dest}/Makefile.am
+
+[FILE6]
+Type=install
+Source=%{kdevelop}/template-common/kde-Makefile.cvs
+Dest=%{dest}/Makefile.cvs
+
+[FILE7]
+Type=install
+Source=%{src}/app-configure.in.in
+Dest=%{dest}/configure.in.in
+
+[MkDir3]
+Type=mkdir
+Dir=%{dest}/src
+
+[FILE8]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.desktop
+Dest=%{dest}/src/%{APPNAMELC}.desktop
+
+[FILE9]
+Type=install
+Source=%{kdevelop}/template-common/kde-app.lsm
+Dest=%{dest}/src/%{APPNAMELC}.lsm
+
+[FILE10]
+Type=install
+Source=%{kdevelop}/template-common/hi16-app-app.png
+Dest=%{dest}/src/hi16-app-%{APPNAMELC}.png
+Process=false
+
+[FILE11]
+Type=install
+Source=%{kdevelop}/template-common/hi32-app-app.png
+Dest=%{dest}/src/hi32-app-%{APPNAMELC}.png
+Process=false
+
+[MkDir4]
+Type=mkdir
+Dir=%{dest}/po
+
+[FILE12]
+Type=install
+Source=%{kdevelop}/template-common/kde-po-Makefile.am
+Dest=%{dest}/po/Makefile.am
+
+[FILE13]
+Type=install
+Source=%{src}/subdirs
+Dest=%{dest}/subdirs
+
+[FILE14]
+Type=install
+Source=%{src}/src-Makefile.am
+Dest=%{dest}/src/Makefile.am
+
+[FILE15]
+Type=install
+Source=%{src}/app.cpp
+Dest=%{dest}/src/%{APPNAMELC}.cpp
+
+[FILE16]
+Type=install
+Source=%{src}/app.rb
+Dest=%{dest}/src/%{APPNAMELC}.rb
+
+[FILE17]
+Type=install
+Source=%{src}/appview.rb
+Dest=%{dest}/src/%{APPNAMELC}view.rb
+
+[FILE18]
+Type=install
+Source=%{src}/appview_base.ui
+Dest=%{dest}/src/appview_base.ui
+
+[FILE19]
+Type=install
+Source=%{src}/prefs-base.ui
+Dest=%{dest}/src/prefs-base.ui
+
+[FILE20]
+Type=install
+Source=%{src}/prefs.rb
+Dest=%{dest}/src/prefs.rb
+
+[FILE21]
+Type=install
+Source=%{src}/main.rb
+Dest=%{dest}/src/main.rb
+
+[FILE22]
+Type=install
+EscapeXML=true
+Source=%{src}/appui.rc
+Dest=%{dest}/src/%{APPNAMELC}ui.rc
+
+[FILE23]
+Type=install
+Source=%{src}/README
+Dest=%{dest}/src/README
+
+[FILE24]
+Type=install
+Source=%{src}/app.kcfg
+Dest=%{dest}/src/%{APPNAMELC}.kcfg
+
+[FILE25]
+Type=install
+Source=%{src}/settings.kcfgc
+Dest=%{dest}/src/settings.kcfgc
+
+[MSG]
+Type=message
+Comment=A Korundum KConfig XT Application was created at %{dest}
+Comment[ca]=Una aplicació Korundum amb KConfig XT ha estat creada a %{dest}
+Comment[da]=Et Korundum KConfig XT program blev oprettet i %{dest}
+Comment[de]=Eine Korundum-KConfig-XT-Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια εφαρμογή Korundum KConfig XT δημιουργήθηκε στο %{dest}
+Comment[es]=Una aplicación Korundum con KConfig XT ha sido creada en %{dest}
+Comment[et]=Korundumi KConfig XT rakendus loodi asukohta %{dest}
+Comment[eu]=Korundum KConfig XT aplikazio bat sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد Korundum KConfig XT در %{dest} ایجاد شد
+Comment[fr]=Une application KConfig XT Korundum a été créée dans %{dest}
+Comment[ga]=Cruthaíodh Feidhmchlár Korundum KConfig XT ag %{dest}
+Comment[gl]=Creouse unha aplicación KConfig XT con Korundum en %{dest}
+Comment[hu]=Létrejött egy Korundum-alapú KConfig XT-s alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione Korundum KConfig XT in %{dest}
+Comment[ja]=Korundum KConfig XT アプリケーションを %{dest} に作成しました
+Comment[nds]=In %{dest} wöör en Korundum/KConfig-XT-Programm opstellt.
+Comment[ne]=Korundum KConfig XT अनुप्रयोग %{dest} मा सिर्जना गरियो
+Comment[nl]=Een Korundum KConfig XT-toepassing is aangemaakt in %{dest}
+Comment[pl]=Program Korundum KConfig XT został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação Korundum com KConfig XT em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação Korundum com KConfig XT em %{dest}
+Comment[ru]=Приложение Korundum с KConfig XT создано в %{dest}
+Comment[sk]=Korundim KConfig XT aplikácia bola vytvorená v %{dest}
+Comment[sr]=Korundum KConfig XT програм направљен је у %{dest}
+Comment[sr@Latn]=Korundum KConfig XT program napravljen je u %{dest}
+Comment[sv]=Ett Korundum KConfig XT-program skapades i %{dest}
+Comment[tr]=Bir Korundum KConfig XT uygulaması %{dest} içinde yaratıldı.
+Comment[zh_TW]=一個 Korundum KConfig XT 應用程式已建立於 %{dest}
diff --git a/languages/ruby/app_templates/kxt/kxtruby.png b/languages/ruby/app_templates/kxt/kxtruby.png
new file mode 100644
index 00000000..419dfa33
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/kxtruby.png
Binary files differ
diff --git a/languages/ruby/app_templates/kxt/main.rb b/languages/ruby/app_templates/kxt/main.rb
new file mode 100644
index 00000000..930bff4f
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/main.rb
@@ -0,0 +1,41 @@
+#!/usr/bin/env ruby
+
+require 'Korundum'
+
+require '%{APPNAMELC}.rb'
+require 'prefs-base.rb'
+require 'prefs.rb'
+require 'settings.rb'
+require 'appview_base.rb'
+require '%{APPNAMELC}view.rb'
+
+description = I18N_NOOP("A KDE Application")
+version = "%{VERSION}"
+options = [ [ "+[URL]", I18N_NOOP( "Document to open" ), "" ] ]
+
+about = KDE::AboutData.new("%{APPNAMELC}", I18N_NOOP("%{APPNAME}"), version, description,
+ KDE::AboutData.License_%{LICENSE}, "(C) %{YEAR} %{AUTHOR}", nil, nil, "%{EMAIL}")
+about.addAuthor( "%{AUTHOR}", nil, "%{EMAIL}" )
+KDE::CmdLineArgs.init(ARGV, about)
+KDE::CmdLineArgs.addCmdLineOptions(options)
+app = KDE::Application.new
+
+# see if we are starting with session management
+if app.restored?
+ RESTORE(%{APPNAMESC})
+else
+ # no session.. just start up normally
+ args = KDE::CmdLineArgs.parsedArgs
+ if args.count == 0
+ widget = %{APPNAMESC}.new
+ widget.show
+ else
+ for i in 0...args.count do
+ widget = %{APPNAMESC}.new
+ widget.show
+ end
+ end
+end
+
+app.exec
+
diff --git a/languages/ruby/app_templates/kxt/prefs-base.ui b/languages/ruby/app_templates/kxt/prefs-base.ui
new file mode 100644
index 00000000..5c0fc860
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/prefs-base.ui
@@ -0,0 +1,127 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>Prefs_base</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Prefs_base</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>282</width>
+ <height>156</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Background color:</string>
+ </property>
+ </widget>
+ <widget class="KColorButton" row="0" column="1">
+ <property name="name">
+ <cstring>kcfg_col_background</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Project age:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Foreground color:</string>
+ </property>
+ </widget>
+ <widget class="KColorButton" row="1" column="1">
+ <property name="name">
+ <cstring>kcfg_col_foreground</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <spacer row="0" column="2">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="1" column="2">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QSpinBox" row="2" column="1">
+ <property name="name">
+ <cstring>kcfg_val_time</cstring>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>2</number>
+ </property>
+ </widget>
+ <spacer row="2" column="2">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kcolorbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/languages/ruby/app_templates/kxt/prefs.rb b/languages/ruby/app_templates/kxt/prefs.rb
new file mode 100644
index 00000000..1469687e
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/prefs.rb
@@ -0,0 +1,7 @@
+
+class Prefs < Prefs_base
+
+ def initialize()
+ super()
+ end
+end
diff --git a/languages/ruby/app_templates/kxt/previewruby.png b/languages/ruby/app_templates/kxt/previewruby.png
new file mode 100644
index 00000000..e235c9cf
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/previewruby.png
Binary files differ
diff --git a/languages/ruby/app_templates/kxt/settings.kcfgc b/languages/ruby/app_templates/kxt/settings.kcfgc
new file mode 100644
index 00000000..384510cd
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/settings.kcfgc
@@ -0,0 +1,6 @@
+# Code generation options for kconfig_compiler
+File=%{APPNAMELC}.kcfg
+ClassName=Settings
+Singleton=true
+Mutators=col_background,col_foreground
+# will create the necessary code for setting those variables
diff --git a/languages/ruby/app_templates/kxt/src-Makefile.am b/languages/ruby/app_templates/kxt/src-Makefile.am
new file mode 100644
index 00000000..a8170abc
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/src-Makefile.am
@@ -0,0 +1,48 @@
+## Makefile.am for %{APPNAMELC}
+
+# this is the program that gets installed. it's name is used for all
+# of the other Makefile.am variables
+bin_PROGRAMS = %{APPNAMELC}
+
+# set the include path for X, qt and KDE
+INCLUDES = $(all_includes) -I$(RUBY_ARCHDIR)
+
+# the library search path.
+%{APPNAMELC}_LDFLAGS = $(all_libraries) $(KDE_RPATH) -L$(RUBY_LIBDIR)
+
+# the libraries to link against.
+%{APPNAMELC}_LDADD = $(LIB_KFILE) $(LIB_KDEPRINT) $(RUBY_LIBRUBYARG)
+
+# which sources should be compiled for %{APPNAMELC}
+%{APPNAMELC}_SOURCES = %{APPNAMELC}.cpp
+
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+KDE_ICON = AUTO
+
+# this is where the kdelnk file will go
+kdelnkdir = $(kde_appsdir)/Utilities
+kdelnk_DATA = %{APPNAMELC}.desktop
+
+# this is where the XML-GUI resource file goes
+rcdir = $(kde_datadir)/%{APPNAMELC}
+rc_DATA = %{APPNAMELC}ui.rc
+
+rubysrc_DATA = main.rb %{APPNAMELC}.rb %{APPNAMELC}view.rb prefs.rb \
+ appview_base.rb prefs-base.rb settings.rb
+
+rubysrcdir = $(kde_datadir)/%{APPNAMELC}
+
+rubyui_DATA = appview_base.ui prefs-base.ui
+
+rubyuidir = $(kde_datadir)/%{APPNAMELC}
+
+%.rb: %.ui
+ $(RBUIC) -tr ${UIC_TR} -kde $< -o $@
+
+RBKCONFIG_COMPILER = rbkconfig_compiler
+
+settings.rb: %{APPNAMELC}.kcfg settings.kcfgc
+ $(RBKCONFIG_COMPILER) ./%{APPNAMELC}.kcfg ./settings.kcfgc
+
diff --git a/languages/ruby/app_templates/kxt/subdirs b/languages/ruby/app_templates/kxt/subdirs
new file mode 100644
index 00000000..0e678106
--- /dev/null
+++ b/languages/ruby/app_templates/kxt/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src
diff --git a/languages/ruby/app_templates/qtruby/.kdev_ignore b/languages/ruby/app_templates/qtruby/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby/.kdev_ignore
diff --git a/languages/ruby/app_templates/qtruby/Makefile.am b/languages/ruby/app_templates/qtruby/Makefile.am
new file mode 100644
index 00000000..68b7bd82
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = app.rb app.kdevelop app-Makefile app.filelist README
+templateName = qtruby
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/ruby/app_templates/qtruby/README b/languages/ruby/app_templates/qtruby/README
new file mode 100644
index 00000000..34e85c43
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby/README
@@ -0,0 +1,29 @@
+QtRuby Hello World template quick start
+Author: Anne-Marie Mahfouf
+Date: 2006-12-05
+-----------------------------------------------
+
+This README file explains you some basic things for starting with
+this application template, a simple QtRuby Hello world template.
+-----------------------------------------------
+
+-- REQUIREMENTS --
+you need
+- Qt version might be 3.3.4 or 3.3.5.
+- kdelibs 3.5 and kdelibs headers 3.5 (devel package) in order to build this template.
+- qtruby either from your distribution or from the kdebindings module or also from
+http://rubyforge.org/projects/korundum/.
+If you use the kdebindings module you need to build kdebindings/smoke/qt and then kdebindings/qtruby.
+
+-----------------------------------------------
+
+-- RUN --
+You will see that the Build menu in KDevelop is now adapted to Ruby.
+In the Build menu, choose Run or use Shift + F9 to see your project running.
+
+-----------------------------------------------
+
+-- RELEVANT LINK --
+http://developer.kde.org/language-bindings/ruby/index.html
+
+In KDevelop Documentation, you can find a Ruby tutorial. \ No newline at end of file
diff --git a/languages/ruby/app_templates/qtruby/app-Makefile b/languages/ruby/app_templates/qtruby/app-Makefile
new file mode 100644
index 00000000..13da2847
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby/app-Makefile
@@ -0,0 +1,7 @@
+uis := $(wildcard *.ui)
+
+all: $(uis)
+ @for name in $^; do rbuic $$name > `echo $$name | awk -F '\\\.ui$' '{ print $$1 }' 2> /dev/null`.rb; echo "Running rbuic on $$name"; done
+
+clean: $(uis)
+ @for name in $^; do rm -f `echo $$name | awk -F '\\\.ui$' '{ print $$1 }' 2> /dev/null`.rb; done
diff --git a/languages/ruby/app_templates/qtruby/app.filelist b/languages/ruby/app_templates/qtruby/app.filelist
new file mode 100644
index 00000000..202beb22
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby/app.filelist
@@ -0,0 +1,2 @@
+# KDevelop Custom Project File List
+%{APPNAMELC}.rb
diff --git a/languages/ruby/app_templates/qtruby/app.kdevelop b/languages/ruby/app_templates/qtruby/app.kdevelop
new file mode 100644
index 00000000..ec464627
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby/app.kdevelop
@@ -0,0 +1,85 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevCustomProject</projectmanagement>
+ <primarylanguage>Ruby</primarylanguage>
+ <keywords>
+ <keyword>Ruby</keyword>
+ <keyword>Qt</keyword>
+ </keywords>
+ <ignoreparts>
+ <part>KDevDoxygen</part>
+ <part>KDevdistpart</part>
+ <part>KDevVisualBoyAdvance</part>
+ <part>KDevDebugger</part>
+ </ignoreparts>
+ </general>
+ <kdevcustomproject>
+ <general>
+ <activedir/>
+ </general>
+ </kdevcustomproject>
+ <kdevfileview>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>CVS,.svn</hidepatterns>
+ </tree>
+ <groups>
+ <group pattern="*.rb" name="Ruby files" />
+ <group pattern="*.ui" name="QT Designer files" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwindows_bugs</toc>
+ </ignoretocs>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="rb"/>
+ <type ext="ui"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevrubysupport>
+ <run>
+ <mainprogram>./%{APPNAMELC}.rb</mainprogram>
+ <interpreter>ruby</interpreter>
+ <terminal>false</terminal>
+ </run>
+ </kdevrubysupport>
+</kdevelop>
diff --git a/languages/ruby/app_templates/qtruby/app.rb b/languages/ruby/app_templates/qtruby/app.rb
new file mode 100755
index 00000000..da817328
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby/app.rb
@@ -0,0 +1,12 @@
+#!/usr/bin/env ruby
+
+require 'Qt'
+
+app = Qt::Application.new(ARGV)
+widget = Qt::Widget.new
+widget.setGeometry(50, 500, 400, 400)
+widget.caption = "Hello World!"
+
+app.mainWidget = widget
+widget.show
+app.exec
diff --git a/languages/ruby/app_templates/qtruby/qtruby.kdevtemplate b/languages/ruby/app_templates/qtruby/qtruby.kdevtemplate
new file mode 100644
index 00000000..6e7328ac
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby/qtruby.kdevtemplate
@@ -0,0 +1,114 @@
+# KDE Config File
+[General]
+Name=QtRuby Hello World
+Name[ca]=Hello World en QtRuby
+Name[da]=QtRuby Goddag verden
+Name[de]=QtRuby-"Hello World"-Programm
+Name[el]=Γεια σου κόσμε QtRuby
+Name[es]=«Hola mundo» en QtRuby
+Name[et]=QtRuby "Tere, maailm"
+Name[eu]=QtRuby "Kaixo mundua" programa
+Name[fr]=« Bonjour monde » en QtRuby
+Name[gl]=Ola mundo en QtRuby
+Name[hu]=QtRuby-alapú Hello world program
+Name[it]="Hello World" con QtRuby
+Name[nds]=QtRuby-"Moin Welt"
+Name[ne]=QtRuby हेल्लो वोल्ड
+Name[pl]="Witaj świecie" w QtRuby
+Name[pt]=Olá Mundo em QtRuby
+Name[pt_BR]=Olá Mundo em QtRuby
+Name[ru]=Hello World на QtRuby
+Name[sk]=QtRuby Ahoj svet
+Name[sr]=„Здраво свете“ у QtRuby-ју
+Name[sr@Latn]=„Zdravo svete“ u QtRuby-ju
+Name[tr]=QtRuby Merhaba Dünya
+Category=Ruby/Qt
+Comment=This generates a simple QtRuby Hello World application
+Comment[ca]=Genera una simple aplicació de Hello World en QtRuby
+Comment[da]=Dette generere et simpelt QtRuby Goddag verden program
+Comment[de]=Erstellt eine einfache auf QtRuby basierende "Hello World"-Anwendung
+Comment[el]=Αυτό δημιουργεί μια απλή εφαρμογή Γεια σου κόσμε σε QtRuby
+Comment[es]=Genera una sencilla aplicación «Hola mundo» en QtRuby
+Comment[et]=Lihtsa QtRuby "Tere, maailm" rakenduse loomine
+Comment[eu]=Honek QtRuby "Kaixo mundua" aplikazio sinple bat sortzen du
+Comment[fa]=یک کاربرد سادۀ QtRuby Hello World تولید می‌کند
+Comment[fr]=Génère un programme « Bonjour monde » simple en QtRuby
+Comment[gl]=Isto xera unha aplicación sinxela Ola mundo QtRuby
+Comment[hu]=Létrehoz egy egyszerű QtRuby-alapú Hello world programot
+Comment[it]=Genera una semplice applicazione di "Hello World" con QtRuby
+Comment[ja]=簡単な QtRuby Hello World アプリケーションを作成します
+Comment[nds]=Dit stellt en eenfach "Moin Welt"-Programm mit QtRuby op.
+Comment[ne]=यसले साधारण QtRuby हेल्लो वोल्ड अनुप्रयोग उत्पन्न गर्दछ
+Comment[nl]=Dit genereert een eenvoudige QtRuby Hello World-toepassing
+Comment[pl]=Generuje prosty program "Witaj świecie" w QtRuby
+Comment[pt]=Isto gera uma aplicação Olá Mundo simples em QtRuby
+Comment[pt_BR]=Isto gera uma aplicação Olá Mundo simples em QtRuby
+Comment[ru]=Создание простого приложения Hello World на QtRuby
+Comment[sk]=Vygeneruje jednoduchú QtRuby Ahoj svet aplikáciu
+Comment[sr]=Ово прави једноставан „Здраво свете“ у QtRuby-ју
+Comment[sr@Latn]=Ovo pravi jednostavan „Zdravo svete“ u QtRuby-ju
+Comment[sv]=Detta skapar ett enkelt Hello World-program i QtRuby
+Comment[tr]=Bu basit bir QtRuby Merhaba Dünya uygulaması yaratır.
+Comment[zh_TW]=產生一個簡單的 QtRuby Hello World 應用程式
+FileTemplates=rb,ShellStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.rb,%{dest}/README
+Icon=qtruby.png
+Archive=qtruby.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/app.rb
+Dest=%{dest}/%{APPNAMELC}.rb
+
+[FILE3]
+Type=install
+Source=%{src}/app-Makefile
+Dest=%{dest}/Makefile
+
+[FILE4]
+Type=install
+Source=%{src}/app.filelist
+Dest=%{dest}/%{APPNAMELC}.kdevelop.filelist
+
+[FILE5]
+Type=install
+Source=%{src}/README
+Dest=%{dest}/README
+
+[MSG]
+Type=message
+Comment=A simple QtRuby application was created in %{dest}
+Comment[ca]=Una simple aplicació en QtRuby ha estat creada en %{dest}
+Comment[da]=Et simpelt QtRuby program blev oprettet i %{dest}
+Comment[de]=Eine einfache QtRuby-Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια απλή εφαρμογή QtRuby δημιουργήθηκε στο %{dest}
+Comment[es]=Una sencilla aplicación en QtRuby ha sido creada en %{dest}
+Comment[et]=Lihtne KQtRuby rakendus loodi asukohta %{dest}
+Comment[eu]=QtRuby aplikazio sinple bat sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد سادۀ QtRuby در %{dest} ایجاد شد
+Comment[fr]=Une application QtRuby simple a été créée dans %{dest}
+Comment[ga]=Cruthaíodh feidhmchlár simplí QtRuby i %{dest}
+Comment[gl]=Creouse unha aplicación sinxela QtRuby en %{dest}
+Comment[hu]=Létrejött egy egyszerű QtRuby-alapú alkalmazás itt: %{dest}
+Comment[it]=È stata creata una semplice applicazione QtRuby in %{dest}
+Comment[ja]=簡単な QtRuby アプリケーションを %{dest} に作成しました
+Comment[nds]=In %{dest} wöör en eenfach QtRuby-Programm opstellt.
+Comment[ne]=साधारण QtRuby अनुप्रयोग %{dest} मा सिर्जना गरियो
+Comment[nl]=Een eenvoudige QtRuby-toepassing is aangemaakt in %{dest}
+Comment[pl]=Prosty program w QtRuby został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação simples de QtRuby em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação simples de QtRuby em %{dest}
+Comment[ru]=Простое приложение QtRuby создано в %{dest}
+Comment[sk]=Jednoduchá QtRuby aplikácia bola vytvorená v %{dest}
+Comment[sr]=Једноставан QtRuby програм направљен је у %{dest}
+Comment[sr@Latn]=Jednostavan QtRuby program napravljen je u %{dest}
+Comment[sv]=Ett enkelt QtRuby-program skapades i %{dest}
+Comment[tr]=Basit bir QtRuby uygulaması %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 创建了一个简单的 QtRuby 应用程序
+Comment[zh_TW]=一個簡單的 QtRuby 應用程式框架已建立於 %{dest}
diff --git a/languages/ruby/app_templates/qtruby/qtruby.png b/languages/ruby/app_templates/qtruby/qtruby.png
new file mode 100644
index 00000000..63935461
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby/qtruby.png
Binary files differ
diff --git a/languages/ruby/app_templates/qtruby4app/Makefile.am b/languages/ruby/app_templates/qtruby4app/Makefile.am
new file mode 100644
index 00000000..2bdc1ef9
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/Makefile.am
@@ -0,0 +1,20 @@
+dataFiles = main.rb qtruby4app.rb qtruby4app.png qtruby4app.kdevelop \
+ application.qrc ReadMe filesave.xpm fileopen.xpm filenew.xpm \
+ editcopy.xpm editpaste.xpm editcut.xpm app-Makefile app.filelist
+
+templateName = qtruby4app
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
+
diff --git a/languages/ruby/app_templates/qtruby4app/ReadMe b/languages/ruby/app_templates/qtruby4app/ReadMe
new file mode 100644
index 00000000..da28297a
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/ReadMe
@@ -0,0 +1,6 @@
+READ THIS IN ORDER TO Run THE QtRuby4 APPLICATION
+-------------------------------------------------
+
+Click the 'Build Project' button to generate the qrc_application.rb
+file from the application.qrc resource with the rbrcc tool.
+
diff --git a/languages/ruby/app_templates/qtruby4app/app-Makefile b/languages/ruby/app_templates/qtruby4app/app-Makefile
new file mode 100644
index 00000000..3b3e7944
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/app-Makefile
@@ -0,0 +1,18 @@
+qrcs := $(wildcard *.qrc)
+uis := $(wildcard *.ui)
+
+all: gen_qrcs gen_uis
+
+gen_qrcs: $(qrcs)
+ @for name in $^; do rbrcc $$name > `echo $$name | awk -F '\\\.qrc$$' '{ printf("qrc_%s", $$1) }' 2> /dev/null`.rb; echo "Running rbrcc on $$name"; done
+
+gen_uis: $(uis)
+ @for name in $^; do rbuic4 $$name > `echo $$name | awk -F '\\\.ui$$' '{ print $$1 }' 2> /dev/null`.rb; echo "Running rbuic4 on $$name"; done
+
+clean: clean_qrcs clean_uis
+
+clean_qrcs: $(qrcs)
+ @for name in $^; do rm -f `echo $$name | awk -F '\\\.qrc$$' '{ printf("qrc_%s", $$1) }' 2> /dev/null`.rb; done
+
+clean_uis: $(uis)
+ @for name in $^; do rm -f `echo $$name | awk -F '\\\.ui$$' '{ print $$1 }' 2> /dev/null`.rb; done
diff --git a/languages/ruby/app_templates/qtruby4app/app.filelist b/languages/ruby/app_templates/qtruby4app/app.filelist
new file mode 100644
index 00000000..339e6998
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/app.filelist
@@ -0,0 +1,3 @@
+# KDevelop Custom Project File List
+main.rb
+%{APPNAMELC}.rb
diff --git a/languages/ruby/app_templates/qtruby4app/application.qrc b/languages/ruby/app_templates/qtruby4app/application.qrc
new file mode 100644
index 00000000..c35b0695
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/application.qrc
@@ -0,0 +1,10 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>editcopy.xpm</file>
+ <file>editcut.xpm</file>
+ <file>filenew.xpm</file>
+ <file>fileopen.xpm</file>
+ <file>editpaste.xpm</file>
+ <file>filesave.xpm</file>
+</qresource>
+</RCC> \ No newline at end of file
diff --git a/languages/ruby/app_templates/qtruby4app/editcopy.xpm b/languages/ruby/app_templates/qtruby4app/editcopy.xpm
new file mode 100644
index 00000000..8350ed0e
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/editcopy.xpm
@@ -0,0 +1,193 @@
+/* XPM */
+static char *editcopy[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 155 2",
+" c black",
+". c #191000",
+"X c #221700",
+"o c #2E2300",
+"O c #452E00",
+"+ c #433200",
+"@ c #493000",
+"# c #553800",
+"$ c #5D4600",
+"% c #6B5000",
+"& c #724B00",
+"* c #7D5E00",
+"= c #6E694F",
+"- c #7E795F",
+"; c #865900",
+": c #8A5C00",
+"> c #8B6800",
+", c #936200",
+"< c #926D00",
+"1 c #926B1A",
+"2 c #967000",
+"3 c #9B721D",
+"4 c #9B7625",
+"5 c #9E792A",
+"6 c #A47C00",
+"7 c #AA7D00",
+"8 c #A1761A",
+"9 c #A57816",
+"0 c #A4791D",
+"q c #AD8200",
+"w c #B28500",
+"e c #AE8530",
+"r c #B99626",
+"t c #97906D",
+"y c #B18D48",
+"u c #B49049",
+"i c #B89542",
+"p c #BA9C4D",
+"a c #BD9E52",
+"s c #BFA053",
+"d c #B8AE78",
+"f c #BEB47E",
+"g c #C49300",
+"h c #C89600",
+"j c #C19D2C",
+"k c #C1A43F",
+"l c #C09E4E",
+"z c #CFB457",
+"x c #C9B159",
+"c c #CAB573",
+"v c #D4BF7C",
+"b c #FFDF62",
+"n c #FFE064",
+"m c #FFE16D",
+"M c #FFE372",
+"N c #FFE479",
+"B c #A19D8E",
+"V c #ABA89A",
+"C c #BEB580",
+"Z c #BDB488",
+"A c #B8B496",
+"S c #AEADAA",
+"D c #B3AFA1",
+"F c #BCBBB6",
+"G c #BFBFB9",
+"H c #C0B680",
+"J c #C4BA85",
+"K c #C6BD8B",
+"L c #CBB589",
+"P c #C8BE88",
+"I c #C3BC90",
+"U c #CBC18C",
+"Y c #CCC493",
+"T c #D7CB8C",
+"R c #DAC786",
+"E c #D8C789",
+"W c #DAC98B",
+"Q c #D0C690",
+"! c #D4CA94",
+"~ c #D4CC9B",
+"^ c #D8CE98",
+"/ c #DCD29C",
+"( c #C6C3B7",
+") c #C8C6BE",
+"_ c #D5C5A5",
+"` c #DBC8A1",
+"' c #DBD4A2",
+"] c #DED9AE",
+"[ c #D9D5B1",
+"{ c #E0CC82",
+"} c #E8D98B",
+"| c #E8D991",
+" . c #E1D7A1",
+".. c #E5DBA5",
+"X. c #E4DCAB",
+"o. c #E8DDAA",
+"O. c #E1DCB2",
+"+. c #E1DCB8",
+"@. c #FFE683",
+"#. c #FFE78A",
+"$. c #FFE885",
+"%. c #FFE88D",
+"&. c #FFE992",
+"*. c #FFEC9D",
+"=. c #FFF09F",
+"-. c #ECE2AC",
+";. c #E5E0B6",
+":. c #E5E1B8",
+">. c #EBE4B6",
+",. c #EAE5BC",
+"<. c #F0E5A8",
+"1. c #FFEDA3",
+"2. c #FFEDA9",
+"3. c #F1E8B8",
+"4. c #FFEFB1",
+"5. c #FFF1A5",
+"6. c #FFF2AD",
+"7. c #FFF2B4",
+"8. c #FFF2BC",
+"9. c #CAC8C2",
+"0. c #D6D4CB",
+"q. c #DFDAC5",
+"w. c #D4D2D0",
+"e. c #E0D7C5",
+"r. c #E4DAC3",
+"t. c #E8DEC7",
+"y. c #E0DFD3",
+"u. c #E6E2C2",
+"i. c #E8E1C5",
+"p. c #EBE3CB",
+"a. c #EEE9C2",
+"s. c #E8E6DC",
+"d. c #F3EDC3",
+"f. c #F2EDCB",
+"g. c #F7F2CD",
+"h. c #FFF3C3",
+"j. c #FFF4CA",
+"k. c #FFF8C5",
+"l. c #FFF8CD",
+"z. c #FDF5D2",
+"x. c #FFF7D8",
+"c. c #FFF9D4",
+"v. c #FFF9DC",
+"b. c #E9E8E7",
+"n. c #F3EFE3",
+"m. c #F2F0E3",
+"M. c #F4F2EA",
+"N. c #FBF7E6",
+"B. c #FEF9E3",
+"V. c #FFFBEC",
+"C. c #F4F4F3",
+"Z. c #F8F7F6",
+"A. c #FEFCF4",
+"S. c #FEFEFC",
+"D. c None",
+/* pixels */
+"D.D.D.D.D.D.D.D.D.D.D.D.h g g g g g g g g g g w * D.D.D.D.D.",
+"D.D.D.D.D.D.D.D.D.D.D.D.g z.z.g.g.g.g.g.g.z.g.R 2 D.D.D.D.D.",
+"D.D.D.D.D.D.D.D.D.D.D.D.g z.d.3.3.3.3.3.3.>.f.g.z < D.D.D.D.",
+"D.D.D.D.D., : ; , : : : 7 a i a R -.-.-.-.' m.u.g.j > D.D.D.",
+"D.D.D.D., u y y L L L L ` t.t.e.e v -.-.-.Y b.S.+.d.q D.D.D.",
+"D.D.D.D., S.S.S.S.S.S.S.S.Z.b.S.e.i W o.o.K w.S.A.u.q D.D.D.",
+"D.D.D.D., S.S.S.A.S.S.S.S.M.w.S.S._ a E ..K 0.S.S.q.7 D.D.D.",
+"D.D.D.D., S.A.V.A.A.A.V.A.n.9.S.S.C._ a ..Y t = - A 6 D.D.D.",
+"D.D.D.D., A.A.V.A.V.V.V.A.n.9.S.S.S.Z.3 ' ' K Z A ] 7 D.D.D.",
+"D.D.D.D., A.V.B.V.V.B.V.V.n.( F S S G 5 ' | / / X.f.q D.D.D.",
+"D.D.D.D., A.V.x.B.x.V.B.N.B.e.D B V ) 3 / / ^ ^ ' a.q D.D.D.",
+"D.D.D.D., V.N.N.B.B.B.v.v.N.z.p.i.p.n.8 ^ / ! Q ' a.q D.D.D.",
+"D.D.D.D., B.B.x.v.x.z.j.j.x.z.z.c.B.B.0 ! ! ! ^ ' ,.q D.D.D.",
+"D.D.D.D., B.h.h.z.z.x.x.z.z.z.h.j.x.v.0 ! Q Y ! ~ ,.q D.D.D.",
+"D.D.D.D., v.c.k.x.h.j.j.j.z.8.h.k.j.v.0 U T U U ~ ,.q D.D.D.",
+"D.D.D.D., v.k.z.h.h.h.j.8.j.h.h.j.k.v.0 U U U U Y ;.q D.D.D.",
+"D.D.D.D., x.h.8.8.h.j.8.8.4.h.4.8.h.x.8 P H P P ~ ;.q D.D.D.",
+"D.D.D.D., v.h.4.4.8.8.4.1.z.h.8.4.h.c.8 H J H J Y ;.q D.D.D.",
+"D.D.D.D., c.2.z.j.4.*.1.1.8.2.2.*.2.l.8 J J H J U ] q D.D.D.",
+"D.D.D.D., l.h.2.4.4.1.%.1.&.2.4.8.7.k.8 f d f H U ] q D.D.D.",
+"D.D.D.D., z.8.#.1.4.1.*.1.1.1.*.N 4.l.8 f f C K ~ :.q D.D.D.",
+"D.D.D.D., 8.&.4.#.%.4.&.@.#.%.%.&.2.l.8 K K Y ~ ] ,.6 D.D.D.",
+"D.D.D.D., h.&.#.*.1.1.%.N N #.&.*.1.l.0 ' ] T x r 6 % D.D.D.",
+"D.D.D.D., 4.4.%.*.#.b &.N M b M 2.1.k.9 k 7 > $ o D.D.D.",
+"D.D.D.D., 7.&.N 5.&.N @.*.b N M N =.k., + D.D.D.",
+"D.D.D.D., 6.N N M M &.#.N 2.$.%.8.6.<.& D.D.D.D.D.",
+"D.D.D.D., 5.&.7.n $.m M 1.7.7.o.c 5 & @ D.D.D.D.D.D.D.D.D.",
+"D.D.D.D., 7.*.m %.=.&.7.} p 1 % # X D.D.D.D.D.D.D.D.D.D.",
+"D.D.D.D., 6.5.5.5.| a 1 & + . D.D.D.D.D.D.D.D.D.D.",
+"D.D.D.D., 6.-.a 1 & O . D.D.D.D.D.D.D.D.D.D.D.D.",
+"D.D.D.D.; : % O . D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.",
+"D.D.D.D. D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D."
+};
diff --git a/languages/ruby/app_templates/qtruby4app/editcut.xpm b/languages/ruby/app_templates/qtruby4app/editcut.xpm
new file mode 100644
index 00000000..9a118931
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/editcut.xpm
@@ -0,0 +1,252 @@
+/* XPM */
+static char *editcut[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 214 2",
+" c #000000",
+". c #0B0B0B",
+"X c #181300",
+"o c #1D190B",
+"O c #131313",
+"+ c #1B1B1B",
+"@ c #211E11",
+"# c #26231A",
+"$ c #2A2513",
+"% c #2E2912",
+"& c #2E2A19",
+"* c #372E0B",
+"= c #302A12",
+"- c #312C1B",
+"; c #3A320F",
+": c #3C3415",
+"> c #3C351B",
+", c #232323",
+"< c #2B2922",
+"1 c #2C2C2C",
+"2 c #302E26",
+"3 c #353120",
+"4 c #3F3B2D",
+"5 c #313131",
+"6 c #3A3A3A",
+"7 c #423814",
+"8 c #493E17",
+"9 c #413D2F",
+"0 c #423F32",
+"q c #4F4319",
+"w c #5C4A00",
+"e c #5F4F0D",
+"r c #514410",
+"t c #554813",
+"y c #4E472C",
+"u c #444136",
+"i c #4A483F",
+"p c #534B2B",
+"a c #504B37",
+"s c #514C3A",
+"d c #654F04",
+"f c #604F0B",
+"g c #665200",
+"h c #675509",
+"j c #6B5405",
+"k c #6C5807",
+"l c #6C590B",
+"z c #745B04",
+"x c #715D0A",
+"c c #7B5B02",
+"v c #625B3B",
+"b c #7E6815",
+"n c #6C643E",
+"m c #4D4B42",
+"M c #494949",
+"N c #504D43",
+"B c #54534C",
+"V c #515151",
+"C c #5D5B54",
+"Z c #656048",
+"A c #736A44",
+"S c #726C54",
+"D c #77725B",
+"F c #696968",
+"G c gray50",
+"H c #826203",
+"J c #806609",
+"K c #836907",
+"L c #8D6A03",
+"P c #9A6F00",
+"I c #9B7005",
+"U c #9E730E",
+"Y c #9C7511",
+"T c #85732C",
+"R c #88783B",
+"E c #AE7C00",
+"W c #A87B13",
+"Q c #847B53",
+"! c #827D64",
+"~ c #9C862E",
+"^ c #A98A1F",
+"/ c #B28D0A",
+"( c #B88D00",
+") c #B2821A",
+"_ c #B18E1B",
+"` c #B3941C",
+"' c #A88E2C",
+"] c #A28C36",
+"[ c #AE9224",
+"{ c #89815E",
+"} c #87826D",
+"| c #858174",
+" . c #888370",
+".. c #8E8A7D",
+"X. c #928C71",
+"o. c #A28E44",
+"O. c #AA9F74",
+"+. c #B9A456",
+"@. c #BDA85B",
+"#. c #B2A068",
+"$. c #C28700",
+"%. c #CC8E00",
+"&. c #C29A00",
+"*. c #C4962F",
+"=. c #CCA100",
+"-. c #D6A800",
+";. c #D1AC1B",
+":. c #DDB31A",
+">. c #D2A922",
+",. c #D4AE2B",
+"<. c #DBA12E",
+"1. c #DBA433",
+"2. c #DDB428",
+"3. c #D2B23B",
+"4. c #E6A200",
+"5. c #E8A509",
+"6. c #EAAF00",
+"7. c #EFAC1E",
+"8. c #F5A100",
+"9. c #FFAD02",
+"0. c #FCAF0D",
+"q. c #FCB005",
+"w. c #FFB60C",
+"e. c #FFBD00",
+"r. c #FFBD16",
+"t. c #E3B432",
+"y. c #E8BF3C",
+"u. c #F6BE2F",
+"i. c #C6A949",
+"p. c #D9A948",
+"a. c #D8AB52",
+"s. c #DBBA45",
+"d. c #C5B162",
+"f. c #ECB74D",
+"g. c #EFB841",
+"h. c #EFBE4A",
+"j. c #EABA55",
+"k. c #FDC006",
+"l. c #FFC10B",
+"z. c #FFC800",
+"x. c #FFC90D",
+"c. c #FAC113",
+"v. c #FBC11C",
+"b. c #FDC910",
+"n. c #EDC233",
+"m. c #F5C32D",
+"M. c #FFC728",
+"N. c #F4C537",
+"B. c #F6C63A",
+"V. c #F5CB36",
+"C. c #FFD73D",
+"Z. c #E9C659",
+"A. c #EAC85A",
+"S. c #FFDA4B",
+"D. c #FFDD5D",
+"F. c #E9CD6B",
+"G. c #FFD560",
+"H. c #FFE06C",
+"J. c gray56",
+"K. c #959595",
+"L. c gray62",
+"P. c #A6A18A",
+"I. c #A8A69E",
+"U. c #AEA895",
+"Y. c #B3AC8F",
+"T. c #B8AF8B",
+"R. c #B4AD96",
+"E. c #B8B199",
+"W. c #A4A4A4",
+"Q. c #AAAAAA",
+"!. c #B0ADA3",
+"~. c #BBB6A3",
+"^. c #B1B1B1",
+"/. c #B9B9B6",
+"(. c #BBBBBA",
+"). c #C5BC9D",
+"_. c #C2BCA2",
+"`. c #C1BEB5",
+"'. c #D2C38E",
+"]. c #DCC78C",
+"[. c #C7C0A7",
+"{. c #C7C2AE",
+"}. c #C7C3B2",
+"|. c #C5C2B8",
+" X c #CAC6B6",
+".X c #CBC9BE",
+"XX c #D9D3BB",
+"oX c #E6D08A",
+"OX c #E7DEBD",
+"+X c #ECDEB3",
+"@X c #FFF0B9",
+"#X c #C5C5C5",
+"$X c #CECCC7",
+"%X c #D0CEC5",
+"&X c #D0CFC8",
+"*X c #D2D1CB",
+"=X c #DBD6C5",
+"-X c #DBD7C9",
+";X c #D3D3D1",
+":X c #DBDBDB",
+">X c #E5E1D6",
+",X c #E5E3DA",
+"<X c #E8E5D9",
+"1X c #EDEADC",
+"2X c #FEF6DE",
+"3X c #E6E6E6",
+"4X c #E9E7E2",
+"5X c #E9E8E4",
+"6X c #EDECEA",
+"7X c #F2F1EB",
+"8X c #F1F1F1",
+"9X c #F8F7F4",
+"0X c #F9F8F8",
+"qX c None",
+/* pixels */
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqX5 5 5 1 , qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqX5 V /.&XQ.F 1 , qXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqX5 _.D.S.H.@X&X6 . qXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqX5 S.=.w g &.C...+ qXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqX5 -.' + o t z.d., qXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqX5 C V.@.+ 3 :.3., qXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqX5 '.b.F.6 , 1 s.,., qXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqX1 b ( n.OXE.E.F.^ + qXqXqXqXqXqXqXqX5 5 1 , ",
+"qXqXqXqXqXqXqX l x K A.oXoXZ.i., qXqXqXqXqXqX5 V &X0X6X, ",
+"qXqXqXqXqXqXqX 8 ( c.v.k.N.1 qXqXqXqX5 V $X0X0X9XXX, ",
+"qXqXqXqXqXqXqXqX O t 6.e.e.k.S O 5 5 V $X8X8X8X1XD : O ",
+"qXqXqXqXqXqXqXqXqXqX 3 J e.G.7X#.+ . 5 C |.3X3X5X4X_.4 % ",
+"qXqXqXqXqXqXqXqXqXqX q ].0X0X+X, B }.:X:X:X:X=XS & o ",
+"qXqXqXqXqXqXqXqXqXqXqX + M 8X8X7XU.Q.#X*X*X*XR.< % qX",
+"qXqXqXqXqXqXqXqXqXqXqXqX, 1 X6XW.G Q.L.^.{.Z @ . qXqX",
+"qXqXqXqXqXqXqXqXqXqX5 5 m P.W.:X6 . 3X/.X., @ qXqXqXqX",
+"qXqXqXqXqXqXqX5 5 5 n +.R.W.J.K.W.^.:X:X1Xm + qXqXqXqXqX",
+"qXqXqXqXqX5 5 i o.y.v.q./ P.I.} | R.&X*X;X8X ., qXqXqXqXqXqX",
+"qXqX5 5 5 R 3.M.5.E L 7.4._ 0 + O + i ).#X#X5X~., O qXqXqXqX",
+"qX5 u ] m.r.%.H r : , t.0.P 7 $ , { `.(.;X-X, + qXqXqX",
+"5 u 2.w.$.k t o , ~ h.P l , u T.^.#X<XN , qXqX",
+"5 >.9.U r . . , T B.*.x qX + , Q !.Q.<XC , qX",
+"p q.1.> . + 1 [ m.p.k . qXqXqXqX , u O.W.;X! + ",
+"4 8.j.` p 5 y ;.u.a.d % qXqXqXqXqXqX O , A P._., ",
+"1 x <.f.m.x.b.y.a.g ; qXqXqXqXqXqXqXqX + 0 v O ",
+" - h c W W W W z : qXqXqXqXqXqXqXqXqXqX . . ",
+" * e l l f X qXqXqXqXqXqXqXqXqXqXqXqXqX ",
+"qX qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX qX",
+"qXqXqX qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX"
+};
diff --git a/languages/ruby/app_templates/qtruby4app/editpaste.xpm b/languages/ruby/app_templates/qtruby4app/editpaste.xpm
new file mode 100644
index 00000000..c29ad36b
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/editpaste.xpm
@@ -0,0 +1,295 @@
+/* XPM */
+static char *editpaste[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 257 2",
+" c black",
+". c #0D0900",
+"X c #191000",
+"o c #221700",
+"O c #2A1B00",
+"+ c #332200",
+"@ c #3E2900",
+"# c #3A2804",
+"$ c #4D3300",
+"% c #4B3E15",
+"& c #44391B",
+"* c #543800",
+"= c #5A3B00",
+"- c #4D4015",
+"; c #524E25",
+": c #5A4F2C",
+"> c #524E3D",
+", c #58562F",
+"< c #53503E",
+"1 c #5E623B",
+"2 c #634100",
+"3 c #684500",
+"4 c #6E4900",
+"5 c #614F11",
+"6 c #685416",
+"7 c #734C00",
+"8 c #784F00",
+"9 c #755B00",
+"0 c #7C5200",
+"q c #7C5A00",
+"w c #7B570F",
+"e c #69562F",
+"r c #786600",
+"t c #7F6A00",
+"y c #766300",
+"u c #60613F",
+"i c #7C6422",
+"p c #545143",
+"a c #54524B",
+"s c gray32",
+"d c #5D5D57",
+"f c #616641",
+"g c #67695D",
+"h c #6B734D",
+"j c #6C7553",
+"k c #616261",
+"l c #686A64",
+"z c #6B7162",
+"x c #727272",
+"c c #003DFF",
+"v c #0043FF",
+"b c #004BFF",
+"n c #0053FF",
+"m c #015AFF",
+"M c #0063FF",
+"N c #046DFF",
+"B c #0865FF",
+"V c #0378FF",
+"C c #1663FF",
+"Z c #1576FF",
+"A c #2678FF",
+"S c #6F7B84",
+"D c #77856D",
+"F c #7B8B75",
+"G c #0083FF",
+"H c #0197FF",
+"J c #0B92FF",
+"K c #1385FF",
+"L c #01A5FF",
+"P c #0DB5FF",
+"I c #3096FF",
+"U c #2DADFF",
+"Y c #2FBCFF",
+"T c #22C6FF",
+"R c #2AC5FF",
+"E c #30D0FF",
+"W c #38D5FF",
+"Q c #4493F1",
+"! c #5F83FF",
+"~ c #5F8AFF",
+"^ c #5290E4",
+"/ c #5F92FF",
+"( c #4CAAFE",
+") c #40B8FF",
+"_ c #779DCB",
+"` c #6693E2",
+"' c #6290FF",
+"] c #649DFF",
+"[ c #71A6E5",
+"{ c #79A4FF",
+"} c #7FB3FF",
+"| c #68B8F3",
+" . c #42DCFF",
+".. c #47E0FF",
+"X. c #58E9FF",
+"o. c #64C0EB",
+"O. c #6ADFEF",
+"+. c #825600",
+"@. c #845A00",
+"#. c #8B5C00",
+"$. c #905F00",
+"%. c #8C6103",
+"&. c #876807",
+"*. c #8A6111",
+"=. c #886E1B",
+"-. c #887600",
+";. c #8C7A00",
+":. c #936200",
+">. c #986800",
+",. c #926C22",
+"<. c #987A3F",
+"1. c #A07200",
+"2. c #A27511",
+"3. c #A97D15",
+"4. c #A77B14",
+"5. c #998712",
+"6. c #A68000",
+"7. c #A78F00",
+"8. c #AD8016",
+"9. c #AC9600",
+"0. c #BB8F00",
+"q. c #A99B2A",
+"w. c #B9A000",
+"e. c #B3A63C",
+"r. c #958D43",
+"t. c #988F44",
+"y. c #9A9346",
+"u. c #9F9948",
+"i. c #8B897C",
+"p. c #958F6F",
+"a. c #98937B",
+"s. c #A68443",
+"d. c #B08C41",
+"f. c #AF9462",
+"g. c #B39864",
+"h. c #B2A850",
+"j. c #BDB355",
+"k. c #C3972F",
+"l. c #C5A400",
+"z. c #CCAC00",
+"x. c #D7BB00",
+"c. c #CCA030",
+"v. c #CBB43E",
+"b. c #E4AD0C",
+"n. c #ECB600",
+"m. c #EDB900",
+"M. c #F2BB00",
+"N. c #C1B84C",
+"B. c #C1B757",
+"V. c #C5BB58",
+"C. c #C9BE5A",
+"Z. c #C2A978",
+"A. c #DFC000",
+"S. c #FDCB00",
+"D. c #F6C300",
+"F. c #FFD100",
+"G. c #FEDB00",
+"H. c #FFDF0E",
+"J. c #F5D500",
+"K. c #FBCD39",
+"L. c #FFE832",
+"P. c #FFE432",
+"I. c #CEC25C",
+"U. c #D7C648",
+"Y. c #DDC74B",
+"T. c #D0C55E",
+"R. c #D3C85F",
+"E. c #D5C960",
+"W. c #DDD264",
+"Q. c #E0CA4C",
+"!. c #E7D14E",
+"~. c #EFDA51",
+"^. c #F4D050",
+"/. c #F9D452",
+"(. c #FEDD53",
+"). c #E2D765",
+"_. c #E9DD69",
+"`. c #E6DD68",
+"'. c #FDDB6E",
+"]. c #FFEE4F",
+"[. c #FEE354",
+"{. c #FEEA55",
+"}. c #F7E153",
+"|. c #FFF056",
+" X c #ECE16A",
+".X c #F1E56D",
+"XX c #F7EA6F",
+"oX c #F7EB70",
+"OX c #F9EC70",
+"+X c #FEF372",
+"@X c #979486",
+"#X c gray60",
+"$X c #969596",
+"%X c #8AA193",
+"&X c #82A89B",
+"*X c #8CAEA3",
+"=X c #86A7A9",
+"-X c #8BA2B1",
+";X c #ACA580",
+":X c #A5A291",
+">X c #B3AF98",
+",X c #B8B7AF",
+"<X c #B3B2AB",
+"1X c #B1B1B1",
+"2X c #A6B8FF",
+"3X c #88DEE0",
+"4X c #8BF0FE",
+"5X c #A4CFC6",
+"6X c #BFD5FF",
+"7X c #BFDCFF",
+"8X c #C2AD82",
+"9X c #CBB489",
+"0X c #D2BF9B",
+"qX c #D1C19F",
+"wX c #C8C4AA",
+"eX c #CFCBB7",
+"rX c #D8C7A6",
+"tX c #D2C2A3",
+"yX c #D5CCB3",
+"uX c #DAD1A1",
+"iX c #DDD5BB",
+"pX c #D7D1B3",
+"aX c #ECE5BB",
+"sX c #F5EBB5",
+"dX c #F5ECBC",
+"fX c #F8EEB8",
+"gX c #FCF2BC",
+"hX c #CBCBCB",
+"jX c #D8D6C7",
+"kX c #DDDDDD",
+"lX c #E4DAC2",
+"zX c #ECE6C7",
+"xX c #EBE6D9",
+"cX c #E9E3D0",
+"vX c #F5EDC4",
+"bX c #F6EFC9",
+"nX c #F0EBD5",
+"mX c #F3EFDB",
+"MX c #FCF3C5",
+"NX c #FCF4CA",
+"BX c #F7F0CA",
+"VX c #F6F0D2",
+"CX c #F9F3D3",
+"ZX c #F9F4DC",
+"AX c #FFF8D4",
+"SX c #FFF9DB",
+"DX c #E7E7E4",
+"FX c #EBEBE9",
+"GX c #F1EDE1",
+"HX c #F9F6E5",
+"JX c #FDF9E4",
+"KX c #FEFBEB",
+"LX c #F6F2E6",
+"PX c #FEFCF3",
+"IX c #FEFDFD",
+"UX c #F4F4F3",
+"YX c None",
+/* pixels */
+"YXYXYXYXYXYX YXYXYXYXYXYXYXYXYXYXYXYXYX",
+"YXYXYXYX:.:.+ IXIXIXIXIXIXIXIXFX# +.7 YXYXYXYXYXYXYXYXYXYXYX",
+"YXYXYX>.k.c.6 FXkXkXkXDXkXkXkXx i b.>.+ YXYXYXYXYXYXYXYXYXYX",
+"YXYXYX:.'.K.=.hX1X1X1X1X1X1X1Xd &.0.%.* 7 #.#.:.$.#.2 YXYXYX",
+"YXYXYX:./.M.%.$Xk k d s s s e w >.2.d.s.Z.9XrXlXxX0X7 YXYXYX",
+"YXYXYX:.^.M.1.: % % - % 5 6 &.GXIXIXPXPXPXPXPXLXIXIXg.3 YXYX",
+"YXYX#X:.^.m.v.y.r.r.r.r.h.h.2.IXPXPXKXKXPXKXHXxXUXIXIXf.4 YX",
+"YXYX#X:.^.m.Y.I.B.j.j.j.V.I.4.PXKXJXKXJXKXKXmXjXFXIXIXUX+. YX",
+"YXYX#X:.^.m.Y.E.I.j.j.j.I.R.8.PXKXSXJXJXJXSXnXeXDXIXIXUX<. YX",
+"YXYXYX:./.M.!.W.R.I.T.R.E.W.8.UXJXJXSXSXSXSXnXeX:X@Xi.<X7 ",
+"YXYXYX:./.D.~._.`.W.W.W.W. X8.PXJXSXAXSXSXSXVXjX>X@X@X,X4 ",
+"YXYXYX:.(.S.}..X X X X X X X8.PXSXAXAXAXAXAXNXzXpXwXwXjX7 ",
+"YXYXYX:.(.S.[.OXOXOXoXoXt.; O s a p p p p a.AXMXvXaXzXGX+. ",
+"YXYXYX:.(.S.[.+X+X+XOX+X; 7X2X] / / ~ ! 2Xp MXNXNXNXSXKX+. YX",
+"YXYXYX:.(.F.|.+X+X+X+X+Xy., _ A m b v c ! p MXMXgXMXAXKX+. YX",
+"YXYXYX:.(.F.|.+X+X+X+X+X+Xj.& ^ B n b v ' < gXMXgXgXNXKX+. YX",
+"YXYXYX:.(.F.U.W.+X+X+X+X).y.g Q N m n b ~ < gXgXgXgXAXJXq YX",
+"YXYXYX:.[.l.j j y.I.j.r.1 =X( K N M m b ~ < gXgXgXgXNXKX+. YX",
+"YXYXYX:.[.t 5X4X&XD F =X| U J G V Z A C / < fXgXgXgXMXHX+. YX",
+"YXYXYX:.[.l.h 3XX...W T P L H K I [ S ` { < fXfXfXfXMXKX+. YX",
+"YXYXYX:.[.G.e.1 *XO...E R Y Y | -Xd Z.k 6X> fXfXfXfXBXJX+. YX",
+"YXYXYX:.[.G.{.`.u.1 F &X*X%Xz l a.uXfXp.> p.sXsXsXfXBXJX+. YX",
+"YXYXYX:.{.G.|.+X+X XN.q.5.7.q cXvXsXsXsXsXsXsXsXsXsXBXKX+. YX",
+"YXYXYX:.|.G.].|.L.H.G.G.G.A.1.JXvXsXsXsXsXsXsXsXfXdXCXPX+. YX",
+"YXYXYX:.{.G.G.G.G.G.x.w.;.t :.HXdXsXsXsXsXsXdXvXBXZXLXtX= YX",
+"YXYXYX:.{.G.J.x.9.;.r 9 q 0 #.KXvXsXaXsXvXBXCXHXiXg.*.= O YX",
+"YXYXYX:.L.9.-.y 9 q 0 = + #.HXbXdXbXVXZXcX8X,.3 $ . YX",
+"YXYXYX%.z.9 q 7 * o $.PXZXmXmX0Xs.0 $ X YX",
+"YXYXYX8 0 = o :.IXpXg.*.= O YXYXYXYX",
+"YXYXYX YXYX@.#.2 @ . YXYXYXYXYXYX",
+"YXYXYX YXYXYXYXYX YXYXYXYXYXYXYXYXYX",
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYX YXYXYXYXYXYXYXYXYXYXYXYX"
+};
diff --git a/languages/ruby/app_templates/qtruby4app/filenew.xpm b/languages/ruby/app_templates/qtruby4app/filenew.xpm
new file mode 100644
index 00000000..85efceb2
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/filenew.xpm
@@ -0,0 +1,216 @@
+/* XPM */
+static char *filenew[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 178 2",
+" c black",
+". c #191000",
+"X c #221700",
+"o c #452E00",
+"O c #4A3100",
+"+ c #4E3400",
+"@ c #553800",
+"# c #604000",
+"$ c #6A4600",
+"% c #6D4800",
+"& c #704A00",
+"* c #724C00",
+"= c #744C00",
+"- c #764E00",
+"; c #785000",
+": c #805500",
+"> c #815500",
+", c #835700",
+"< c #865900",
+"1 c #875A00",
+"2 c #8A5B00",
+"3 c #8A5C00",
+"4 c #8B5C00",
+"5 c #8C5D00",
+"6 c #8D5D00",
+"7 c #8F5E00",
+"8 c #805911",
+"9 c #905F00",
+"0 c #906000",
+"q c #926000",
+"w c #946200",
+"e c #956300",
+"r c #966400",
+"t c #976400",
+"y c #956913",
+"u c #926C22",
+"i c #9B7732",
+"p c #B18D48",
+"a c #B28E49",
+"s c #B4904A",
+"d c #BAA373",
+"f c #A1A195",
+"g c #ABAB9F",
+"h c #ADADAB",
+"j c #AFAFAB",
+"k c #B3B3A6",
+"l c #BCBCB8",
+"z c #BFBFBC",
+"x c #CBB489",
+"c c #CBB58A",
+"v c #CDB78B",
+"b c #CAB891",
+"n c #C9BB9E",
+"m c #CEBEA2",
+"M c #C6C6BC",
+"N c #D9C8A8",
+"B c #E8E1BA",
+"V c #E8E1BB",
+"C c #FEFFA1",
+"Z c #FFFFA0",
+"A c #FEFFA3",
+"S c #FEFFA4",
+"D c #FEFFA6",
+"F c #FEFFA8",
+"G c #FEFFA9",
+"H c #FFFFA8",
+"J c #FEFFAA",
+"K c #FEFFAB",
+"L c #FFFFAB",
+"P c #FEFFAC",
+"I c #FFFFAC",
+"U c #FEFFAE",
+"Y c #FEFFAF",
+"T c #FEFFB0",
+"R c #FEFFB1",
+"E c #FFFFB0",
+"W c #FEFFB4",
+"Q c #FEFFB5",
+"! c #FFFFB4",
+"~ c #FEFFB8",
+"^ c #FEFFB9",
+"/ c #FFFFB8",
+"( c #FFFFB9",
+") c #FEFFBB",
+"_ c #FFFFBA",
+"` c #FEFFBD",
+"' c #FFFFBD",
+"] c #FEFFBE",
+"[ c #FFFFBE",
+"{ c #C8C8C1",
+"} c #CACAC4",
+"| c #CBCBC6",
+" . c #DBD2C1",
+".. c #DEDFCF",
+"X. c #D4D4D1",
+"o. c #E1D5C1",
+"O. c #E3D9C3",
+"+. c #E5DCCC",
+"@. c #E8E8D3",
+"#. c #ECECD7",
+"$. c #F0EBDA",
+"%. c #FEFFC2",
+"&. c #FEFFC3",
+"*. c #FFFFC2",
+"=. c #FEFFC7",
+"-. c #FFFFC7",
+";. c #FEFFCB",
+":. c #FEFFCC",
+">. c #FFFFCC",
+",. c #FEFFCE",
+"<. c #FEFFD0",
+"1. c #FEFFD1",
+"2. c #FFFFD0",
+"3. c #FFFFD1",
+"4. c #FFFFD3",
+"5. c #FEFFD5",
+"6. c #FFFFD5",
+"7. c #FEFFD6",
+"8. c #FEFFD7",
+"9. c #FFFFD6",
+"0. c #FFFFD8",
+"q. c #FEFFDA",
+"w. c #FFFFDA",
+"e. c #FFFFDB",
+"r. c #FFFFDC",
+"t. c #FEFFDE",
+"y. c #FEFFDF",
+"u. c #FFFFDE",
+"i. c #FFFFDF",
+"p. c #E9E9E7",
+"a. c #F3F3E9",
+"s. c #F3F3EB",
+"d. c #F5F5E8",
+"f. c #F8F8E3",
+"g. c #FEFFE0",
+"h. c LightYellow",
+"j. c #FFFFE1",
+"k. c #FEFFE3",
+"l. c #FFFFE3",
+"z. c #FDFEE7",
+"x. c #FEFFE4",
+"c. c #FEFFE5",
+"v. c #FFFFE4",
+"b. c #FBFBE9",
+"n. c #FEFFE8",
+"m. c #FFFFE8",
+"M. c #FFFFE9",
+"N. c #FFFFEA",
+"B. c #FEFFEC",
+"V. c #FEFFED",
+"C. c #FFFFEC",
+"Z. c #FFFFED",
+"A. c #FEFFEF",
+"S. c #F4F4F0",
+"D. c #F4F4F3",
+"F. c #F5F5F4",
+"G. c #F8F8F6",
+"H. c ivory",
+"J. c #FFFFF1",
+"K. c #FEFFF3",
+"L. c #FFFFF3",
+"P. c #FEFFF4",
+"I. c #FFFFF4",
+"U. c #FEFFF7",
+"Y. c #FFFFF6",
+"T. c #FFFFF7",
+"R. c #FBFBFB",
+"E. c #FFFFF8",
+"W. c #FFFFF9",
+"Q. c #FFFFFA",
+"!. c #FFFFFB",
+"~. c gray99",
+"^. c #FEFFFD",
+"/. c #FFFFFC",
+"(. c #FFFFFD",
+"). c #FFFFFE",
+"_. c gray100",
+"`. c None",
+/* pixels */
+"`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.`.w 2 1 w 4 4 4 6 w 9 6 - `.`.`.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.r s p p c c c c N O.+.o.y # `.`.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.r ).).).).).).).).F.p.). .& o `.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w ).E.).E.).E.E.E.S.X.).R.n $ + `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w E.Y.Y.E.Y.E.E.E.a.| ).).D.m % `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w E.Y.Y.J.Y.J.Y.Y.a.| ).).).D.> `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w Y.J.J.J.J.J.J.J.a.M l h h { ; `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w Y.B.B.B.N.N.B.B.b...k f h } ; `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w J.N.N.N.N.N.N.N.l.f.#.@.#.a.> `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w J.l.l.l.l.l.l.l.l.l.l.l.l.J.> `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w J.r.l.l.r.l.r.l.r.l.r.l.r.J.1 `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w B.r.r.q.q.q.q.q.q.r.q.q.r.B.> `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w N.5.5.5.5.q.5.5.5.5.5.5.5.B., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w N.<.<.<.<.<.<.<.5.<.<.<.<.N., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w l.,.;.;.;.,.;.,.;.,.;.;.;.l., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w l.-.-.-.-.-.-.;.-.-.-.-.;.l.> `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w l.-.%.%.%.%.%.%.%.%.%.%.%.l., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w r.' ' ' ' ' ) ' ' ' ' ' ' r., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w r.) ) W ) ) ) ) ) ) W ) ) q., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w q.W W W W W W W W W W W W q., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w 5.Y Y W Y Y Y Y Y Y Y Y Y 5., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w 5.J J J Y J Y Y J Y J J Y q., `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w 5.J J D J J D J D J W ) ,.$.- `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w <.Z D D Z D J Y ' ,.B b i - O `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w <.Z Z Z Y ) <.B d u & @ X `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w ,.J ) ,.B d y & o . `.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.w Y.V d u & o . `.`.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`.1 4 & o . `.`.`.`.`.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`. `.`.`.`.`.`.`.`.`.`.`.`.`.`.",
+"`.`.`.`.`.`.`.`. `.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`."
+};
diff --git a/languages/ruby/app_templates/qtruby4app/fileopen.xpm b/languages/ruby/app_templates/qtruby4app/fileopen.xpm
new file mode 100644
index 00000000..a6c33b62
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/fileopen.xpm
@@ -0,0 +1,295 @@
+/* XPM */
+static char *fileopen[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 257 2",
+" c black",
+". c #0B0900",
+"X c #130E00",
+"o c #161100",
+"O c #231A00",
+"+ c #352600",
+"@ c #3B311C",
+"# c #433100",
+"$ c #4F3B00",
+"% c #4A3E16",
+"& c #4A3D22",
+"* c #4D421A",
+"= c #54420D",
+"- c #4E4529",
+"; c #484338",
+": c #484233",
+"> c #5B4B24",
+", c #624500",
+"< c #674D00",
+"1 c #6D4D00",
+"2 c #6E4F17",
+"3 c #6D5200",
+"4 c #775500",
+"5 c #745B0F",
+"6 c #795200",
+"7 c #7A5A00",
+"8 c #715C18",
+"9 c #764B0A",
+"0 c #6C5423",
+"q c #6D592E",
+"w c #785E27",
+"e c #735626",
+"r c #665736",
+"t c #7A631D",
+"y c #7A672E",
+"u c #776535",
+"i c #5C5956",
+"p c #78704F",
+"a c #75726E",
+"s c #8D4F00",
+"d c #815700",
+"f c #835A00",
+"g c #8A5C00",
+"h c #866400",
+"j c #966100",
+"k c #956F00",
+"l c #9C6100",
+"z c #9D7500",
+"x c #856B2A",
+"c c #8C752A",
+"v c #8C723B",
+"b c #977939",
+"n c #A45D00",
+"m c #A26100",
+"M c #AA680D",
+"N c #AB6700",
+"B c #A07700",
+"V c #A57B00",
+"C c #AB7A00",
+"Z c #AA7300",
+"A c #AF721A",
+"S c #B87E00",
+"D c #B57B00",
+"F c #B0731A",
+"G c #B47C26",
+"H c #B77E28",
+"J c #897F59",
+"K c #977C40",
+"L c #927F58",
+"P c #807A6C",
+"I c #9C821D",
+"U c #9F8A35",
+"Y c #AC8000",
+"T c #B28500",
+"R c #B68800",
+"E c #BB8B00",
+"W c #A78337",
+"Q c #A28B31",
+"! c #AF9535",
+"~ c #B58E3A",
+"^ c #B88633",
+"/ c #B49936",
+"( c #BCA039",
+") c #998445",
+"_ c #978657",
+"` c #8B8264",
+"' c #8E8572",
+"] c #978864",
+"[ c #978C75",
+"{ c #9F9072",
+"} c #A38845",
+"| c #A48952",
+" . c #AA965C",
+".. c #A89156",
+"X. c #B5934D",
+"o. c #B39D45",
+"O. c #B49755",
+"+. c #AB984A",
+"@. c #AD9A65",
+"#. c #A79778",
+"$. c #A59874",
+"%. c #A29B7A",
+"&. c #A79775",
+"*. c #BDA959",
+"=. c #B3A46C",
+"-. c #B1A07F",
+";. c #B5A97A",
+":. c #BEB37B",
+">. c #C49200",
+",. c #C89500",
+"<. c #CC9800",
+"1. c #C69812",
+"2. c #D2A31C",
+"3. c #C2A63E",
+"4. c #D7AE37",
+"5. c #C29840",
+"6. c #C29B4E",
+"7. c #C2A641",
+"8. c #C6AA43",
+"9. c #C8AC45",
+"0. c #CBAF49",
+"q. c #CAA746",
+"w. c #C4A158",
+"e. c #CAA65D",
+"r. c #CEA857",
+"t. c #CFA95A",
+"y. c #C5AC50",
+"u. c #CDB14B",
+"i. c #CBB358",
+"p. c #CAB152",
+"a. c #D2AB59",
+"s. c #D1B54D",
+"d. c #D4B951",
+"f. c #D6BC5B",
+"g. c #DDB45E",
+"h. c #D9BD56",
+"j. c #D2B753",
+"k. c #DAAB48",
+"l. c #CEAE69",
+"z. c #CCAD67",
+"x. c #CCB662",
+"c. c #CAB26B",
+"v. c #C8B66B",
+"b. c #CEB775",
+"n. c #CEBE7F",
+"m. c #D3AD66",
+"M. c #D5BE64",
+"N. c #D4BF6D",
+"B. c #E4B34B",
+"V. c #E0B75F",
+"C. c #E1B85F",
+"Z. c #E4BA61",
+"A. c #E9BE63",
+"S. c #DDC159",
+"D. c #DAC269",
+"F. c #D4C176",
+"G. c #D8C67F",
+"H. c #E1C55D",
+"J. c #EFC05D",
+"K. c #F1C15E",
+"L. c #E0C264",
+"P. c #E5C961",
+"I. c #EDC164",
+"U. c #E9CD65",
+"Y. c #EFD36B",
+"T. c #F2C564",
+"R. c #F6C868",
+"E. c #F8C760",
+"W. c #FBCC6A",
+"Q. c #FDCB63",
+"!. c #F1D56D",
+"~. c #FFD06C",
+"^. c #F5D972",
+"/. c #FED175",
+"(. c #FADE77",
+"). c #E4C87A",
+"_. c #FEE27C",
+"`. c #8F9192",
+"'. c #9A9A96",
+"]. c #A79F83",
+"[. c #ADA583",
+"{. c #A7A399",
+"}. c #BBAC86",
+"|. c #BDB088",
+" X c #BBB298",
+".X c #A7A8A6",
+"XX c #ADAEB0",
+"oX c #B5B6B4",
+"OX c #BABCBC",
+"+X c #C6B38E",
+"@X c #D3BE80",
+"#X c #D0BC95",
+"$X c #C6BFA6",
+"%X c #C5C29D",
+"&X c #D2C283",
+"*X c #DAC789",
+"=X c #DBCA8B",
+"-X c #D5C489",
+";X c #DBCD94",
+":X c #D6C699",
+">X c #CFC8B1",
+",X c #C8C6B7",
+"<X c #D1C9A6",
+"1X c #DBD3BA",
+"2X c #E1C981",
+"3X c #E0CD91",
+"4X c #ECD686",
+"5X c #EBD69E",
+"6X c #FED682",
+"7X c #FED88B",
+"8X c #FEDC95",
+"9X c #E3CEA3",
+"0X c #EED9A9",
+"qX c #E7DCB9",
+"wX c #F4DDAF",
+"eX c #FFE68A",
+"rX c #FFE893",
+"tX c #FFEA9F",
+"yX c #FFE2A5",
+"uX c #FFE3AC",
+"iX c #FFECA7",
+"pX c #FFEDAE",
+"aX c #F1E0B6",
+"sX c #FDE5B4",
+"dX c #FFEEB4",
+"fX c #F8E5BB",
+"gX c #FFF0BC",
+"hX c #C5C7C8",
+"jX c #C7C8CA",
+"kX c #CCCECF",
+"lX c #CCCAC0",
+"zX c #CDCED0",
+"xX c #D1D1CF",
+"cX c #D1D3D4",
+"vX c #D6D8DA",
+"bX c #DADCDE",
+"nX c #DCDEE0",
+"mX c #DEE0E2",
+"MX c #E7DEC2",
+"NX c #EBE1C5",
+"BX c #F4E9C3",
+"VX c #F7EACE",
+"CX c #FEEAC3",
+"ZX c #FAEBCA",
+"AX c #FFF1C1",
+"SX c #FFF3CC",
+"DX c #FFF6DA",
+"FX c #E1E3E5",
+"GX c #E4E6E8",
+"HX c #E7E9EA",
+"JX c #E8E6E0",
+"KX c #E9EAEC",
+"LX c #ECEEF0",
+"PX c #EEF0F2",
+"IX c #F8F4E8",
+"UX c #F1F3F5",
+"YX c None",
+/* pixels */
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX V E <.,.T YXYXYXYXYXYX",
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX< E 2.aXCXVXE 3 E <.E YXYX",
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX R ,.5XCX8XQ.wX<.1.$.OX<. YXYX",
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYX R >.L.ZXyXT.K.E.wX ..XKXKXR YXYX",
+"YXYXYXYXYXYXYXYXYXYXYXYX V E 4.ZXsXW.K.I.Z.O.{.KXUXUXMXk YXYX",
+"YXYXYXYXYXYX R E 7 YX< E 2.aXsX6XC.T.Z.w.[ xXUXUXUXUX2X3 YXYX",
+"YXYXYXYX R >.).5X,.T ,.5XCX8XK.T.A.a.] OXUXUXUXUXUXUX2.O YXYX",
+"YXYX Y E Z.ZXsX7XsX0XCXyXR.K.I.V._ .XUXUXUXUXUXLXKXJXV D N S 7 ",
+" z E 4.fXsX/.K.~./.6X~.I.I.C...'.KXUXPXPXPXLXKXGXbXl.N m.SXm.D ",
+" E 0XgX7XE.W.W.~.~.R.I.Z.w.' bXUXUXUXPXPXLXmXbX$X) ~ aXSXpXBXn ",
+" <.CXT.Q.~.W.W.R.I.A.t._ hXUXUXUXUXPXLXGXnX,X .t XAXSXeX4Xl.Z ",
+" <.sXB.W.W.W.T.A.g._ oXUXUXUXUXUXLXLXmXcX=.5 $.BXgXeX!.D.3Xm + ",
+" <.sXB.R.R.A.V.| {.KXUXUXUXUXLXKXGXvX|.c u qXdXgX^.U.f.3XH f ",
+" <.sXB.T.Z.m.[ nXUXUXUXUXPXKXHXbX,X) e <XdXiX_.S.u.P.F.t.h ",
+" <.sXk.Z.r.K [email protected] %.DXiX_.Y.S.d.h.D.*Xl X ",
+" <.wXq.r.X.r UXUXPXPXKXmXvX|.y _ NXdXrX!.S.d.h.d.f.=XF 4 YX",
+" ,.0X5.X.) a PXPXKXGXnX>X) y >XAXAX_.S.h.h.u.s.d.F.6.g YX",
+" >.9X~ } u '.LXKXmXxX .5 [.IXAX_.!.S.h.h.d.8.s.D.n.j YXYX",
+" >.:XW v & kXmXvX;.t ] BXAXrX!.U.u.S.9.u.3.7.i.;XM 1 YXYXYX",
+" E #Xb u : nXcX_ u 1XSXgX^.U.H.S.d.8.s.d.u.b.-XG g YXYXYXYX",
+" R +Xc r a zX[.= -XdX_.U.d.P.h.d.u.3.8.N.=Xw.l 1 YXYXYXYX",
+" T }.x > `.oX> %.*.S.S.h.S.7.d.h.0.p.n.c.M d . YXYXYXYXYX",
+" C ].w @ XXu p *.( h.S.s.u.u.u.p.N.*X^ g + YXYXYXYXYXYX",
+" Z &.e ; ` * :.o.S.S.S.u.( 9.x.&XX.j , YXYXYXYXYXYX",
+" B { 0 i % [.o.u.S.d.h.9.M.&Xz.M 6 YXYXYXYXYXYXYXYX",
+" z { 0 - J *./ S.9.d.i.G.&XF g O YXYXYXYXYXYXYXYXYXYX",
+" z $.2 w =.! s.d.p.N.;X^ l , YXYXYXYXYXYXYXYXYXYXYX",
+" B &.9 ;.Q / [email protected] 6 YXYXYXYXYXYXYXYXYXYXYXYXYX",
+" h W @.+.I y.&Xb.F 7 O YXYXYXYXYXYXYXYXYXYXYXYXYXYXYX",
+" $ s %XU F.=X^ j # YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX",
+" g O.<Xe.l 1 YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX",
+" o f n d . YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX"
+};
diff --git a/languages/ruby/app_templates/qtruby4app/filesave.xpm b/languages/ruby/app_templates/qtruby4app/filesave.xpm
new file mode 100644
index 00000000..86ea7d63
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/filesave.xpm
@@ -0,0 +1,295 @@
+/* XPM */
+static char *filesave[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 257 2",
+" c #000000",
+". c #06060A",
+"X c #09090D",
+"o c #0B0B16",
+"O c #101022",
+"+ c #1E1E28",
+"@ c #181829",
+"# c #151F3A",
+"$ c #1A263F",
+"% c #1D2A3F",
+"& c #272730",
+"* c #2E2E3F",
+"= c #212140",
+"- c #212E41",
+"; c #2F2F41",
+": c #292A4A",
+"> c #23224B",
+", c #262353",
+"< c #292655",
+"1 c #2B2C54",
+"2 c #2C2C5B",
+"3 c #293746",
+"4 c #2D304F",
+"5 c #243243",
+"6 c #2E315D",
+"7 c #363647",
+"8 c #303E4A",
+"9 c #30325E",
+"0 c #3C3C53",
+"q c #2E2E60",
+"w c #2F3160",
+"e c #302E63",
+"r c #313164",
+"t c #363861",
+"y c #353868",
+"u c #384650",
+"i c #284F6B",
+"p c #2D547B",
+"a c #3B486A",
+"s c #36597D",
+"d c #3D5D7C",
+"f c #4C4C4C",
+"g c #40405A",
+"h c #414E56",
+"j c #4B585E",
+"k c #49545E",
+"l c #555555",
+"z c #4D4D6B",
+"x c #434675",
+"c c #4B5660",
+"v c #4F5962",
+"b c #41517E",
+"n c #4B507D",
+"m c #515C67",
+"M c #505D6E",
+"N c #5C5D7D",
+"B c #546066",
+"V c #54626D",
+"C c #5B646D",
+"Z c #55677A",
+"A c #556B78",
+"S c #5D6772",
+"D c #6B6B6B",
+"F c #646464",
+"G c #616C73",
+"H c #63707D",
+"J c #6B7679",
+"K c gray45",
+"L c #00418E",
+"P c #004494",
+"I c #004894",
+"U c #044F98",
+"Y c #03509B",
+"T c #0A5198",
+"R c #13579C",
+"E c #185DA1",
+"W c #285888",
+"Q c #2B6094",
+"! c #396D9A",
+"~ c #336A96",
+"^ c #3D719B",
+"/ c #226EB8",
+"( c #326EA8",
+") c #326BA3",
+"_ c #3673AE",
+"` c #3A76B4",
+"' c #0B6FD1",
+"] c #0F75D8",
+"[ c #1479DA",
+"{ c #1B7CDC",
+"} c #466481",
+"| c #42749C",
+" . c #4A799E",
+".. c #506A84",
+"X. c #5F678D",
+"o. c #576391",
+"O. c #5A6592",
+"+. c #5F6893",
+"@. c #5B738B",
+"#. c #507DA1",
+"$. c #626283",
+"%. c #636A94",
+"&. c #656F98",
+"*. c #657A8F",
+"=. c #6B7299",
+"-. c #717191",
+";. c #797998",
+":. c #687BA6",
+">. c #2281DC",
+",. c #3F81C0",
+"<. c #3988D7",
+"1. c #2785E1",
+"2. c #2E8AE3",
+"3. c #368FE5",
+"4. c #3690E6",
+"5. c #3D93E7",
+"6. c #3D94E9",
+"7. c #57839E",
+"8. c #4787BC",
+"9. c #5480A1",
+"0. c #5B84A3",
+"q. c #6E8496",
+"w. c #6E8B9A",
+"e. c #7D848E",
+"r. c #728597",
+"t. c #738598",
+"y. c #768899",
+"u. c #7B8B9B",
+"i. c #6489A5",
+"p. c #698EA7",
+"a. c #6D8FA9",
+"s. c #6E81AB",
+"d. c #7683A6",
+"f. c #768CB7",
+"g. c #7395AD",
+"h. c #7C96B0",
+"j. c #4086CA",
+"k. c #4986C3",
+"l. c #4284C3",
+"z. c #498ED2",
+"x. c #4D95DB",
+"c. c #548DC5",
+"v. c #5D92C8",
+"b. c #5593C9",
+"n. c #5097DE",
+"m. c #5198DE",
+"M. c #4296E7",
+"N. c #4895E2",
+"B. c #4B99E5",
+"V. c #4A9CEB",
+"C. c #4599EB",
+"Z. c #529DE6",
+"A. c #589EE2",
+"S. c #54A1EB",
+"D. c #5AA1E6",
+"F. c #5AA5EB",
+"G. c #5EA8EF",
+"H. c #53A3F1",
+"J. c #5EAAF2",
+"K. c #6699CB",
+"L. c #799BC8",
+"P. c #7EA6C9",
+"I. c #60A2E5",
+"U. c #65A7E8",
+"Y. c #6BABE9",
+"T. c #68ADF2",
+"R. c #67B0F5",
+"E. c #6DB3F6",
+"W. c #70ADEA",
+"Q. c #75B0E9",
+"!. c #7CB5EB",
+"~. c #73B9F8",
+"^. c #7BBDFB",
+"/. c #7CBAF6",
+"(. c gray55",
+"). c #828899",
+"_. c #84949E",
+"`. c #918E8A",
+"'. c #949494",
+"]. c #8F8FA9",
+"[. c #8997A5",
+"{. c #8A9AA9",
+"}. c #9A9BAF",
+"|. c #9399A9",
+" X c #9FAAB5",
+".X c #A29E9B",
+"XX c #A7A7A7",
+"oX c #ABABAB",
+"OX c #A3A3B4",
+"+X c #A8A8B7",
+"@X c #A3ABB3",
+"#X c #B4B5B5",
+"$X c #B0B0BC",
+"%X c #B7B9BC",
+"&X c #BBB7B3",
+"*X c #BBBBBB",
+"=X c #82B1DB",
+"-X c #81B7EC",
+";X c #88BBED",
+":X c #86BAED",
+">X c #AEBBC8",
+",X c #A6BDCD",
+"<X c #BBBCC3",
+"1X c #81C1F6",
+"2X c #83C2FA",
+"3X c #89C4FA",
+"4X c #8CC8FC",
+"5X c #95C2EF",
+"6X c #93CBFD",
+"7X c #9BCFFF",
+"8X c #97D0FC",
+"9X c #9CD3FE",
+"0X c #BEC0C1",
+"qX c #A3C7E7",
+"wX c #A2CAF1",
+"eX c #A1D4FF",
+"rX c #A3D8FF",
+"tX c #AADBFF",
+"yX c #B0D1F2",
+"uX c #BDD9F4",
+"iX c #AAE0FF",
+"pX c #B3E1FF",
+"aX c #B9E6FF",
+"sX c #BEE9FF",
+"dX c #C4C4C4",
+"fX c #C6C5CD",
+"gX c #C6C8CB",
+"hX c #CAC7C4",
+"jX c #CAC8C6",
+"kX c #CBCCCB",
+"lX c #D1D0CE",
+"zX c #D3D3D3",
+"xX c #D4D7D9",
+"cX c #D8D8D7",
+"vX c #DBDBDB",
+"bX c #C4ECFF",
+"nX c #C9E0F6",
+"mX c #C4F5FF",
+"MX c #CCF2FF",
+"NX c #D5E6F7",
+"BX c #DDEBF9",
+"VX c #DCFDFF",
+"CX c #D3F1F5",
+"ZX c #E1E0DE",
+"AX c #E4E3E3",
+"SX c #E4E7EA",
+"DX c #E7E8E9",
+"FX c #E8E6E4",
+"GX c #EDE9E5",
+"HX c #EBEBEB",
+"JX c #E7EEF5",
+"KX c #EAF2FA",
+"LX c #F1EEEA",
+"PX c #F3F3F3",
+"IX c #F4F8FC",
+"UX c #FDFDFC",
+"YX c None",
+/* pixels */
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXy y e 6 6 2 < < , , 1 YXYX",
+"YXYXYX2 < , , q w 2 e r r r w e w r e 2 6 1 6 s :.f.L.y YXYX",
+"YXYXYXx d.s.:.a # $ $ % - 5 3 8 u h k B S J ).,XF.b.7.r YXYX",
+"YXYXYX&.mX~.8.V #X#X%XdXfXzXxXvXZXZXDXFXFXDXLXDX>.U i 9 YXYX",
+"YXYXYXo.2X] L C UXDXcXzXkXkXkXjXjXdXdX%X%X&X%X*XN.' ~ 6 YXYX",
+"YXYXYXo.1X] P k hXoXXXXXoXoX#X#X*X%X&X%X%XdXkXxXx.[ ~ 6 YXYX",
+"YXYXYXO.3X[ I m FXkXjXjXkXkXkXkXkXkXzXzXzXcXZXSXx.{ ! 6 YXYX",
+"YXYXYXo.3X{ I S UXvXxXzXkXkXkXkXkXjXdX*X%X#X&X%XZ.1.^ 9 YXYX",
+"YXYXYXO.4X>.U j jX#X#X#X%XdXdXkXzXkXzXzXcXvXDXJXA.1.| 6 YXYX",
+"YXYXYXO.6X>.T V PXZXZXZXAXSXDXDXFXHXDXHXHXHXHXSXI.2.| 9 YXYX",
+"YXYXYXO.6X2.T G UXLXDXDXAXZXZXAXZXvXcXzXkXkXkXgXY.3. .6 YXYX",
+"YXYXYXO.9X4.R m zXdXdXkXzXvXAXDXHXLXPXPXIXUXUXUXQ.6. .9 YXYX",
+"YXYXYXO.9X5.R H UXIXUXUXUXUXUXUXUXUXUXUXIXKXJXBX-XC.#.9 YXYX",
+"YXYXYXO.eXM./ h.UXUXIXKXBXNXnXuXyXwX5X:X!.Y.Y.Y.D.H.9.6 YXYX",
+"YXYXYX+.rXB.<.x.Q.;X-XQ.Y.U.U.D.Z.Z.B.B.C.V.V.B.B.T.0.9 YXYX",
+"YXYXYX+.tXB.N.B.B.B.B.C.V.V.H.H.H.D.N.z.8._ ( <.D.R.0.9 YXYX",
+"YXYXYX+.tXS.Z.F.D.m.z.l.` ) Q W p s } @.r.[. X>XG.E.0.9 YXYX",
+"YXYXYX+.pXU.m.) p d ..*.u.|.+X<XzXZXGXLXGXZXzXjX/.~.p.r YXYX",
+"YXYXYX%.aXT.k.*.GXlX&X.X`..XhXlXzXvXvXvXvXxXkXgX2X^.a.w YXYX",
+"YXYXYX%.aXE.k.r.LXoXl f l F *XlXzXvXvXvXvXcXzXgX4X:Xa.w YXYX",
+"YXYXYX%.bX~.c.y.LX'.f D K D 0XkXzXvXvXvXvXvXzXfX6X4Xg.9 YXYX",
+"YXYXYX%.bX^.c.y.LX'.l D K D 0XlXzXcXvXvXvXxXkXkX9X6Xw.r YXYX",
+"YXYXYX%.bX2Xv.u.LX'.l K K K 0XlXzXcXvXvXvXvXkXfX9XP.M = YXYX",
+"YXYXYX%.bX2XK.u.LX'.l K K D 0XlXxXcXvXZXvXxXzXkXqXZ : . YXYX",
+"YXYXYX%.MX6XK.u.LX'.f F D D 0XkXzXcXvXvXvXvXcXkX_.: o YXYX",
+"YXYXYX%.MX6XK.u.LXXX(.XX&XdXkXzXvXZXDXAXzX<X+X}.N O YXYX",
+"YXYXYX%.VXiX=X{.FXzXkXkXjXdX<X$XOX].;.$.z 0 7 & X YXYXYX",
+"YXYXYX=.CXq.A ).fX+X|.).-.N z 0 * + o YXYXYXYX",
+"YXYXYXn $.t 6 , 4 0 * + . YXYXYXYXYXYX",
+"YXYXYX> @ o YXYXYXYXYXYXYXYXYXYXYXYX",
+"YXYXYX YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX",
+"YXYXYX YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX"
+};
diff --git a/languages/ruby/app_templates/qtruby4app/main.rb b/languages/ruby/app_templates/qtruby4app/main.rb
new file mode 100644
index 00000000..7b5aaf60
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/main.rb
@@ -0,0 +1,10 @@
+require 'Qt4'
+require '%{APPNAMELC}.rb'
+require 'qrc_application.rb'
+
+app = Qt::Application.new(ARGV)
+mw = %{APPNAME}.new
+mw.show
+app.exec
+
+
diff --git a/languages/ruby/app_templates/qtruby4app/qrc_application.rb b/languages/ruby/app_templates/qtruby4app/qrc_application.rb
new file mode 100644
index 00000000..b2bd7673
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/qrc_application.rb
@@ -0,0 +1,2281 @@
+#****************************************************************************
+#** Ruby Resource object code
+#**
+#** Created: Mon Dec 3 14:03:30 2007
+#** by: The Ruby Resource Compiler for Qt version 4.3.0
+#**
+#** WARNING! All changes made in this file will be lost!
+#****************************************************************************/
+
+class QCleanupResources__dest_class__
+ def self.qt_resource_data
+ return @@qt_resource_data
+ end
+
+ def self.qt_resource_name
+ return @@qt_resource_name
+ end
+
+ def self.qt_resource_struct
+ return @@qt_resource_struct
+ end
+
+@@qt_resource_data = [
+ # /home/rdale/src/kde/branches/KDE/3.5/kdevelop/languages/ruby/app_templates/qtruby4makeapp/fileopen.xpm
+ 0x0,0x0,0x18,0xf9,
+ 0x2f,
+ 0x2a,0x20,0x58,0x50,0x4d,0x20,0x2a,0x2f,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,
+ 0x63,0x68,0x61,0x72,0x20,0x2a,0x66,0x69,0x6c,0x65,0x6f,0x70,0x65,0x6e,0x5b,0x5d,
+ 0x20,0x3d,0x20,0x7b,0xa,0x2f,0x2a,0x20,0x63,0x6f,0x6c,0x75,0x6d,0x6e,0x73,0x20,
+ 0x72,0x6f,0x77,0x73,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x73,0x20,0x63,0x68,0x61,0x72,
+ 0x73,0x2d,0x70,0x65,0x72,0x2d,0x70,0x69,0x78,0x65,0x6c,0x20,0x2a,0x2f,0xa,0x22,
+ 0x33,0x32,0x20,0x33,0x32,0x20,0x32,0x35,0x37,0x20,0x32,0x22,0x2c,0xa,0x22,0x20,
+ 0x20,0x20,0x63,0x20,0x62,0x6c,0x61,0x63,0x6b,0x22,0x2c,0xa,0x22,0x2e,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x42,0x30,0x39,0x30,0x30,0x22,0x2c,0xa,0x22,0x58,0x20,0x20,
+ 0x63,0x20,0x23,0x31,0x33,0x30,0x45,0x30,0x30,0x22,0x2c,0xa,0x22,0x6f,0x20,0x20,
+ 0x63,0x20,0x23,0x31,0x36,0x31,0x31,0x30,0x30,0x22,0x2c,0xa,0x22,0x4f,0x20,0x20,
+ 0x63,0x20,0x23,0x32,0x33,0x31,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x2b,0x20,0x20,
+ 0x63,0x20,0x23,0x33,0x35,0x32,0x36,0x30,0x30,0x22,0x2c,0xa,0x22,0x40,0x20,0x20,
+ 0x63,0x20,0x23,0x33,0x42,0x33,0x31,0x31,0x43,0x22,0x2c,0xa,0x22,0x23,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x33,0x33,0x31,0x30,0x30,0x22,0x2c,0xa,0x22,0x24,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x46,0x33,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x25,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x41,0x33,0x45,0x31,0x36,0x22,0x2c,0xa,0x22,0x26,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x41,0x33,0x44,0x32,0x32,0x22,0x2c,0xa,0x22,0x2a,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x44,0x34,0x32,0x31,0x41,0x22,0x2c,0xa,0x22,0x3d,0x20,0x20,
+ 0x63,0x20,0x23,0x35,0x34,0x34,0x32,0x30,0x44,0x22,0x2c,0xa,0x22,0x2d,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x45,0x34,0x35,0x32,0x39,0x22,0x2c,0xa,0x22,0x3b,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x38,0x34,0x33,0x33,0x38,0x22,0x2c,0xa,0x22,0x3a,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x38,0x34,0x32,0x33,0x33,0x22,0x2c,0xa,0x22,0x3e,0x20,0x20,
+ 0x63,0x20,0x23,0x35,0x42,0x34,0x42,0x32,0x34,0x22,0x2c,0xa,0x22,0x2c,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x32,0x34,0x35,0x30,0x30,0x22,0x2c,0xa,0x22,0x3c,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x37,0x34,0x44,0x30,0x30,0x22,0x2c,0xa,0x22,0x31,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x44,0x34,0x44,0x30,0x30,0x22,0x2c,0xa,0x22,0x32,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x45,0x34,0x46,0x31,0x37,0x22,0x2c,0xa,0x22,0x33,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x44,0x35,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x34,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x37,0x35,0x35,0x30,0x30,0x22,0x2c,0xa,0x22,0x35,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x34,0x35,0x42,0x30,0x46,0x22,0x2c,0xa,0x22,0x36,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x39,0x35,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x37,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x41,0x35,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x38,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x31,0x35,0x43,0x31,0x38,0x22,0x2c,0xa,0x22,0x39,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x36,0x34,0x42,0x30,0x41,0x22,0x2c,0xa,0x22,0x30,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x43,0x35,0x34,0x32,0x33,0x22,0x2c,0xa,0x22,0x71,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x44,0x35,0x39,0x32,0x45,0x22,0x2c,0xa,0x22,0x77,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x38,0x35,0x45,0x32,0x37,0x22,0x2c,0xa,0x22,0x65,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x33,0x35,0x36,0x32,0x36,0x22,0x2c,0xa,0x22,0x72,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x36,0x35,0x37,0x33,0x36,0x22,0x2c,0xa,0x22,0x74,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x41,0x36,0x33,0x31,0x44,0x22,0x2c,0xa,0x22,0x79,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x41,0x36,0x37,0x32,0x45,0x22,0x2c,0xa,0x22,0x75,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x37,0x36,0x35,0x33,0x35,0x22,0x2c,0xa,0x22,0x69,0x20,0x20,
+ 0x63,0x20,0x23,0x35,0x43,0x35,0x39,0x35,0x36,0x22,0x2c,0xa,0x22,0x70,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x38,0x37,0x30,0x34,0x46,0x22,0x2c,0xa,0x22,0x61,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x35,0x37,0x32,0x36,0x45,0x22,0x2c,0xa,0x22,0x73,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x44,0x34,0x46,0x30,0x30,0x22,0x2c,0xa,0x22,0x64,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x31,0x35,0x37,0x30,0x30,0x22,0x2c,0xa,0x22,0x66,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x33,0x35,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x67,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x41,0x35,0x43,0x30,0x30,0x22,0x2c,0xa,0x22,0x68,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x36,0x36,0x34,0x30,0x30,0x22,0x2c,0xa,0x22,0x6a,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x36,0x36,0x31,0x30,0x30,0x22,0x2c,0xa,0x22,0x6b,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x35,0x36,0x46,0x30,0x30,0x22,0x2c,0xa,0x22,0x6c,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x43,0x36,0x31,0x30,0x30,0x22,0x2c,0xa,0x22,0x7a,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x44,0x37,0x35,0x30,0x30,0x22,0x2c,0xa,0x22,0x78,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x35,0x36,0x42,0x32,0x41,0x22,0x2c,0xa,0x22,0x63,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x43,0x37,0x35,0x32,0x41,0x22,0x2c,0xa,0x22,0x76,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x43,0x37,0x32,0x33,0x42,0x22,0x2c,0xa,0x22,0x62,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x37,0x37,0x39,0x33,0x39,0x22,0x2c,0xa,0x22,0x6e,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x34,0x35,0x44,0x30,0x30,0x22,0x2c,0xa,0x22,0x6d,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x32,0x36,0x31,0x30,0x30,0x22,0x2c,0xa,0x22,0x4d,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x41,0x36,0x38,0x30,0x44,0x22,0x2c,0xa,0x22,0x4e,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x42,0x36,0x37,0x30,0x30,0x22,0x2c,0xa,0x22,0x42,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x30,0x37,0x37,0x30,0x30,0x22,0x2c,0xa,0x22,0x56,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x35,0x37,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x43,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x42,0x37,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x5a,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x41,0x37,0x33,0x30,0x30,0x22,0x2c,0xa,0x22,0x41,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x46,0x37,0x32,0x31,0x41,0x22,0x2c,0xa,0x22,0x53,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x38,0x37,0x45,0x30,0x30,0x22,0x2c,0xa,0x22,0x44,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x35,0x37,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x46,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x30,0x37,0x33,0x31,0x41,0x22,0x2c,0xa,0x22,0x47,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x34,0x37,0x43,0x32,0x36,0x22,0x2c,0xa,0x22,0x48,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x37,0x37,0x45,0x32,0x38,0x22,0x2c,0xa,0x22,0x4a,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x39,0x37,0x46,0x35,0x39,0x22,0x2c,0xa,0x22,0x4b,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x37,0x37,0x43,0x34,0x30,0x22,0x2c,0xa,0x22,0x4c,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x32,0x37,0x46,0x35,0x38,0x22,0x2c,0xa,0x22,0x50,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x30,0x37,0x41,0x36,0x43,0x22,0x2c,0xa,0x22,0x49,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x43,0x38,0x32,0x31,0x44,0x22,0x2c,0xa,0x22,0x55,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x46,0x38,0x41,0x33,0x35,0x22,0x2c,0xa,0x22,0x59,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x43,0x38,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x54,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x32,0x38,0x35,0x30,0x30,0x22,0x2c,0xa,0x22,0x52,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x36,0x38,0x38,0x30,0x30,0x22,0x2c,0xa,0x22,0x45,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x42,0x38,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x57,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x37,0x38,0x33,0x33,0x37,0x22,0x2c,0xa,0x22,0x51,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x32,0x38,0x42,0x33,0x31,0x22,0x2c,0xa,0x22,0x21,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x46,0x39,0x35,0x33,0x35,0x22,0x2c,0xa,0x22,0x7e,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x35,0x38,0x45,0x33,0x41,0x22,0x2c,0xa,0x22,0x5e,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x38,0x38,0x36,0x33,0x33,0x22,0x2c,0xa,0x22,0x2f,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x34,0x39,0x39,0x33,0x36,0x22,0x2c,0xa,0x22,0x28,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x43,0x41,0x30,0x33,0x39,0x22,0x2c,0xa,0x22,0x29,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x39,0x38,0x34,0x34,0x35,0x22,0x2c,0xa,0x22,0x5f,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x37,0x38,0x36,0x35,0x37,0x22,0x2c,0xa,0x22,0x60,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x42,0x38,0x32,0x36,0x34,0x22,0x2c,0xa,0x22,0x27,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x45,0x38,0x35,0x37,0x32,0x22,0x2c,0xa,0x22,0x5d,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x37,0x38,0x38,0x36,0x34,0x22,0x2c,0xa,0x22,0x5b,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x37,0x38,0x43,0x37,0x35,0x22,0x2c,0xa,0x22,0x7b,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x46,0x39,0x30,0x37,0x32,0x22,0x2c,0xa,0x22,0x7d,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x33,0x38,0x38,0x34,0x35,0x22,0x2c,0xa,0x22,0x7c,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x34,0x38,0x39,0x35,0x32,0x22,0x2c,0xa,0x22,0x20,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x41,0x39,0x36,0x35,0x43,0x22,0x2c,0xa,0x22,0x2e,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x38,0x39,0x31,0x35,0x36,0x22,0x2c,0xa,0x22,0x58,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x35,0x39,0x33,0x34,0x44,0x22,0x2c,0xa,0x22,0x6f,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x33,0x39,0x44,0x34,0x35,0x22,0x2c,0xa,0x22,0x4f,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x34,0x39,0x37,0x35,0x35,0x22,0x2c,0xa,0x22,0x2b,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x42,0x39,0x38,0x34,0x41,0x22,0x2c,0xa,0x22,0x40,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x44,0x39,0x41,0x36,0x35,0x22,0x2c,0xa,0x22,0x23,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x37,0x39,0x37,0x37,0x38,0x22,0x2c,0xa,0x22,0x24,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x35,0x39,0x38,0x37,0x34,0x22,0x2c,0xa,0x22,0x25,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x32,0x39,0x42,0x37,0x41,0x22,0x2c,0xa,0x22,0x26,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x37,0x39,0x37,0x37,0x35,0x22,0x2c,0xa,0x22,0x2a,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x44,0x41,0x39,0x35,0x39,0x22,0x2c,0xa,0x22,0x3d,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x33,0x41,0x34,0x36,0x43,0x22,0x2c,0xa,0x22,0x2d,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x31,0x41,0x30,0x37,0x46,0x22,0x2c,0xa,0x22,0x3b,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x35,0x41,0x39,0x37,0x41,0x22,0x2c,0xa,0x22,0x3a,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x45,0x42,0x33,0x37,0x42,0x22,0x2c,0xa,0x22,0x3e,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x34,0x39,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x2c,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x38,0x39,0x35,0x30,0x30,0x22,0x2c,0xa,0x22,0x3c,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x43,0x39,0x38,0x30,0x30,0x22,0x2c,0xa,0x22,0x31,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x36,0x39,0x38,0x31,0x32,0x22,0x2c,0xa,0x22,0x32,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x32,0x41,0x33,0x31,0x43,0x22,0x2c,0xa,0x22,0x33,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x32,0x41,0x36,0x33,0x45,0x22,0x2c,0xa,0x22,0x34,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x37,0x41,0x45,0x33,0x37,0x22,0x2c,0xa,0x22,0x35,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x32,0x39,0x38,0x34,0x30,0x22,0x2c,0xa,0x22,0x36,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x32,0x39,0x42,0x34,0x45,0x22,0x2c,0xa,0x22,0x37,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x32,0x41,0x36,0x34,0x31,0x22,0x2c,0xa,0x22,0x38,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x36,0x41,0x41,0x34,0x33,0x22,0x2c,0xa,0x22,0x39,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x38,0x41,0x43,0x34,0x35,0x22,0x2c,0xa,0x22,0x30,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x42,0x41,0x46,0x34,0x39,0x22,0x2c,0xa,0x22,0x71,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x41,0x41,0x37,0x34,0x36,0x22,0x2c,0xa,0x22,0x77,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x34,0x41,0x31,0x35,0x38,0x22,0x2c,0xa,0x22,0x65,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x41,0x41,0x36,0x35,0x44,0x22,0x2c,0xa,0x22,0x72,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x45,0x41,0x38,0x35,0x37,0x22,0x2c,0xa,0x22,0x74,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x46,0x41,0x39,0x35,0x41,0x22,0x2c,0xa,0x22,0x79,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x35,0x41,0x43,0x35,0x30,0x22,0x2c,0xa,0x22,0x75,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x44,0x42,0x31,0x34,0x42,0x22,0x2c,0xa,0x22,0x69,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x42,0x42,0x33,0x35,0x38,0x22,0x2c,0xa,0x22,0x70,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x41,0x42,0x31,0x35,0x32,0x22,0x2c,0xa,0x22,0x61,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x32,0x41,0x42,0x35,0x39,0x22,0x2c,0xa,0x22,0x73,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x31,0x42,0x35,0x34,0x44,0x22,0x2c,0xa,0x22,0x64,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x34,0x42,0x39,0x35,0x31,0x22,0x2c,0xa,0x22,0x66,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x36,0x42,0x43,0x35,0x42,0x22,0x2c,0xa,0x22,0x67,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x44,0x42,0x34,0x35,0x45,0x22,0x2c,0xa,0x22,0x68,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x39,0x42,0x44,0x35,0x36,0x22,0x2c,0xa,0x22,0x6a,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x32,0x42,0x37,0x35,0x33,0x22,0x2c,0xa,0x22,0x6b,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x41,0x41,0x42,0x34,0x38,0x22,0x2c,0xa,0x22,0x6c,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x45,0x41,0x45,0x36,0x39,0x22,0x2c,0xa,0x22,0x7a,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x43,0x41,0x44,0x36,0x37,0x22,0x2c,0xa,0x22,0x78,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x43,0x42,0x36,0x36,0x32,0x22,0x2c,0xa,0x22,0x63,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x41,0x42,0x32,0x36,0x42,0x22,0x2c,0xa,0x22,0x76,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x38,0x42,0x36,0x36,0x42,0x22,0x2c,0xa,0x22,0x62,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x45,0x42,0x37,0x37,0x35,0x22,0x2c,0xa,0x22,0x6e,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x45,0x42,0x45,0x37,0x46,0x22,0x2c,0xa,0x22,0x6d,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x33,0x41,0x44,0x36,0x36,0x22,0x2c,0xa,0x22,0x4d,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x35,0x42,0x45,0x36,0x34,0x22,0x2c,0xa,0x22,0x4e,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x34,0x42,0x46,0x36,0x44,0x22,0x2c,0xa,0x22,0x42,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x34,0x42,0x33,0x34,0x42,0x22,0x2c,0xa,0x22,0x56,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x30,0x42,0x37,0x35,0x46,0x22,0x2c,0xa,0x22,0x43,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x31,0x42,0x38,0x35,0x46,0x22,0x2c,0xa,0x22,0x5a,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x34,0x42,0x41,0x36,0x31,0x22,0x2c,0xa,0x22,0x41,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x39,0x42,0x45,0x36,0x33,0x22,0x2c,0xa,0x22,0x53,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x44,0x43,0x31,0x35,0x39,0x22,0x2c,0xa,0x22,0x44,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x41,0x43,0x32,0x36,0x39,0x22,0x2c,0xa,0x22,0x46,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x34,0x43,0x31,0x37,0x36,0x22,0x2c,0xa,0x22,0x47,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x38,0x43,0x36,0x37,0x46,0x22,0x2c,0xa,0x22,0x48,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x31,0x43,0x35,0x35,0x44,0x22,0x2c,0xa,0x22,0x4a,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x46,0x43,0x30,0x35,0x44,0x22,0x2c,0xa,0x22,0x4b,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x31,0x43,0x31,0x35,0x45,0x22,0x2c,0xa,0x22,0x4c,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x30,0x43,0x32,0x36,0x34,0x22,0x2c,0xa,0x22,0x50,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x35,0x43,0x39,0x36,0x31,0x22,0x2c,0xa,0x22,0x49,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x44,0x43,0x31,0x36,0x34,0x22,0x2c,0xa,0x22,0x55,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x39,0x43,0x44,0x36,0x35,0x22,0x2c,0xa,0x22,0x59,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x46,0x44,0x33,0x36,0x42,0x22,0x2c,0xa,0x22,0x54,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x32,0x43,0x35,0x36,0x34,0x22,0x2c,0xa,0x22,0x52,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x36,0x43,0x38,0x36,0x38,0x22,0x2c,0xa,0x22,0x45,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x38,0x43,0x37,0x36,0x30,0x22,0x2c,0xa,0x22,0x57,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x42,0x43,0x43,0x36,0x41,0x22,0x2c,0xa,0x22,0x51,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x44,0x43,0x42,0x36,0x33,0x22,0x2c,0xa,0x22,0x21,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x31,0x44,0x35,0x36,0x44,0x22,0x2c,0xa,0x22,0x7e,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x44,0x30,0x36,0x43,0x22,0x2c,0xa,0x22,0x5e,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x35,0x44,0x39,0x37,0x32,0x22,0x2c,0xa,0x22,0x2f,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x44,0x31,0x37,0x35,0x22,0x2c,0xa,0x22,0x28,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x41,0x44,0x45,0x37,0x37,0x22,0x2c,0xa,0x22,0x29,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x34,0x43,0x38,0x37,0x41,0x22,0x2c,0xa,0x22,0x5f,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x45,0x32,0x37,0x43,0x22,0x2c,0xa,0x22,0x60,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x46,0x39,0x31,0x39,0x32,0x22,0x2c,0xa,0x22,0x27,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x41,0x39,0x41,0x39,0x36,0x22,0x2c,0xa,0x22,0x5d,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x37,0x39,0x46,0x38,0x33,0x22,0x2c,0xa,0x22,0x5b,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x44,0x41,0x35,0x38,0x33,0x22,0x2c,0xa,0x22,0x7b,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x37,0x41,0x33,0x39,0x39,0x22,0x2c,0xa,0x22,0x7d,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x42,0x41,0x43,0x38,0x36,0x22,0x2c,0xa,0x22,0x7c,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x44,0x42,0x30,0x38,0x38,0x22,0x2c,0xa,0x22,0x20,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x42,0x42,0x32,0x39,0x38,0x22,0x2c,0xa,0x22,0x2e,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x37,0x41,0x38,0x41,0x36,0x22,0x2c,0xa,0x22,0x58,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x44,0x41,0x45,0x42,0x30,0x22,0x2c,0xa,0x22,0x6f,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x35,0x42,0x36,0x42,0x34,0x22,0x2c,0xa,0x22,0x4f,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x41,0x42,0x43,0x42,0x43,0x22,0x2c,0xa,0x22,0x2b,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x36,0x42,0x33,0x38,0x45,0x22,0x2c,0xa,0x22,0x40,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x33,0x42,0x45,0x38,0x30,0x22,0x2c,0xa,0x22,0x23,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x30,0x42,0x43,0x39,0x35,0x22,0x2c,0xa,0x22,0x24,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x36,0x42,0x46,0x41,0x36,0x22,0x2c,0xa,0x22,0x25,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x35,0x43,0x32,0x39,0x44,0x22,0x2c,0xa,0x22,0x26,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x32,0x43,0x32,0x38,0x33,0x22,0x2c,0xa,0x22,0x2a,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x41,0x43,0x37,0x38,0x39,0x22,0x2c,0xa,0x22,0x3d,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x42,0x43,0x41,0x38,0x42,0x22,0x2c,0xa,0x22,0x2d,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x35,0x43,0x34,0x38,0x39,0x22,0x2c,0xa,0x22,0x3b,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x42,0x43,0x44,0x39,0x34,0x22,0x2c,0xa,0x22,0x3a,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x36,0x43,0x36,0x39,0x39,0x22,0x2c,0xa,0x22,0x3e,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x46,0x43,0x38,0x42,0x31,0x22,0x2c,0xa,0x22,0x2c,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x38,0x43,0x36,0x42,0x37,0x22,0x2c,0xa,0x22,0x3c,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x31,0x43,0x39,0x41,0x36,0x22,0x2c,0xa,0x22,0x31,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x42,0x44,0x33,0x42,0x41,0x22,0x2c,0xa,0x22,0x32,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x31,0x43,0x39,0x38,0x31,0x22,0x2c,0xa,0x22,0x33,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x30,0x43,0x44,0x39,0x31,0x22,0x2c,0xa,0x22,0x34,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x43,0x44,0x36,0x38,0x36,0x22,0x2c,0xa,0x22,0x35,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x42,0x44,0x36,0x39,0x45,0x22,0x2c,0xa,0x22,0x36,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x44,0x36,0x38,0x32,0x22,0x2c,0xa,0x22,0x37,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x44,0x38,0x38,0x42,0x22,0x2c,0xa,0x22,0x38,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x44,0x43,0x39,0x35,0x22,0x2c,0xa,0x22,0x39,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x33,0x43,0x45,0x41,0x33,0x22,0x2c,0xa,0x22,0x30,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x45,0x44,0x39,0x41,0x39,0x22,0x2c,0xa,0x22,0x71,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x37,0x44,0x43,0x42,0x39,0x22,0x2c,0xa,0x22,0x77,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x34,0x44,0x44,0x41,0x46,0x22,0x2c,0xa,0x22,0x65,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x36,0x38,0x41,0x22,0x2c,0xa,0x22,0x72,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x38,0x39,0x33,0x22,0x2c,0xa,0x22,0x74,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x41,0x39,0x46,0x22,0x2c,0xa,0x22,0x79,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x32,0x41,0x35,0x22,0x2c,0xa,0x22,0x75,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x33,0x41,0x43,0x22,0x2c,0xa,0x22,0x69,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x43,0x41,0x37,0x22,0x2c,0xa,0x22,0x70,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x44,0x41,0x45,0x22,0x2c,0xa,0x22,0x61,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x31,0x45,0x30,0x42,0x36,0x22,0x2c,0xa,0x22,0x73,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x44,0x45,0x35,0x42,0x34,0x22,0x2c,0xa,0x22,0x64,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x45,0x42,0x34,0x22,0x2c,0xa,0x22,0x66,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x38,0x45,0x35,0x42,0x42,0x22,0x2c,0xa,0x22,0x67,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x30,0x42,0x43,0x22,0x2c,0xa,0x22,0x68,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x35,0x43,0x37,0x43,0x38,0x22,0x2c,0xa,0x22,0x6a,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x37,0x43,0x38,0x43,0x41,0x22,0x2c,0xa,0x22,0x6b,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x43,0x43,0x45,0x43,0x46,0x22,0x2c,0xa,0x22,0x6c,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x43,0x43,0x41,0x43,0x30,0x22,0x2c,0xa,0x22,0x7a,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x44,0x43,0x45,0x44,0x30,0x22,0x2c,0xa,0x22,0x78,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x31,0x44,0x31,0x43,0x46,0x22,0x2c,0xa,0x22,0x63,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x31,0x44,0x33,0x44,0x34,0x22,0x2c,0xa,0x22,0x76,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x36,0x44,0x38,0x44,0x41,0x22,0x2c,0xa,0x22,0x62,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x41,0x44,0x43,0x44,0x45,0x22,0x2c,0xa,0x22,0x6e,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x43,0x44,0x45,0x45,0x30,0x22,0x2c,0xa,0x22,0x6d,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x45,0x45,0x30,0x45,0x32,0x22,0x2c,0xa,0x22,0x4d,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x37,0x44,0x45,0x43,0x32,0x22,0x2c,0xa,0x22,0x4e,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x42,0x45,0x31,0x43,0x35,0x22,0x2c,0xa,0x22,0x42,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x34,0x45,0x39,0x43,0x33,0x22,0x2c,0xa,0x22,0x56,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x37,0x45,0x41,0x43,0x45,0x22,0x2c,0xa,0x22,0x43,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x45,0x41,0x43,0x33,0x22,0x2c,0xa,0x22,0x5a,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x41,0x45,0x42,0x43,0x41,0x22,0x2c,0xa,0x22,0x41,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x31,0x43,0x31,0x22,0x2c,0xa,0x22,0x53,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x33,0x43,0x43,0x22,0x2c,0xa,0x22,0x44,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x36,0x44,0x41,0x22,0x2c,0xa,0x22,0x46,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x31,0x45,0x33,0x45,0x35,0x22,0x2c,0xa,0x22,0x47,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x34,0x45,0x36,0x45,0x38,0x22,0x2c,0xa,0x22,0x48,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x37,0x45,0x39,0x45,0x41,0x22,0x2c,0xa,0x22,0x4a,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x38,0x45,0x36,0x45,0x30,0x22,0x2c,0xa,0x22,0x4b,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x39,0x45,0x41,0x45,0x43,0x22,0x2c,0xa,0x22,0x4c,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x43,0x45,0x45,0x46,0x30,0x22,0x2c,0xa,0x22,0x50,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x45,0x46,0x30,0x46,0x32,0x22,0x2c,0xa,0x22,0x49,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x38,0x46,0x34,0x45,0x38,0x22,0x2c,0xa,0x22,0x55,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x31,0x46,0x33,0x46,0x35,0x22,0x2c,0xa,0x22,0x59,0x58,0x20,
+ 0x63,0x20,0x4e,0x6f,0x6e,0x65,0x22,0x2c,0xa,0x2f,0x2a,0x20,0x70,0x69,0x78,0x65,
+ 0x6c,0x73,0x20,0x2a,0x2f,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x20,0x20,0x56,
+ 0x20,0x45,0x20,0x3c,0x2e,0x2c,0x2e,0x54,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x3c,
+ 0x20,0x45,0x20,0x32,0x2e,0x61,0x58,0x43,0x58,0x56,0x58,0x45,0x20,0x33,0x20,0x45,
+ 0x20,0x3c,0x2e,0x45,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x20,
+ 0x20,0x52,0x20,0x2c,0x2e,0x35,0x58,0x43,0x58,0x38,0x58,0x51,0x2e,0x77,0x58,0x3c,
+ 0x2e,0x31,0x2e,0x24,0x2e,0x4f,0x58,0x3c,0x2e,0x20,0x20,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x20,
+ 0x20,0x52,0x20,0x3e,0x2e,0x4c,0x2e,0x5a,0x58,0x79,0x58,0x54,0x2e,0x4b,0x2e,0x45,
+ 0x2e,0x77,0x58,0x20,0x2e,0x2e,0x58,0x4b,0x58,0x4b,0x58,0x52,0x20,0x20,0x20,0x59,
+ 0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x20,
+ 0x20,0x56,0x20,0x45,0x20,0x34,0x2e,0x5a,0x58,0x73,0x58,0x57,0x2e,0x4b,0x2e,0x49,
+ 0x2e,0x5a,0x2e,0x4f,0x2e,0x7b,0x2e,0x4b,0x58,0x55,0x58,0x55,0x58,0x4d,0x58,0x6b,
+ 0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x20,0x20,0x52,0x20,0x45,0x20,0x37,0x20,0x59,
+ 0x58,0x3c,0x20,0x45,0x20,0x32,0x2e,0x61,0x58,0x73,0x58,0x36,0x58,0x43,0x2e,0x54,
+ 0x2e,0x5a,0x2e,0x77,0x2e,0x5b,0x20,0x78,0x58,0x55,0x58,0x55,0x58,0x55,0x58,0x55,
+ 0x58,0x32,0x58,0x33,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x20,0x20,0x52,0x20,0x3e,0x2e,0x29,0x2e,0x35,
+ 0x58,0x2c,0x2e,0x54,0x20,0x2c,0x2e,0x35,0x58,0x43,0x58,0x38,0x58,0x4b,0x2e,0x54,
+ 0x2e,0x41,0x2e,0x61,0x2e,0x5d,0x20,0x4f,0x58,0x55,0x58,0x55,0x58,0x55,0x58,0x55,
+ 0x58,0x55,0x58,0x55,0x58,0x32,0x2e,0x4f,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x20,0x20,0x59,0x20,0x45,0x20,0x5a,0x2e,0x5a,
+ 0x58,0x73,0x58,0x37,0x58,0x73,0x58,0x30,0x58,0x43,0x58,0x79,0x58,0x52,0x2e,0x4b,
+ 0x2e,0x49,0x2e,0x56,0x2e,0x5f,0x20,0x2e,0x58,0x55,0x58,0x55,0x58,0x55,0x58,0x55,
+ 0x58,0x55,0x58,0x4c,0x58,0x4b,0x58,0x4a,0x58,0x56,0x20,0x44,0x20,0x4e,0x20,0x53,
+ 0x20,0x37,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x7a,0x20,0x45,0x20,0x34,0x2e,0x66,
+ 0x58,0x73,0x58,0x2f,0x2e,0x4b,0x2e,0x7e,0x2e,0x2f,0x2e,0x36,0x58,0x7e,0x2e,0x49,
+ 0x2e,0x49,0x2e,0x43,0x2e,0x2e,0x2e,0x27,0x2e,0x4b,0x58,0x55,0x58,0x50,0x58,0x50,
+ 0x58,0x50,0x58,0x4c,0x58,0x4b,0x58,0x47,0x58,0x62,0x58,0x6c,0x2e,0x4e,0x20,0x6d,
+ 0x2e,0x53,0x58,0x6d,0x2e,0x44,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x45,0x20,0x30,
+ 0x58,0x67,0x58,0x37,0x58,0x45,0x2e,0x57,0x2e,0x57,0x2e,0x7e,0x2e,0x7e,0x2e,0x52,
+ 0x2e,0x49,0x2e,0x5a,0x2e,0x77,0x2e,0x27,0x20,0x62,0x58,0x55,0x58,0x55,0x58,0x55,
+ 0x58,0x50,0x58,0x50,0x58,0x4c,0x58,0x6d,0x58,0x62,0x58,0x24,0x58,0x29,0x20,0x7e,
+ 0x20,0x61,0x58,0x53,0x58,0x70,0x58,0x42,0x58,0x6e,0x20,0x22,0x2c,0xa,0x22,0x20,
+ 0x20,0x3c,0x2e,0x43,0x58,0x54,0x2e,0x51,0x2e,0x7e,0x2e,0x57,0x2e,0x57,0x2e,0x52,
+ 0x2e,0x49,0x2e,0x41,0x2e,0x74,0x2e,0x5f,0x20,0x68,0x58,0x55,0x58,0x55,0x58,0x55,
+ 0x58,0x55,0x58,0x50,0x58,0x4c,0x58,0x47,0x58,0x6e,0x58,0x2c,0x58,0x20,0x2e,0x74,
+ 0x20,0x20,0x58,0x41,0x58,0x53,0x58,0x65,0x58,0x34,0x58,0x6c,0x2e,0x5a,0x20,0x22,
+ 0x2c,0xa,0x22,0x20,0x20,0x3c,0x2e,0x73,0x58,0x42,0x2e,0x57,0x2e,0x57,0x2e,0x57,
+ 0x2e,0x54,0x2e,0x41,0x2e,0x67,0x2e,0x5f,0x20,0x6f,0x58,0x55,0x58,0x55,0x58,0x55,
+ 0x58,0x55,0x58,0x55,0x58,0x4c,0x58,0x4c,0x58,0x6d,0x58,0x63,0x58,0x3d,0x2e,0x35,
+ 0x20,0x24,0x2e,0x42,0x58,0x67,0x58,0x65,0x58,0x21,0x2e,0x44,0x2e,0x33,0x58,0x6d,
+ 0x20,0x2b,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x3c,0x2e,0x73,0x58,0x42,0x2e,0x52,
+ 0x2e,0x52,0x2e,0x41,0x2e,0x56,0x2e,0x7c,0x20,0x7b,0x2e,0x4b,0x58,0x55,0x58,0x55,
+ 0x58,0x55,0x58,0x55,0x58,0x4c,0x58,0x4b,0x58,0x47,0x58,0x76,0x58,0x7c,0x2e,0x63,
+ 0x20,0x75,0x20,0x71,0x58,0x64,0x58,0x67,0x58,0x5e,0x2e,0x55,0x2e,0x66,0x2e,0x33,
+ 0x58,0x48,0x20,0x66,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x3c,0x2e,0x73,
+ 0x58,0x42,0x2e,0x54,0x2e,0x5a,0x2e,0x6d,0x2e,0x5b,0x20,0x6e,0x58,0x55,0x58,0x55,
+ 0x58,0x55,0x58,0x55,0x58,0x50,0x58,0x4b,0x58,0x48,0x58,0x62,0x58,0x2c,0x58,0x29,
+ 0x20,0x65,0x20,0x3c,0x58,0x64,0x58,0x69,0x58,0x5f,0x2e,0x53,0x2e,0x75,0x2e,0x50,
+ 0x2e,0x46,0x2e,0x74,0x2e,0x68,0x20,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,
+ 0x20,0x3c,0x2e,0x73,0x58,0x6b,0x2e,0x5a,0x2e,0x72,0x2e,0x4b,0x20,0x6a,0x58,0x55,
+ 0x58,0x55,0x58,0x55,0x58,0x50,0x58,0x4c,0x58,0x4b,0x58,0x6d,0x58,0x63,0x58,0x40,
+ 0x2e,0x35,0x20,0x25,0x2e,0x44,0x58,0x69,0x58,0x5f,0x2e,0x59,0x2e,0x53,0x2e,0x64,
+ 0x2e,0x68,0x2e,0x44,0x2e,0x2a,0x58,0x6c,0x20,0x58,0x20,0x20,0x20,0x20,0x20,0x22,
+ 0x2c,0xa,0x22,0x20,0x20,0x3c,0x2e,0x77,0x58,0x71,0x2e,0x72,0x2e,0x58,0x2e,0x72,
+ 0x20,0x55,0x58,0x55,0x58,0x50,0x58,0x50,0x58,0x4b,0x58,0x6d,0x58,0x76,0x58,0x7c,
+ 0x2e,0x79,0x20,0x5f,0x20,0x4e,0x58,0x64,0x58,0x72,0x58,0x21,0x2e,0x53,0x2e,0x64,
+ 0x2e,0x68,0x2e,0x64,0x2e,0x66,0x2e,0x3d,0x58,0x46,0x20,0x34,0x20,0x20,0x20,0x20,
+ 0x20,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,0x20,0x2c,0x2e,0x30,0x58,0x35,0x2e,0x58,
+ 0x2e,0x29,0x20,0x61,0x20,0x50,0x58,0x50,0x58,0x4b,0x58,0x47,0x58,0x6e,0x58,0x3e,
+ 0x58,0x29,0x20,0x79,0x20,0x3e,0x58,0x41,0x58,0x41,0x58,0x5f,0x2e,0x53,0x2e,0x68,
+ 0x2e,0x68,0x2e,0x75,0x2e,0x73,0x2e,0x64,0x2e,0x46,0x2e,0x36,0x2e,0x67,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,0x20,0x3e,0x2e,0x39,
+ 0x58,0x7e,0x20,0x7d,0x20,0x75,0x20,0x27,0x2e,0x4c,0x58,0x4b,0x58,0x6d,0x58,0x78,
+ 0x58,0x20,0x2e,0x35,0x20,0x5b,0x2e,0x49,0x58,0x41,0x58,0x5f,0x2e,0x21,0x2e,0x53,
+ 0x2e,0x68,0x2e,0x68,0x2e,0x64,0x2e,0x38,0x2e,0x73,0x2e,0x44,0x2e,0x6e,0x2e,0x6a,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,
+ 0x20,0x3e,0x2e,0x3a,0x58,0x57,0x20,0x76,0x20,0x26,0x20,0x6b,0x58,0x6d,0x58,0x76,
+ 0x58,0x3b,0x2e,0x74,0x20,0x5d,0x20,0x42,0x58,0x41,0x58,0x72,0x58,0x21,0x2e,0x55,
+ 0x2e,0x75,0x2e,0x53,0x2e,0x39,0x2e,0x75,0x2e,0x33,0x2e,0x37,0x2e,0x69,0x2e,0x3b,
+ 0x58,0x4d,0x20,0x31,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x20,0x20,0x45,0x20,0x23,0x58,0x62,0x20,0x75,0x20,0x3a,0x20,0x6e,
+ 0x58,0x63,0x58,0x5f,0x20,0x75,0x20,0x31,0x58,0x53,0x58,0x67,0x58,0x5e,0x2e,0x55,
+ 0x2e,0x48,0x2e,0x53,0x2e,0x64,0x2e,0x38,0x2e,0x73,0x2e,0x64,0x2e,0x75,0x2e,0x62,
+ 0x2e,0x2d,0x58,0x47,0x20,0x67,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,0x20,0x52,0x20,0x2b,0x58,0x63,0x20,0x72,
+ 0x20,0x61,0x20,0x7a,0x58,0x5b,0x2e,0x3d,0x20,0x2d,0x58,0x64,0x58,0x5f,0x2e,0x55,
+ 0x2e,0x64,0x2e,0x50,0x2e,0x68,0x2e,0x64,0x2e,0x75,0x2e,0x33,0x2e,0x38,0x2e,0x4e,
+ 0x2e,0x3d,0x58,0x77,0x2e,0x6c,0x20,0x31,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,0x20,0x54,0x20,0x7d,
+ 0x2e,0x78,0x20,0x3e,0x20,0x60,0x2e,0x6f,0x58,0x3e,0x20,0x25,0x2e,0x2a,0x2e,0x53,
+ 0x2e,0x53,0x2e,0x68,0x2e,0x53,0x2e,0x37,0x2e,0x64,0x2e,0x68,0x2e,0x30,0x2e,0x70,
+ 0x2e,0x6e,0x2e,0x63,0x2e,0x4d,0x20,0x64,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,
+ 0x20,0x43,0x20,0x5d,0x2e,0x77,0x20,0x40,0x20,0x58,0x58,0x75,0x20,0x70,0x20,0x2a,
+ 0x2e,0x28,0x20,0x68,0x2e,0x53,0x2e,0x73,0x2e,0x75,0x2e,0x75,0x2e,0x75,0x2e,0x70,
+ 0x2e,0x4e,0x2e,0x2a,0x58,0x5e,0x20,0x67,0x20,0x2b,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x20,0x20,0x5a,0x20,0x26,0x2e,0x65,0x20,0x3b,0x20,0x60,0x20,0x2a,
+ 0x20,0x3a,0x2e,0x6f,0x2e,0x53,0x2e,0x53,0x2e,0x53,0x2e,0x75,0x2e,0x28,0x20,0x39,
+ 0x2e,0x78,0x2e,0x26,0x58,0x58,0x2e,0x6a,0x20,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,0x20,0x42,0x20,0x7b,0x20,0x30,0x20,0x69,
+ 0x20,0x25,0x20,0x5b,0x2e,0x6f,0x2e,0x75,0x2e,0x53,0x2e,0x64,0x2e,0x68,0x2e,0x39,
+ 0x2e,0x4d,0x2e,0x26,0x58,0x7a,0x2e,0x4d,0x20,0x36,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,0x20,0x7a,0x20,0x7b,
+ 0x20,0x30,0x20,0x2d,0x20,0x4a,0x20,0x2a,0x2e,0x2f,0x20,0x53,0x2e,0x39,0x2e,0x64,
+ 0x2e,0x69,0x2e,0x47,0x2e,0x26,0x58,0x46,0x20,0x67,0x20,0x4f,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,
+ 0x20,0x7a,0x20,0x24,0x2e,0x32,0x20,0x77,0x20,0x3d,0x2e,0x21,0x20,0x73,0x2e,0x64,
+ 0x2e,0x70,0x2e,0x4e,0x2e,0x3b,0x58,0x5e,0x20,0x6c,0x20,0x2c,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x20,0x20,0x42,0x20,0x26,0x2e,0x39,0x20,0x3b,0x2e,0x51,0x20,0x2f,
+ 0x20,0x6a,0x2e,0x78,0x2e,0x40,0x58,0x6c,0x2e,0x6d,0x20,0x36,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,0x20,0x68,0x20,0x57,0x20,0x40,0x2e,0x2b,
+ 0x2e,0x49,0x20,0x79,0x2e,0x26,0x58,0x62,0x2e,0x46,0x20,0x37,0x20,0x4f,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,0x20,0x24,0x20,0x73,
+ 0x20,0x25,0x58,0x55,0x20,0x46,0x2e,0x3d,0x58,0x5e,0x20,0x6a,0x20,0x23,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x20,
+ 0x20,0x20,0x20,0x67,0x20,0x4f,0x2e,0x3c,0x58,0x65,0x2e,0x6c,0x20,0x31,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x20,0x20,0x20,0x20,0x6f,0x20,0x66,0x20,0x6e,0x20,0x64,0x20,0x2e,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x22,0xa,0x7d,0x3b,0xa,
+ # /home/rdale/src/kde/branches/KDE/3.5/kdevelop/languages/ruby/app_templates/qtruby4makeapp/filesave.xpm
+ 0x0,0x0,0x18,0xf9,
+ 0x2f,
+ 0x2a,0x20,0x58,0x50,0x4d,0x20,0x2a,0x2f,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,
+ 0x63,0x68,0x61,0x72,0x20,0x2a,0x66,0x69,0x6c,0x65,0x73,0x61,0x76,0x65,0x5b,0x5d,
+ 0x20,0x3d,0x20,0x7b,0xa,0x2f,0x2a,0x20,0x63,0x6f,0x6c,0x75,0x6d,0x6e,0x73,0x20,
+ 0x72,0x6f,0x77,0x73,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x73,0x20,0x63,0x68,0x61,0x72,
+ 0x73,0x2d,0x70,0x65,0x72,0x2d,0x70,0x69,0x78,0x65,0x6c,0x20,0x2a,0x2f,0xa,0x22,
+ 0x33,0x32,0x20,0x33,0x32,0x20,0x32,0x35,0x37,0x20,0x32,0x22,0x2c,0xa,0x22,0x20,
+ 0x20,0x20,0x63,0x20,0x23,0x30,0x30,0x30,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x2e,
+ 0x20,0x20,0x63,0x20,0x23,0x30,0x36,0x30,0x36,0x30,0x41,0x22,0x2c,0xa,0x22,0x58,
+ 0x20,0x20,0x63,0x20,0x23,0x30,0x39,0x30,0x39,0x30,0x44,0x22,0x2c,0xa,0x22,0x6f,
+ 0x20,0x20,0x63,0x20,0x23,0x30,0x42,0x30,0x42,0x31,0x36,0x22,0x2c,0xa,0x22,0x4f,
+ 0x20,0x20,0x63,0x20,0x23,0x31,0x30,0x31,0x30,0x32,0x32,0x22,0x2c,0xa,0x22,0x2b,
+ 0x20,0x20,0x63,0x20,0x23,0x31,0x45,0x31,0x45,0x32,0x38,0x22,0x2c,0xa,0x22,0x40,
+ 0x20,0x20,0x63,0x20,0x23,0x31,0x38,0x31,0x38,0x32,0x39,0x22,0x2c,0xa,0x22,0x23,
+ 0x20,0x20,0x63,0x20,0x23,0x31,0x35,0x31,0x46,0x33,0x41,0x22,0x2c,0xa,0x22,0x24,
+ 0x20,0x20,0x63,0x20,0x23,0x31,0x41,0x32,0x36,0x33,0x46,0x22,0x2c,0xa,0x22,0x25,
+ 0x20,0x20,0x63,0x20,0x23,0x31,0x44,0x32,0x41,0x33,0x46,0x22,0x2c,0xa,0x22,0x26,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x37,0x32,0x37,0x33,0x30,0x22,0x2c,0xa,0x22,0x2a,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x45,0x32,0x45,0x33,0x46,0x22,0x2c,0xa,0x22,0x3d,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x31,0x32,0x31,0x34,0x30,0x22,0x2c,0xa,0x22,0x2d,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x31,0x32,0x45,0x34,0x31,0x22,0x2c,0xa,0x22,0x3b,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x46,0x32,0x46,0x34,0x31,0x22,0x2c,0xa,0x22,0x3a,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x39,0x32,0x41,0x34,0x41,0x22,0x2c,0xa,0x22,0x3e,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x33,0x32,0x32,0x34,0x42,0x22,0x2c,0xa,0x22,0x2c,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x36,0x32,0x33,0x35,0x33,0x22,0x2c,0xa,0x22,0x3c,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x39,0x32,0x36,0x35,0x35,0x22,0x2c,0xa,0x22,0x31,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x42,0x32,0x43,0x35,0x34,0x22,0x2c,0xa,0x22,0x32,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x43,0x32,0x43,0x35,0x42,0x22,0x2c,0xa,0x22,0x33,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x39,0x33,0x37,0x34,0x36,0x22,0x2c,0xa,0x22,0x34,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x44,0x33,0x30,0x34,0x46,0x22,0x2c,0xa,0x22,0x35,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x34,0x33,0x32,0x34,0x33,0x22,0x2c,0xa,0x22,0x36,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x45,0x33,0x31,0x35,0x44,0x22,0x2c,0xa,0x22,0x37,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x36,0x33,0x36,0x34,0x37,0x22,0x2c,0xa,0x22,0x38,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x30,0x33,0x45,0x34,0x41,0x22,0x2c,0xa,0x22,0x39,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x30,0x33,0x32,0x35,0x45,0x22,0x2c,0xa,0x22,0x30,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x43,0x33,0x43,0x35,0x33,0x22,0x2c,0xa,0x22,0x71,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x45,0x32,0x45,0x36,0x30,0x22,0x2c,0xa,0x22,0x77,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x46,0x33,0x31,0x36,0x30,0x22,0x2c,0xa,0x22,0x65,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x30,0x32,0x45,0x36,0x33,0x22,0x2c,0xa,0x22,0x72,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x31,0x33,0x31,0x36,0x34,0x22,0x2c,0xa,0x22,0x74,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x36,0x33,0x38,0x36,0x31,0x22,0x2c,0xa,0x22,0x79,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x35,0x33,0x38,0x36,0x38,0x22,0x2c,0xa,0x22,0x75,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x38,0x34,0x36,0x35,0x30,0x22,0x2c,0xa,0x22,0x69,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x38,0x34,0x46,0x36,0x42,0x22,0x2c,0xa,0x22,0x70,
+ 0x20,0x20,0x63,0x20,0x23,0x32,0x44,0x35,0x34,0x37,0x42,0x22,0x2c,0xa,0x22,0x61,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x42,0x34,0x38,0x36,0x41,0x22,0x2c,0xa,0x22,0x73,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x36,0x35,0x39,0x37,0x44,0x22,0x2c,0xa,0x22,0x64,
+ 0x20,0x20,0x63,0x20,0x23,0x33,0x44,0x35,0x44,0x37,0x43,0x22,0x2c,0xa,0x22,0x66,
+ 0x20,0x20,0x63,0x20,0x23,0x34,0x43,0x34,0x43,0x34,0x43,0x22,0x2c,0xa,0x22,0x67,
+ 0x20,0x20,0x63,0x20,0x23,0x34,0x30,0x34,0x30,0x35,0x41,0x22,0x2c,0xa,0x22,0x68,
+ 0x20,0x20,0x63,0x20,0x23,0x34,0x31,0x34,0x45,0x35,0x36,0x22,0x2c,0xa,0x22,0x6a,
+ 0x20,0x20,0x63,0x20,0x23,0x34,0x42,0x35,0x38,0x35,0x45,0x22,0x2c,0xa,0x22,0x6b,
+ 0x20,0x20,0x63,0x20,0x23,0x34,0x39,0x35,0x34,0x35,0x45,0x22,0x2c,0xa,0x22,0x6c,
+ 0x20,0x20,0x63,0x20,0x23,0x35,0x35,0x35,0x35,0x35,0x35,0x22,0x2c,0xa,0x22,0x7a,
+ 0x20,0x20,0x63,0x20,0x23,0x34,0x44,0x34,0x44,0x36,0x42,0x22,0x2c,0xa,0x22,0x78,
+ 0x20,0x20,0x63,0x20,0x23,0x34,0x33,0x34,0x36,0x37,0x35,0x22,0x2c,0xa,0x22,0x63,
+ 0x20,0x20,0x63,0x20,0x23,0x34,0x42,0x35,0x36,0x36,0x30,0x22,0x2c,0xa,0x22,0x76,
+ 0x20,0x20,0x63,0x20,0x23,0x34,0x46,0x35,0x39,0x36,0x32,0x22,0x2c,0xa,0x22,0x62,
+ 0x20,0x20,0x63,0x20,0x23,0x34,0x31,0x35,0x31,0x37,0x45,0x22,0x2c,0xa,0x22,0x6e,
+ 0x20,0x20,0x63,0x20,0x23,0x34,0x42,0x35,0x30,0x37,0x44,0x22,0x2c,0xa,0x22,0x6d,
+ 0x20,0x20,0x63,0x20,0x23,0x35,0x31,0x35,0x43,0x36,0x37,0x22,0x2c,0xa,0x22,0x4d,
+ 0x20,0x20,0x63,0x20,0x23,0x35,0x30,0x35,0x44,0x36,0x45,0x22,0x2c,0xa,0x22,0x4e,
+ 0x20,0x20,0x63,0x20,0x23,0x35,0x43,0x35,0x44,0x37,0x44,0x22,0x2c,0xa,0x22,0x42,
+ 0x20,0x20,0x63,0x20,0x23,0x35,0x34,0x36,0x30,0x36,0x36,0x22,0x2c,0xa,0x22,0x56,
+ 0x20,0x20,0x63,0x20,0x23,0x35,0x34,0x36,0x32,0x36,0x44,0x22,0x2c,0xa,0x22,0x43,
+ 0x20,0x20,0x63,0x20,0x23,0x35,0x42,0x36,0x34,0x36,0x44,0x22,0x2c,0xa,0x22,0x5a,
+ 0x20,0x20,0x63,0x20,0x23,0x35,0x35,0x36,0x37,0x37,0x41,0x22,0x2c,0xa,0x22,0x41,
+ 0x20,0x20,0x63,0x20,0x23,0x35,0x35,0x36,0x42,0x37,0x38,0x22,0x2c,0xa,0x22,0x53,
+ 0x20,0x20,0x63,0x20,0x23,0x35,0x44,0x36,0x37,0x37,0x32,0x22,0x2c,0xa,0x22,0x44,
+ 0x20,0x20,0x63,0x20,0x23,0x36,0x42,0x36,0x42,0x36,0x42,0x22,0x2c,0xa,0x22,0x46,
+ 0x20,0x20,0x63,0x20,0x23,0x36,0x34,0x36,0x34,0x36,0x34,0x22,0x2c,0xa,0x22,0x47,
+ 0x20,0x20,0x63,0x20,0x23,0x36,0x31,0x36,0x43,0x37,0x33,0x22,0x2c,0xa,0x22,0x48,
+ 0x20,0x20,0x63,0x20,0x23,0x36,0x33,0x37,0x30,0x37,0x44,0x22,0x2c,0xa,0x22,0x4a,
+ 0x20,0x20,0x63,0x20,0x23,0x36,0x42,0x37,0x36,0x37,0x39,0x22,0x2c,0xa,0x22,0x4b,
+ 0x20,0x20,0x63,0x20,0x67,0x72,0x61,0x79,0x34,0x35,0x22,0x2c,0xa,0x22,0x4c,0x20,
+ 0x20,0x63,0x20,0x23,0x30,0x30,0x34,0x31,0x38,0x45,0x22,0x2c,0xa,0x22,0x50,0x20,
+ 0x20,0x63,0x20,0x23,0x30,0x30,0x34,0x34,0x39,0x34,0x22,0x2c,0xa,0x22,0x49,0x20,
+ 0x20,0x63,0x20,0x23,0x30,0x30,0x34,0x38,0x39,0x34,0x22,0x2c,0xa,0x22,0x55,0x20,
+ 0x20,0x63,0x20,0x23,0x30,0x34,0x34,0x46,0x39,0x38,0x22,0x2c,0xa,0x22,0x59,0x20,
+ 0x20,0x63,0x20,0x23,0x30,0x33,0x35,0x30,0x39,0x42,0x22,0x2c,0xa,0x22,0x54,0x20,
+ 0x20,0x63,0x20,0x23,0x30,0x41,0x35,0x31,0x39,0x38,0x22,0x2c,0xa,0x22,0x52,0x20,
+ 0x20,0x63,0x20,0x23,0x31,0x33,0x35,0x37,0x39,0x43,0x22,0x2c,0xa,0x22,0x45,0x20,
+ 0x20,0x63,0x20,0x23,0x31,0x38,0x35,0x44,0x41,0x31,0x22,0x2c,0xa,0x22,0x57,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x38,0x35,0x38,0x38,0x38,0x22,0x2c,0xa,0x22,0x51,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x42,0x36,0x30,0x39,0x34,0x22,0x2c,0xa,0x22,0x21,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x39,0x36,0x44,0x39,0x41,0x22,0x2c,0xa,0x22,0x7e,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x33,0x36,0x41,0x39,0x36,0x22,0x2c,0xa,0x22,0x5e,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x44,0x37,0x31,0x39,0x42,0x22,0x2c,0xa,0x22,0x2f,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x32,0x36,0x45,0x42,0x38,0x22,0x2c,0xa,0x22,0x28,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x32,0x36,0x45,0x41,0x38,0x22,0x2c,0xa,0x22,0x29,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x32,0x36,0x42,0x41,0x33,0x22,0x2c,0xa,0x22,0x5f,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x36,0x37,0x33,0x41,0x45,0x22,0x2c,0xa,0x22,0x60,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x41,0x37,0x36,0x42,0x34,0x22,0x2c,0xa,0x22,0x27,0x20,
+ 0x20,0x63,0x20,0x23,0x30,0x42,0x36,0x46,0x44,0x31,0x22,0x2c,0xa,0x22,0x5d,0x20,
+ 0x20,0x63,0x20,0x23,0x30,0x46,0x37,0x35,0x44,0x38,0x22,0x2c,0xa,0x22,0x5b,0x20,
+ 0x20,0x63,0x20,0x23,0x31,0x34,0x37,0x39,0x44,0x41,0x22,0x2c,0xa,0x22,0x7b,0x20,
+ 0x20,0x63,0x20,0x23,0x31,0x42,0x37,0x43,0x44,0x43,0x22,0x2c,0xa,0x22,0x7d,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x36,0x36,0x34,0x38,0x31,0x22,0x2c,0xa,0x22,0x7c,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x32,0x37,0x34,0x39,0x43,0x22,0x2c,0xa,0x22,0x20,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x41,0x37,0x39,0x39,0x45,0x22,0x2c,0xa,0x22,0x2e,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x30,0x36,0x41,0x38,0x34,0x22,0x2c,0xa,0x22,0x58,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x46,0x36,0x37,0x38,0x44,0x22,0x2c,0xa,0x22,0x6f,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x37,0x36,0x33,0x39,0x31,0x22,0x2c,0xa,0x22,0x4f,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x41,0x36,0x35,0x39,0x32,0x22,0x2c,0xa,0x22,0x2b,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x46,0x36,0x38,0x39,0x33,0x22,0x2c,0xa,0x22,0x40,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x42,0x37,0x33,0x38,0x42,0x22,0x2c,0xa,0x22,0x23,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x30,0x37,0x44,0x41,0x31,0x22,0x2c,0xa,0x22,0x24,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x32,0x36,0x32,0x38,0x33,0x22,0x2c,0xa,0x22,0x25,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x33,0x36,0x41,0x39,0x34,0x22,0x2c,0xa,0x22,0x26,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x35,0x36,0x46,0x39,0x38,0x22,0x2c,0xa,0x22,0x2a,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x35,0x37,0x41,0x38,0x46,0x22,0x2c,0xa,0x22,0x3d,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x42,0x37,0x32,0x39,0x39,0x22,0x2c,0xa,0x22,0x2d,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x31,0x37,0x31,0x39,0x31,0x22,0x2c,0xa,0x22,0x3b,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x39,0x37,0x39,0x39,0x38,0x22,0x2c,0xa,0x22,0x3a,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x38,0x37,0x42,0x41,0x36,0x22,0x2c,0xa,0x22,0x3e,0x2e,
+ 0x20,0x63,0x20,0x23,0x32,0x32,0x38,0x31,0x44,0x43,0x22,0x2c,0xa,0x22,0x2c,0x2e,
+ 0x20,0x63,0x20,0x23,0x33,0x46,0x38,0x31,0x43,0x30,0x22,0x2c,0xa,0x22,0x3c,0x2e,
+ 0x20,0x63,0x20,0x23,0x33,0x39,0x38,0x38,0x44,0x37,0x22,0x2c,0xa,0x22,0x31,0x2e,
+ 0x20,0x63,0x20,0x23,0x32,0x37,0x38,0x35,0x45,0x31,0x22,0x2c,0xa,0x22,0x32,0x2e,
+ 0x20,0x63,0x20,0x23,0x32,0x45,0x38,0x41,0x45,0x33,0x22,0x2c,0xa,0x22,0x33,0x2e,
+ 0x20,0x63,0x20,0x23,0x33,0x36,0x38,0x46,0x45,0x35,0x22,0x2c,0xa,0x22,0x34,0x2e,
+ 0x20,0x63,0x20,0x23,0x33,0x36,0x39,0x30,0x45,0x36,0x22,0x2c,0xa,0x22,0x35,0x2e,
+ 0x20,0x63,0x20,0x23,0x33,0x44,0x39,0x33,0x45,0x37,0x22,0x2c,0xa,0x22,0x36,0x2e,
+ 0x20,0x63,0x20,0x23,0x33,0x44,0x39,0x34,0x45,0x39,0x22,0x2c,0xa,0x22,0x37,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x37,0x38,0x33,0x39,0x45,0x22,0x2c,0xa,0x22,0x38,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x37,0x38,0x37,0x42,0x43,0x22,0x2c,0xa,0x22,0x39,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x34,0x38,0x30,0x41,0x31,0x22,0x2c,0xa,0x22,0x30,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x42,0x38,0x34,0x41,0x33,0x22,0x2c,0xa,0x22,0x71,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x45,0x38,0x34,0x39,0x36,0x22,0x2c,0xa,0x22,0x77,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x45,0x38,0x42,0x39,0x41,0x22,0x2c,0xa,0x22,0x65,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x44,0x38,0x34,0x38,0x45,0x22,0x2c,0xa,0x22,0x72,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x32,0x38,0x35,0x39,0x37,0x22,0x2c,0xa,0x22,0x74,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x33,0x38,0x35,0x39,0x38,0x22,0x2c,0xa,0x22,0x79,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x36,0x38,0x38,0x39,0x39,0x22,0x2c,0xa,0x22,0x75,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x42,0x38,0x42,0x39,0x42,0x22,0x2c,0xa,0x22,0x69,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x34,0x38,0x39,0x41,0x35,0x22,0x2c,0xa,0x22,0x70,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x39,0x38,0x45,0x41,0x37,0x22,0x2c,0xa,0x22,0x61,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x44,0x38,0x46,0x41,0x39,0x22,0x2c,0xa,0x22,0x73,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x45,0x38,0x31,0x41,0x42,0x22,0x2c,0xa,0x22,0x64,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x36,0x38,0x33,0x41,0x36,0x22,0x2c,0xa,0x22,0x66,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x36,0x38,0x43,0x42,0x37,0x22,0x2c,0xa,0x22,0x67,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x33,0x39,0x35,0x41,0x44,0x22,0x2c,0xa,0x22,0x68,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x43,0x39,0x36,0x42,0x30,0x22,0x2c,0xa,0x22,0x6a,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x30,0x38,0x36,0x43,0x41,0x22,0x2c,0xa,0x22,0x6b,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x39,0x38,0x36,0x43,0x33,0x22,0x2c,0xa,0x22,0x6c,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x32,0x38,0x34,0x43,0x33,0x22,0x2c,0xa,0x22,0x7a,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x39,0x38,0x45,0x44,0x32,0x22,0x2c,0xa,0x22,0x78,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x44,0x39,0x35,0x44,0x42,0x22,0x2c,0xa,0x22,0x63,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x34,0x38,0x44,0x43,0x35,0x22,0x2c,0xa,0x22,0x76,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x44,0x39,0x32,0x43,0x38,0x22,0x2c,0xa,0x22,0x62,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x35,0x39,0x33,0x43,0x39,0x22,0x2c,0xa,0x22,0x6e,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x30,0x39,0x37,0x44,0x45,0x22,0x2c,0xa,0x22,0x6d,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x31,0x39,0x38,0x44,0x45,0x22,0x2c,0xa,0x22,0x4d,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x32,0x39,0x36,0x45,0x37,0x22,0x2c,0xa,0x22,0x4e,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x38,0x39,0x35,0x45,0x32,0x22,0x2c,0xa,0x22,0x42,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x42,0x39,0x39,0x45,0x35,0x22,0x2c,0xa,0x22,0x56,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x41,0x39,0x43,0x45,0x42,0x22,0x2c,0xa,0x22,0x43,0x2e,
+ 0x20,0x63,0x20,0x23,0x34,0x35,0x39,0x39,0x45,0x42,0x22,0x2c,0xa,0x22,0x5a,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x32,0x39,0x44,0x45,0x36,0x22,0x2c,0xa,0x22,0x41,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x38,0x39,0x45,0x45,0x32,0x22,0x2c,0xa,0x22,0x53,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x34,0x41,0x31,0x45,0x42,0x22,0x2c,0xa,0x22,0x44,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x41,0x41,0x31,0x45,0x36,0x22,0x2c,0xa,0x22,0x46,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x41,0x41,0x35,0x45,0x42,0x22,0x2c,0xa,0x22,0x47,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x45,0x41,0x38,0x45,0x46,0x22,0x2c,0xa,0x22,0x48,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x33,0x41,0x33,0x46,0x31,0x22,0x2c,0xa,0x22,0x4a,0x2e,
+ 0x20,0x63,0x20,0x23,0x35,0x45,0x41,0x41,0x46,0x32,0x22,0x2c,0xa,0x22,0x4b,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x36,0x39,0x39,0x43,0x42,0x22,0x2c,0xa,0x22,0x4c,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x39,0x39,0x42,0x43,0x38,0x22,0x2c,0xa,0x22,0x50,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x45,0x41,0x36,0x43,0x39,0x22,0x2c,0xa,0x22,0x49,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x30,0x41,0x32,0x45,0x35,0x22,0x2c,0xa,0x22,0x55,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x35,0x41,0x37,0x45,0x38,0x22,0x2c,0xa,0x22,0x59,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x42,0x41,0x42,0x45,0x39,0x22,0x2c,0xa,0x22,0x54,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x38,0x41,0x44,0x46,0x32,0x22,0x2c,0xa,0x22,0x52,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x37,0x42,0x30,0x46,0x35,0x22,0x2c,0xa,0x22,0x45,0x2e,
+ 0x20,0x63,0x20,0x23,0x36,0x44,0x42,0x33,0x46,0x36,0x22,0x2c,0xa,0x22,0x57,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x30,0x41,0x44,0x45,0x41,0x22,0x2c,0xa,0x22,0x51,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x35,0x42,0x30,0x45,0x39,0x22,0x2c,0xa,0x22,0x21,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x43,0x42,0x35,0x45,0x42,0x22,0x2c,0xa,0x22,0x7e,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x33,0x42,0x39,0x46,0x38,0x22,0x2c,0xa,0x22,0x5e,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x42,0x42,0x44,0x46,0x42,0x22,0x2c,0xa,0x22,0x2f,0x2e,
+ 0x20,0x63,0x20,0x23,0x37,0x43,0x42,0x41,0x46,0x36,0x22,0x2c,0xa,0x22,0x28,0x2e,
+ 0x20,0x63,0x20,0x67,0x72,0x61,0x79,0x35,0x35,0x22,0x2c,0xa,0x22,0x29,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x32,0x38,0x38,0x39,0x39,0x22,0x2c,0xa,0x22,0x5f,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x34,0x39,0x34,0x39,0x45,0x22,0x2c,0xa,0x22,0x60,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x31,0x38,0x45,0x38,0x41,0x22,0x2c,0xa,0x22,0x27,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x34,0x39,0x34,0x39,0x34,0x22,0x2c,0xa,0x22,0x5d,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x46,0x38,0x46,0x41,0x39,0x22,0x2c,0xa,0x22,0x5b,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x39,0x39,0x37,0x41,0x35,0x22,0x2c,0xa,0x22,0x7b,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x41,0x39,0x41,0x41,0x39,0x22,0x2c,0xa,0x22,0x7d,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x41,0x39,0x42,0x41,0x46,0x22,0x2c,0xa,0x22,0x7c,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x33,0x39,0x39,0x41,0x39,0x22,0x2c,0xa,0x22,0x20,0x58,0x20,
+ 0x63,0x20,0x23,0x39,0x46,0x41,0x41,0x42,0x35,0x22,0x2c,0xa,0x22,0x2e,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x32,0x39,0x45,0x39,0x42,0x22,0x2c,0xa,0x22,0x58,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x37,0x41,0x37,0x41,0x37,0x22,0x2c,0xa,0x22,0x6f,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x42,0x41,0x42,0x41,0x42,0x22,0x2c,0xa,0x22,0x4f,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x33,0x41,0x33,0x42,0x34,0x22,0x2c,0xa,0x22,0x2b,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x38,0x41,0x38,0x42,0x37,0x22,0x2c,0xa,0x22,0x40,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x33,0x41,0x42,0x42,0x33,0x22,0x2c,0xa,0x22,0x23,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x34,0x42,0x35,0x42,0x35,0x22,0x2c,0xa,0x22,0x24,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x30,0x42,0x30,0x42,0x43,0x22,0x2c,0xa,0x22,0x25,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x37,0x42,0x39,0x42,0x43,0x22,0x2c,0xa,0x22,0x26,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x42,0x42,0x37,0x42,0x33,0x22,0x2c,0xa,0x22,0x2a,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x42,0x42,0x42,0x42,0x42,0x22,0x2c,0xa,0x22,0x3d,0x58,0x20,
+ 0x63,0x20,0x23,0x38,0x32,0x42,0x31,0x44,0x42,0x22,0x2c,0xa,0x22,0x2d,0x58,0x20,
+ 0x63,0x20,0x23,0x38,0x31,0x42,0x37,0x45,0x43,0x22,0x2c,0xa,0x22,0x3b,0x58,0x20,
+ 0x63,0x20,0x23,0x38,0x38,0x42,0x42,0x45,0x44,0x22,0x2c,0xa,0x22,0x3a,0x58,0x20,
+ 0x63,0x20,0x23,0x38,0x36,0x42,0x41,0x45,0x44,0x22,0x2c,0xa,0x22,0x3e,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x45,0x42,0x42,0x43,0x38,0x22,0x2c,0xa,0x22,0x2c,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x36,0x42,0x44,0x43,0x44,0x22,0x2c,0xa,0x22,0x3c,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x42,0x42,0x43,0x43,0x33,0x22,0x2c,0xa,0x22,0x31,0x58,0x20,
+ 0x63,0x20,0x23,0x38,0x31,0x43,0x31,0x46,0x36,0x22,0x2c,0xa,0x22,0x32,0x58,0x20,
+ 0x63,0x20,0x23,0x38,0x33,0x43,0x32,0x46,0x41,0x22,0x2c,0xa,0x22,0x33,0x58,0x20,
+ 0x63,0x20,0x23,0x38,0x39,0x43,0x34,0x46,0x41,0x22,0x2c,0xa,0x22,0x34,0x58,0x20,
+ 0x63,0x20,0x23,0x38,0x43,0x43,0x38,0x46,0x43,0x22,0x2c,0xa,0x22,0x35,0x58,0x20,
+ 0x63,0x20,0x23,0x39,0x35,0x43,0x32,0x45,0x46,0x22,0x2c,0xa,0x22,0x36,0x58,0x20,
+ 0x63,0x20,0x23,0x39,0x33,0x43,0x42,0x46,0x44,0x22,0x2c,0xa,0x22,0x37,0x58,0x20,
+ 0x63,0x20,0x23,0x39,0x42,0x43,0x46,0x46,0x46,0x22,0x2c,0xa,0x22,0x38,0x58,0x20,
+ 0x63,0x20,0x23,0x39,0x37,0x44,0x30,0x46,0x43,0x22,0x2c,0xa,0x22,0x39,0x58,0x20,
+ 0x63,0x20,0x23,0x39,0x43,0x44,0x33,0x46,0x45,0x22,0x2c,0xa,0x22,0x30,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x45,0x43,0x30,0x43,0x31,0x22,0x2c,0xa,0x22,0x71,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x33,0x43,0x37,0x45,0x37,0x22,0x2c,0xa,0x22,0x77,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x32,0x43,0x41,0x46,0x31,0x22,0x2c,0xa,0x22,0x65,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x31,0x44,0x34,0x46,0x46,0x22,0x2c,0xa,0x22,0x72,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x33,0x44,0x38,0x46,0x46,0x22,0x2c,0xa,0x22,0x74,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x41,0x44,0x42,0x46,0x46,0x22,0x2c,0xa,0x22,0x79,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x30,0x44,0x31,0x46,0x32,0x22,0x2c,0xa,0x22,0x75,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x44,0x44,0x39,0x46,0x34,0x22,0x2c,0xa,0x22,0x69,0x58,0x20,
+ 0x63,0x20,0x23,0x41,0x41,0x45,0x30,0x46,0x46,0x22,0x2c,0xa,0x22,0x70,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x33,0x45,0x31,0x46,0x46,0x22,0x2c,0xa,0x22,0x61,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x39,0x45,0x36,0x46,0x46,0x22,0x2c,0xa,0x22,0x73,0x58,0x20,
+ 0x63,0x20,0x23,0x42,0x45,0x45,0x39,0x46,0x46,0x22,0x2c,0xa,0x22,0x64,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x34,0x43,0x34,0x43,0x34,0x22,0x2c,0xa,0x22,0x66,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x36,0x43,0x35,0x43,0x44,0x22,0x2c,0xa,0x22,0x67,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x36,0x43,0x38,0x43,0x42,0x22,0x2c,0xa,0x22,0x68,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x41,0x43,0x37,0x43,0x34,0x22,0x2c,0xa,0x22,0x6a,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x41,0x43,0x38,0x43,0x36,0x22,0x2c,0xa,0x22,0x6b,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x42,0x43,0x43,0x43,0x42,0x22,0x2c,0xa,0x22,0x6c,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x31,0x44,0x30,0x43,0x45,0x22,0x2c,0xa,0x22,0x7a,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x33,0x44,0x33,0x44,0x33,0x22,0x2c,0xa,0x22,0x78,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x34,0x44,0x37,0x44,0x39,0x22,0x2c,0xa,0x22,0x63,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x38,0x44,0x38,0x44,0x37,0x22,0x2c,0xa,0x22,0x76,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x42,0x44,0x42,0x44,0x42,0x22,0x2c,0xa,0x22,0x62,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x34,0x45,0x43,0x46,0x46,0x22,0x2c,0xa,0x22,0x6e,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x39,0x45,0x30,0x46,0x36,0x22,0x2c,0xa,0x22,0x6d,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x34,0x46,0x35,0x46,0x46,0x22,0x2c,0xa,0x22,0x4d,0x58,0x20,
+ 0x63,0x20,0x23,0x43,0x43,0x46,0x32,0x46,0x46,0x22,0x2c,0xa,0x22,0x4e,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x35,0x45,0x36,0x46,0x37,0x22,0x2c,0xa,0x22,0x42,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x44,0x45,0x42,0x46,0x39,0x22,0x2c,0xa,0x22,0x56,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x43,0x46,0x44,0x46,0x46,0x22,0x2c,0xa,0x22,0x43,0x58,0x20,
+ 0x63,0x20,0x23,0x44,0x33,0x46,0x31,0x46,0x35,0x22,0x2c,0xa,0x22,0x5a,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x31,0x45,0x30,0x44,0x45,0x22,0x2c,0xa,0x22,0x41,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x34,0x45,0x33,0x45,0x33,0x22,0x2c,0xa,0x22,0x53,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x34,0x45,0x37,0x45,0x41,0x22,0x2c,0xa,0x22,0x44,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x37,0x45,0x38,0x45,0x39,0x22,0x2c,0xa,0x22,0x46,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x38,0x45,0x36,0x45,0x34,0x22,0x2c,0xa,0x22,0x47,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x44,0x45,0x39,0x45,0x35,0x22,0x2c,0xa,0x22,0x48,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x42,0x45,0x42,0x45,0x42,0x22,0x2c,0xa,0x22,0x4a,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x37,0x45,0x45,0x46,0x35,0x22,0x2c,0xa,0x22,0x4b,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x41,0x46,0x32,0x46,0x41,0x22,0x2c,0xa,0x22,0x4c,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x31,0x45,0x45,0x45,0x41,0x22,0x2c,0xa,0x22,0x50,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x33,0x46,0x33,0x46,0x33,0x22,0x2c,0xa,0x22,0x49,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x34,0x46,0x38,0x46,0x43,0x22,0x2c,0xa,0x22,0x55,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x44,0x46,0x44,0x46,0x43,0x22,0x2c,0xa,0x22,0x59,0x58,0x20,
+ 0x63,0x20,0x4e,0x6f,0x6e,0x65,0x22,0x2c,0xa,0x2f,0x2a,0x20,0x70,0x69,0x78,0x65,
+ 0x6c,0x73,0x20,0x2a,0x2f,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x79,0x20,0x79,0x20,0x65,0x20,0x36,
+ 0x20,0x36,0x20,0x32,0x20,0x3c,0x20,0x3c,0x20,0x2c,0x20,0x2c,0x20,0x31,0x20,0x20,
+ 0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x32,0x20,0x3c,0x20,0x2c,0x20,0x2c,0x20,0x71,0x20,0x77,0x20,0x32,0x20,0x65,
+ 0x20,0x72,0x20,0x72,0x20,0x72,0x20,0x77,0x20,0x65,0x20,0x77,0x20,0x72,0x20,0x65,
+ 0x20,0x32,0x20,0x36,0x20,0x31,0x20,0x36,0x20,0x73,0x20,0x3a,0x2e,0x66,0x2e,0x4c,
+ 0x2e,0x79,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x78,0x20,0x64,0x2e,0x73,0x2e,0x3a,0x2e,0x61,0x20,0x23,
+ 0x20,0x24,0x20,0x24,0x20,0x25,0x20,0x2d,0x20,0x35,0x20,0x33,0x20,0x38,0x20,0x75,
+ 0x20,0x68,0x20,0x6b,0x20,0x42,0x20,0x53,0x20,0x4a,0x20,0x29,0x2e,0x2c,0x58,0x46,
+ 0x2e,0x62,0x2e,0x37,0x2e,0x72,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x26,0x2e,0x6d,0x58,0x7e,0x2e,0x38,
+ 0x2e,0x56,0x20,0x23,0x58,0x23,0x58,0x25,0x58,0x64,0x58,0x66,0x58,0x7a,0x58,0x78,
+ 0x58,0x76,0x58,0x5a,0x58,0x5a,0x58,0x44,0x58,0x46,0x58,0x46,0x58,0x44,0x58,0x4c,
+ 0x58,0x44,0x58,0x3e,0x2e,0x55,0x20,0x69,0x20,0x39,0x20,0x20,0x20,0x20,0x20,0x59,
+ 0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x6f,0x2e,0x32,
+ 0x58,0x5d,0x20,0x4c,0x20,0x43,0x20,0x55,0x58,0x44,0x58,0x63,0x58,0x7a,0x58,0x6b,
+ 0x58,0x6b,0x58,0x6b,0x58,0x6a,0x58,0x6a,0x58,0x64,0x58,0x64,0x58,0x25,0x58,0x25,
+ 0x58,0x26,0x58,0x25,0x58,0x2a,0x58,0x4e,0x2e,0x27,0x20,0x7e,0x20,0x36,0x20,0x20,
+ 0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x6f,0x2e,0x31,0x58,0x5d,0x20,0x50,0x20,0x6b,0x20,0x68,0x58,0x6f,0x58,0x58,
+ 0x58,0x58,0x58,0x6f,0x58,0x6f,0x58,0x23,0x58,0x23,0x58,0x2a,0x58,0x25,0x58,0x26,
+ 0x58,0x25,0x58,0x25,0x58,0x64,0x58,0x6b,0x58,0x78,0x58,0x78,0x2e,0x5b,0x20,0x7e,
+ 0x20,0x36,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x4f,0x2e,0x33,0x58,0x5b,0x20,0x49,0x20,0x6d,0x20,0x46,
+ 0x58,0x6b,0x58,0x6a,0x58,0x6a,0x58,0x6b,0x58,0x6b,0x58,0x6b,0x58,0x6b,0x58,0x6b,
+ 0x58,0x6b,0x58,0x7a,0x58,0x7a,0x58,0x7a,0x58,0x63,0x58,0x5a,0x58,0x53,0x58,0x78,
+ 0x2e,0x7b,0x20,0x21,0x20,0x36,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x6f,0x2e,0x33,0x58,0x7b,0x20,0x49,
+ 0x20,0x53,0x20,0x55,0x58,0x76,0x58,0x78,0x58,0x7a,0x58,0x6b,0x58,0x6b,0x58,0x6b,
+ 0x58,0x6b,0x58,0x6b,0x58,0x6a,0x58,0x64,0x58,0x2a,0x58,0x25,0x58,0x23,0x58,0x26,
+ 0x58,0x25,0x58,0x5a,0x2e,0x31,0x2e,0x5e,0x20,0x39,0x20,0x20,0x20,0x20,0x20,0x59,
+ 0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x4f,0x2e,0x34,
+ 0x58,0x3e,0x2e,0x55,0x20,0x6a,0x20,0x6a,0x58,0x23,0x58,0x23,0x58,0x23,0x58,0x25,
+ 0x58,0x64,0x58,0x64,0x58,0x6b,0x58,0x7a,0x58,0x6b,0x58,0x7a,0x58,0x7a,0x58,0x63,
+ 0x58,0x76,0x58,0x44,0x58,0x4a,0x58,0x41,0x2e,0x31,0x2e,0x7c,0x20,0x36,0x20,0x20,
+ 0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x4f,0x2e,0x36,0x58,0x3e,0x2e,0x54,0x20,0x56,0x20,0x50,0x58,0x5a,0x58,0x5a,
+ 0x58,0x5a,0x58,0x41,0x58,0x53,0x58,0x44,0x58,0x44,0x58,0x46,0x58,0x48,0x58,0x44,
+ 0x58,0x48,0x58,0x48,0x58,0x48,0x58,0x48,0x58,0x53,0x58,0x49,0x2e,0x32,0x2e,0x7c,
+ 0x20,0x39,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x4f,0x2e,0x36,0x58,0x32,0x2e,0x54,0x20,0x47,0x20,0x55,
+ 0x58,0x4c,0x58,0x44,0x58,0x44,0x58,0x41,0x58,0x5a,0x58,0x5a,0x58,0x41,0x58,0x5a,
+ 0x58,0x76,0x58,0x63,0x58,0x7a,0x58,0x6b,0x58,0x6b,0x58,0x6b,0x58,0x67,0x58,0x59,
+ 0x2e,0x33,0x2e,0x20,0x2e,0x36,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x4f,0x2e,0x39,0x58,0x34,0x2e,0x52,
+ 0x20,0x6d,0x20,0x7a,0x58,0x64,0x58,0x64,0x58,0x6b,0x58,0x7a,0x58,0x76,0x58,0x41,
+ 0x58,0x44,0x58,0x48,0x58,0x4c,0x58,0x50,0x58,0x50,0x58,0x49,0x58,0x55,0x58,0x55,
+ 0x58,0x55,0x58,0x51,0x2e,0x36,0x2e,0x20,0x2e,0x39,0x20,0x20,0x20,0x20,0x20,0x59,
+ 0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x4f,0x2e,0x39,
+ 0x58,0x35,0x2e,0x52,0x20,0x48,0x20,0x55,0x58,0x49,0x58,0x55,0x58,0x55,0x58,0x55,
+ 0x58,0x55,0x58,0x55,0x58,0x55,0x58,0x55,0x58,0x55,0x58,0x55,0x58,0x55,0x58,0x49,
+ 0x58,0x4b,0x58,0x4a,0x58,0x42,0x58,0x2d,0x58,0x43,0x2e,0x23,0x2e,0x39,0x20,0x20,
+ 0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x4f,0x2e,0x65,0x58,0x4d,0x2e,0x2f,0x20,0x68,0x2e,0x55,0x58,0x55,0x58,0x49,
+ 0x58,0x4b,0x58,0x42,0x58,0x4e,0x58,0x6e,0x58,0x75,0x58,0x79,0x58,0x77,0x58,0x35,
+ 0x58,0x3a,0x58,0x21,0x2e,0x59,0x2e,0x59,0x2e,0x59,0x2e,0x44,0x2e,0x48,0x2e,0x39,
+ 0x2e,0x36,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x2b,0x2e,0x72,0x58,0x42,0x2e,0x3c,0x2e,0x78,0x2e,0x51,
+ 0x2e,0x3b,0x58,0x2d,0x58,0x51,0x2e,0x59,0x2e,0x55,0x2e,0x55,0x2e,0x44,0x2e,0x5a,
+ 0x2e,0x5a,0x2e,0x42,0x2e,0x42,0x2e,0x43,0x2e,0x56,0x2e,0x56,0x2e,0x42,0x2e,0x42,
+ 0x2e,0x54,0x2e,0x30,0x2e,0x39,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x2b,0x2e,0x74,0x58,0x42,0x2e,0x4e,
+ 0x2e,0x42,0x2e,0x42,0x2e,0x42,0x2e,0x42,0x2e,0x43,0x2e,0x56,0x2e,0x56,0x2e,0x48,
+ 0x2e,0x48,0x2e,0x48,0x2e,0x44,0x2e,0x4e,0x2e,0x7a,0x2e,0x38,0x2e,0x5f,0x20,0x28,
+ 0x20,0x3c,0x2e,0x44,0x2e,0x52,0x2e,0x30,0x2e,0x39,0x20,0x20,0x20,0x20,0x20,0x59,
+ 0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x2b,0x2e,0x74,
+ 0x58,0x53,0x2e,0x5a,0x2e,0x46,0x2e,0x44,0x2e,0x6d,0x2e,0x7a,0x2e,0x6c,0x2e,0x60,
+ 0x20,0x29,0x20,0x51,0x20,0x57,0x20,0x70,0x20,0x73,0x20,0x7d,0x20,0x40,0x2e,0x72,
+ 0x2e,0x5b,0x2e,0x20,0x58,0x3e,0x58,0x47,0x2e,0x45,0x2e,0x30,0x2e,0x39,0x20,0x20,
+ 0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x2b,0x2e,0x70,0x58,0x55,0x2e,0x6d,0x2e,0x29,0x20,0x70,0x20,0x64,0x20,0x2e,
+ 0x2e,0x2a,0x2e,0x75,0x2e,0x7c,0x2e,0x2b,0x58,0x3c,0x58,0x7a,0x58,0x5a,0x58,0x47,
+ 0x58,0x4c,0x58,0x47,0x58,0x5a,0x58,0x7a,0x58,0x6a,0x58,0x2f,0x2e,0x7e,0x2e,0x70,
+ 0x2e,0x72,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x25,0x2e,0x61,0x58,0x54,0x2e,0x6b,0x2e,0x2a,0x2e,0x47,
+ 0x58,0x6c,0x58,0x26,0x58,0x2e,0x58,0x60,0x2e,0x2e,0x58,0x68,0x58,0x6c,0x58,0x7a,
+ 0x58,0x76,0x58,0x76,0x58,0x76,0x58,0x76,0x58,0x78,0x58,0x6b,0x58,0x67,0x58,0x32,
+ 0x58,0x5e,0x2e,0x61,0x2e,0x77,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x25,0x2e,0x61,0x58,0x45,0x2e,0x6b,
+ 0x2e,0x72,0x2e,0x4c,0x58,0x6f,0x58,0x6c,0x20,0x66,0x20,0x6c,0x20,0x46,0x20,0x2a,
+ 0x58,0x6c,0x58,0x7a,0x58,0x76,0x58,0x76,0x58,0x76,0x58,0x76,0x58,0x63,0x58,0x7a,
+ 0x58,0x67,0x58,0x34,0x58,0x3a,0x58,0x61,0x2e,0x77,0x20,0x20,0x20,0x20,0x20,0x59,
+ 0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x25,0x2e,0x62,
+ 0x58,0x7e,0x2e,0x63,0x2e,0x79,0x2e,0x4c,0x58,0x27,0x2e,0x66,0x20,0x44,0x20,0x4b,
+ 0x20,0x44,0x20,0x30,0x58,0x6b,0x58,0x7a,0x58,0x76,0x58,0x76,0x58,0x76,0x58,0x76,
+ 0x58,0x76,0x58,0x7a,0x58,0x66,0x58,0x36,0x58,0x34,0x58,0x67,0x2e,0x39,0x20,0x20,
+ 0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x25,0x2e,0x62,0x58,0x5e,0x2e,0x63,0x2e,0x79,0x2e,0x4c,0x58,0x27,0x2e,0x6c,
+ 0x20,0x44,0x20,0x4b,0x20,0x44,0x20,0x30,0x58,0x6c,0x58,0x7a,0x58,0x63,0x58,0x76,
+ 0x58,0x76,0x58,0x76,0x58,0x78,0x58,0x6b,0x58,0x6b,0x58,0x39,0x58,0x36,0x58,0x77,
+ 0x2e,0x72,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x25,0x2e,0x62,0x58,0x32,0x58,0x76,0x2e,0x75,0x2e,0x4c,
+ 0x58,0x27,0x2e,0x6c,0x20,0x4b,0x20,0x4b,0x20,0x4b,0x20,0x30,0x58,0x6c,0x58,0x7a,
+ 0x58,0x63,0x58,0x76,0x58,0x76,0x58,0x76,0x58,0x76,0x58,0x6b,0x58,0x66,0x58,0x39,
+ 0x58,0x50,0x2e,0x4d,0x20,0x3d,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x25,0x2e,0x62,0x58,0x32,0x58,0x4b,
+ 0x2e,0x75,0x2e,0x4c,0x58,0x27,0x2e,0x6c,0x20,0x4b,0x20,0x4b,0x20,0x44,0x20,0x30,
+ 0x58,0x6c,0x58,0x78,0x58,0x63,0x58,0x76,0x58,0x5a,0x58,0x76,0x58,0x78,0x58,0x7a,
+ 0x58,0x6b,0x58,0x71,0x58,0x5a,0x20,0x3a,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x59,
+ 0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x25,0x2e,0x4d,
+ 0x58,0x36,0x58,0x4b,0x2e,0x75,0x2e,0x4c,0x58,0x27,0x2e,0x66,0x20,0x46,0x20,0x44,
+ 0x20,0x44,0x20,0x30,0x58,0x6b,0x58,0x7a,0x58,0x63,0x58,0x76,0x58,0x76,0x58,0x76,
+ 0x58,0x76,0x58,0x63,0x58,0x6b,0x58,0x5f,0x2e,0x3a,0x20,0x6f,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x25,0x2e,0x4d,0x58,0x36,0x58,0x4b,0x2e,0x75,0x2e,0x4c,0x58,0x58,0x58,0x28,
+ 0x2e,0x58,0x58,0x26,0x58,0x64,0x58,0x6b,0x58,0x7a,0x58,0x76,0x58,0x5a,0x58,0x44,
+ 0x58,0x41,0x58,0x7a,0x58,0x3c,0x58,0x2b,0x58,0x7d,0x2e,0x4e,0x20,0x4f,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x25,0x2e,0x56,0x58,0x69,0x58,0x3d,0x58,0x7b,0x2e,0x46,
+ 0x58,0x7a,0x58,0x6b,0x58,0x6b,0x58,0x6a,0x58,0x64,0x58,0x3c,0x58,0x24,0x58,0x4f,
+ 0x58,0x5d,0x2e,0x3b,0x2e,0x24,0x2e,0x7a,0x20,0x30,0x20,0x37,0x20,0x26,0x20,0x58,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x3d,0x2e,0x43,0x58,0x71,0x2e,0x41,
+ 0x20,0x29,0x2e,0x66,0x58,0x2b,0x58,0x7c,0x2e,0x29,0x2e,0x2d,0x2e,0x4e,0x20,0x7a,
+ 0x20,0x30,0x20,0x2a,0x20,0x2b,0x20,0x6f,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x6e,0x20,0x24,
+ 0x2e,0x74,0x20,0x36,0x20,0x2c,0x20,0x34,0x20,0x30,0x20,0x2a,0x20,0x2b,0x20,0x2e,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x3e,0x20,0x40,0x20,0x6f,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,
+ 0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,
+ 0x58,0x59,0x58,0x22,0xa,0x7d,0x3b,0xa,
+ # /home/rdale/src/kde/branches/KDE/3.5/kdevelop/languages/ruby/app_templates/qtruby4makeapp/editcopy.xpm
+ 0x0,0x0,0x12,0x99,
+ 0x2f,
+ 0x2a,0x20,0x58,0x50,0x4d,0x20,0x2a,0x2f,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,
+ 0x63,0x68,0x61,0x72,0x20,0x2a,0x65,0x64,0x69,0x74,0x63,0x6f,0x70,0x79,0x5b,0x5d,
+ 0x20,0x3d,0x20,0x7b,0xa,0x2f,0x2a,0x20,0x63,0x6f,0x6c,0x75,0x6d,0x6e,0x73,0x20,
+ 0x72,0x6f,0x77,0x73,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x73,0x20,0x63,0x68,0x61,0x72,
+ 0x73,0x2d,0x70,0x65,0x72,0x2d,0x70,0x69,0x78,0x65,0x6c,0x20,0x2a,0x2f,0xa,0x22,
+ 0x33,0x32,0x20,0x33,0x32,0x20,0x31,0x35,0x35,0x20,0x32,0x22,0x2c,0xa,0x22,0x20,
+ 0x20,0x20,0x63,0x20,0x62,0x6c,0x61,0x63,0x6b,0x22,0x2c,0xa,0x22,0x2e,0x20,0x20,
+ 0x63,0x20,0x23,0x31,0x39,0x31,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x58,0x20,0x20,
+ 0x63,0x20,0x23,0x32,0x32,0x31,0x37,0x30,0x30,0x22,0x2c,0xa,0x22,0x6f,0x20,0x20,
+ 0x63,0x20,0x23,0x32,0x45,0x32,0x33,0x30,0x30,0x22,0x2c,0xa,0x22,0x4f,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x35,0x32,0x45,0x30,0x30,0x22,0x2c,0xa,0x22,0x2b,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x33,0x33,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x40,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x39,0x33,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x23,0x20,0x20,
+ 0x63,0x20,0x23,0x35,0x35,0x33,0x38,0x30,0x30,0x22,0x2c,0xa,0x22,0x24,0x20,0x20,
+ 0x63,0x20,0x23,0x35,0x44,0x34,0x36,0x30,0x30,0x22,0x2c,0xa,0x22,0x25,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x42,0x35,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x26,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x32,0x34,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x2a,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x44,0x35,0x45,0x30,0x30,0x22,0x2c,0xa,0x22,0x3d,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x45,0x36,0x39,0x34,0x46,0x22,0x2c,0xa,0x22,0x2d,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x45,0x37,0x39,0x35,0x46,0x22,0x2c,0xa,0x22,0x3b,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x36,0x35,0x39,0x30,0x30,0x22,0x2c,0xa,0x22,0x3a,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x41,0x35,0x43,0x30,0x30,0x22,0x2c,0xa,0x22,0x3e,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x42,0x36,0x38,0x30,0x30,0x22,0x2c,0xa,0x22,0x2c,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x33,0x36,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x3c,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x32,0x36,0x44,0x30,0x30,0x22,0x2c,0xa,0x22,0x31,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x32,0x36,0x42,0x31,0x41,0x22,0x2c,0xa,0x22,0x32,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x36,0x37,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x33,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x42,0x37,0x32,0x31,0x44,0x22,0x2c,0xa,0x22,0x34,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x42,0x37,0x36,0x32,0x35,0x22,0x2c,0xa,0x22,0x35,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x45,0x37,0x39,0x32,0x41,0x22,0x2c,0xa,0x22,0x36,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x34,0x37,0x43,0x30,0x30,0x22,0x2c,0xa,0x22,0x37,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x41,0x37,0x44,0x30,0x30,0x22,0x2c,0xa,0x22,0x38,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x31,0x37,0x36,0x31,0x41,0x22,0x2c,0xa,0x22,0x39,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x35,0x37,0x38,0x31,0x36,0x22,0x2c,0xa,0x22,0x30,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x34,0x37,0x39,0x31,0x44,0x22,0x2c,0xa,0x22,0x71,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x44,0x38,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x77,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x32,0x38,0x35,0x30,0x30,0x22,0x2c,0xa,0x22,0x65,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x45,0x38,0x35,0x33,0x30,0x22,0x2c,0xa,0x22,0x72,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x39,0x39,0x36,0x32,0x36,0x22,0x2c,0xa,0x22,0x74,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x37,0x39,0x30,0x36,0x44,0x22,0x2c,0xa,0x22,0x79,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x31,0x38,0x44,0x34,0x38,0x22,0x2c,0xa,0x22,0x75,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x34,0x39,0x30,0x34,0x39,0x22,0x2c,0xa,0x22,0x69,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x38,0x39,0x35,0x34,0x32,0x22,0x2c,0xa,0x22,0x70,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x41,0x39,0x43,0x34,0x44,0x22,0x2c,0xa,0x22,0x61,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x44,0x39,0x45,0x35,0x32,0x22,0x2c,0xa,0x22,0x73,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x46,0x41,0x30,0x35,0x33,0x22,0x2c,0xa,0x22,0x64,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x38,0x41,0x45,0x37,0x38,0x22,0x2c,0xa,0x22,0x66,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x45,0x42,0x34,0x37,0x45,0x22,0x2c,0xa,0x22,0x67,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x34,0x39,0x33,0x30,0x30,0x22,0x2c,0xa,0x22,0x68,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x38,0x39,0x36,0x30,0x30,0x22,0x2c,0xa,0x22,0x6a,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x31,0x39,0x44,0x32,0x43,0x22,0x2c,0xa,0x22,0x6b,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x31,0x41,0x34,0x33,0x46,0x22,0x2c,0xa,0x22,0x6c,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x30,0x39,0x45,0x34,0x45,0x22,0x2c,0xa,0x22,0x7a,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x46,0x42,0x34,0x35,0x37,0x22,0x2c,0xa,0x22,0x78,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x39,0x42,0x31,0x35,0x39,0x22,0x2c,0xa,0x22,0x63,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x41,0x42,0x35,0x37,0x33,0x22,0x2c,0xa,0x22,0x76,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x34,0x42,0x46,0x37,0x43,0x22,0x2c,0xa,0x22,0x62,0x20,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x44,0x46,0x36,0x32,0x22,0x2c,0xa,0x22,0x6e,0x20,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x30,0x36,0x34,0x22,0x2c,0xa,0x22,0x6d,0x20,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x31,0x36,0x44,0x22,0x2c,0xa,0x22,0x4d,0x20,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x33,0x37,0x32,0x22,0x2c,0xa,0x22,0x4e,0x20,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x34,0x37,0x39,0x22,0x2c,0xa,0x22,0x42,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x31,0x39,0x44,0x38,0x45,0x22,0x2c,0xa,0x22,0x56,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x42,0x41,0x38,0x39,0x41,0x22,0x2c,0xa,0x22,0x43,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x45,0x42,0x35,0x38,0x30,0x22,0x2c,0xa,0x22,0x5a,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x44,0x42,0x34,0x38,0x38,0x22,0x2c,0xa,0x22,0x41,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x38,0x42,0x34,0x39,0x36,0x22,0x2c,0xa,0x22,0x53,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x45,0x41,0x44,0x41,0x41,0x22,0x2c,0xa,0x22,0x44,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x33,0x41,0x46,0x41,0x31,0x22,0x2c,0xa,0x22,0x46,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x43,0x42,0x42,0x42,0x36,0x22,0x2c,0xa,0x22,0x47,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x46,0x42,0x46,0x42,0x39,0x22,0x2c,0xa,0x22,0x48,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x30,0x42,0x36,0x38,0x30,0x22,0x2c,0xa,0x22,0x4a,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x34,0x42,0x41,0x38,0x35,0x22,0x2c,0xa,0x22,0x4b,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x36,0x42,0x44,0x38,0x42,0x22,0x2c,0xa,0x22,0x4c,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x42,0x42,0x35,0x38,0x39,0x22,0x2c,0xa,0x22,0x50,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x38,0x42,0x45,0x38,0x38,0x22,0x2c,0xa,0x22,0x49,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x33,0x42,0x43,0x39,0x30,0x22,0x2c,0xa,0x22,0x55,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x42,0x43,0x31,0x38,0x43,0x22,0x2c,0xa,0x22,0x59,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x43,0x43,0x34,0x39,0x33,0x22,0x2c,0xa,0x22,0x54,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x37,0x43,0x42,0x38,0x43,0x22,0x2c,0xa,0x22,0x52,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x41,0x43,0x37,0x38,0x36,0x22,0x2c,0xa,0x22,0x45,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x38,0x43,0x37,0x38,0x39,0x22,0x2c,0xa,0x22,0x57,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x41,0x43,0x39,0x38,0x42,0x22,0x2c,0xa,0x22,0x51,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x30,0x43,0x36,0x39,0x30,0x22,0x2c,0xa,0x22,0x21,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x34,0x43,0x41,0x39,0x34,0x22,0x2c,0xa,0x22,0x7e,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x34,0x43,0x43,0x39,0x42,0x22,0x2c,0xa,0x22,0x5e,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x38,0x43,0x45,0x39,0x38,0x22,0x2c,0xa,0x22,0x2f,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x43,0x44,0x32,0x39,0x43,0x22,0x2c,0xa,0x22,0x28,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x36,0x43,0x33,0x42,0x37,0x22,0x2c,0xa,0x22,0x29,0x20,0x20,
+ 0x63,0x20,0x23,0x43,0x38,0x43,0x36,0x42,0x45,0x22,0x2c,0xa,0x22,0x5f,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x35,0x43,0x35,0x41,0x35,0x22,0x2c,0xa,0x22,0x60,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x42,0x43,0x38,0x41,0x31,0x22,0x2c,0xa,0x22,0x27,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x42,0x44,0x34,0x41,0x32,0x22,0x2c,0xa,0x22,0x5d,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x45,0x44,0x39,0x41,0x45,0x22,0x2c,0xa,0x22,0x5b,0x20,0x20,
+ 0x63,0x20,0x23,0x44,0x39,0x44,0x35,0x42,0x31,0x22,0x2c,0xa,0x22,0x7b,0x20,0x20,
+ 0x63,0x20,0x23,0x45,0x30,0x43,0x43,0x38,0x32,0x22,0x2c,0xa,0x22,0x7d,0x20,0x20,
+ 0x63,0x20,0x23,0x45,0x38,0x44,0x39,0x38,0x42,0x22,0x2c,0xa,0x22,0x7c,0x20,0x20,
+ 0x63,0x20,0x23,0x45,0x38,0x44,0x39,0x39,0x31,0x22,0x2c,0xa,0x22,0x20,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x31,0x44,0x37,0x41,0x31,0x22,0x2c,0xa,0x22,0x2e,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x35,0x44,0x42,0x41,0x35,0x22,0x2c,0xa,0x22,0x58,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x34,0x44,0x43,0x41,0x42,0x22,0x2c,0xa,0x22,0x6f,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x38,0x44,0x44,0x41,0x41,0x22,0x2c,0xa,0x22,0x4f,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x31,0x44,0x43,0x42,0x32,0x22,0x2c,0xa,0x22,0x2b,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x31,0x44,0x43,0x42,0x38,0x22,0x2c,0xa,0x22,0x40,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x36,0x38,0x33,0x22,0x2c,0xa,0x22,0x23,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x37,0x38,0x41,0x22,0x2c,0xa,0x22,0x24,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x38,0x38,0x35,0x22,0x2c,0xa,0x22,0x25,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x38,0x38,0x44,0x22,0x2c,0xa,0x22,0x26,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x39,0x39,0x32,0x22,0x2c,0xa,0x22,0x2a,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x43,0x39,0x44,0x22,0x2c,0xa,0x22,0x3d,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x30,0x39,0x46,0x22,0x2c,0xa,0x22,0x2d,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x43,0x45,0x32,0x41,0x43,0x22,0x2c,0xa,0x22,0x3b,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x35,0x45,0x30,0x42,0x36,0x22,0x2c,0xa,0x22,0x3a,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x35,0x45,0x31,0x42,0x38,0x22,0x2c,0xa,0x22,0x3e,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x42,0x45,0x34,0x42,0x36,0x22,0x2c,0xa,0x22,0x2c,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x41,0x45,0x35,0x42,0x43,0x22,0x2c,0xa,0x22,0x3c,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x30,0x45,0x35,0x41,0x38,0x22,0x2c,0xa,0x22,0x31,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x44,0x41,0x33,0x22,0x2c,0xa,0x22,0x32,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x44,0x41,0x39,0x22,0x2c,0xa,0x22,0x33,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x31,0x45,0x38,0x42,0x38,0x22,0x2c,0xa,0x22,0x34,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x46,0x42,0x31,0x22,0x2c,0xa,0x22,0x35,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x31,0x41,0x35,0x22,0x2c,0xa,0x22,0x36,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x32,0x41,0x44,0x22,0x2c,0xa,0x22,0x37,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x32,0x42,0x34,0x22,0x2c,0xa,0x22,0x38,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x32,0x42,0x43,0x22,0x2c,0xa,0x22,0x39,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x41,0x43,0x38,0x43,0x32,0x22,0x2c,0xa,0x22,0x30,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x36,0x44,0x34,0x43,0x42,0x22,0x2c,0xa,0x22,0x71,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x46,0x44,0x41,0x43,0x35,0x22,0x2c,0xa,0x22,0x77,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x34,0x44,0x32,0x44,0x30,0x22,0x2c,0xa,0x22,0x65,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x30,0x44,0x37,0x43,0x35,0x22,0x2c,0xa,0x22,0x72,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x34,0x44,0x41,0x43,0x33,0x22,0x2c,0xa,0x22,0x74,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x38,0x44,0x45,0x43,0x37,0x22,0x2c,0xa,0x22,0x79,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x30,0x44,0x46,0x44,0x33,0x22,0x2c,0xa,0x22,0x75,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x36,0x45,0x32,0x43,0x32,0x22,0x2c,0xa,0x22,0x69,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x38,0x45,0x31,0x43,0x35,0x22,0x2c,0xa,0x22,0x70,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x42,0x45,0x33,0x43,0x42,0x22,0x2c,0xa,0x22,0x61,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x45,0x45,0x39,0x43,0x32,0x22,0x2c,0xa,0x22,0x73,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x38,0x45,0x36,0x44,0x43,0x22,0x2c,0xa,0x22,0x64,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x33,0x45,0x44,0x43,0x33,0x22,0x2c,0xa,0x22,0x66,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x32,0x45,0x44,0x43,0x42,0x22,0x2c,0xa,0x22,0x67,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x37,0x46,0x32,0x43,0x44,0x22,0x2c,0xa,0x22,0x68,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x33,0x43,0x33,0x22,0x2c,0xa,0x22,0x6a,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x34,0x43,0x41,0x22,0x2c,0xa,0x22,0x6b,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x38,0x43,0x35,0x22,0x2c,0xa,0x22,0x6c,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x38,0x43,0x44,0x22,0x2c,0xa,0x22,0x7a,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x44,0x46,0x35,0x44,0x32,0x22,0x2c,0xa,0x22,0x78,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x37,0x44,0x38,0x22,0x2c,0xa,0x22,0x63,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x39,0x44,0x34,0x22,0x2c,0xa,0x22,0x76,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x39,0x44,0x43,0x22,0x2c,0xa,0x22,0x62,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x39,0x45,0x38,0x45,0x37,0x22,0x2c,0xa,0x22,0x6e,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x33,0x45,0x46,0x45,0x33,0x22,0x2c,0xa,0x22,0x6d,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x32,0x46,0x30,0x45,0x33,0x22,0x2c,0xa,0x22,0x4d,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x34,0x46,0x32,0x45,0x41,0x22,0x2c,0xa,0x22,0x4e,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x42,0x46,0x37,0x45,0x36,0x22,0x2c,0xa,0x22,0x42,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x46,0x39,0x45,0x33,0x22,0x2c,0xa,0x22,0x56,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x42,0x45,0x43,0x22,0x2c,0xa,0x22,0x43,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x34,0x46,0x34,0x46,0x33,0x22,0x2c,0xa,0x22,0x5a,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x38,0x46,0x37,0x46,0x36,0x22,0x2c,0xa,0x22,0x41,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x46,0x43,0x46,0x34,0x22,0x2c,0xa,0x22,0x53,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x46,0x45,0x46,0x43,0x22,0x2c,0xa,0x22,0x44,0x2e,0x20,
+ 0x63,0x20,0x4e,0x6f,0x6e,0x65,0x22,0x2c,0xa,0x2f,0x2a,0x20,0x70,0x69,0x78,0x65,
+ 0x6c,0x73,0x20,0x2a,0x2f,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x68,
+ 0x20,0x67,0x20,0x67,0x20,0x67,0x20,0x67,0x20,0x67,0x20,0x67,0x20,0x67,0x20,0x67,
+ 0x20,0x67,0x20,0x67,0x20,0x77,0x20,0x2a,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x67,0x20,0x7a,0x2e,0x7a,0x2e,0x67,0x2e,0x67,0x2e,0x67,0x2e,0x67,
+ 0x2e,0x67,0x2e,0x67,0x2e,0x7a,0x2e,0x67,0x2e,0x52,0x20,0x32,0x20,0x20,0x20,0x20,
+ 0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x67,0x20,0x7a,0x2e,0x64,0x2e,0x33,0x2e,0x33,
+ 0x2e,0x33,0x2e,0x33,0x2e,0x33,0x2e,0x33,0x2e,0x3e,0x2e,0x66,0x2e,0x67,0x2e,0x7a,
+ 0x20,0x3c,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,
+ 0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x3a,
+ 0x20,0x3b,0x20,0x2c,0x20,0x3a,0x20,0x3a,0x20,0x3a,0x20,0x37,0x20,0x61,0x20,0x69,
+ 0x20,0x61,0x20,0x52,0x20,0x2d,0x2e,0x2d,0x2e,0x2d,0x2e,0x2d,0x2e,0x27,0x20,0x6d,
+ 0x2e,0x75,0x2e,0x67,0x2e,0x6a,0x20,0x3e,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,
+ 0x20,0x75,0x20,0x79,0x20,0x79,0x20,0x4c,0x20,0x4c,0x20,0x4c,0x20,0x4c,0x20,0x60,
+ 0x20,0x74,0x2e,0x74,0x2e,0x65,0x2e,0x65,0x20,0x76,0x20,0x2d,0x2e,0x2d,0x2e,0x2d,
+ 0x2e,0x59,0x20,0x62,0x2e,0x53,0x2e,0x2b,0x2e,0x64,0x2e,0x71,0x20,0x20,0x20,0x20,
+ 0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x2c,0x20,0x53,0x2e,0x53,0x2e,0x53,0x2e,0x53,0x2e,0x53,0x2e,0x53,
+ 0x2e,0x53,0x2e,0x53,0x2e,0x5a,0x2e,0x62,0x2e,0x53,0x2e,0x65,0x2e,0x69,0x20,0x57,
+ 0x20,0x6f,0x2e,0x6f,0x2e,0x4b,0x20,0x77,0x2e,0x53,0x2e,0x41,0x2e,0x75,0x2e,0x71,
+ 0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x53,0x2e,0x53,0x2e,0x53,0x2e,0x41,
+ 0x2e,0x53,0x2e,0x53,0x2e,0x53,0x2e,0x53,0x2e,0x4d,0x2e,0x77,0x2e,0x53,0x2e,0x53,
+ 0x2e,0x5f,0x20,0x61,0x20,0x45,0x20,0x2e,0x2e,0x4b,0x20,0x30,0x2e,0x53,0x2e,0x53,
+ 0x2e,0x71,0x2e,0x37,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,
+ 0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x53,0x2e,0x41,
+ 0x2e,0x56,0x2e,0x41,0x2e,0x41,0x2e,0x41,0x2e,0x56,0x2e,0x41,0x2e,0x6e,0x2e,0x39,
+ 0x2e,0x53,0x2e,0x53,0x2e,0x43,0x2e,0x5f,0x20,0x61,0x20,0x2e,0x2e,0x59,0x20,0x74,
+ 0x20,0x3d,0x20,0x2d,0x20,0x41,0x20,0x36,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,
+ 0x20,0x41,0x2e,0x41,0x2e,0x56,0x2e,0x41,0x2e,0x56,0x2e,0x56,0x2e,0x56,0x2e,0x41,
+ 0x2e,0x6e,0x2e,0x39,0x2e,0x53,0x2e,0x53,0x2e,0x53,0x2e,0x5a,0x2e,0x33,0x20,0x27,
+ 0x20,0x27,0x20,0x4b,0x20,0x5a,0x20,0x41,0x20,0x5d,0x20,0x37,0x20,0x20,0x20,0x20,
+ 0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x2c,0x20,0x41,0x2e,0x56,0x2e,0x42,0x2e,0x56,0x2e,0x56,0x2e,0x42,
+ 0x2e,0x56,0x2e,0x56,0x2e,0x6e,0x2e,0x28,0x20,0x46,0x20,0x53,0x20,0x53,0x20,0x47,
+ 0x20,0x35,0x20,0x27,0x20,0x7c,0x20,0x2f,0x20,0x2f,0x20,0x58,0x2e,0x66,0x2e,0x71,
+ 0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x41,0x2e,0x56,0x2e,0x78,0x2e,0x42,
+ 0x2e,0x78,0x2e,0x56,0x2e,0x42,0x2e,0x4e,0x2e,0x42,0x2e,0x65,0x2e,0x44,0x20,0x42,
+ 0x20,0x56,0x20,0x29,0x20,0x33,0x20,0x2f,0x20,0x2f,0x20,0x5e,0x20,0x5e,0x20,0x27,
+ 0x20,0x61,0x2e,0x71,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,
+ 0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x56,0x2e,0x4e,
+ 0x2e,0x4e,0x2e,0x42,0x2e,0x42,0x2e,0x42,0x2e,0x76,0x2e,0x76,0x2e,0x4e,0x2e,0x7a,
+ 0x2e,0x70,0x2e,0x69,0x2e,0x70,0x2e,0x6e,0x2e,0x38,0x20,0x5e,0x20,0x2f,0x20,0x21,
+ 0x20,0x51,0x20,0x27,0x20,0x61,0x2e,0x71,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,
+ 0x20,0x42,0x2e,0x42,0x2e,0x78,0x2e,0x76,0x2e,0x78,0x2e,0x7a,0x2e,0x6a,0x2e,0x6a,
+ 0x2e,0x78,0x2e,0x7a,0x2e,0x7a,0x2e,0x63,0x2e,0x42,0x2e,0x42,0x2e,0x30,0x20,0x21,
+ 0x20,0x21,0x20,0x21,0x20,0x5e,0x20,0x27,0x20,0x2c,0x2e,0x71,0x20,0x20,0x20,0x20,
+ 0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x2c,0x20,0x42,0x2e,0x68,0x2e,0x68,0x2e,0x7a,0x2e,0x7a,0x2e,0x78,
+ 0x2e,0x78,0x2e,0x7a,0x2e,0x7a,0x2e,0x7a,0x2e,0x68,0x2e,0x6a,0x2e,0x78,0x2e,0x76,
+ 0x2e,0x30,0x20,0x21,0x20,0x51,0x20,0x59,0x20,0x21,0x20,0x7e,0x20,0x2c,0x2e,0x71,
+ 0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x76,0x2e,0x63,0x2e,0x6b,0x2e,0x78,
+ 0x2e,0x68,0x2e,0x6a,0x2e,0x6a,0x2e,0x6a,0x2e,0x7a,0x2e,0x38,0x2e,0x68,0x2e,0x6b,
+ 0x2e,0x6a,0x2e,0x76,0x2e,0x30,0x20,0x55,0x20,0x54,0x20,0x55,0x20,0x55,0x20,0x7e,
+ 0x20,0x2c,0x2e,0x71,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,
+ 0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x76,0x2e,0x6b,
+ 0x2e,0x7a,0x2e,0x68,0x2e,0x68,0x2e,0x68,0x2e,0x6a,0x2e,0x38,0x2e,0x6a,0x2e,0x68,
+ 0x2e,0x68,0x2e,0x6a,0x2e,0x6b,0x2e,0x76,0x2e,0x30,0x20,0x55,0x20,0x55,0x20,0x55,
+ 0x20,0x55,0x20,0x59,0x20,0x3b,0x2e,0x71,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,
+ 0x20,0x78,0x2e,0x68,0x2e,0x38,0x2e,0x38,0x2e,0x68,0x2e,0x6a,0x2e,0x38,0x2e,0x38,
+ 0x2e,0x34,0x2e,0x68,0x2e,0x34,0x2e,0x38,0x2e,0x68,0x2e,0x78,0x2e,0x38,0x20,0x50,
+ 0x20,0x48,0x20,0x50,0x20,0x50,0x20,0x7e,0x20,0x3b,0x2e,0x71,0x20,0x20,0x20,0x20,
+ 0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x2c,0x20,0x76,0x2e,0x68,0x2e,0x34,0x2e,0x34,0x2e,0x38,0x2e,0x38,
+ 0x2e,0x34,0x2e,0x31,0x2e,0x7a,0x2e,0x68,0x2e,0x38,0x2e,0x34,0x2e,0x68,0x2e,0x63,
+ 0x2e,0x38,0x20,0x48,0x20,0x4a,0x20,0x48,0x20,0x4a,0x20,0x59,0x20,0x3b,0x2e,0x71,
+ 0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x63,0x2e,0x32,0x2e,0x7a,0x2e,0x6a,
+ 0x2e,0x34,0x2e,0x2a,0x2e,0x31,0x2e,0x31,0x2e,0x38,0x2e,0x32,0x2e,0x32,0x2e,0x2a,
+ 0x2e,0x32,0x2e,0x6c,0x2e,0x38,0x20,0x4a,0x20,0x4a,0x20,0x48,0x20,0x4a,0x20,0x55,
+ 0x20,0x5d,0x20,0x71,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,
+ 0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x6c,0x2e,0x68,
+ 0x2e,0x32,0x2e,0x34,0x2e,0x34,0x2e,0x31,0x2e,0x25,0x2e,0x31,0x2e,0x26,0x2e,0x32,
+ 0x2e,0x34,0x2e,0x38,0x2e,0x37,0x2e,0x6b,0x2e,0x38,0x20,0x66,0x20,0x64,0x20,0x66,
+ 0x20,0x48,0x20,0x55,0x20,0x5d,0x20,0x71,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,
+ 0x20,0x7a,0x2e,0x38,0x2e,0x23,0x2e,0x31,0x2e,0x34,0x2e,0x31,0x2e,0x2a,0x2e,0x31,
+ 0x2e,0x31,0x2e,0x31,0x2e,0x2a,0x2e,0x4e,0x20,0x34,0x2e,0x6c,0x2e,0x38,0x20,0x66,
+ 0x20,0x66,0x20,0x43,0x20,0x4b,0x20,0x7e,0x20,0x3a,0x2e,0x71,0x20,0x20,0x20,0x20,
+ 0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x2c,0x20,0x38,0x2e,0x26,0x2e,0x34,0x2e,0x23,0x2e,0x25,0x2e,0x34,
+ 0x2e,0x26,0x2e,0x40,0x2e,0x23,0x2e,0x25,0x2e,0x25,0x2e,0x26,0x2e,0x32,0x2e,0x6c,
+ 0x2e,0x38,0x20,0x4b,0x20,0x4b,0x20,0x59,0x20,0x7e,0x20,0x5d,0x20,0x2c,0x2e,0x36,
+ 0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x68,0x2e,0x26,0x2e,0x23,0x2e,0x2a,
+ 0x2e,0x31,0x2e,0x31,0x2e,0x25,0x2e,0x4e,0x20,0x4e,0x20,0x23,0x2e,0x26,0x2e,0x2a,
+ 0x2e,0x31,0x2e,0x6c,0x2e,0x30,0x20,0x27,0x20,0x5d,0x20,0x54,0x20,0x78,0x20,0x72,
+ 0x20,0x36,0x20,0x25,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,
+ 0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x34,0x2e,0x34,
+ 0x2e,0x25,0x2e,0x2a,0x2e,0x23,0x2e,0x62,0x20,0x26,0x2e,0x4e,0x20,0x4d,0x20,0x62,
+ 0x20,0x4d,0x20,0x32,0x2e,0x31,0x2e,0x6b,0x2e,0x39,0x20,0x6b,0x20,0x37,0x20,0x3e,
+ 0x20,0x24,0x20,0x6f,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,
+ 0x20,0x37,0x2e,0x26,0x2e,0x4e,0x20,0x35,0x2e,0x26,0x2e,0x4e,0x20,0x40,0x2e,0x2a,
+ 0x2e,0x62,0x20,0x4e,0x20,0x4d,0x20,0x4e,0x20,0x3d,0x2e,0x6b,0x2e,0x2c,0x20,0x2b,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x2c,0x20,0x36,0x2e,0x4e,0x20,0x4e,0x20,0x4d,0x20,0x4d,0x20,0x26,
+ 0x2e,0x23,0x2e,0x4e,0x20,0x32,0x2e,0x24,0x2e,0x25,0x2e,0x38,0x2e,0x36,0x2e,0x3c,
+ 0x2e,0x26,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x35,0x2e,0x26,0x2e,0x37,0x2e,0x6e,
+ 0x20,0x24,0x2e,0x6d,0x20,0x4d,0x20,0x31,0x2e,0x37,0x2e,0x37,0x2e,0x6f,0x2e,0x63,
+ 0x20,0x35,0x20,0x26,0x20,0x40,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,
+ 0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,0x20,0x37,0x2e,0x2a,
+ 0x2e,0x6d,0x20,0x25,0x2e,0x3d,0x2e,0x26,0x2e,0x37,0x2e,0x7d,0x20,0x70,0x20,0x31,
+ 0x20,0x25,0x20,0x23,0x20,0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x2c,
+ 0x20,0x36,0x2e,0x35,0x2e,0x35,0x2e,0x35,0x2e,0x7c,0x20,0x61,0x20,0x31,0x20,0x26,
+ 0x20,0x2b,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x2c,0x20,0x36,0x2e,0x2d,0x2e,0x61,0x20,0x31,0x20,0x26,0x20,0x4f,
+ 0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,0x2c,0xa,0x22,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x3b,0x20,0x3a,0x20,0x25,0x20,0x4f,0x20,0x2e,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x22,
+ 0x2c,0xa,0x22,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,0x2e,0x44,
+ 0x2e,0x44,0x2e,0x22,0xa,0x7d,0x3b,0xa,
+ # /home/rdale/src/kde/branches/KDE/3.5/kdevelop/languages/ruby/app_templates/qtruby4makeapp/filenew.xpm
+ 0x0,0x0,0x14,0x9,
+ 0x2f,
+ 0x2a,0x20,0x58,0x50,0x4d,0x20,0x2a,0x2f,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,
+ 0x63,0x68,0x61,0x72,0x20,0x2a,0x66,0x69,0x6c,0x65,0x6e,0x65,0x77,0x5b,0x5d,0x20,
+ 0x3d,0x20,0x7b,0xa,0x2f,0x2a,0x20,0x63,0x6f,0x6c,0x75,0x6d,0x6e,0x73,0x20,0x72,
+ 0x6f,0x77,0x73,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x73,0x20,0x63,0x68,0x61,0x72,0x73,
+ 0x2d,0x70,0x65,0x72,0x2d,0x70,0x69,0x78,0x65,0x6c,0x20,0x2a,0x2f,0xa,0x22,0x33,
+ 0x32,0x20,0x33,0x32,0x20,0x31,0x37,0x38,0x20,0x32,0x22,0x2c,0xa,0x22,0x20,0x20,
+ 0x20,0x63,0x20,0x62,0x6c,0x61,0x63,0x6b,0x22,0x2c,0xa,0x22,0x2e,0x20,0x20,0x63,
+ 0x20,0x23,0x31,0x39,0x31,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x58,0x20,0x20,0x63,
+ 0x20,0x23,0x32,0x32,0x31,0x37,0x30,0x30,0x22,0x2c,0xa,0x22,0x6f,0x20,0x20,0x63,
+ 0x20,0x23,0x34,0x35,0x32,0x45,0x30,0x30,0x22,0x2c,0xa,0x22,0x4f,0x20,0x20,0x63,
+ 0x20,0x23,0x34,0x41,0x33,0x31,0x30,0x30,0x22,0x2c,0xa,0x22,0x2b,0x20,0x20,0x63,
+ 0x20,0x23,0x34,0x45,0x33,0x34,0x30,0x30,0x22,0x2c,0xa,0x22,0x40,0x20,0x20,0x63,
+ 0x20,0x23,0x35,0x35,0x33,0x38,0x30,0x30,0x22,0x2c,0xa,0x22,0x23,0x20,0x20,0x63,
+ 0x20,0x23,0x36,0x30,0x34,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x24,0x20,0x20,0x63,
+ 0x20,0x23,0x36,0x41,0x34,0x36,0x30,0x30,0x22,0x2c,0xa,0x22,0x25,0x20,0x20,0x63,
+ 0x20,0x23,0x36,0x44,0x34,0x38,0x30,0x30,0x22,0x2c,0xa,0x22,0x26,0x20,0x20,0x63,
+ 0x20,0x23,0x37,0x30,0x34,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x2a,0x20,0x20,0x63,
+ 0x20,0x23,0x37,0x32,0x34,0x43,0x30,0x30,0x22,0x2c,0xa,0x22,0x3d,0x20,0x20,0x63,
+ 0x20,0x23,0x37,0x34,0x34,0x43,0x30,0x30,0x22,0x2c,0xa,0x22,0x2d,0x20,0x20,0x63,
+ 0x20,0x23,0x37,0x36,0x34,0x45,0x30,0x30,0x22,0x2c,0xa,0x22,0x3b,0x20,0x20,0x63,
+ 0x20,0x23,0x37,0x38,0x35,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x3a,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x30,0x35,0x35,0x30,0x30,0x22,0x2c,0xa,0x22,0x3e,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x31,0x35,0x35,0x30,0x30,0x22,0x2c,0xa,0x22,0x2c,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x33,0x35,0x37,0x30,0x30,0x22,0x2c,0xa,0x22,0x3c,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x36,0x35,0x39,0x30,0x30,0x22,0x2c,0xa,0x22,0x31,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x37,0x35,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x32,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x41,0x35,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x33,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x41,0x35,0x43,0x30,0x30,0x22,0x2c,0xa,0x22,0x34,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x42,0x35,0x43,0x30,0x30,0x22,0x2c,0xa,0x22,0x35,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x43,0x35,0x44,0x30,0x30,0x22,0x2c,0xa,0x22,0x36,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x44,0x35,0x44,0x30,0x30,0x22,0x2c,0xa,0x22,0x37,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x46,0x35,0x45,0x30,0x30,0x22,0x2c,0xa,0x22,0x38,0x20,0x20,0x63,
+ 0x20,0x23,0x38,0x30,0x35,0x39,0x31,0x31,0x22,0x2c,0xa,0x22,0x39,0x20,0x20,0x63,
+ 0x20,0x23,0x39,0x30,0x35,0x46,0x30,0x30,0x22,0x2c,0xa,0x22,0x30,0x20,0x20,0x63,
+ 0x20,0x23,0x39,0x30,0x36,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x71,0x20,0x20,0x63,
+ 0x20,0x23,0x39,0x32,0x36,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x77,0x20,0x20,0x63,
+ 0x20,0x23,0x39,0x34,0x36,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x65,0x20,0x20,0x63,
+ 0x20,0x23,0x39,0x35,0x36,0x33,0x30,0x30,0x22,0x2c,0xa,0x22,0x72,0x20,0x20,0x63,
+ 0x20,0x23,0x39,0x36,0x36,0x34,0x30,0x30,0x22,0x2c,0xa,0x22,0x74,0x20,0x20,0x63,
+ 0x20,0x23,0x39,0x37,0x36,0x34,0x30,0x30,0x22,0x2c,0xa,0x22,0x79,0x20,0x20,0x63,
+ 0x20,0x23,0x39,0x35,0x36,0x39,0x31,0x33,0x22,0x2c,0xa,0x22,0x75,0x20,0x20,0x63,
+ 0x20,0x23,0x39,0x32,0x36,0x43,0x32,0x32,0x22,0x2c,0xa,0x22,0x69,0x20,0x20,0x63,
+ 0x20,0x23,0x39,0x42,0x37,0x37,0x33,0x32,0x22,0x2c,0xa,0x22,0x70,0x20,0x20,0x63,
+ 0x20,0x23,0x42,0x31,0x38,0x44,0x34,0x38,0x22,0x2c,0xa,0x22,0x61,0x20,0x20,0x63,
+ 0x20,0x23,0x42,0x32,0x38,0x45,0x34,0x39,0x22,0x2c,0xa,0x22,0x73,0x20,0x20,0x63,
+ 0x20,0x23,0x42,0x34,0x39,0x30,0x34,0x41,0x22,0x2c,0xa,0x22,0x64,0x20,0x20,0x63,
+ 0x20,0x23,0x42,0x41,0x41,0x33,0x37,0x33,0x22,0x2c,0xa,0x22,0x66,0x20,0x20,0x63,
+ 0x20,0x23,0x41,0x31,0x41,0x31,0x39,0x35,0x22,0x2c,0xa,0x22,0x67,0x20,0x20,0x63,
+ 0x20,0x23,0x41,0x42,0x41,0x42,0x39,0x46,0x22,0x2c,0xa,0x22,0x68,0x20,0x20,0x63,
+ 0x20,0x23,0x41,0x44,0x41,0x44,0x41,0x42,0x22,0x2c,0xa,0x22,0x6a,0x20,0x20,0x63,
+ 0x20,0x23,0x41,0x46,0x41,0x46,0x41,0x42,0x22,0x2c,0xa,0x22,0x6b,0x20,0x20,0x63,
+ 0x20,0x23,0x42,0x33,0x42,0x33,0x41,0x36,0x22,0x2c,0xa,0x22,0x6c,0x20,0x20,0x63,
+ 0x20,0x23,0x42,0x43,0x42,0x43,0x42,0x38,0x22,0x2c,0xa,0x22,0x7a,0x20,0x20,0x63,
+ 0x20,0x23,0x42,0x46,0x42,0x46,0x42,0x43,0x22,0x2c,0xa,0x22,0x78,0x20,0x20,0x63,
+ 0x20,0x23,0x43,0x42,0x42,0x34,0x38,0x39,0x22,0x2c,0xa,0x22,0x63,0x20,0x20,0x63,
+ 0x20,0x23,0x43,0x42,0x42,0x35,0x38,0x41,0x22,0x2c,0xa,0x22,0x76,0x20,0x20,0x63,
+ 0x20,0x23,0x43,0x44,0x42,0x37,0x38,0x42,0x22,0x2c,0xa,0x22,0x62,0x20,0x20,0x63,
+ 0x20,0x23,0x43,0x41,0x42,0x38,0x39,0x31,0x22,0x2c,0xa,0x22,0x6e,0x20,0x20,0x63,
+ 0x20,0x23,0x43,0x39,0x42,0x42,0x39,0x45,0x22,0x2c,0xa,0x22,0x6d,0x20,0x20,0x63,
+ 0x20,0x23,0x43,0x45,0x42,0x45,0x41,0x32,0x22,0x2c,0xa,0x22,0x4d,0x20,0x20,0x63,
+ 0x20,0x23,0x43,0x36,0x43,0x36,0x42,0x43,0x22,0x2c,0xa,0x22,0x4e,0x20,0x20,0x63,
+ 0x20,0x23,0x44,0x39,0x43,0x38,0x41,0x38,0x22,0x2c,0xa,0x22,0x42,0x20,0x20,0x63,
+ 0x20,0x23,0x45,0x38,0x45,0x31,0x42,0x41,0x22,0x2c,0xa,0x22,0x56,0x20,0x20,0x63,
+ 0x20,0x23,0x45,0x38,0x45,0x31,0x42,0x42,0x22,0x2c,0xa,0x22,0x43,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x41,0x31,0x22,0x2c,0xa,0x22,0x5a,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x41,0x30,0x22,0x2c,0xa,0x22,0x41,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x41,0x33,0x22,0x2c,0xa,0x22,0x53,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x41,0x34,0x22,0x2c,0xa,0x22,0x44,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x41,0x36,0x22,0x2c,0xa,0x22,0x46,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x41,0x38,0x22,0x2c,0xa,0x22,0x47,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x41,0x39,0x22,0x2c,0xa,0x22,0x48,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x41,0x38,0x22,0x2c,0xa,0x22,0x4a,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x41,0x41,0x22,0x2c,0xa,0x22,0x4b,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x41,0x42,0x22,0x2c,0xa,0x22,0x4c,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x41,0x42,0x22,0x2c,0xa,0x22,0x50,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x41,0x43,0x22,0x2c,0xa,0x22,0x49,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x41,0x43,0x22,0x2c,0xa,0x22,0x55,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x41,0x45,0x22,0x2c,0xa,0x22,0x59,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x41,0x46,0x22,0x2c,0xa,0x22,0x54,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x42,0x30,0x22,0x2c,0xa,0x22,0x52,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x42,0x31,0x22,0x2c,0xa,0x22,0x45,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x42,0x30,0x22,0x2c,0xa,0x22,0x57,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x42,0x34,0x22,0x2c,0xa,0x22,0x51,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x42,0x35,0x22,0x2c,0xa,0x22,0x21,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x42,0x34,0x22,0x2c,0xa,0x22,0x7e,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x42,0x38,0x22,0x2c,0xa,0x22,0x5e,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x42,0x39,0x22,0x2c,0xa,0x22,0x2f,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x42,0x38,0x22,0x2c,0xa,0x22,0x28,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x42,0x39,0x22,0x2c,0xa,0x22,0x29,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x42,0x42,0x22,0x2c,0xa,0x22,0x5f,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x42,0x41,0x22,0x2c,0xa,0x22,0x60,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x42,0x44,0x22,0x2c,0xa,0x22,0x27,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x42,0x44,0x22,0x2c,0xa,0x22,0x5d,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x42,0x45,0x22,0x2c,0xa,0x22,0x5b,0x20,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x42,0x45,0x22,0x2c,0xa,0x22,0x7b,0x20,0x20,0x63,
+ 0x20,0x23,0x43,0x38,0x43,0x38,0x43,0x31,0x22,0x2c,0xa,0x22,0x7d,0x20,0x20,0x63,
+ 0x20,0x23,0x43,0x41,0x43,0x41,0x43,0x34,0x22,0x2c,0xa,0x22,0x7c,0x20,0x20,0x63,
+ 0x20,0x23,0x43,0x42,0x43,0x42,0x43,0x36,0x22,0x2c,0xa,0x22,0x20,0x2e,0x20,0x63,
+ 0x20,0x23,0x44,0x42,0x44,0x32,0x43,0x31,0x22,0x2c,0xa,0x22,0x2e,0x2e,0x20,0x63,
+ 0x20,0x23,0x44,0x45,0x44,0x46,0x43,0x46,0x22,0x2c,0xa,0x22,0x58,0x2e,0x20,0x63,
+ 0x20,0x23,0x44,0x34,0x44,0x34,0x44,0x31,0x22,0x2c,0xa,0x22,0x6f,0x2e,0x20,0x63,
+ 0x20,0x23,0x45,0x31,0x44,0x35,0x43,0x31,0x22,0x2c,0xa,0x22,0x4f,0x2e,0x20,0x63,
+ 0x20,0x23,0x45,0x33,0x44,0x39,0x43,0x33,0x22,0x2c,0xa,0x22,0x2b,0x2e,0x20,0x63,
+ 0x20,0x23,0x45,0x35,0x44,0x43,0x43,0x43,0x22,0x2c,0xa,0x22,0x40,0x2e,0x20,0x63,
+ 0x20,0x23,0x45,0x38,0x45,0x38,0x44,0x33,0x22,0x2c,0xa,0x22,0x23,0x2e,0x20,0x63,
+ 0x20,0x23,0x45,0x43,0x45,0x43,0x44,0x37,0x22,0x2c,0xa,0x22,0x24,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x30,0x45,0x42,0x44,0x41,0x22,0x2c,0xa,0x22,0x25,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x43,0x32,0x22,0x2c,0xa,0x22,0x26,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x43,0x33,0x22,0x2c,0xa,0x22,0x2a,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x43,0x32,0x22,0x2c,0xa,0x22,0x3d,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x43,0x37,0x22,0x2c,0xa,0x22,0x2d,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x43,0x37,0x22,0x2c,0xa,0x22,0x3b,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x43,0x42,0x22,0x2c,0xa,0x22,0x3a,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x43,0x43,0x22,0x2c,0xa,0x22,0x3e,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x43,0x43,0x22,0x2c,0xa,0x22,0x2c,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x43,0x45,0x22,0x2c,0xa,0x22,0x3c,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x44,0x30,0x22,0x2c,0xa,0x22,0x31,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x44,0x31,0x22,0x2c,0xa,0x22,0x32,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x44,0x30,0x22,0x2c,0xa,0x22,0x33,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x44,0x31,0x22,0x2c,0xa,0x22,0x34,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x44,0x33,0x22,0x2c,0xa,0x22,0x35,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x44,0x35,0x22,0x2c,0xa,0x22,0x36,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x44,0x35,0x22,0x2c,0xa,0x22,0x37,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x44,0x36,0x22,0x2c,0xa,0x22,0x38,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x44,0x37,0x22,0x2c,0xa,0x22,0x39,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x44,0x36,0x22,0x2c,0xa,0x22,0x30,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x44,0x38,0x22,0x2c,0xa,0x22,0x71,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x44,0x41,0x22,0x2c,0xa,0x22,0x77,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x44,0x41,0x22,0x2c,0xa,0x22,0x65,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x44,0x42,0x22,0x2c,0xa,0x22,0x72,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x44,0x43,0x22,0x2c,0xa,0x22,0x74,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x44,0x45,0x22,0x2c,0xa,0x22,0x79,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x44,0x46,0x22,0x2c,0xa,0x22,0x75,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x44,0x45,0x22,0x2c,0xa,0x22,0x69,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x46,0x44,0x46,0x22,0x2c,0xa,0x22,0x70,0x2e,0x20,0x63,
+ 0x20,0x23,0x45,0x39,0x45,0x39,0x45,0x37,0x22,0x2c,0xa,0x22,0x61,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x33,0x46,0x33,0x45,0x39,0x22,0x2c,0xa,0x22,0x73,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x33,0x46,0x33,0x45,0x42,0x22,0x2c,0xa,0x22,0x64,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x35,0x46,0x35,0x45,0x38,0x22,0x2c,0xa,0x22,0x66,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x38,0x46,0x38,0x45,0x33,0x22,0x2c,0xa,0x22,0x67,0x2e,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x46,0x45,0x30,0x22,0x2c,0xa,0x22,0x68,0x2e,0x20,0x63,
+ 0x20,0x4c,0x69,0x67,0x68,0x74,0x59,0x65,0x6c,0x6c,0x6f,0x77,0x22,0x2c,0xa,0x22,
+ 0x6a,0x2e,0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x45,0x31,0x22,0x2c,0xa,0x22,
+ 0x6b,0x2e,0x20,0x63,0x20,0x23,0x46,0x45,0x46,0x46,0x45,0x33,0x22,0x2c,0xa,0x22,
+ 0x6c,0x2e,0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x45,0x33,0x22,0x2c,0xa,0x22,
+ 0x7a,0x2e,0x20,0x63,0x20,0x23,0x46,0x44,0x46,0x45,0x45,0x37,0x22,0x2c,0xa,0x22,
+ 0x78,0x2e,0x20,0x63,0x20,0x23,0x46,0x45,0x46,0x46,0x45,0x34,0x22,0x2c,0xa,0x22,
+ 0x63,0x2e,0x20,0x63,0x20,0x23,0x46,0x45,0x46,0x46,0x45,0x35,0x22,0x2c,0xa,0x22,
+ 0x76,0x2e,0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x45,0x34,0x22,0x2c,0xa,0x22,
+ 0x62,0x2e,0x20,0x63,0x20,0x23,0x46,0x42,0x46,0x42,0x45,0x39,0x22,0x2c,0xa,0x22,
+ 0x6e,0x2e,0x20,0x63,0x20,0x23,0x46,0x45,0x46,0x46,0x45,0x38,0x22,0x2c,0xa,0x22,
+ 0x6d,0x2e,0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x45,0x38,0x22,0x2c,0xa,0x22,
+ 0x4d,0x2e,0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x45,0x39,0x22,0x2c,0xa,0x22,
+ 0x4e,0x2e,0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x45,0x41,0x22,0x2c,0xa,0x22,
+ 0x42,0x2e,0x20,0x63,0x20,0x23,0x46,0x45,0x46,0x46,0x45,0x43,0x22,0x2c,0xa,0x22,
+ 0x56,0x2e,0x20,0x63,0x20,0x23,0x46,0x45,0x46,0x46,0x45,0x44,0x22,0x2c,0xa,0x22,
+ 0x43,0x2e,0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x45,0x43,0x22,0x2c,0xa,0x22,
+ 0x5a,0x2e,0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x45,0x44,0x22,0x2c,0xa,0x22,
+ 0x41,0x2e,0x20,0x63,0x20,0x23,0x46,0x45,0x46,0x46,0x45,0x46,0x22,0x2c,0xa,0x22,
+ 0x53,0x2e,0x20,0x63,0x20,0x23,0x46,0x34,0x46,0x34,0x46,0x30,0x22,0x2c,0xa,0x22,
+ 0x44,0x2e,0x20,0x63,0x20,0x23,0x46,0x34,0x46,0x34,0x46,0x33,0x22,0x2c,0xa,0x22,
+ 0x46,0x2e,0x20,0x63,0x20,0x23,0x46,0x35,0x46,0x35,0x46,0x34,0x22,0x2c,0xa,0x22,
+ 0x47,0x2e,0x20,0x63,0x20,0x23,0x46,0x38,0x46,0x38,0x46,0x36,0x22,0x2c,0xa,0x22,
+ 0x48,0x2e,0x20,0x63,0x20,0x69,0x76,0x6f,0x72,0x79,0x22,0x2c,0xa,0x22,0x4a,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x31,0x22,0x2c,0xa,0x22,0x4b,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x45,0x46,0x46,0x46,0x33,0x22,0x2c,0xa,0x22,0x4c,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x33,0x22,0x2c,0xa,0x22,0x50,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x45,0x46,0x46,0x46,0x34,0x22,0x2c,0xa,0x22,0x49,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x34,0x22,0x2c,0xa,0x22,0x55,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x45,0x46,0x46,0x46,0x37,0x22,0x2c,0xa,0x22,0x59,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x36,0x22,0x2c,0xa,0x22,0x54,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x37,0x22,0x2c,0xa,0x22,0x52,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x42,0x46,0x42,0x46,0x42,0x22,0x2c,0xa,0x22,0x45,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x38,0x22,0x2c,0xa,0x22,0x57,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x39,0x22,0x2c,0xa,0x22,0x51,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x41,0x22,0x2c,0xa,0x22,0x21,0x2e,
+ 0x20,0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x42,0x22,0x2c,0xa,0x22,0x7e,0x2e,
+ 0x20,0x63,0x20,0x67,0x72,0x61,0x79,0x39,0x39,0x22,0x2c,0xa,0x22,0x5e,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x46,0x46,0x46,0x44,0x22,0x2c,0xa,0x22,0x2f,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x43,0x22,0x2c,0xa,0x22,0x28,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x44,0x22,0x2c,0xa,0x22,0x29,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x46,0x46,0x45,0x22,0x2c,0xa,0x22,0x5f,0x2e,0x20,
+ 0x63,0x20,0x67,0x72,0x61,0x79,0x31,0x30,0x30,0x22,0x2c,0xa,0x22,0x60,0x2e,0x20,
+ 0x63,0x20,0x4e,0x6f,0x6e,0x65,0x22,0x2c,0xa,0x2f,0x2a,0x20,0x70,0x69,0x78,0x65,
+ 0x6c,0x73,0x20,0x2a,0x2f,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x77,0x20,0x32,0x20,0x31,0x20,0x77,0x20,0x34,0x20,0x34,0x20,0x34,0x20,0x36,
+ 0x20,0x77,0x20,0x39,0x20,0x36,0x20,0x2d,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,
+ 0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x72,0x20,0x73,0x20,0x70,0x20,0x70,0x20,0x63,0x20,0x63,0x20,0x63,
+ 0x20,0x63,0x20,0x4e,0x20,0x4f,0x2e,0x2b,0x2e,0x6f,0x2e,0x79,0x20,0x23,0x20,0x20,
+ 0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x72,0x20,0x29,0x2e,0x29,0x2e,0x29,0x2e,0x29,
+ 0x2e,0x29,0x2e,0x29,0x2e,0x29,0x2e,0x29,0x2e,0x46,0x2e,0x70,0x2e,0x29,0x2e,0x20,
+ 0x2e,0x26,0x20,0x6f,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x29,0x2e,0x45,
+ 0x2e,0x29,0x2e,0x45,0x2e,0x29,0x2e,0x45,0x2e,0x45,0x2e,0x45,0x2e,0x53,0x2e,0x58,
+ 0x2e,0x29,0x2e,0x52,0x2e,0x6e,0x20,0x24,0x20,0x2b,0x20,0x20,0x20,0x20,0x20,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,
+ 0x20,0x45,0x2e,0x59,0x2e,0x59,0x2e,0x45,0x2e,0x59,0x2e,0x45,0x2e,0x45,0x2e,0x45,
+ 0x2e,0x61,0x2e,0x7c,0x20,0x29,0x2e,0x29,0x2e,0x44,0x2e,0x6d,0x20,0x25,0x20,0x20,
+ 0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,
+ 0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x77,0x20,0x45,0x2e,0x59,0x2e,0x59,0x2e,0x4a,0x2e,0x59,0x2e,0x4a,
+ 0x2e,0x59,0x2e,0x59,0x2e,0x61,0x2e,0x7c,0x20,0x29,0x2e,0x29,0x2e,0x29,0x2e,0x44,
+ 0x2e,0x3e,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x59,0x2e,0x4a,0x2e,0x4a,0x2e,0x4a,
+ 0x2e,0x4a,0x2e,0x4a,0x2e,0x4a,0x2e,0x4a,0x2e,0x61,0x2e,0x4d,0x20,0x6c,0x20,0x68,
+ 0x20,0x68,0x20,0x7b,0x20,0x3b,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x59,0x2e,0x42,
+ 0x2e,0x42,0x2e,0x42,0x2e,0x4e,0x2e,0x4e,0x2e,0x42,0x2e,0x42,0x2e,0x62,0x2e,0x2e,
+ 0x2e,0x6b,0x20,0x66,0x20,0x68,0x20,0x7d,0x20,0x3b,0x20,0x20,0x20,0x20,0x20,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,
+ 0x20,0x4a,0x2e,0x4e,0x2e,0x4e,0x2e,0x4e,0x2e,0x4e,0x2e,0x4e,0x2e,0x4e,0x2e,0x4e,
+ 0x2e,0x6c,0x2e,0x66,0x2e,0x23,0x2e,0x40,0x2e,0x23,0x2e,0x61,0x2e,0x3e,0x20,0x20,
+ 0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,
+ 0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x77,0x20,0x4a,0x2e,0x6c,0x2e,0x6c,0x2e,0x6c,0x2e,0x6c,0x2e,0x6c,
+ 0x2e,0x6c,0x2e,0x6c,0x2e,0x6c,0x2e,0x6c,0x2e,0x6c,0x2e,0x6c,0x2e,0x6c,0x2e,0x4a,
+ 0x2e,0x3e,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x4a,0x2e,0x72,0x2e,0x6c,0x2e,0x6c,
+ 0x2e,0x72,0x2e,0x6c,0x2e,0x72,0x2e,0x6c,0x2e,0x72,0x2e,0x6c,0x2e,0x72,0x2e,0x6c,
+ 0x2e,0x72,0x2e,0x4a,0x2e,0x31,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x42,0x2e,0x72,
+ 0x2e,0x72,0x2e,0x71,0x2e,0x71,0x2e,0x71,0x2e,0x71,0x2e,0x71,0x2e,0x71,0x2e,0x72,
+ 0x2e,0x71,0x2e,0x71,0x2e,0x72,0x2e,0x42,0x2e,0x3e,0x20,0x20,0x20,0x20,0x20,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,
+ 0x20,0x4e,0x2e,0x35,0x2e,0x35,0x2e,0x35,0x2e,0x35,0x2e,0x71,0x2e,0x35,0x2e,0x35,
+ 0x2e,0x35,0x2e,0x35,0x2e,0x35,0x2e,0x35,0x2e,0x35,0x2e,0x42,0x2e,0x2c,0x20,0x20,
+ 0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,
+ 0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x77,0x20,0x4e,0x2e,0x3c,0x2e,0x3c,0x2e,0x3c,0x2e,0x3c,0x2e,0x3c,
+ 0x2e,0x3c,0x2e,0x3c,0x2e,0x35,0x2e,0x3c,0x2e,0x3c,0x2e,0x3c,0x2e,0x3c,0x2e,0x4e,
+ 0x2e,0x2c,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x6c,0x2e,0x2c,0x2e,0x3b,0x2e,0x3b,
+ 0x2e,0x3b,0x2e,0x2c,0x2e,0x3b,0x2e,0x2c,0x2e,0x3b,0x2e,0x2c,0x2e,0x3b,0x2e,0x3b,
+ 0x2e,0x3b,0x2e,0x6c,0x2e,0x2c,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x6c,0x2e,0x2d,
+ 0x2e,0x2d,0x2e,0x2d,0x2e,0x2d,0x2e,0x2d,0x2e,0x2d,0x2e,0x3b,0x2e,0x2d,0x2e,0x2d,
+ 0x2e,0x2d,0x2e,0x2d,0x2e,0x3b,0x2e,0x6c,0x2e,0x3e,0x20,0x20,0x20,0x20,0x20,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,
+ 0x20,0x6c,0x2e,0x2d,0x2e,0x25,0x2e,0x25,0x2e,0x25,0x2e,0x25,0x2e,0x25,0x2e,0x25,
+ 0x2e,0x25,0x2e,0x25,0x2e,0x25,0x2e,0x25,0x2e,0x25,0x2e,0x6c,0x2e,0x2c,0x20,0x20,
+ 0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,
+ 0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x77,0x20,0x72,0x2e,0x27,0x20,0x27,0x20,0x27,0x20,0x27,0x20,0x27,
+ 0x20,0x29,0x20,0x27,0x20,0x27,0x20,0x27,0x20,0x27,0x20,0x27,0x20,0x27,0x20,0x72,
+ 0x2e,0x2c,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x72,0x2e,0x29,0x20,0x29,0x20,0x57,
+ 0x20,0x29,0x20,0x29,0x20,0x29,0x20,0x29,0x20,0x29,0x20,0x29,0x20,0x57,0x20,0x29,
+ 0x20,0x29,0x20,0x71,0x2e,0x2c,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x71,0x2e,0x57,
+ 0x20,0x57,0x20,0x57,0x20,0x57,0x20,0x57,0x20,0x57,0x20,0x57,0x20,0x57,0x20,0x57,
+ 0x20,0x57,0x20,0x57,0x20,0x57,0x20,0x71,0x2e,0x2c,0x20,0x20,0x20,0x20,0x20,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,
+ 0x20,0x35,0x2e,0x59,0x20,0x59,0x20,0x57,0x20,0x59,0x20,0x59,0x20,0x59,0x20,0x59,
+ 0x20,0x59,0x20,0x59,0x20,0x59,0x20,0x59,0x20,0x59,0x20,0x35,0x2e,0x2c,0x20,0x20,
+ 0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,
+ 0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x77,0x20,0x35,0x2e,0x4a,0x20,0x4a,0x20,0x4a,0x20,0x59,0x20,0x4a,
+ 0x20,0x59,0x20,0x59,0x20,0x4a,0x20,0x59,0x20,0x4a,0x20,0x4a,0x20,0x59,0x20,0x71,
+ 0x2e,0x2c,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x35,0x2e,0x4a,0x20,0x4a,0x20,0x44,
+ 0x20,0x4a,0x20,0x4a,0x20,0x44,0x20,0x4a,0x20,0x44,0x20,0x4a,0x20,0x57,0x20,0x29,
+ 0x20,0x2c,0x2e,0x24,0x2e,0x2d,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x3c,0x2e,0x5a,
+ 0x20,0x44,0x20,0x44,0x20,0x5a,0x20,0x44,0x20,0x4a,0x20,0x59,0x20,0x27,0x20,0x2c,
+ 0x2e,0x42,0x20,0x62,0x20,0x69,0x20,0x2d,0x20,0x4f,0x20,0x20,0x20,0x20,0x20,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,
+ 0x20,0x3c,0x2e,0x5a,0x20,0x5a,0x20,0x5a,0x20,0x59,0x20,0x29,0x20,0x3c,0x2e,0x42,
+ 0x20,0x64,0x20,0x75,0x20,0x26,0x20,0x40,0x20,0x58,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,
+ 0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x77,0x20,0x2c,0x2e,0x4a,0x20,0x29,0x20,0x2c,0x2e,0x42,0x20,0x64,
+ 0x20,0x79,0x20,0x26,0x20,0x6f,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x77,0x20,0x59,0x2e,0x56,0x20,0x64,0x20,0x75,
+ 0x20,0x26,0x20,0x6f,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x31,0x20,0x34,0x20,0x26,
+ 0x20,0x6f,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,0x2c,0xa,0x22,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x22,
+ 0x2c,0xa,0x22,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,0x2e,0x60,
+ 0x2e,0x60,0x2e,0x22,0xa,0x7d,0x3b,0xa,
+ # /home/rdale/src/kde/branches/KDE/3.5/kdevelop/languages/ruby/app_templates/qtruby4makeapp/editpaste.xpm
+ 0x0,0x0,0x18,0xf8,
+ 0x2f,
+ 0x2a,0x20,0x58,0x50,0x4d,0x20,0x2a,0x2f,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,
+ 0x63,0x68,0x61,0x72,0x20,0x2a,0x65,0x64,0x69,0x74,0x70,0x61,0x73,0x74,0x65,0x5b,
+ 0x5d,0x20,0x3d,0x20,0x7b,0xa,0x2f,0x2a,0x20,0x63,0x6f,0x6c,0x75,0x6d,0x6e,0x73,
+ 0x20,0x72,0x6f,0x77,0x73,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x73,0x20,0x63,0x68,0x61,
+ 0x72,0x73,0x2d,0x70,0x65,0x72,0x2d,0x70,0x69,0x78,0x65,0x6c,0x20,0x2a,0x2f,0xa,
+ 0x22,0x33,0x32,0x20,0x33,0x32,0x20,0x32,0x35,0x37,0x20,0x32,0x22,0x2c,0xa,0x22,
+ 0x20,0x20,0x20,0x63,0x20,0x62,0x6c,0x61,0x63,0x6b,0x22,0x2c,0xa,0x22,0x2e,0x20,
+ 0x20,0x63,0x20,0x23,0x30,0x44,0x30,0x39,0x30,0x30,0x22,0x2c,0xa,0x22,0x58,0x20,
+ 0x20,0x63,0x20,0x23,0x31,0x39,0x31,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x6f,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x32,0x31,0x37,0x30,0x30,0x22,0x2c,0xa,0x22,0x4f,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x41,0x31,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x2b,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x33,0x32,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x40,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x45,0x32,0x39,0x30,0x30,0x22,0x2c,0xa,0x22,0x23,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x41,0x32,0x38,0x30,0x34,0x22,0x2c,0xa,0x22,0x24,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x44,0x33,0x33,0x30,0x30,0x22,0x2c,0xa,0x22,0x25,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x42,0x33,0x45,0x31,0x35,0x22,0x2c,0xa,0x22,0x26,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x34,0x33,0x39,0x31,0x42,0x22,0x2c,0xa,0x22,0x2a,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x34,0x33,0x38,0x30,0x30,0x22,0x2c,0xa,0x22,0x3d,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x41,0x33,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x2d,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x44,0x34,0x30,0x31,0x35,0x22,0x2c,0xa,0x22,0x3b,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x32,0x34,0x45,0x32,0x35,0x22,0x2c,0xa,0x22,0x3a,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x41,0x34,0x46,0x32,0x43,0x22,0x2c,0xa,0x22,0x3e,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x32,0x34,0x45,0x33,0x44,0x22,0x2c,0xa,0x22,0x2c,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x38,0x35,0x36,0x32,0x46,0x22,0x2c,0xa,0x22,0x3c,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x33,0x35,0x30,0x33,0x45,0x22,0x2c,0xa,0x22,0x31,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x45,0x36,0x32,0x33,0x42,0x22,0x2c,0xa,0x22,0x32,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x33,0x34,0x31,0x30,0x30,0x22,0x2c,0xa,0x22,0x33,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x38,0x34,0x35,0x30,0x30,0x22,0x2c,0xa,0x22,0x34,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x45,0x34,0x39,0x30,0x30,0x22,0x2c,0xa,0x22,0x35,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x31,0x34,0x46,0x31,0x31,0x22,0x2c,0xa,0x22,0x36,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x38,0x35,0x34,0x31,0x36,0x22,0x2c,0xa,0x22,0x37,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x33,0x34,0x43,0x30,0x30,0x22,0x2c,0xa,0x22,0x38,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x38,0x34,0x46,0x30,0x30,0x22,0x2c,0xa,0x22,0x39,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x35,0x35,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x30,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x43,0x35,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x71,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x43,0x35,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x77,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x42,0x35,0x37,0x30,0x46,0x22,0x2c,0xa,0x22,0x65,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x39,0x35,0x36,0x32,0x46,0x22,0x2c,0xa,0x22,0x72,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x38,0x36,0x36,0x30,0x30,0x22,0x2c,0xa,0x22,0x74,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x46,0x36,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x79,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x36,0x36,0x33,0x30,0x30,0x22,0x2c,0xa,0x22,0x75,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x30,0x36,0x31,0x33,0x46,0x22,0x2c,0xa,0x22,0x69,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x43,0x36,0x34,0x32,0x32,0x22,0x2c,0xa,0x22,0x70,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x34,0x35,0x31,0x34,0x33,0x22,0x2c,0xa,0x22,0x61,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x34,0x35,0x32,0x34,0x42,0x22,0x2c,0xa,0x22,0x73,0x20,
+ 0x20,0x63,0x20,0x67,0x72,0x61,0x79,0x33,0x32,0x22,0x2c,0xa,0x22,0x64,0x20,0x20,
+ 0x63,0x20,0x23,0x35,0x44,0x35,0x44,0x35,0x37,0x22,0x2c,0xa,0x22,0x66,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x31,0x36,0x36,0x34,0x31,0x22,0x2c,0xa,0x22,0x67,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x37,0x36,0x39,0x35,0x44,0x22,0x2c,0xa,0x22,0x68,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x42,0x37,0x33,0x34,0x44,0x22,0x2c,0xa,0x22,0x6a,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x43,0x37,0x35,0x35,0x33,0x22,0x2c,0xa,0x22,0x6b,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x31,0x36,0x32,0x36,0x31,0x22,0x2c,0xa,0x22,0x6c,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x38,0x36,0x41,0x36,0x34,0x22,0x2c,0xa,0x22,0x7a,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x42,0x37,0x31,0x36,0x32,0x22,0x2c,0xa,0x22,0x78,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x32,0x37,0x32,0x37,0x32,0x22,0x2c,0xa,0x22,0x63,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x30,0x33,0x44,0x46,0x46,0x22,0x2c,0xa,0x22,0x76,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x30,0x34,0x33,0x46,0x46,0x22,0x2c,0xa,0x22,0x62,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x30,0x34,0x42,0x46,0x46,0x22,0x2c,0xa,0x22,0x6e,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x30,0x35,0x33,0x46,0x46,0x22,0x2c,0xa,0x22,0x6d,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x31,0x35,0x41,0x46,0x46,0x22,0x2c,0xa,0x22,0x4d,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x30,0x36,0x33,0x46,0x46,0x22,0x2c,0xa,0x22,0x4e,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x34,0x36,0x44,0x46,0x46,0x22,0x2c,0xa,0x22,0x42,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x38,0x36,0x35,0x46,0x46,0x22,0x2c,0xa,0x22,0x56,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x33,0x37,0x38,0x46,0x46,0x22,0x2c,0xa,0x22,0x43,0x20,0x20,
+ 0x63,0x20,0x23,0x31,0x36,0x36,0x33,0x46,0x46,0x22,0x2c,0xa,0x22,0x5a,0x20,0x20,
+ 0x63,0x20,0x23,0x31,0x35,0x37,0x36,0x46,0x46,0x22,0x2c,0xa,0x22,0x41,0x20,0x20,
+ 0x63,0x20,0x23,0x32,0x36,0x37,0x38,0x46,0x46,0x22,0x2c,0xa,0x22,0x53,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x46,0x37,0x42,0x38,0x34,0x22,0x2c,0xa,0x22,0x44,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x37,0x38,0x35,0x36,0x44,0x22,0x2c,0xa,0x22,0x46,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x42,0x38,0x42,0x37,0x35,0x22,0x2c,0xa,0x22,0x47,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x30,0x38,0x33,0x46,0x46,0x22,0x2c,0xa,0x22,0x48,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x31,0x39,0x37,0x46,0x46,0x22,0x2c,0xa,0x22,0x4a,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x42,0x39,0x32,0x46,0x46,0x22,0x2c,0xa,0x22,0x4b,0x20,0x20,
+ 0x63,0x20,0x23,0x31,0x33,0x38,0x35,0x46,0x46,0x22,0x2c,0xa,0x22,0x4c,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x31,0x41,0x35,0x46,0x46,0x22,0x2c,0xa,0x22,0x50,0x20,0x20,
+ 0x63,0x20,0x23,0x30,0x44,0x42,0x35,0x46,0x46,0x22,0x2c,0xa,0x22,0x49,0x20,0x20,
+ 0x63,0x20,0x23,0x33,0x30,0x39,0x36,0x46,0x46,0x22,0x2c,0xa,0x22,0x55,0x20,0x20,
+ 0x63,0x20,0x23,0x32,0x44,0x41,0x44,0x46,0x46,0x22,0x2c,0xa,0x22,0x59,0x20,0x20,
+ 0x63,0x20,0x23,0x32,0x46,0x42,0x43,0x46,0x46,0x22,0x2c,0xa,0x22,0x54,0x20,0x20,
+ 0x63,0x20,0x23,0x32,0x32,0x43,0x36,0x46,0x46,0x22,0x2c,0xa,0x22,0x52,0x20,0x20,
+ 0x63,0x20,0x23,0x32,0x41,0x43,0x35,0x46,0x46,0x22,0x2c,0xa,0x22,0x45,0x20,0x20,
+ 0x63,0x20,0x23,0x33,0x30,0x44,0x30,0x46,0x46,0x22,0x2c,0xa,0x22,0x57,0x20,0x20,
+ 0x63,0x20,0x23,0x33,0x38,0x44,0x35,0x46,0x46,0x22,0x2c,0xa,0x22,0x51,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x34,0x39,0x33,0x46,0x31,0x22,0x2c,0xa,0x22,0x21,0x20,0x20,
+ 0x63,0x20,0x23,0x35,0x46,0x38,0x33,0x46,0x46,0x22,0x2c,0xa,0x22,0x7e,0x20,0x20,
+ 0x63,0x20,0x23,0x35,0x46,0x38,0x41,0x46,0x46,0x22,0x2c,0xa,0x22,0x5e,0x20,0x20,
+ 0x63,0x20,0x23,0x35,0x32,0x39,0x30,0x45,0x34,0x22,0x2c,0xa,0x22,0x2f,0x20,0x20,
+ 0x63,0x20,0x23,0x35,0x46,0x39,0x32,0x46,0x46,0x22,0x2c,0xa,0x22,0x28,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x43,0x41,0x41,0x46,0x45,0x22,0x2c,0xa,0x22,0x29,0x20,0x20,
+ 0x63,0x20,0x23,0x34,0x30,0x42,0x38,0x46,0x46,0x22,0x2c,0xa,0x22,0x5f,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x37,0x39,0x44,0x43,0x42,0x22,0x2c,0xa,0x22,0x60,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x36,0x39,0x33,0x45,0x32,0x22,0x2c,0xa,0x22,0x27,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x32,0x39,0x30,0x46,0x46,0x22,0x2c,0xa,0x22,0x5d,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x34,0x39,0x44,0x46,0x46,0x22,0x2c,0xa,0x22,0x5b,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x31,0x41,0x36,0x45,0x35,0x22,0x2c,0xa,0x22,0x7b,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x39,0x41,0x34,0x46,0x46,0x22,0x2c,0xa,0x22,0x7d,0x20,0x20,
+ 0x63,0x20,0x23,0x37,0x46,0x42,0x33,0x46,0x46,0x22,0x2c,0xa,0x22,0x7c,0x20,0x20,
+ 0x63,0x20,0x23,0x36,0x38,0x42,0x38,0x46,0x33,0x22,0x2c,0xa,0x22,0x20,0x2e,0x20,
+ 0x63,0x20,0x23,0x34,0x32,0x44,0x43,0x46,0x46,0x22,0x2c,0xa,0x22,0x2e,0x2e,0x20,
+ 0x63,0x20,0x23,0x34,0x37,0x45,0x30,0x46,0x46,0x22,0x2c,0xa,0x22,0x58,0x2e,0x20,
+ 0x63,0x20,0x23,0x35,0x38,0x45,0x39,0x46,0x46,0x22,0x2c,0xa,0x22,0x6f,0x2e,0x20,
+ 0x63,0x20,0x23,0x36,0x34,0x43,0x30,0x45,0x42,0x22,0x2c,0xa,0x22,0x4f,0x2e,0x20,
+ 0x63,0x20,0x23,0x36,0x41,0x44,0x46,0x45,0x46,0x22,0x2c,0xa,0x22,0x2b,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x32,0x35,0x36,0x30,0x30,0x22,0x2c,0xa,0x22,0x40,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x34,0x35,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x23,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x42,0x35,0x43,0x30,0x30,0x22,0x2c,0xa,0x22,0x24,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x30,0x35,0x46,0x30,0x30,0x22,0x2c,0xa,0x22,0x25,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x43,0x36,0x31,0x30,0x33,0x22,0x2c,0xa,0x22,0x26,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x37,0x36,0x38,0x30,0x37,0x22,0x2c,0xa,0x22,0x2a,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x41,0x36,0x31,0x31,0x31,0x22,0x2c,0xa,0x22,0x3d,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x38,0x36,0x45,0x31,0x42,0x22,0x2c,0xa,0x22,0x2d,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x38,0x37,0x36,0x30,0x30,0x22,0x2c,0xa,0x22,0x3b,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x43,0x37,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x3a,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x33,0x36,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x3e,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x38,0x36,0x38,0x30,0x30,0x22,0x2c,0xa,0x22,0x2c,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x32,0x36,0x43,0x32,0x32,0x22,0x2c,0xa,0x22,0x3c,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x38,0x37,0x41,0x33,0x46,0x22,0x2c,0xa,0x22,0x31,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x30,0x37,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x32,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x32,0x37,0x35,0x31,0x31,0x22,0x2c,0xa,0x22,0x33,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x39,0x37,0x44,0x31,0x35,0x22,0x2c,0xa,0x22,0x34,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x37,0x37,0x42,0x31,0x34,0x22,0x2c,0xa,0x22,0x35,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x39,0x38,0x37,0x31,0x32,0x22,0x2c,0xa,0x22,0x36,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x36,0x38,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x37,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x37,0x38,0x46,0x30,0x30,0x22,0x2c,0xa,0x22,0x38,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x44,0x38,0x30,0x31,0x36,0x22,0x2c,0xa,0x22,0x39,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x43,0x39,0x36,0x30,0x30,0x22,0x2c,0xa,0x22,0x30,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x42,0x38,0x46,0x30,0x30,0x22,0x2c,0xa,0x22,0x71,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x39,0x39,0x42,0x32,0x41,0x22,0x2c,0xa,0x22,0x77,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x39,0x41,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x65,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x33,0x41,0x36,0x33,0x43,0x22,0x2c,0xa,0x22,0x72,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x35,0x38,0x44,0x34,0x33,0x22,0x2c,0xa,0x22,0x74,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x38,0x38,0x46,0x34,0x34,0x22,0x2c,0xa,0x22,0x79,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x41,0x39,0x33,0x34,0x36,0x22,0x2c,0xa,0x22,0x75,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x46,0x39,0x39,0x34,0x38,0x22,0x2c,0xa,0x22,0x69,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x42,0x38,0x39,0x37,0x43,0x22,0x2c,0xa,0x22,0x70,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x35,0x38,0x46,0x36,0x46,0x22,0x2c,0xa,0x22,0x61,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x38,0x39,0x33,0x37,0x42,0x22,0x2c,0xa,0x22,0x73,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x36,0x38,0x34,0x34,0x33,0x22,0x2c,0xa,0x22,0x64,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x30,0x38,0x43,0x34,0x31,0x22,0x2c,0xa,0x22,0x66,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x46,0x39,0x34,0x36,0x32,0x22,0x2c,0xa,0x22,0x67,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x33,0x39,0x38,0x36,0x34,0x22,0x2c,0xa,0x22,0x68,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x32,0x41,0x38,0x35,0x30,0x22,0x2c,0xa,0x22,0x6a,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x44,0x42,0x33,0x35,0x35,0x22,0x2c,0xa,0x22,0x6b,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x33,0x39,0x37,0x32,0x46,0x22,0x2c,0xa,0x22,0x6c,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x35,0x41,0x34,0x30,0x30,0x22,0x2c,0xa,0x22,0x7a,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x43,0x41,0x43,0x30,0x30,0x22,0x2c,0xa,0x22,0x78,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x37,0x42,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x63,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x43,0x41,0x30,0x33,0x30,0x22,0x2c,0xa,0x22,0x76,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x42,0x42,0x34,0x33,0x45,0x22,0x2c,0xa,0x22,0x62,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x34,0x41,0x44,0x30,0x43,0x22,0x2c,0xa,0x22,0x6e,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x43,0x42,0x36,0x30,0x30,0x22,0x2c,0xa,0x22,0x6d,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x44,0x42,0x39,0x30,0x30,0x22,0x2c,0xa,0x22,0x4d,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x32,0x42,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x4e,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x31,0x42,0x38,0x34,0x43,0x22,0x2c,0xa,0x22,0x42,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x31,0x42,0x37,0x35,0x37,0x22,0x2c,0xa,0x22,0x56,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x35,0x42,0x42,0x35,0x38,0x22,0x2c,0xa,0x22,0x43,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x39,0x42,0x45,0x35,0x41,0x22,0x2c,0xa,0x22,0x5a,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x32,0x41,0x39,0x37,0x38,0x22,0x2c,0xa,0x22,0x41,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x46,0x43,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x53,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x44,0x43,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x44,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x36,0x43,0x33,0x30,0x30,0x22,0x2c,0xa,0x22,0x46,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x44,0x31,0x30,0x30,0x22,0x2c,0xa,0x22,0x47,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x44,0x42,0x30,0x30,0x22,0x2c,0xa,0x22,0x48,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x44,0x46,0x30,0x45,0x22,0x2c,0xa,0x22,0x4a,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x35,0x44,0x35,0x30,0x30,0x22,0x2c,0xa,0x22,0x4b,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x42,0x43,0x44,0x33,0x39,0x22,0x2c,0xa,0x22,0x4c,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x38,0x33,0x32,0x22,0x2c,0xa,0x22,0x50,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x34,0x33,0x32,0x22,0x2c,0xa,0x22,0x49,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x45,0x43,0x32,0x35,0x43,0x22,0x2c,0xa,0x22,0x55,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x37,0x43,0x36,0x34,0x38,0x22,0x2c,0xa,0x22,0x59,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x44,0x43,0x37,0x34,0x42,0x22,0x2c,0xa,0x22,0x54,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x30,0x43,0x35,0x35,0x45,0x22,0x2c,0xa,0x22,0x52,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x33,0x43,0x38,0x35,0x46,0x22,0x2c,0xa,0x22,0x45,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x35,0x43,0x39,0x36,0x30,0x22,0x2c,0xa,0x22,0x57,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x44,0x44,0x32,0x36,0x34,0x22,0x2c,0xa,0x22,0x51,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x30,0x43,0x41,0x34,0x43,0x22,0x2c,0xa,0x22,0x21,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x37,0x44,0x31,0x34,0x45,0x22,0x2c,0xa,0x22,0x7e,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x46,0x44,0x41,0x35,0x31,0x22,0x2c,0xa,0x22,0x5e,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x34,0x44,0x30,0x35,0x30,0x22,0x2c,0xa,0x22,0x2f,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x39,0x44,0x34,0x35,0x32,0x22,0x2c,0xa,0x22,0x28,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x44,0x44,0x35,0x33,0x22,0x2c,0xa,0x22,0x29,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x32,0x44,0x37,0x36,0x35,0x22,0x2c,0xa,0x22,0x5f,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x39,0x44,0x44,0x36,0x39,0x22,0x2c,0xa,0x22,0x60,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x36,0x44,0x44,0x36,0x38,0x22,0x2c,0xa,0x22,0x27,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x44,0x44,0x42,0x36,0x45,0x22,0x2c,0xa,0x22,0x5d,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x45,0x34,0x46,0x22,0x2c,0xa,0x22,0x5b,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x45,0x33,0x35,0x34,0x22,0x2c,0xa,0x22,0x7b,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x45,0x41,0x35,0x35,0x22,0x2c,0xa,0x22,0x7d,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x37,0x45,0x31,0x35,0x33,0x22,0x2c,0xa,0x22,0x7c,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x46,0x30,0x35,0x36,0x22,0x2c,0xa,0x22,0x20,0x58,0x20,
+ 0x63,0x20,0x23,0x45,0x43,0x45,0x31,0x36,0x41,0x22,0x2c,0xa,0x22,0x2e,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x31,0x45,0x35,0x36,0x44,0x22,0x2c,0xa,0x22,0x58,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x37,0x45,0x41,0x36,0x46,0x22,0x2c,0xa,0x22,0x6f,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x37,0x45,0x42,0x37,0x30,0x22,0x2c,0xa,0x22,0x4f,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x39,0x45,0x43,0x37,0x30,0x22,0x2c,0xa,0x22,0x2b,0x58,0x20,
+ 0x63,0x20,0x23,0x46,0x45,0x46,0x33,0x37,0x32,0x22,0x2c,0xa,0x22,0x40,0x58,0x20,
+ 0x63,0x20,0x23,0x39,0x37,0x39,0x34,0x38,0x36,0x22,0x2c,0xa,0x22,0x23,0x58,0x20,
+ 0x63,0x20,0x67,0x72,0x61,0x79,0x36,0x30,0x22,0x2c,0xa,0x22,0x24,0x58,0x20,0x63,
+ 0x20,0x23,0x39,0x36,0x39,0x35,0x39,0x36,0x22,0x2c,0xa,0x22,0x25,0x58,0x20,0x63,
+ 0x20,0x23,0x38,0x41,0x41,0x31,0x39,0x33,0x22,0x2c,0xa,0x22,0x26,0x58,0x20,0x63,
+ 0x20,0x23,0x38,0x32,0x41,0x38,0x39,0x42,0x22,0x2c,0xa,0x22,0x2a,0x58,0x20,0x63,
+ 0x20,0x23,0x38,0x43,0x41,0x45,0x41,0x33,0x22,0x2c,0xa,0x22,0x3d,0x58,0x20,0x63,
+ 0x20,0x23,0x38,0x36,0x41,0x37,0x41,0x39,0x22,0x2c,0xa,0x22,0x2d,0x58,0x20,0x63,
+ 0x20,0x23,0x38,0x42,0x41,0x32,0x42,0x31,0x22,0x2c,0xa,0x22,0x3b,0x58,0x20,0x63,
+ 0x20,0x23,0x41,0x43,0x41,0x35,0x38,0x30,0x22,0x2c,0xa,0x22,0x3a,0x58,0x20,0x63,
+ 0x20,0x23,0x41,0x35,0x41,0x32,0x39,0x31,0x22,0x2c,0xa,0x22,0x3e,0x58,0x20,0x63,
+ 0x20,0x23,0x42,0x33,0x41,0x46,0x39,0x38,0x22,0x2c,0xa,0x22,0x2c,0x58,0x20,0x63,
+ 0x20,0x23,0x42,0x38,0x42,0x37,0x41,0x46,0x22,0x2c,0xa,0x22,0x3c,0x58,0x20,0x63,
+ 0x20,0x23,0x42,0x33,0x42,0x32,0x41,0x42,0x22,0x2c,0xa,0x22,0x31,0x58,0x20,0x63,
+ 0x20,0x23,0x42,0x31,0x42,0x31,0x42,0x31,0x22,0x2c,0xa,0x22,0x32,0x58,0x20,0x63,
+ 0x20,0x23,0x41,0x36,0x42,0x38,0x46,0x46,0x22,0x2c,0xa,0x22,0x33,0x58,0x20,0x63,
+ 0x20,0x23,0x38,0x38,0x44,0x45,0x45,0x30,0x22,0x2c,0xa,0x22,0x34,0x58,0x20,0x63,
+ 0x20,0x23,0x38,0x42,0x46,0x30,0x46,0x45,0x22,0x2c,0xa,0x22,0x35,0x58,0x20,0x63,
+ 0x20,0x23,0x41,0x34,0x43,0x46,0x43,0x36,0x22,0x2c,0xa,0x22,0x36,0x58,0x20,0x63,
+ 0x20,0x23,0x42,0x46,0x44,0x35,0x46,0x46,0x22,0x2c,0xa,0x22,0x37,0x58,0x20,0x63,
+ 0x20,0x23,0x42,0x46,0x44,0x43,0x46,0x46,0x22,0x2c,0xa,0x22,0x38,0x58,0x20,0x63,
+ 0x20,0x23,0x43,0x32,0x41,0x44,0x38,0x32,0x22,0x2c,0xa,0x22,0x39,0x58,0x20,0x63,
+ 0x20,0x23,0x43,0x42,0x42,0x34,0x38,0x39,0x22,0x2c,0xa,0x22,0x30,0x58,0x20,0x63,
+ 0x20,0x23,0x44,0x32,0x42,0x46,0x39,0x42,0x22,0x2c,0xa,0x22,0x71,0x58,0x20,0x63,
+ 0x20,0x23,0x44,0x31,0x43,0x31,0x39,0x46,0x22,0x2c,0xa,0x22,0x77,0x58,0x20,0x63,
+ 0x20,0x23,0x43,0x38,0x43,0x34,0x41,0x41,0x22,0x2c,0xa,0x22,0x65,0x58,0x20,0x63,
+ 0x20,0x23,0x43,0x46,0x43,0x42,0x42,0x37,0x22,0x2c,0xa,0x22,0x72,0x58,0x20,0x63,
+ 0x20,0x23,0x44,0x38,0x43,0x37,0x41,0x36,0x22,0x2c,0xa,0x22,0x74,0x58,0x20,0x63,
+ 0x20,0x23,0x44,0x32,0x43,0x32,0x41,0x33,0x22,0x2c,0xa,0x22,0x79,0x58,0x20,0x63,
+ 0x20,0x23,0x44,0x35,0x43,0x43,0x42,0x33,0x22,0x2c,0xa,0x22,0x75,0x58,0x20,0x63,
+ 0x20,0x23,0x44,0x41,0x44,0x31,0x41,0x31,0x22,0x2c,0xa,0x22,0x69,0x58,0x20,0x63,
+ 0x20,0x23,0x44,0x44,0x44,0x35,0x42,0x42,0x22,0x2c,0xa,0x22,0x70,0x58,0x20,0x63,
+ 0x20,0x23,0x44,0x37,0x44,0x31,0x42,0x33,0x22,0x2c,0xa,0x22,0x61,0x58,0x20,0x63,
+ 0x20,0x23,0x45,0x43,0x45,0x35,0x42,0x42,0x22,0x2c,0xa,0x22,0x73,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x35,0x45,0x42,0x42,0x35,0x22,0x2c,0xa,0x22,0x64,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x35,0x45,0x43,0x42,0x43,0x22,0x2c,0xa,0x22,0x66,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x38,0x45,0x45,0x42,0x38,0x22,0x2c,0xa,0x22,0x67,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x43,0x46,0x32,0x42,0x43,0x22,0x2c,0xa,0x22,0x68,0x58,0x20,0x63,
+ 0x20,0x23,0x43,0x42,0x43,0x42,0x43,0x42,0x22,0x2c,0xa,0x22,0x6a,0x58,0x20,0x63,
+ 0x20,0x23,0x44,0x38,0x44,0x36,0x43,0x37,0x22,0x2c,0xa,0x22,0x6b,0x58,0x20,0x63,
+ 0x20,0x23,0x44,0x44,0x44,0x44,0x44,0x44,0x22,0x2c,0xa,0x22,0x6c,0x58,0x20,0x63,
+ 0x20,0x23,0x45,0x34,0x44,0x41,0x43,0x32,0x22,0x2c,0xa,0x22,0x7a,0x58,0x20,0x63,
+ 0x20,0x23,0x45,0x43,0x45,0x36,0x43,0x37,0x22,0x2c,0xa,0x22,0x78,0x58,0x20,0x63,
+ 0x20,0x23,0x45,0x42,0x45,0x36,0x44,0x39,0x22,0x2c,0xa,0x22,0x63,0x58,0x20,0x63,
+ 0x20,0x23,0x45,0x39,0x45,0x33,0x44,0x30,0x22,0x2c,0xa,0x22,0x76,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x35,0x45,0x44,0x43,0x34,0x22,0x2c,0xa,0x22,0x62,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x36,0x45,0x46,0x43,0x39,0x22,0x2c,0xa,0x22,0x6e,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x30,0x45,0x42,0x44,0x35,0x22,0x2c,0xa,0x22,0x6d,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x33,0x45,0x46,0x44,0x42,0x22,0x2c,0xa,0x22,0x4d,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x43,0x46,0x33,0x43,0x35,0x22,0x2c,0xa,0x22,0x4e,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x43,0x46,0x34,0x43,0x41,0x22,0x2c,0xa,0x22,0x42,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x37,0x46,0x30,0x43,0x41,0x22,0x2c,0xa,0x22,0x56,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x36,0x46,0x30,0x44,0x32,0x22,0x2c,0xa,0x22,0x43,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x39,0x46,0x33,0x44,0x33,0x22,0x2c,0xa,0x22,0x5a,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x39,0x46,0x34,0x44,0x43,0x22,0x2c,0xa,0x22,0x41,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x38,0x44,0x34,0x22,0x2c,0xa,0x22,0x53,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x46,0x46,0x39,0x44,0x42,0x22,0x2c,0xa,0x22,0x44,0x58,0x20,0x63,
+ 0x20,0x23,0x45,0x37,0x45,0x37,0x45,0x34,0x22,0x2c,0xa,0x22,0x46,0x58,0x20,0x63,
+ 0x20,0x23,0x45,0x42,0x45,0x42,0x45,0x39,0x22,0x2c,0xa,0x22,0x47,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x31,0x45,0x44,0x45,0x31,0x22,0x2c,0xa,0x22,0x48,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x39,0x46,0x36,0x45,0x35,0x22,0x2c,0xa,0x22,0x4a,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x44,0x46,0x39,0x45,0x34,0x22,0x2c,0xa,0x22,0x4b,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x42,0x45,0x42,0x22,0x2c,0xa,0x22,0x4c,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x36,0x46,0x32,0x45,0x36,0x22,0x2c,0xa,0x22,0x50,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x43,0x46,0x33,0x22,0x2c,0xa,0x22,0x49,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x45,0x46,0x44,0x46,0x44,0x22,0x2c,0xa,0x22,0x55,0x58,0x20,0x63,
+ 0x20,0x23,0x46,0x34,0x46,0x34,0x46,0x33,0x22,0x2c,0xa,0x22,0x59,0x58,0x20,0x63,
+ 0x20,0x4e,0x6f,0x6e,0x65,0x22,0x2c,0xa,0x2f,0x2a,0x20,0x70,0x69,0x78,0x65,0x6c,
+ 0x73,0x20,0x2a,0x2f,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x59,0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x59,0x58,0x3a,0x2e,0x3a,0x2e,0x2b,0x20,0x49,0x58,0x49,0x58,0x49,0x58,0x49,0x58,
+ 0x49,0x58,0x49,0x58,0x49,0x58,0x49,0x58,0x46,0x58,0x23,0x20,0x2b,0x2e,0x37,0x20,
+ 0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x3e,0x2e,0x6b,0x2e,0x63,0x2e,0x36,0x20,0x46,0x58,0x6b,0x58,
+ 0x6b,0x58,0x6b,0x58,0x44,0x58,0x6b,0x58,0x6b,0x58,0x6b,0x58,0x78,0x20,0x69,0x20,
+ 0x62,0x2e,0x3e,0x2e,0x2b,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,
+ 0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x3a,0x2e,0x27,0x2e,0x4b,0x2e,0x3d,0x2e,
+ 0x68,0x58,0x31,0x58,0x31,0x58,0x31,0x58,0x31,0x58,0x31,0x58,0x31,0x58,0x31,0x58,
+ 0x64,0x20,0x26,0x2e,0x30,0x2e,0x25,0x2e,0x2a,0x20,0x37,0x20,0x23,0x2e,0x23,0x2e,
+ 0x3a,0x2e,0x24,0x2e,0x23,0x2e,0x32,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,
+ 0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x3a,0x2e,0x2f,0x2e,
+ 0x4d,0x2e,0x25,0x2e,0x24,0x58,0x6b,0x20,0x6b,0x20,0x64,0x20,0x73,0x20,0x73,0x20,
+ 0x73,0x20,0x65,0x20,0x77,0x20,0x3e,0x2e,0x32,0x2e,0x64,0x2e,0x73,0x2e,0x5a,0x2e,
+ 0x39,0x58,0x72,0x58,0x6c,0x58,0x78,0x58,0x30,0x58,0x37,0x20,0x20,0x20,0x20,0x20,
+ 0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x3a,0x2e,0x5e,0x2e,0x4d,0x2e,0x31,0x2e,0x3a,0x20,0x25,0x20,0x25,0x20,0x2d,0x20,
+ 0x25,0x20,0x35,0x20,0x36,0x20,0x26,0x2e,0x47,0x58,0x49,0x58,0x49,0x58,0x50,0x58,
+ 0x50,0x58,0x50,0x58,0x50,0x58,0x50,0x58,0x4c,0x58,0x49,0x58,0x49,0x58,0x67,0x2e,
+ 0x33,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,
+ 0x59,0x58,0x23,0x58,0x3a,0x2e,0x5e,0x2e,0x6d,0x2e,0x76,0x2e,0x79,0x2e,0x72,0x2e,
+ 0x72,0x2e,0x72,0x2e,0x72,0x2e,0x68,0x2e,0x68,0x2e,0x32,0x2e,0x49,0x58,0x50,0x58,
+ 0x50,0x58,0x4b,0x58,0x4b,0x58,0x50,0x58,0x4b,0x58,0x48,0x58,0x78,0x58,0x55,0x58,
+ 0x49,0x58,0x49,0x58,0x66,0x2e,0x34,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,
+ 0xa,0x22,0x59,0x58,0x59,0x58,0x23,0x58,0x3a,0x2e,0x5e,0x2e,0x6d,0x2e,0x59,0x2e,
+ 0x49,0x2e,0x42,0x2e,0x6a,0x2e,0x6a,0x2e,0x6a,0x2e,0x56,0x2e,0x49,0x2e,0x34,0x2e,
+ 0x50,0x58,0x4b,0x58,0x4a,0x58,0x4b,0x58,0x4a,0x58,0x4b,0x58,0x4b,0x58,0x6d,0x58,
+ 0x6a,0x58,0x46,0x58,0x49,0x58,0x49,0x58,0x55,0x58,0x2b,0x2e,0x20,0x20,0x20,0x20,
+ 0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x23,0x58,0x3a,0x2e,0x5e,0x2e,
+ 0x6d,0x2e,0x59,0x2e,0x45,0x2e,0x49,0x2e,0x6a,0x2e,0x6a,0x2e,0x6a,0x2e,0x49,0x2e,
+ 0x52,0x2e,0x38,0x2e,0x50,0x58,0x4b,0x58,0x53,0x58,0x4a,0x58,0x4a,0x58,0x4a,0x58,
+ 0x53,0x58,0x6e,0x58,0x65,0x58,0x44,0x58,0x49,0x58,0x49,0x58,0x55,0x58,0x3c,0x2e,
+ 0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x3a,0x2e,0x2f,0x2e,0x4d,0x2e,0x21,0x2e,0x57,0x2e,0x52,0x2e,0x49,0x2e,0x54,0x2e,
+ 0x52,0x2e,0x45,0x2e,0x57,0x2e,0x38,0x2e,0x55,0x58,0x4a,0x58,0x4a,0x58,0x53,0x58,
+ 0x53,0x58,0x53,0x58,0x53,0x58,0x6e,0x58,0x65,0x58,0x3a,0x58,0x40,0x58,0x69,0x2e,
+ 0x3c,0x58,0x37,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x3a,0x2e,0x2f,0x2e,0x44,0x2e,0x7e,0x2e,0x5f,0x2e,0x60,0x2e,
+ 0x57,0x2e,0x57,0x2e,0x57,0x2e,0x57,0x2e,0x20,0x58,0x38,0x2e,0x50,0x58,0x4a,0x58,
+ 0x53,0x58,0x41,0x58,0x53,0x58,0x53,0x58,0x53,0x58,0x56,0x58,0x6a,0x58,0x3e,0x58,
+ 0x40,0x58,0x40,0x58,0x2c,0x58,0x34,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x2c,
+ 0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x3a,0x2e,0x28,0x2e,0x53,0x2e,0x7d,0x2e,
+ 0x2e,0x58,0x20,0x58,0x20,0x58,0x20,0x58,0x20,0x58,0x20,0x58,0x20,0x58,0x38,0x2e,
+ 0x50,0x58,0x53,0x58,0x41,0x58,0x41,0x58,0x41,0x58,0x41,0x58,0x41,0x58,0x4e,0x58,
+ 0x7a,0x58,0x70,0x58,0x77,0x58,0x77,0x58,0x6a,0x58,0x37,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x3a,0x2e,0x28,0x2e,
+ 0x53,0x2e,0x5b,0x2e,0x4f,0x58,0x4f,0x58,0x4f,0x58,0x6f,0x58,0x6f,0x58,0x74,0x2e,
+ 0x3b,0x20,0x4f,0x20,0x73,0x20,0x61,0x20,0x70,0x20,0x70,0x20,0x70,0x20,0x70,0x20,
+ 0x61,0x2e,0x41,0x58,0x4d,0x58,0x76,0x58,0x61,0x58,0x7a,0x58,0x47,0x58,0x2b,0x2e,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x3a,0x2e,0x28,0x2e,0x53,0x2e,0x5b,0x2e,0x2b,0x58,0x2b,0x58,0x2b,0x58,0x4f,0x58,
+ 0x2b,0x58,0x3b,0x20,0x37,0x58,0x32,0x58,0x5d,0x20,0x2f,0x20,0x2f,0x20,0x7e,0x20,
+ 0x21,0x20,0x32,0x58,0x70,0x20,0x4d,0x58,0x4e,0x58,0x4e,0x58,0x4e,0x58,0x53,0x58,
+ 0x4b,0x58,0x2b,0x2e,0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x3a,0x2e,0x28,0x2e,0x46,0x2e,0x7c,0x2e,0x2b,0x58,0x2b,0x58,
+ 0x2b,0x58,0x2b,0x58,0x2b,0x58,0x79,0x2e,0x2c,0x20,0x5f,0x20,0x41,0x20,0x6d,0x20,
+ 0x62,0x20,0x76,0x20,0x63,0x20,0x21,0x20,0x70,0x20,0x4d,0x58,0x4d,0x58,0x67,0x58,
+ 0x4d,0x58,0x41,0x58,0x4b,0x58,0x2b,0x2e,0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,
+ 0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x3a,0x2e,0x28,0x2e,0x46,0x2e,0x7c,0x2e,
+ 0x2b,0x58,0x2b,0x58,0x2b,0x58,0x2b,0x58,0x2b,0x58,0x2b,0x58,0x6a,0x2e,0x26,0x20,
+ 0x5e,0x20,0x42,0x20,0x6e,0x20,0x62,0x20,0x76,0x20,0x27,0x20,0x3c,0x20,0x67,0x58,
+ 0x4d,0x58,0x67,0x58,0x67,0x58,0x4e,0x58,0x4b,0x58,0x2b,0x2e,0x20,0x20,0x20,0x20,
+ 0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x3a,0x2e,0x28,0x2e,
+ 0x46,0x2e,0x55,0x2e,0x57,0x2e,0x2b,0x58,0x2b,0x58,0x2b,0x58,0x2b,0x58,0x29,0x2e,
+ 0x79,0x2e,0x67,0x20,0x51,0x20,0x4e,0x20,0x6d,0x20,0x6e,0x20,0x62,0x20,0x7e,0x20,
+ 0x3c,0x20,0x67,0x58,0x67,0x58,0x67,0x58,0x67,0x58,0x41,0x58,0x4a,0x58,0x71,0x20,
+ 0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x3a,0x2e,0x5b,0x2e,0x6c,0x2e,0x6a,0x20,0x6a,0x20,0x79,0x2e,0x49,0x2e,0x6a,0x2e,
+ 0x72,0x2e,0x31,0x20,0x3d,0x58,0x28,0x20,0x4b,0x20,0x4e,0x20,0x4d,0x20,0x6d,0x20,
+ 0x62,0x20,0x7e,0x20,0x3c,0x20,0x67,0x58,0x67,0x58,0x67,0x58,0x67,0x58,0x4e,0x58,
+ 0x4b,0x58,0x2b,0x2e,0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x3a,0x2e,0x5b,0x2e,0x74,0x20,0x35,0x58,0x34,0x58,0x26,0x58,
+ 0x44,0x20,0x46,0x20,0x3d,0x58,0x7c,0x20,0x55,0x20,0x4a,0x20,0x47,0x20,0x56,0x20,
+ 0x5a,0x20,0x41,0x20,0x43,0x20,0x2f,0x20,0x3c,0x20,0x66,0x58,0x67,0x58,0x67,0x58,
+ 0x67,0x58,0x4d,0x58,0x48,0x58,0x2b,0x2e,0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,
+ 0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x3a,0x2e,0x5b,0x2e,0x6c,0x2e,0x68,0x20,
+ 0x33,0x58,0x58,0x2e,0x2e,0x2e,0x57,0x20,0x54,0x20,0x50,0x20,0x4c,0x20,0x48,0x20,
+ 0x4b,0x20,0x49,0x20,0x5b,0x20,0x53,0x20,0x60,0x20,0x7b,0x20,0x3c,0x20,0x66,0x58,
+ 0x66,0x58,0x66,0x58,0x66,0x58,0x4d,0x58,0x4b,0x58,0x2b,0x2e,0x20,0x20,0x20,0x20,
+ 0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x3a,0x2e,0x5b,0x2e,
+ 0x47,0x2e,0x65,0x2e,0x31,0x20,0x2a,0x58,0x4f,0x2e,0x2e,0x2e,0x45,0x20,0x52,0x20,
+ 0x59,0x20,0x59,0x20,0x7c,0x20,0x2d,0x58,0x64,0x20,0x5a,0x2e,0x6b,0x20,0x36,0x58,
+ 0x3e,0x20,0x66,0x58,0x66,0x58,0x66,0x58,0x66,0x58,0x42,0x58,0x4a,0x58,0x2b,0x2e,
+ 0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x3a,0x2e,0x5b,0x2e,0x47,0x2e,0x7b,0x2e,0x60,0x2e,0x75,0x2e,0x31,0x20,0x46,0x20,
+ 0x26,0x58,0x2a,0x58,0x25,0x58,0x7a,0x20,0x6c,0x20,0x61,0x2e,0x75,0x58,0x66,0x58,
+ 0x70,0x2e,0x3e,0x20,0x70,0x2e,0x73,0x58,0x73,0x58,0x73,0x58,0x66,0x58,0x42,0x58,
+ 0x4a,0x58,0x2b,0x2e,0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x3a,0x2e,0x7b,0x2e,0x47,0x2e,0x7c,0x2e,0x2b,0x58,0x2b,0x58,
+ 0x20,0x58,0x4e,0x2e,0x71,0x2e,0x35,0x2e,0x37,0x2e,0x71,0x20,0x63,0x58,0x76,0x58,
+ 0x73,0x58,0x73,0x58,0x73,0x58,0x73,0x58,0x73,0x58,0x73,0x58,0x73,0x58,0x73,0x58,
+ 0x73,0x58,0x42,0x58,0x4b,0x58,0x2b,0x2e,0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,
+ 0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x3a,0x2e,0x7c,0x2e,0x47,0x2e,0x5d,0x2e,
+ 0x7c,0x2e,0x4c,0x2e,0x48,0x2e,0x47,0x2e,0x47,0x2e,0x47,0x2e,0x41,0x2e,0x31,0x2e,
+ 0x4a,0x58,0x76,0x58,0x73,0x58,0x73,0x58,0x73,0x58,0x73,0x58,0x73,0x58,0x73,0x58,
+ 0x73,0x58,0x66,0x58,0x64,0x58,0x43,0x58,0x50,0x58,0x2b,0x2e,0x20,0x20,0x20,0x20,
+ 0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x3a,0x2e,0x7b,0x2e,
+ 0x47,0x2e,0x47,0x2e,0x47,0x2e,0x47,0x2e,0x47,0x2e,0x78,0x2e,0x77,0x2e,0x3b,0x2e,
+ 0x74,0x20,0x3a,0x2e,0x48,0x58,0x64,0x58,0x73,0x58,0x73,0x58,0x73,0x58,0x73,0x58,
+ 0x73,0x58,0x64,0x58,0x76,0x58,0x42,0x58,0x5a,0x58,0x4c,0x58,0x74,0x58,0x3d,0x20,
+ 0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x3a,0x2e,0x7b,0x2e,0x47,0x2e,0x4a,0x2e,0x78,0x2e,0x39,0x2e,0x3b,0x2e,0x72,0x20,
+ 0x39,0x20,0x71,0x20,0x30,0x20,0x23,0x2e,0x4b,0x58,0x76,0x58,0x73,0x58,0x61,0x58,
+ 0x73,0x58,0x76,0x58,0x42,0x58,0x43,0x58,0x48,0x58,0x69,0x58,0x67,0x2e,0x2a,0x2e,
+ 0x3d,0x20,0x4f,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x3a,0x2e,0x4c,0x2e,0x39,0x2e,0x2d,0x2e,0x79,0x20,0x39,0x20,
+ 0x71,0x20,0x30,0x20,0x3d,0x20,0x2b,0x20,0x20,0x20,0x23,0x2e,0x48,0x58,0x62,0x58,
+ 0x64,0x58,0x62,0x58,0x56,0x58,0x5a,0x58,0x63,0x58,0x38,0x58,0x2c,0x2e,0x33,0x20,
+ 0x24,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x22,0x2c,
+ 0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x25,0x2e,0x7a,0x2e,0x39,0x20,0x71,0x20,
+ 0x37,0x20,0x2a,0x20,0x6f,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x2e,
+ 0x50,0x58,0x5a,0x58,0x6d,0x58,0x6d,0x58,0x30,0x58,0x73,0x2e,0x30,0x20,0x24,0x20,
+ 0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x38,0x20,0x30,0x20,
+ 0x3d,0x20,0x6f,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x3a,0x2e,0x49,0x58,0x70,0x58,0x67,0x2e,0x2a,0x2e,0x3d,0x20,0x4f,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x59,0x58,0x59,0x58,0x40,0x2e,0x23,0x2e,0x32,0x20,0x40,0x20,0x2e,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,0xa,0x22,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x22,0x2c,
+ 0xa,0x22,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,0x59,0x58,
+ 0x59,0x58,0x22,0xa,0x7d,0x3b,0xa,
+ # /home/rdale/src/kde/branches/KDE/3.5/kdevelop/languages/ruby/app_templates/qtruby4makeapp/editcut.xpm
+ 0x0,0x0,0x16,0x47,
+ 0x2f,
+ 0x2a,0x20,0x58,0x50,0x4d,0x20,0x2a,0x2f,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,
+ 0x63,0x68,0x61,0x72,0x20,0x2a,0x65,0x64,0x69,0x74,0x63,0x75,0x74,0x5b,0x5d,0x20,
+ 0x3d,0x20,0x7b,0xa,0x2f,0x2a,0x20,0x63,0x6f,0x6c,0x75,0x6d,0x6e,0x73,0x20,0x72,
+ 0x6f,0x77,0x73,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x73,0x20,0x63,0x68,0x61,0x72,0x73,
+ 0x2d,0x70,0x65,0x72,0x2d,0x70,0x69,0x78,0x65,0x6c,0x20,0x2a,0x2f,0xa,0x22,0x33,
+ 0x32,0x20,0x33,0x32,0x20,0x32,0x31,0x34,0x20,0x32,0x22,0x2c,0xa,0x22,0x20,0x20,
+ 0x20,0x63,0x20,0x23,0x30,0x30,0x30,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x2e,0x20,
+ 0x20,0x63,0x20,0x23,0x30,0x42,0x30,0x42,0x30,0x42,0x22,0x2c,0xa,0x22,0x58,0x20,
+ 0x20,0x63,0x20,0x23,0x31,0x38,0x31,0x33,0x30,0x30,0x22,0x2c,0xa,0x22,0x6f,0x20,
+ 0x20,0x63,0x20,0x23,0x31,0x44,0x31,0x39,0x30,0x42,0x22,0x2c,0xa,0x22,0x4f,0x20,
+ 0x20,0x63,0x20,0x23,0x31,0x33,0x31,0x33,0x31,0x33,0x22,0x2c,0xa,0x22,0x2b,0x20,
+ 0x20,0x63,0x20,0x23,0x31,0x42,0x31,0x42,0x31,0x42,0x22,0x2c,0xa,0x22,0x40,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x31,0x31,0x45,0x31,0x31,0x22,0x2c,0xa,0x22,0x23,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x36,0x32,0x33,0x31,0x41,0x22,0x2c,0xa,0x22,0x24,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x41,0x32,0x35,0x31,0x33,0x22,0x2c,0xa,0x22,0x25,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x45,0x32,0x39,0x31,0x32,0x22,0x2c,0xa,0x22,0x26,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x45,0x32,0x41,0x31,0x39,0x22,0x2c,0xa,0x22,0x2a,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x37,0x32,0x45,0x30,0x42,0x22,0x2c,0xa,0x22,0x3d,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x30,0x32,0x41,0x31,0x32,0x22,0x2c,0xa,0x22,0x2d,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x31,0x32,0x43,0x31,0x42,0x22,0x2c,0xa,0x22,0x3b,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x41,0x33,0x32,0x30,0x46,0x22,0x2c,0xa,0x22,0x3a,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x43,0x33,0x34,0x31,0x35,0x22,0x2c,0xa,0x22,0x3e,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x43,0x33,0x35,0x31,0x42,0x22,0x2c,0xa,0x22,0x2c,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x33,0x32,0x33,0x32,0x33,0x22,0x2c,0xa,0x22,0x3c,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x42,0x32,0x39,0x32,0x32,0x22,0x2c,0xa,0x22,0x31,0x20,
+ 0x20,0x63,0x20,0x23,0x32,0x43,0x32,0x43,0x32,0x43,0x22,0x2c,0xa,0x22,0x32,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x30,0x32,0x45,0x32,0x36,0x22,0x2c,0xa,0x22,0x33,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x35,0x33,0x31,0x32,0x30,0x22,0x2c,0xa,0x22,0x34,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x46,0x33,0x42,0x32,0x44,0x22,0x2c,0xa,0x22,0x35,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x31,0x33,0x31,0x33,0x31,0x22,0x2c,0xa,0x22,0x36,0x20,
+ 0x20,0x63,0x20,0x23,0x33,0x41,0x33,0x41,0x33,0x41,0x22,0x2c,0xa,0x22,0x37,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x32,0x33,0x38,0x31,0x34,0x22,0x2c,0xa,0x22,0x38,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x39,0x33,0x45,0x31,0x37,0x22,0x2c,0xa,0x22,0x39,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x31,0x33,0x44,0x32,0x46,0x22,0x2c,0xa,0x22,0x30,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x32,0x33,0x46,0x33,0x32,0x22,0x2c,0xa,0x22,0x71,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x46,0x34,0x33,0x31,0x39,0x22,0x2c,0xa,0x22,0x77,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x43,0x34,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x65,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x46,0x34,0x46,0x30,0x44,0x22,0x2c,0xa,0x22,0x72,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x31,0x34,0x34,0x31,0x30,0x22,0x2c,0xa,0x22,0x74,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x35,0x34,0x38,0x31,0x33,0x22,0x2c,0xa,0x22,0x79,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x45,0x34,0x37,0x32,0x43,0x22,0x2c,0xa,0x22,0x75,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x34,0x34,0x31,0x33,0x36,0x22,0x2c,0xa,0x22,0x69,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x41,0x34,0x38,0x33,0x46,0x22,0x2c,0xa,0x22,0x70,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x33,0x34,0x42,0x32,0x42,0x22,0x2c,0xa,0x22,0x61,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x30,0x34,0x42,0x33,0x37,0x22,0x2c,0xa,0x22,0x73,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x31,0x34,0x43,0x33,0x41,0x22,0x2c,0xa,0x22,0x64,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x35,0x34,0x46,0x30,0x34,0x22,0x2c,0xa,0x22,0x66,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x30,0x34,0x46,0x30,0x42,0x22,0x2c,0xa,0x22,0x67,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x36,0x35,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x68,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x37,0x35,0x35,0x30,0x39,0x22,0x2c,0xa,0x22,0x6a,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x42,0x35,0x34,0x30,0x35,0x22,0x2c,0xa,0x22,0x6b,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x43,0x35,0x38,0x30,0x37,0x22,0x2c,0xa,0x22,0x6c,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x43,0x35,0x39,0x30,0x42,0x22,0x2c,0xa,0x22,0x7a,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x34,0x35,0x42,0x30,0x34,0x22,0x2c,0xa,0x22,0x78,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x31,0x35,0x44,0x30,0x41,0x22,0x2c,0xa,0x22,0x63,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x42,0x35,0x42,0x30,0x32,0x22,0x2c,0xa,0x22,0x76,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x32,0x35,0x42,0x33,0x42,0x22,0x2c,0xa,0x22,0x62,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x45,0x36,0x38,0x31,0x35,0x22,0x2c,0xa,0x22,0x6e,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x43,0x36,0x34,0x33,0x45,0x22,0x2c,0xa,0x22,0x6d,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x44,0x34,0x42,0x34,0x32,0x22,0x2c,0xa,0x22,0x4d,0x20,
+ 0x20,0x63,0x20,0x23,0x34,0x39,0x34,0x39,0x34,0x39,0x22,0x2c,0xa,0x22,0x4e,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x30,0x34,0x44,0x34,0x33,0x22,0x2c,0xa,0x22,0x42,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x34,0x35,0x33,0x34,0x43,0x22,0x2c,0xa,0x22,0x56,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x31,0x35,0x31,0x35,0x31,0x22,0x2c,0xa,0x22,0x43,0x20,
+ 0x20,0x63,0x20,0x23,0x35,0x44,0x35,0x42,0x35,0x34,0x22,0x2c,0xa,0x22,0x5a,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x35,0x36,0x30,0x34,0x38,0x22,0x2c,0xa,0x22,0x41,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x33,0x36,0x41,0x34,0x34,0x22,0x2c,0xa,0x22,0x53,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x32,0x36,0x43,0x35,0x34,0x22,0x2c,0xa,0x22,0x44,0x20,
+ 0x20,0x63,0x20,0x23,0x37,0x37,0x37,0x32,0x35,0x42,0x22,0x2c,0xa,0x22,0x46,0x20,
+ 0x20,0x63,0x20,0x23,0x36,0x39,0x36,0x39,0x36,0x38,0x22,0x2c,0xa,0x22,0x47,0x20,
+ 0x20,0x63,0x20,0x67,0x72,0x61,0x79,0x35,0x30,0x22,0x2c,0xa,0x22,0x48,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x32,0x36,0x32,0x30,0x33,0x22,0x2c,0xa,0x22,0x4a,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x30,0x36,0x36,0x30,0x39,0x22,0x2c,0xa,0x22,0x4b,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x33,0x36,0x39,0x30,0x37,0x22,0x2c,0xa,0x22,0x4c,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x44,0x36,0x41,0x30,0x33,0x22,0x2c,0xa,0x22,0x50,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x41,0x36,0x46,0x30,0x30,0x22,0x2c,0xa,0x22,0x49,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x42,0x37,0x30,0x30,0x35,0x22,0x2c,0xa,0x22,0x55,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x45,0x37,0x33,0x30,0x45,0x22,0x2c,0xa,0x22,0x59,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x43,0x37,0x35,0x31,0x31,0x22,0x2c,0xa,0x22,0x54,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x35,0x37,0x33,0x32,0x43,0x22,0x2c,0xa,0x22,0x52,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x38,0x37,0x38,0x33,0x42,0x22,0x2c,0xa,0x22,0x45,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x45,0x37,0x43,0x30,0x30,0x22,0x2c,0xa,0x22,0x57,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x38,0x37,0x42,0x31,0x33,0x22,0x2c,0xa,0x22,0x51,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x34,0x37,0x42,0x35,0x33,0x22,0x2c,0xa,0x22,0x21,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x32,0x37,0x44,0x36,0x34,0x22,0x2c,0xa,0x22,0x7e,0x20,0x20,
+ 0x63,0x20,0x23,0x39,0x43,0x38,0x36,0x32,0x45,0x22,0x2c,0xa,0x22,0x5e,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x39,0x38,0x41,0x31,0x46,0x22,0x2c,0xa,0x22,0x2f,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x32,0x38,0x44,0x30,0x41,0x22,0x2c,0xa,0x22,0x28,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x38,0x38,0x44,0x30,0x30,0x22,0x2c,0xa,0x22,0x29,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x32,0x38,0x32,0x31,0x41,0x22,0x2c,0xa,0x22,0x5f,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x31,0x38,0x45,0x31,0x42,0x22,0x2c,0xa,0x22,0x60,0x20,0x20,
+ 0x63,0x20,0x23,0x42,0x33,0x39,0x34,0x31,0x43,0x22,0x2c,0xa,0x22,0x27,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x38,0x38,0x45,0x32,0x43,0x22,0x2c,0xa,0x22,0x5d,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x32,0x38,0x43,0x33,0x36,0x22,0x2c,0xa,0x22,0x5b,0x20,0x20,
+ 0x63,0x20,0x23,0x41,0x45,0x39,0x32,0x32,0x34,0x22,0x2c,0xa,0x22,0x7b,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x39,0x38,0x31,0x35,0x45,0x22,0x2c,0xa,0x22,0x7d,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x37,0x38,0x32,0x36,0x44,0x22,0x2c,0xa,0x22,0x7c,0x20,0x20,
+ 0x63,0x20,0x23,0x38,0x35,0x38,0x31,0x37,0x34,0x22,0x2c,0xa,0x22,0x20,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x38,0x38,0x33,0x37,0x30,0x22,0x2c,0xa,0x22,0x2e,0x2e,0x20,
+ 0x63,0x20,0x23,0x38,0x45,0x38,0x41,0x37,0x44,0x22,0x2c,0xa,0x22,0x58,0x2e,0x20,
+ 0x63,0x20,0x23,0x39,0x32,0x38,0x43,0x37,0x31,0x22,0x2c,0xa,0x22,0x6f,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x32,0x38,0x45,0x34,0x34,0x22,0x2c,0xa,0x22,0x4f,0x2e,0x20,
+ 0x63,0x20,0x23,0x41,0x41,0x39,0x46,0x37,0x34,0x22,0x2c,0xa,0x22,0x2b,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x39,0x41,0x34,0x35,0x36,0x22,0x2c,0xa,0x22,0x40,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x44,0x41,0x38,0x35,0x42,0x22,0x2c,0xa,0x22,0x23,0x2e,0x20,
+ 0x63,0x20,0x23,0x42,0x32,0x41,0x30,0x36,0x38,0x22,0x2c,0xa,0x22,0x24,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x32,0x38,0x37,0x30,0x30,0x22,0x2c,0xa,0x22,0x25,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x43,0x38,0x45,0x30,0x30,0x22,0x2c,0xa,0x22,0x26,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x32,0x39,0x41,0x30,0x30,0x22,0x2c,0xa,0x22,0x2a,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x34,0x39,0x36,0x32,0x46,0x22,0x2c,0xa,0x22,0x3d,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x43,0x41,0x31,0x30,0x30,0x22,0x2c,0xa,0x22,0x2d,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x36,0x41,0x38,0x30,0x30,0x22,0x2c,0xa,0x22,0x3b,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x31,0x41,0x43,0x31,0x42,0x22,0x2c,0xa,0x22,0x3a,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x44,0x42,0x33,0x31,0x41,0x22,0x2c,0xa,0x22,0x3e,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x32,0x41,0x39,0x32,0x32,0x22,0x2c,0xa,0x22,0x2c,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x34,0x41,0x45,0x32,0x42,0x22,0x2c,0xa,0x22,0x3c,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x42,0x41,0x31,0x32,0x45,0x22,0x2c,0xa,0x22,0x31,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x42,0x41,0x34,0x33,0x33,0x22,0x2c,0xa,0x22,0x32,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x44,0x42,0x34,0x32,0x38,0x22,0x2c,0xa,0x22,0x33,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x32,0x42,0x32,0x33,0x42,0x22,0x2c,0xa,0x22,0x34,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x36,0x41,0x32,0x30,0x30,0x22,0x2c,0xa,0x22,0x35,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x38,0x41,0x35,0x30,0x39,0x22,0x2c,0xa,0x22,0x36,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x41,0x41,0x46,0x30,0x30,0x22,0x2c,0xa,0x22,0x37,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x46,0x41,0x43,0x31,0x45,0x22,0x2c,0xa,0x22,0x38,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x35,0x41,0x31,0x30,0x30,0x22,0x2c,0xa,0x22,0x39,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x41,0x44,0x30,0x32,0x22,0x2c,0xa,0x22,0x30,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x43,0x41,0x46,0x30,0x44,0x22,0x2c,0xa,0x22,0x71,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x43,0x42,0x30,0x30,0x35,0x22,0x2c,0xa,0x22,0x77,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x42,0x36,0x30,0x43,0x22,0x2c,0xa,0x22,0x65,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x42,0x44,0x30,0x30,0x22,0x2c,0xa,0x22,0x72,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x42,0x44,0x31,0x36,0x22,0x2c,0xa,0x22,0x74,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x33,0x42,0x34,0x33,0x32,0x22,0x2c,0xa,0x22,0x79,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x38,0x42,0x46,0x33,0x43,0x22,0x2c,0xa,0x22,0x75,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x36,0x42,0x45,0x32,0x46,0x22,0x2c,0xa,0x22,0x69,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x36,0x41,0x39,0x34,0x39,0x22,0x2c,0xa,0x22,0x70,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x39,0x41,0x39,0x34,0x38,0x22,0x2c,0xa,0x22,0x61,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x38,0x41,0x42,0x35,0x32,0x22,0x2c,0xa,0x22,0x73,0x2e,0x20,
+ 0x63,0x20,0x23,0x44,0x42,0x42,0x41,0x34,0x35,0x22,0x2c,0xa,0x22,0x64,0x2e,0x20,
+ 0x63,0x20,0x23,0x43,0x35,0x42,0x31,0x36,0x32,0x22,0x2c,0xa,0x22,0x66,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x43,0x42,0x37,0x34,0x44,0x22,0x2c,0xa,0x22,0x67,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x46,0x42,0x38,0x34,0x31,0x22,0x2c,0xa,0x22,0x68,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x46,0x42,0x45,0x34,0x41,0x22,0x2c,0xa,0x22,0x6a,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x41,0x42,0x41,0x35,0x35,0x22,0x2c,0xa,0x22,0x6b,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x44,0x43,0x30,0x30,0x36,0x22,0x2c,0xa,0x22,0x6c,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x43,0x31,0x30,0x42,0x22,0x2c,0xa,0x22,0x7a,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x43,0x38,0x30,0x30,0x22,0x2c,0xa,0x22,0x78,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x43,0x39,0x30,0x44,0x22,0x2c,0xa,0x22,0x63,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x41,0x43,0x31,0x31,0x33,0x22,0x2c,0xa,0x22,0x76,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x42,0x43,0x31,0x31,0x43,0x22,0x2c,0xa,0x22,0x62,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x44,0x43,0x39,0x31,0x30,0x22,0x2c,0xa,0x22,0x6e,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x44,0x43,0x32,0x33,0x33,0x22,0x2c,0xa,0x22,0x6d,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x35,0x43,0x33,0x32,0x44,0x22,0x2c,0xa,0x22,0x4d,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x43,0x37,0x32,0x38,0x22,0x2c,0xa,0x22,0x4e,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x34,0x43,0x35,0x33,0x37,0x22,0x2c,0xa,0x22,0x42,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x36,0x43,0x36,0x33,0x41,0x22,0x2c,0xa,0x22,0x56,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x35,0x43,0x42,0x33,0x36,0x22,0x2c,0xa,0x22,0x43,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x44,0x37,0x33,0x44,0x22,0x2c,0xa,0x22,0x5a,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x39,0x43,0x36,0x35,0x39,0x22,0x2c,0xa,0x22,0x41,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x41,0x43,0x38,0x35,0x41,0x22,0x2c,0xa,0x22,0x53,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x44,0x41,0x34,0x42,0x22,0x2c,0xa,0x22,0x44,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x44,0x44,0x35,0x44,0x22,0x2c,0xa,0x22,0x46,0x2e,0x20,
+ 0x63,0x20,0x23,0x45,0x39,0x43,0x44,0x36,0x42,0x22,0x2c,0xa,0x22,0x47,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x44,0x35,0x36,0x30,0x22,0x2c,0xa,0x22,0x48,0x2e,0x20,
+ 0x63,0x20,0x23,0x46,0x46,0x45,0x30,0x36,0x43,0x22,0x2c,0xa,0x22,0x4a,0x2e,0x20,
+ 0x63,0x20,0x67,0x72,0x61,0x79,0x35,0x36,0x22,0x2c,0xa,0x22,0x4b,0x2e,0x20,0x63,
+ 0x20,0x23,0x39,0x35,0x39,0x35,0x39,0x35,0x22,0x2c,0xa,0x22,0x4c,0x2e,0x20,0x63,
+ 0x20,0x67,0x72,0x61,0x79,0x36,0x32,0x22,0x2c,0xa,0x22,0x50,0x2e,0x20,0x63,0x20,
+ 0x23,0x41,0x36,0x41,0x31,0x38,0x41,0x22,0x2c,0xa,0x22,0x49,0x2e,0x20,0x63,0x20,
+ 0x23,0x41,0x38,0x41,0x36,0x39,0x45,0x22,0x2c,0xa,0x22,0x55,0x2e,0x20,0x63,0x20,
+ 0x23,0x41,0x45,0x41,0x38,0x39,0x35,0x22,0x2c,0xa,0x22,0x59,0x2e,0x20,0x63,0x20,
+ 0x23,0x42,0x33,0x41,0x43,0x38,0x46,0x22,0x2c,0xa,0x22,0x54,0x2e,0x20,0x63,0x20,
+ 0x23,0x42,0x38,0x41,0x46,0x38,0x42,0x22,0x2c,0xa,0x22,0x52,0x2e,0x20,0x63,0x20,
+ 0x23,0x42,0x34,0x41,0x44,0x39,0x36,0x22,0x2c,0xa,0x22,0x45,0x2e,0x20,0x63,0x20,
+ 0x23,0x42,0x38,0x42,0x31,0x39,0x39,0x22,0x2c,0xa,0x22,0x57,0x2e,0x20,0x63,0x20,
+ 0x23,0x41,0x34,0x41,0x34,0x41,0x34,0x22,0x2c,0xa,0x22,0x51,0x2e,0x20,0x63,0x20,
+ 0x23,0x41,0x41,0x41,0x41,0x41,0x41,0x22,0x2c,0xa,0x22,0x21,0x2e,0x20,0x63,0x20,
+ 0x23,0x42,0x30,0x41,0x44,0x41,0x33,0x22,0x2c,0xa,0x22,0x7e,0x2e,0x20,0x63,0x20,
+ 0x23,0x42,0x42,0x42,0x36,0x41,0x33,0x22,0x2c,0xa,0x22,0x5e,0x2e,0x20,0x63,0x20,
+ 0x23,0x42,0x31,0x42,0x31,0x42,0x31,0x22,0x2c,0xa,0x22,0x2f,0x2e,0x20,0x63,0x20,
+ 0x23,0x42,0x39,0x42,0x39,0x42,0x36,0x22,0x2c,0xa,0x22,0x28,0x2e,0x20,0x63,0x20,
+ 0x23,0x42,0x42,0x42,0x42,0x42,0x41,0x22,0x2c,0xa,0x22,0x29,0x2e,0x20,0x63,0x20,
+ 0x23,0x43,0x35,0x42,0x43,0x39,0x44,0x22,0x2c,0xa,0x22,0x5f,0x2e,0x20,0x63,0x20,
+ 0x23,0x43,0x32,0x42,0x43,0x41,0x32,0x22,0x2c,0xa,0x22,0x60,0x2e,0x20,0x63,0x20,
+ 0x23,0x43,0x31,0x42,0x45,0x42,0x35,0x22,0x2c,0xa,0x22,0x27,0x2e,0x20,0x63,0x20,
+ 0x23,0x44,0x32,0x43,0x33,0x38,0x45,0x22,0x2c,0xa,0x22,0x5d,0x2e,0x20,0x63,0x20,
+ 0x23,0x44,0x43,0x43,0x37,0x38,0x43,0x22,0x2c,0xa,0x22,0x5b,0x2e,0x20,0x63,0x20,
+ 0x23,0x43,0x37,0x43,0x30,0x41,0x37,0x22,0x2c,0xa,0x22,0x7b,0x2e,0x20,0x63,0x20,
+ 0x23,0x43,0x37,0x43,0x32,0x41,0x45,0x22,0x2c,0xa,0x22,0x7d,0x2e,0x20,0x63,0x20,
+ 0x23,0x43,0x37,0x43,0x33,0x42,0x32,0x22,0x2c,0xa,0x22,0x7c,0x2e,0x20,0x63,0x20,
+ 0x23,0x43,0x35,0x43,0x32,0x42,0x38,0x22,0x2c,0xa,0x22,0x20,0x58,0x20,0x63,0x20,
+ 0x23,0x43,0x41,0x43,0x36,0x42,0x36,0x22,0x2c,0xa,0x22,0x2e,0x58,0x20,0x63,0x20,
+ 0x23,0x43,0x42,0x43,0x39,0x42,0x45,0x22,0x2c,0xa,0x22,0x58,0x58,0x20,0x63,0x20,
+ 0x23,0x44,0x39,0x44,0x33,0x42,0x42,0x22,0x2c,0xa,0x22,0x6f,0x58,0x20,0x63,0x20,
+ 0x23,0x45,0x36,0x44,0x30,0x38,0x41,0x22,0x2c,0xa,0x22,0x4f,0x58,0x20,0x63,0x20,
+ 0x23,0x45,0x37,0x44,0x45,0x42,0x44,0x22,0x2c,0xa,0x22,0x2b,0x58,0x20,0x63,0x20,
+ 0x23,0x45,0x43,0x44,0x45,0x42,0x33,0x22,0x2c,0xa,0x22,0x40,0x58,0x20,0x63,0x20,
+ 0x23,0x46,0x46,0x46,0x30,0x42,0x39,0x22,0x2c,0xa,0x22,0x23,0x58,0x20,0x63,0x20,
+ 0x23,0x43,0x35,0x43,0x35,0x43,0x35,0x22,0x2c,0xa,0x22,0x24,0x58,0x20,0x63,0x20,
+ 0x23,0x43,0x45,0x43,0x43,0x43,0x37,0x22,0x2c,0xa,0x22,0x25,0x58,0x20,0x63,0x20,
+ 0x23,0x44,0x30,0x43,0x45,0x43,0x35,0x22,0x2c,0xa,0x22,0x26,0x58,0x20,0x63,0x20,
+ 0x23,0x44,0x30,0x43,0x46,0x43,0x38,0x22,0x2c,0xa,0x22,0x2a,0x58,0x20,0x63,0x20,
+ 0x23,0x44,0x32,0x44,0x31,0x43,0x42,0x22,0x2c,0xa,0x22,0x3d,0x58,0x20,0x63,0x20,
+ 0x23,0x44,0x42,0x44,0x36,0x43,0x35,0x22,0x2c,0xa,0x22,0x2d,0x58,0x20,0x63,0x20,
+ 0x23,0x44,0x42,0x44,0x37,0x43,0x39,0x22,0x2c,0xa,0x22,0x3b,0x58,0x20,0x63,0x20,
+ 0x23,0x44,0x33,0x44,0x33,0x44,0x31,0x22,0x2c,0xa,0x22,0x3a,0x58,0x20,0x63,0x20,
+ 0x23,0x44,0x42,0x44,0x42,0x44,0x42,0x22,0x2c,0xa,0x22,0x3e,0x58,0x20,0x63,0x20,
+ 0x23,0x45,0x35,0x45,0x31,0x44,0x36,0x22,0x2c,0xa,0x22,0x2c,0x58,0x20,0x63,0x20,
+ 0x23,0x45,0x35,0x45,0x33,0x44,0x41,0x22,0x2c,0xa,0x22,0x3c,0x58,0x20,0x63,0x20,
+ 0x23,0x45,0x38,0x45,0x35,0x44,0x39,0x22,0x2c,0xa,0x22,0x31,0x58,0x20,0x63,0x20,
+ 0x23,0x45,0x44,0x45,0x41,0x44,0x43,0x22,0x2c,0xa,0x22,0x32,0x58,0x20,0x63,0x20,
+ 0x23,0x46,0x45,0x46,0x36,0x44,0x45,0x22,0x2c,0xa,0x22,0x33,0x58,0x20,0x63,0x20,
+ 0x23,0x45,0x36,0x45,0x36,0x45,0x36,0x22,0x2c,0xa,0x22,0x34,0x58,0x20,0x63,0x20,
+ 0x23,0x45,0x39,0x45,0x37,0x45,0x32,0x22,0x2c,0xa,0x22,0x35,0x58,0x20,0x63,0x20,
+ 0x23,0x45,0x39,0x45,0x38,0x45,0x34,0x22,0x2c,0xa,0x22,0x36,0x58,0x20,0x63,0x20,
+ 0x23,0x45,0x44,0x45,0x43,0x45,0x41,0x22,0x2c,0xa,0x22,0x37,0x58,0x20,0x63,0x20,
+ 0x23,0x46,0x32,0x46,0x31,0x45,0x42,0x22,0x2c,0xa,0x22,0x38,0x58,0x20,0x63,0x20,
+ 0x23,0x46,0x31,0x46,0x31,0x46,0x31,0x22,0x2c,0xa,0x22,0x39,0x58,0x20,0x63,0x20,
+ 0x23,0x46,0x38,0x46,0x37,0x46,0x34,0x22,0x2c,0xa,0x22,0x30,0x58,0x20,0x63,0x20,
+ 0x23,0x46,0x39,0x46,0x38,0x46,0x38,0x22,0x2c,0xa,0x22,0x71,0x58,0x20,0x63,0x20,
+ 0x4e,0x6f,0x6e,0x65,0x22,0x2c,0xa,0x2f,0x2a,0x20,0x70,0x69,0x78,0x65,0x6c,0x73,
+ 0x20,0x2a,0x2f,0xa,0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x35,0x20,0x35,0x20,0x35,
+ 0x20,0x31,0x20,0x2c,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x35,0x20,0x56,
+ 0x20,0x2f,0x2e,0x26,0x58,0x51,0x2e,0x46,0x20,0x31,0x20,0x2c,0x20,0x20,0x20,0x20,
+ 0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,
+ 0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x35,0x20,0x5f,0x2e,0x44,0x2e,0x53,0x2e,0x48,0x2e,0x40,0x58,0x26,0x58,0x36,
+ 0x20,0x2e,0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x35,0x20,0x53,0x2e,0x3d,0x2e,0x77,0x20,0x67,0x20,0x26,
+ 0x2e,0x43,0x2e,0x2e,0x2e,0x2b,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x35,0x20,0x2d,0x2e,0x27,0x20,0x2b,
+ 0x20,0x6f,0x20,0x74,0x20,0x7a,0x2e,0x64,0x2e,0x2c,0x20,0x20,0x20,0x20,0x20,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x35,0x20,0x43,0x20,0x56,
+ 0x2e,0x40,0x2e,0x2b,0x20,0x20,0x20,0x33,0x20,0x3a,0x2e,0x33,0x2e,0x2c,0x20,0x20,
+ 0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,
+ 0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x35,
+ 0x20,0x27,0x2e,0x62,0x2e,0x46,0x2e,0x36,0x20,0x2c,0x20,0x31,0x20,0x73,0x2e,0x2c,
+ 0x2e,0x2c,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x31,0x20,0x62,0x20,0x28,0x20,0x6e,0x2e,0x4f,0x58,0x45,0x2e,0x45,
+ 0x2e,0x46,0x2e,0x5e,0x20,0x2b,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x35,0x20,0x35,0x20,0x31,
+ 0x20,0x2c,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x20,0x20,0x6c,0x20,0x78,0x20,0x4b,0x20,0x41,
+ 0x2e,0x6f,0x58,0x6f,0x58,0x5a,0x2e,0x69,0x2e,0x2c,0x20,0x20,0x20,0x20,0x20,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x35,0x20,0x56,0x20,0x26,
+ 0x58,0x30,0x58,0x36,0x58,0x2c,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x38,0x20,0x28,0x20,0x63,0x2e,0x76,0x2e,0x6b,0x2e,0x4e,0x2e,0x31,0x20,0x20,
+ 0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x35,0x20,0x56,0x20,0x24,
+ 0x58,0x30,0x58,0x30,0x58,0x39,0x58,0x58,0x58,0x2c,0x20,0x20,0x20,0x22,0x2c,0xa,
+ 0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x20,0x20,0x20,0x20,0x4f,0x20,0x74,0x20,0x36,0x2e,0x65,0x2e,0x65,0x2e,0x6b,
+ 0x2e,0x53,0x20,0x4f,0x20,0x20,0x20,0x20,0x20,0x35,0x20,0x35,0x20,0x56,0x20,0x24,
+ 0x58,0x38,0x58,0x38,0x58,0x38,0x58,0x31,0x58,0x44,0x20,0x3a,0x20,0x4f,0x20,0x20,
+ 0x20,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x20,0x20,0x33,0x20,0x4a,0x20,0x65,
+ 0x2e,0x47,0x2e,0x37,0x58,0x23,0x2e,0x2b,0x20,0x2e,0x20,0x35,0x20,0x43,0x20,0x7c,
+ 0x2e,0x33,0x58,0x33,0x58,0x35,0x58,0x34,0x58,0x5f,0x2e,0x34,0x20,0x25,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x20,0x20,0x20,
+ 0x20,0x71,0x20,0x5d,0x2e,0x30,0x58,0x30,0x58,0x2b,0x58,0x2c,0x20,0x42,0x20,0x7d,
+ 0x2e,0x3a,0x58,0x3a,0x58,0x3a,0x58,0x3a,0x58,0x3d,0x58,0x53,0x20,0x26,0x20,0x6f,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x20,0x20,0x2b,0x20,0x4d,0x20,0x38,0x58,0x38,0x58,0x37,0x58,0x55,
+ 0x2e,0x51,0x2e,0x23,0x58,0x2a,0x58,0x2a,0x58,0x2a,0x58,0x52,0x2e,0x3c,0x20,0x25,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x22,0x2c,0xa,
+ 0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x2c,0x20,0x31,0x20,0x20,0x58,0x36,
+ 0x58,0x57,0x2e,0x47,0x20,0x51,0x2e,0x4c,0x2e,0x5e,0x2e,0x7b,0x2e,0x5a,0x20,0x40,
+ 0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,
+ 0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x35,0x20,0x35,0x20,0x6d,0x20,0x50,
+ 0x2e,0x57,0x2e,0x3a,0x58,0x36,0x20,0x2e,0x20,0x33,0x58,0x2f,0x2e,0x58,0x2e,0x2c,
+ 0x20,0x40,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x35,0x20,0x35,0x20,0x35,0x20,0x6e,0x20,0x2b,
+ 0x2e,0x52,0x2e,0x57,0x2e,0x4a,0x2e,0x4b,0x2e,0x57,0x2e,0x5e,0x2e,0x3a,0x58,0x3a,
+ 0x58,0x31,0x58,0x6d,0x20,0x2b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x35,0x20,0x35,0x20,0x69,0x20,0x6f,0x2e,0x79,
+ 0x2e,0x76,0x2e,0x71,0x2e,0x2f,0x20,0x50,0x2e,0x49,0x2e,0x7d,0x20,0x7c,0x20,0x52,
+ 0x2e,0x26,0x58,0x2a,0x58,0x3b,0x58,0x38,0x58,0x20,0x2e,0x2c,0x20,0x20,0x20,0x20,
+ 0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,
+ 0x22,0x71,0x58,0x71,0x58,0x35,0x20,0x35,0x20,0x35,0x20,0x52,0x20,0x33,0x2e,0x4d,
+ 0x2e,0x35,0x2e,0x45,0x20,0x4c,0x20,0x37,0x2e,0x34,0x2e,0x5f,0x20,0x30,0x20,0x2b,
+ 0x20,0x4f,0x20,0x2b,0x20,0x69,0x20,0x29,0x2e,0x23,0x58,0x23,0x58,0x35,0x58,0x7e,
+ 0x2e,0x2c,0x20,0x4f,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x35,0x20,0x75,0x20,0x5d,0x20,0x6d,0x2e,0x72,
+ 0x2e,0x25,0x2e,0x48,0x20,0x72,0x20,0x3a,0x20,0x2c,0x20,0x74,0x2e,0x30,0x2e,0x50,
+ 0x20,0x37,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x24,0x20,0x2c,0x20,0x7b,0x20,0x60,
+ 0x2e,0x28,0x2e,0x3b,0x58,0x2d,0x58,0x2c,0x20,0x2b,0x20,0x20,0x20,0x20,0x20,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,0x22,0x35,0x20,0x75,0x20,0x32,0x2e,0x77,
+ 0x2e,0x24,0x2e,0x6b,0x20,0x74,0x20,0x6f,0x20,0x20,0x20,0x2c,0x20,0x7e,0x20,0x68,
+ 0x2e,0x50,0x20,0x6c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x2c,0x20,0x75,0x20,0x54,0x2e,0x5e,0x2e,0x23,0x58,0x3c,0x58,0x4e,0x20,0x2c,
+ 0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,0x22,0x35,0x20,0x3e,
+ 0x2e,0x39,0x2e,0x55,0x20,0x72,0x20,0x2e,0x20,0x20,0x20,0x2e,0x20,0x2c,0x20,0x54,
+ 0x20,0x42,0x2e,0x2a,0x2e,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x71,
+ 0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x2b,0x20,0x2c,0x20,0x51,0x20,0x21,0x2e,0x51,
+ 0x2e,0x3c,0x58,0x43,0x20,0x2c,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x22,0x2c,0xa,
+ 0x22,0x70,0x20,0x71,0x2e,0x31,0x2e,0x3e,0x20,0x2e,0x20,0x20,0x20,0x2b,0x20,0x31,
+ 0x20,0x5b,0x20,0x6d,0x2e,0x70,0x2e,0x6b,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x2c,
+ 0x20,0x75,0x20,0x4f,0x2e,0x57,0x2e,0x3b,0x58,0x21,0x20,0x2b,0x20,0x20,0x20,0x20,
+ 0x20,0x22,0x2c,0xa,0x22,0x34,0x20,0x38,0x2e,0x6a,0x2e,0x60,0x20,0x70,0x20,0x35,
+ 0x20,0x79,0x20,0x3b,0x2e,0x75,0x2e,0x61,0x2e,0x64,0x20,0x25,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x4f,0x20,0x2c,0x20,0x41,0x20,0x50,0x2e,0x5f,0x2e,0x2c,
+ 0x20,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x31,0x20,0x78,0x20,0x3c,0x2e,0x66,
+ 0x2e,0x6d,0x2e,0x78,0x2e,0x62,0x2e,0x79,0x2e,0x61,0x2e,0x67,0x20,0x3b,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x2b,0x20,0x30,
+ 0x20,0x76,0x20,0x4f,0x20,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x2d,
+ 0x20,0x68,0x20,0x63,0x20,0x57,0x20,0x57,0x20,0x57,0x20,0x57,0x20,0x7a,0x20,0x3a,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x2e,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,
+ 0x22,0x20,0x20,0x20,0x20,0x20,0x20,0x2a,0x20,0x65,0x20,0x6c,0x20,0x6c,0x20,0x66,
+ 0x20,0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x22,0x2c,0xa,0x22,0x71,0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x71,0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,0x22,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x22,0x2c,0xa,
+ 0x22,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,0x58,0x71,
+ 0x58,0x22,0xa,0x7d,0x3b,0xa,
+ ]
+
+@@qt_resource_name = [
+ # fileopen.xpm
+ 0x0,0xc,
+ 0xb,0x21,0x7,0xad,
+ 0x0,0x66,
+ 0x0,0x69,0x0,0x6c,0x0,0x65,0x0,0x6f,0x0,0x70,0x0,0x65,0x0,0x6e,0x0,0x2e,0x0,0x78,0x0,0x70,0x0,0x6d,
+ # filesave.xpm
+ 0x0,0xc,
+ 0x5,0x68,0x6,0x4d,
+ 0x0,0x66,
+ 0x0,0x69,0x0,0x6c,0x0,0x65,0x0,0x73,0x0,0x61,0x0,0x76,0x0,0x65,0x0,0x2e,0x0,0x78,0x0,0x70,0x0,0x6d,
+ # editcopy.xpm
+ 0x0,0xc,
+ 0xb,0xe,0x4a,0x2d,
+ 0x0,0x65,
+ 0x0,0x64,0x0,0x69,0x0,0x74,0x0,0x63,0x0,0x6f,0x0,0x70,0x0,0x79,0x0,0x2e,0x0,0x78,0x0,0x70,0x0,0x6d,
+ # filenew.xpm
+ 0x0,0xb,
+ 0x4,0x14,0x5a,0xed,
+ 0x0,0x66,
+ 0x0,0x69,0x0,0x6c,0x0,0x65,0x0,0x6e,0x0,0x65,0x0,0x77,0x0,0x2e,0x0,0x78,0x0,0x70,0x0,0x6d,
+ # editpaste.xpm
+ 0x0,0xd,
+ 0xd,0xc9,0x33,0xcd,
+ 0x0,0x65,
+ 0x0,0x64,0x0,0x69,0x0,0x74,0x0,0x70,0x0,0x61,0x0,0x73,0x0,0x74,0x0,0x65,0x0,0x2e,0x0,0x78,0x0,0x70,0x0,0x6d,
+ # editcut.xpm
+ 0x0,0xb,
+ 0xa,0x10,0x3e,0x2d,
+ 0x0,0x65,
+ 0x0,0x64,0x0,0x69,0x0,0x74,0x0,0x63,0x0,0x75,0x0,0x74,0x0,0x2e,0x0,0x78,0x0,0x70,0x0,0x6d,
+ ]
+
+@@qt_resource_struct = [
+ # :
+ 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x1,
+ # :/filenew.xpm
+ 0x0,0x0,0x0,0x5a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x44,0x97,
+ # :/filesave.xpm
+ 0x0,0x0,0x0,0x1e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x18,0xfd,
+ # :/editcut.xpm
+ 0x0,0x0,0x0,0x96,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x71,0xa0,
+ # :/editcopy.xpm
+ 0x0,0x0,0x0,0x3c,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x31,0xfa,
+ # :/fileopen.xpm
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,
+ # :/editpaste.xpm
+ 0x0,0x0,0x0,0x76,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x58,0xa4,
+]
+
+ def self.qInitResources_application()
+ Qt.qRegisterResourceData(0x01, QCleanupResources__dest_class__.qt_resource_struct.pack("C*"), QCleanupResources__dest_class__.qt_resource_name.pack("C*"), QCleanupResources__dest_class__.qt_resource_data.pack("C*"))
+ return 1
+ end
+ def self.qCleanupResources_application()
+ Qt.qUnregisterResourceData(0x01, QCleanupResources__dest_class__.qt_resource_struct.pack("C*"), QCleanupResources__dest_class__.qt_resource_name.pack("C*"), QCleanupResources__dest_class__.qt_resource_data.pack("C*"))
+ return 1
+ end
+
+end
+
+QCleanupResources__dest_class__.qInitResources_application()
diff --git a/languages/ruby/app_templates/qtruby4app/qtruby4app.kdevelop b/languages/ruby/app_templates/qtruby4app/qtruby4app.kdevelop
new file mode 100644
index 00000000..4afe7bca
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/qtruby4app.kdevelop
@@ -0,0 +1,83 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevCustomProject</projectmanagement>
+ <primarylanguage>Ruby</primarylanguage>
+ <keywords>
+ <keyword>Ruby</keyword>
+ <keyword>Qt</keyword>
+ </keywords>
+ </general>
+ <kdevcustomproject>
+ <general>
+ <activedir/>
+ </general>
+ </kdevcustomproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.rb" name="Ruby files" />
+ <group pattern="*.ui" name="QT Designer files" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>CVS,.svn</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <workspace>
+ <openfiles/>
+ </workspace>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="rb" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevrubysupport>
+ <run>
+ <interpreter>ruby</interpreter>
+ <terminal>false</terminal>
+ <mainprogram>./main.rb</mainprogram>
+ </run>
+ </kdevrubysupport>
+</kdevelop>
diff --git a/languages/ruby/app_templates/qtruby4app/qtruby4app.kdevtemplate b/languages/ruby/app_templates/qtruby4app/qtruby4app.kdevtemplate
new file mode 100644
index 00000000..bd778450
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/qtruby4app.kdevtemplate
@@ -0,0 +1,166 @@
+# KDE Config File
+[General]
+Name=QtRuby4 Application
+Name[ca]=Aplicació en QtRuby4
+Name[da]=QtRuby4-program
+Name[de]=QtRuby4-Anwendung
+Name[el]=Εφαρμογή QtRuby4
+Name[es]=Aplicación en QtRuby4
+Name[et]=QtRuby4 rakendus
+Name[hu]=QtRuby4-alapú alkalmazás
+Name[it]=Applicazione QtRuby4
+Name[nds]=QtRuby4-Programm
+Name[nl]=QtRuby4-programma
+Name[pl]=Program w QtRuby
+Name[pt]=Aplicação em QtRuby4
+Name[pt_BR]=Aplicativo QtRuby4
+Name[ru]=Приложение QtRuby4
+Name[sk]=QtRuby4 Aplikácia
+Name[sr]=QtRuby4 програм
+Name[sr@Latn]=QtRuby4 program
+Name[sv]=QtRuby 4-program
+Name[zh_TW]=QtRuby4 應用程式
+Icon=qtruby4app.png
+Category=Ruby/Qt
+Category[fr]=Ruby/Qt
+Comment=Generate a QtRuby4 based application (crossplatform compatible) - Needs QtRuby4
+Comment[ca]=Genera una aplicació basada en QtRuby4 (compatible plataforma creuada) - Necessita QtRuby4
+Comment[da]=Genererer et QtRuby4-baseret program (krydsplatformskompatibelt) - kræver QtRuby4
+Comment[de]=Erstellt eine auf QtRuby4 basierende Anwendung (plattformunabhängig). - Benötigt QtRuby4.
+Comment[el]=Δημιουργία μιας εφαρμογής βασισμένης στην QtRuby4 (πολλαπλών πλατφόρμων) - Απαιτείται η QtRuby4
+Comment[es]=Genera una aplicación basada en QtRuby4 (con compatibilidad multiplataforma) - Necesita QtRuby4
+Comment[et]=Rakenduse loomine QtRuby4 põhjal (multiplatvormne) - vajalik on QtRuby4
+Comment[hu]=Létrehoz egy QtRuby4-alapú, keresztfordításra is alkalmas alkalmazást - QtRuby4-et igényel
+Comment[it]=Genera un'applicazione basata su QtRuby4 (compatibile multipiattaforma) - serve QtRuby4
+Comment[nds]=Stellt en op QRubyt4 opbuut Programm op (över Bedriefümgeven weg kompatibel) - QtRuby4 deit noot
+Comment[nl]=Genereer een QtRuby4-gebaseerd programma (crossplatform-compatible) - heeft QtRuby4 nodig
+Comment[pl]=Generuje program używający QtRuby4 (wieloplatformowy) - wymaga QtRuby4
+Comment[pt]=Gera uma aplicação baseada no QtRuby4 (compatível com várias plataformas) - Necessita do QtRuby4
+Comment[pt_BR]=Gera uma aplicação baseada no QtRuby4 (compatível com várias plataformas) - Necessita do QtRuby4
+Comment[ru]=Создание кроссплатформенного приложения Qt 4 на Ruby. Требует QtRuby4.
+Comment[sk]=Vygeneruje aplikáciu založenú na QtRuby4 (multiplatformovo kompatibilnú) - vyžaduje QtRuby4
+Comment[sr]=Прави програм на основи QtRuby4 (прекоплатформски компатибилан) — захтева QtRuby4
+Comment[sr@Latn]=Pravi program na osnovi QtRuby4 (prekoplatformski kompatibilan) — zahteva QtRuby4
+Comment[sv]=Skapar ett QtRuby 4-baserat program (fungerar på andra plattformar). Kräver QtRuby 4.
+Comment[zh_TW]=產生一個 QtRuby4 為基礎的應用程式(跨平台相容)─需要 QtRuby4
+FileTemplates=rb,ShellStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.rb,%{dest}/ReadMe
+Archive=qtruby4app.tar.gz
+
+[FILE1]
+Type=install
+Source=%{src}/qtruby4app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/main.rb
+Dest=%{dest}/main.rb
+
+[FILE3]
+Type=install
+Source=%{src}/qtruby4app.rb
+Dest=%{dest}/%{APPNAMELC}.rb
+
+[FILE4]
+Type=install
+Source=%{src}/app-Makefile
+Dest=%{dest}/Makefile
+
+[FILE5]
+Type=install
+Source=%{src}/fileopen.xpm
+Dest=%{dest}/fileopen.xpm
+
+[FILE6]
+Type=install
+Source=%{src}/filesave.xpm
+Dest=%{dest}/filesave.xpm
+
+[FILE7]
+Type=install
+Source=%{src}/filenew.xpm
+Dest=%{dest}/filenew.xpm
+
+[FILE8]
+Type=install
+Source=%{src}/editcopy.xpm
+Dest=%{dest}/editcopy.xpm
+
+[FILE9]
+Type=install
+Source=%{src}/editpaste.xpm
+Dest=%{dest}/editpaste.xpm
+
+[FILE10]
+Type=install
+Source=%{src}/editcut.xpm
+Dest=%{dest}/editcut.xpm
+
+[FILE11]
+Type=install
+Source=%{src}/application.qrc
+Dest=%{dest}/application.qrc
+
+[FILE12]
+Type=install
+Source=%{src}/ReadMe
+Dest=%{dest}/ReadMe
+
+[FILE13]
+Type=install
+Source=%{src}/app.filelist
+Dest=%{dest}/%{APPNAMELC}.kdevelop.filelist
+
+[MSG]
+Type=message
+Comment=A QtRuby4 based application was created in %{dest}
+Comment[ca]=Una aplicació basada en QtRuby4 ha estat creada en %{dest}
+Comment[da]=Et QtRuby4-baseret program blev oprettet i %{dest}
+Comment[de]=Eine auf QtRuby4 basierende Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μία εφαρμογή βασισμένη στην QtRuby4 δημιουργήθηκε στο %{dest}
+Comment[es]=Una aplicación basada en QtRuby4 ha sido creada en %{dest}
+Comment[et]=Rakendus QtRuby4 põhjal loodi asukohta %{dest}
+Comment[hu]=Létrejött egy QtRuby4-alapú alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione basata su QtRuby4 in %{dest}
+Comment[nds]=In %{dest} wöör en op QtRuby4 opbuut Programm opstellt.
+Comment[nl]=Een QtRuby4-gebaseerd programma is aangemaakt in %{dest}
+Comment[pl]=Program używający QtRuby4 został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação baseada em QtRuby4 em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação baseada em QtRuby4 em %{dest}
+Comment[ru]=Приложение QtRuby4 создано в %{dest}
+Comment[sk]=QtRuby4 aplikácia bola vytvorená v %{dest}
+Comment[sr]=QtRuby4 програм је направљен у %{dest}
+Comment[sr@Latn]=QtRuby4 program je napravljen u %{dest}
+Comment[sv]=Ett program baserat på QtRuby 4 skapades i %{dest}
+Comment[zh_TW]=一個 QtRuby4 為基礎的應用程式框架已建立於 %{dest}
+
+Comment=
+
+[DESIGNER]
+Type=value
+ValueType=QString
+Value=DESIGNER
+Comment=Absolute Path for Designer (Qt4).
+Comment[ca]=Ruta absoluta per a Designer (Qt4).
+Comment[da]=Absolut søgesti til Designer (Qt4).
+Comment[de]=Absoluter Pfad für Designer (Qt4).
+Comment[el]=Απόλυτη διαδρομή για τον Σχεδιαστή (Qt4).
+Comment[es]=Ruta completa para Designer (Qt4).
+Comment[et]=Disaineri (Qt4) absoluutne asukoht.
+Comment[fr]=Chemin absolu pour Designer (Qt4).
+Comment[hu]=A Designer (Qt4) teljes elérési útja
+Comment[it]=Percorso assoluto del Designer (Qt4).
+Comment[ja]=Designer (Qt4) の絶対パス
+Comment[nds]=Afsluut Padd för Designer (Qt4)
+Comment[nl]=Absoluut pad naar Designer (Qt4).
+Comment[pl]=Ścieżka bezwzględna do Designera (Qt4).
+Comment[pt]=Localização Absoluta do Designer (Qt4).
+Comment[pt_BR]=Localização Absoluta do Designer (Qt4).
+Comment[ru]=Полный путь к Designer (Qt 4).
+Comment[sk]=Absolútna cesta ku Designer (Qt4).
+Comment[sr]=Апсолутна путања до Designer-а (Qt4).
+Comment[sr@Latn]=Apsolutna putanja do Designer-a (Qt4).
+Comment[sv]=Absolut sökväg till Designer (Qt4).
+Comment[zh_TW]=設計家(Qt4)的絕對路徑
+Default=
diff --git a/languages/ruby/app_templates/qtruby4app/qtruby4app.png b/languages/ruby/app_templates/qtruby4app/qtruby4app.png
new file mode 100644
index 00000000..96a7e0bf
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/qtruby4app.png
Binary files differ
diff --git a/languages/ruby/app_templates/qtruby4app/qtruby4app.rb b/languages/ruby/app_templates/qtruby4app/qtruby4app.rb
new file mode 100644
index 00000000..58dfa10a
--- /dev/null
+++ b/languages/ruby/app_templates/qtruby4app/qtruby4app.rb
@@ -0,0 +1,263 @@
+
+class %{APPNAME} < Qt::MainWindow
+
+ slots :newFile,
+ :open,
+ :save,
+ :saveAs,
+ :about,
+ :documentWasModified
+
+ def initialize
+ super
+ @textEdit = Qt::TextEdit.new
+ setCentralWidget(@textEdit)
+
+ createActions()
+ createMenus()
+ createToolBars()
+ createStatusBar()
+
+ readSettings()
+
+ connect(@textEdit.document, SIGNAL(:contentsChanged),
+ self, SLOT(:documentWasModified))
+
+ setCurrentFile("")
+ end
+
+ def closeEvent(event)
+ if maybeSave
+ writeSettings
+ event.accept
+ else
+ event.ignore
+ end
+ end
+
+ def newFile()
+ if maybeSave
+ @textEdit.clear
+ setCurrentFile("")
+ end
+ end
+
+ def open()
+ if maybeSave
+ fileName = Qt::FileDialog.getOpenFileName(self)
+ if !fileName.nil?
+ loadFile(fileName)
+ end
+ end
+ end
+
+ def save()
+ if @curFile.nil?
+ return saveAs()
+ else
+ return saveFile(@curFile);
+ end
+ end
+
+ def saveAs()
+ fileName = Qt::FileDialog.getSaveFileName(self)
+ if fileName.nil?
+ return false
+ end
+
+ return saveFile(fileName)
+ end
+
+ def about()
+ Qt::MessageBox.about(self, tr("About Application"),
+ tr("The <b>Application</b> example demonstrates how to " \
+ "write modern GUI applications using Qt, with a menu bar, " \
+ "toolbars, and a status bar."))
+ end
+
+ def documentWasModified()
+ setWindowModified(true)
+ end
+
+ def createActions()
+ @newAct = Qt::Action.new(Qt::Icon.new(":/filenew.xpm"), tr("&New"), self)
+ @newAct.shortcut = tr("Ctrl+N")
+ @newAct.statusTip = tr("Create a new file")
+ connect(@newAct, SIGNAL(:triggered), self, SLOT(:newFile))
+
+ @openAct = Qt::Action.new(Qt::Icon.new(":/fileopen.xpm"), tr("&Open..."), self)
+ @openAct.shortcut = tr("Ctrl+O")
+ @openAct.statusTip = tr("Open an existing file")
+ connect(@openAct, SIGNAL(:triggered), self, SLOT(:open))
+
+ @saveAct = Qt::Action.new(Qt::Icon.new(":/filesave.xpm"), tr("&Save"), self)
+ @saveAct.shortcut = tr("Ctrl+S")
+ @saveAct.statusTip = tr("Save the document to disk")
+ connect(@saveAct, SIGNAL(:triggered), self, SLOT(:save))
+
+ @saveAsAct = Qt::Action.new(tr("Save &As..."), self)
+ @saveAsAct.statusTip = tr("Save the document under a new name")
+ connect(@saveAsAct, SIGNAL(:triggered), self, SLOT(:saveAs))
+
+ @exitAct = Qt::Action.new(tr("E&xit"), self)
+ @exitAct.shortcut = tr("Ctrl+Q")
+ @exitAct.statusTip = tr("Exit the application")
+ connect(@exitAct, SIGNAL(:triggered), self, SLOT(:close))
+
+ @cutAct = Qt::Action.new(Qt::Icon.new(":/editcut.xpm"), tr("Cu&t"), self)
+ @cutAct.shortcut = tr("Ctrl+X")
+ @cutAct.statusTip = tr("Cut the current selection's contents to the " \
+ "clipboard")
+ connect(@cutAct, SIGNAL(:triggered), @textEdit, SLOT(:cut))
+
+ @copyAct = Qt::Action.new(Qt::Icon.new(":/editcopy.xpm"), tr("&Copy"), self)
+ @copyAct.shortcut = tr("Ctrl+C")
+ @copyAct.statusTip = tr("Copy the current selection's contents to the " \
+ "clipboard")
+ connect(@copyAct, SIGNAL(:triggered), @textEdit, SLOT(:copy))
+
+ @pasteAct = Qt::Action.new(Qt::Icon.new(":/editpaste.xpm"), tr("&Paste"), self)
+ @pasteAct.shortcut = tr("Ctrl+V")
+ @pasteAct.statusTip = tr("Paste the clipboard's contents into the current " \
+ "selection")
+ connect(@pasteAct, SIGNAL(:triggered), @textEdit, SLOT(:paste))
+
+ @aboutAct = Qt::Action.new(tr("&About"), self)
+ @aboutAct.statusTip = tr("Show the application's About box")
+ connect(@aboutAct, SIGNAL(:triggered), self, SLOT(:about))
+
+ @aboutQtAct = Qt::Action.new(tr("About &Qt"), self)
+ @aboutQtAct.statusTip = tr("Show the Qt library's About box")
+ connect(@aboutQtAct, SIGNAL(:triggered), $qApp, SLOT(:aboutQt))
+
+ @cutAct.setEnabled(false)
+ @copyAct.setEnabled(false)
+ connect(@textEdit, SIGNAL('copyAvailable(bool)'),
+ @cutAct, SLOT('setEnabled(bool)'))
+ connect(@textEdit, SIGNAL('copyAvailable(bool)'),
+ @copyAct, SLOT('setEnabled(bool)'))
+ end
+
+ def createMenus()
+ @fileMenu = menuBar().addMenu(tr("&File"))
+ @fileMenu.addAction(@newAct)
+ @fileMenu.addAction(@openAct)
+ @fileMenu.addAction(@saveAct)
+ @fileMenu.addAction(@saveAsAct)
+ @fileMenu.addSeparator()
+ @fileMenu.addAction(@exitAct)
+
+ @editMenu = menuBar.addMenu(tr("&Edit"))
+ @editMenu.addAction(@cutAct)
+ @editMenu.addAction(@copyAct)
+ @editMenu.addAction(@pasteAct)
+
+ menuBar.addSeparator()
+
+ @helpMenu = menuBar().addMenu(tr("&Help"))
+ @helpMenu.addAction(@aboutAct)
+ @helpMenu.addAction(@aboutQtAct)
+ end
+
+ def createToolBars()
+ @fileToolBar = addToolBar(tr("File"))
+ @fileToolBar.addAction(@newAct)
+ @fileToolBar.addAction(@openAct)
+ @fileToolBar.addAction(@saveAct)
+
+ @editToolBar = addToolBar(tr("Edit"))
+ @editToolBar.addAction(@cutAct)
+ @editToolBar.addAction(@copyAct)
+ @editToolBar.addAction(@pasteAct)
+ end
+
+ def createStatusBar()
+ statusBar.showMessage(tr("Ready"))
+ end
+
+ def readSettings()
+ settings = Qt::Settings.new("Trolltech", "Application Example")
+ pos = settings.value("pos", Qt::Variant.new(Qt::Point.new(200, 200))).toPoint()
+ size = settings.value("size", Qt::Variant.new(Qt::Size.new(400, 400))).toSize()
+ resize(size)
+ move(pos)
+ end
+
+ def writeSettings()
+ settings = Qt::Settings.new("Trolltech", "Application Example")
+ settings.setValue("pos", Qt::Variant.new(pos()))
+ settings.setValue("size", Qt::Variant.new(size()))
+ end
+
+ def maybeSave()
+ if @textEdit.document.modified?
+ ret = Qt::MessageBox.warning(self, tr("Application"),
+ tr("The document has been modified.\n" \
+ "Do you want to save your changes?"),
+ Qt::MessageBox::Yes | Qt::MessageBox::Default,
+ Qt::MessageBox::No,
+ Qt::MessageBox::Cancel | Qt::MessageBox::Escape)
+ if ret == Qt::MessageBox::Yes
+ return save()
+ elsif ret == Qt::MessageBox::Cancel
+ return false
+ end
+ end
+ return true
+ end
+
+ def loadFile(fileName)
+ file = Qt::File.new(fileName)
+ if !file.open(Qt::File::ReadOnly | Qt::File::Text)
+ Qt::MessageBox.warning( self, tr("Application"),
+ tr("Cannot read file %s\n%s." % [fileName, file.errorString]) )
+ return
+ end
+
+ inf = Qt::TextStream.new(file)
+ Qt::Application.overrideCursor = Qt::Cursor.new(Qt::WaitCursor)
+ @textEdit.setPlainText(inf.readAll)
+ Qt::Application.restoreOverrideCursor()
+
+ setCurrentFile(fileName)
+ statusBar.showMessage(tr("File loaded"), 2000)
+ end
+
+ def saveFile(fileName)
+ file = Qt::File.new(fileName)
+ if !file.open(Qt::File::WriteOnly | Qt::File::Text)
+ Qt::MessageBox.warning(self, tr("Application"),
+ tr("Cannot write file %s\n%s." % [fileName, file.errorString]) )
+ return false
+ end
+
+ outf = Qt::TextStream.new(file)
+ Qt::Application.overrideCursor = Qt::Cursor.new(Qt::WaitCursor)
+ outf << @textEdit.toPlainText()
+ Qt::Application.restoreOverrideCursor()
+ outf.flush
+
+ setCurrentFile(fileName)
+ statusBar().showMessage(tr("File saved"), 2000)
+ return true
+ end
+
+ def setCurrentFile(fileName)
+ @curFile = fileName;
+ @textEdit.document().modified = false
+ setWindowModified(false)
+
+ shownName = ""
+ if @curFile.nil?
+ shownName = "untitled.txt"
+ else
+ shownName = strippedName(@curFile)
+ end
+
+ setWindowTitle(tr("%s[*] - %s" % [shownName, tr("Application")]))
+ end
+
+ def strippedName(fullFileName)
+ return Qt::FileInfo.new(fullFileName).fileName()
+ end
+end \ No newline at end of file
diff --git a/languages/ruby/app_templates/qtrubyapp/Makefile.am b/languages/ruby/app_templates/qtrubyapp/Makefile.am
new file mode 100644
index 00000000..7fc1c803
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/Makefile.am
@@ -0,0 +1,18 @@
+dataFiles = main.rb qtrubyapp.rb qtrubyapp.png qtrubyapp.kdevelop \
+ filesave.xpm fileopen.xpm fileprint.xpm app.filelist app-Makefile README
+
+templateName = qtrubyapp
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/ruby/app_templates/qtrubyapp/README b/languages/ruby/app_templates/qtrubyapp/README
new file mode 100644
index 00000000..9468893b
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/README
@@ -0,0 +1,29 @@
+QtRuby App template quick start
+Author: Anne-Marie Mahfouf
+Date: 2006-12-05
+-----------------------------------------------
+
+This README file explains you some basic things for starting with
+this application template.
+-----------------------------------------------
+
+-- REQUIREMENTS --
+you need
+- Qt version might be 3.3.4 or 3.3.5.
+- kdelibs 3.5 and kdelibs headers 3.5 (devel package) in order to build this template.
+- qtruby either from your distribution or from the kdebindings module or also from
+http://rubyforge.org/projects/korundum/.
+If you use the kdebindings module you need to build kdebindings/smoke/qt and then kdebindings/qtruby.
+
+-----------------------------------------------
+
+-- RUN --
+You will see that the Build menu in KDevelop is now adapted to Ruby.
+In the Build menu, choose Run or use Shift + F9 to see your project running.
+
+-----------------------------------------------
+
+-- RELEVANT LINK --
+http://developer.kde.org/language-bindings/ruby/index.html
+
+In KDevelop Documentation, you can find a Ruby tutorial. \ No newline at end of file
diff --git a/languages/ruby/app_templates/qtrubyapp/app-Makefile b/languages/ruby/app_templates/qtrubyapp/app-Makefile
new file mode 100644
index 00000000..88b5556e
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/app-Makefile
@@ -0,0 +1,7 @@
+uis := $(wildcard *.ui)
+
+all: $(uis)
+ @for name in $^; do rbuic $$name > `echo $$name | awk -F '\\\.ui$$' '{ print $$1 }' 2> /dev/null`.rb; echo "Running rbuic on $$name"; done
+
+clean: $(uis)
+ @for name in $^; do rm -f `echo $$name | awk -F '\\\.ui$$' '{ print $$1 }' 2> /dev/null`.rb; done
diff --git a/languages/ruby/app_templates/qtrubyapp/app.filelist b/languages/ruby/app_templates/qtrubyapp/app.filelist
new file mode 100644
index 00000000..339e6998
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/app.filelist
@@ -0,0 +1,3 @@
+# KDevelop Custom Project File List
+main.rb
+%{APPNAMELC}.rb
diff --git a/languages/ruby/app_templates/qtrubyapp/fileopen.xpm b/languages/ruby/app_templates/qtrubyapp/fileopen.xpm
new file mode 100644
index 00000000..880417ee
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/fileopen.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *fileopen[] = {
+" 16 13 5 1",
+". c #040404",
+"# c #808304",
+"a c None",
+"b c #f3f704",
+"c c #f3f7f3",
+"aaaaaaaaa...aaaa",
+"aaaaaaaa.aaa.a.a",
+"aaaaaaaaaaaaa..a",
+"a...aaaaaaaa...a",
+".bcb.......aaaaa",
+".cbcbcbcbc.aaaaa",
+".bcbcbcbcb.aaaaa",
+".cbcb...........",
+".bcb.#########.a",
+".cb.#########.aa",
+".b.#########.aaa",
+"..#########.aaaa",
+"...........aaaaa"
+};
diff --git a/languages/ruby/app_templates/qtrubyapp/fileprint.xpm b/languages/ruby/app_templates/qtrubyapp/fileprint.xpm
new file mode 100644
index 00000000..6ada912f
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/fileprint.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static const char *fileprint[] = {
+" 16 14 6 1",
+". c #000000",
+"# c #848284",
+"a c #c6c3c6",
+"b c #ffff00",
+"c c #ffffff",
+"d c None",
+"ddddd.........dd",
+"dddd.cccccccc.dd",
+"dddd.c.....c.ddd",
+"ddd.cccccccc.ddd",
+"ddd.c.....c....d",
+"dd.cccccccc.a.a.",
+"d..........a.a..",
+".aaaaaaaaaa.a.a.",
+".............aa.",
+".aaaaaa###aa.a.d",
+".aaaaaabbbaa...d",
+".............a.d",
+"d.aaaaaaaaa.a.dd",
+"dd...........ddd"
+};
diff --git a/languages/ruby/app_templates/qtrubyapp/filesave.xpm b/languages/ruby/app_templates/qtrubyapp/filesave.xpm
new file mode 100644
index 00000000..bd6870f4
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/filesave.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *filesave[] = {
+" 14 14 4 1",
+". c #040404",
+"# c #808304",
+"a c #bfc2bf",
+"b c None",
+"..............",
+".#.aaaaaaaa.a.",
+".#.aaaaaaaa...",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".##........##.",
+".############.",
+".##.........#.",
+".##......aa.#.",
+".##......aa.#.",
+".##......aa.#.",
+"b............."
+};
diff --git a/languages/ruby/app_templates/qtrubyapp/main.rb b/languages/ruby/app_templates/qtrubyapp/main.rb
new file mode 100644
index 00000000..6f4bceae
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/main.rb
@@ -0,0 +1,10 @@
+require 'Qt'
+require '%{APPNAMELC}.rb'
+
+a = Qt::Application.new( ARGV )
+mw = %{APPNAMESC}.new
+mw.caption = "%{APPNAMESC}"
+mw.show
+a.connect( a, SIGNAL('lastWindowClosed()'), a, SLOT('quit()') )
+a.exec
+
diff --git a/languages/ruby/app_templates/qtrubyapp/qtrubyapp.kdevelop b/languages/ruby/app_templates/qtrubyapp/qtrubyapp.kdevelop
new file mode 100644
index 00000000..4afe7bca
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/qtrubyapp.kdevelop
@@ -0,0 +1,83 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevCustomProject</projectmanagement>
+ <primarylanguage>Ruby</primarylanguage>
+ <keywords>
+ <keyword>Ruby</keyword>
+ <keyword>Qt</keyword>
+ </keywords>
+ </general>
+ <kdevcustomproject>
+ <general>
+ <activedir/>
+ </general>
+ </kdevcustomproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.rb" name="Ruby files" />
+ <group pattern="*.ui" name="QT Designer files" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*" name="Others" />
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>CVS,.svn</hidepatterns>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <workspace>
+ <openfiles/>
+ </workspace>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="rb" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevrubysupport>
+ <run>
+ <interpreter>ruby</interpreter>
+ <terminal>false</terminal>
+ <mainprogram>./main.rb</mainprogram>
+ </run>
+ </kdevrubysupport>
+</kdevelop>
diff --git a/languages/ruby/app_templates/qtrubyapp/qtrubyapp.kdevtemplate b/languages/ruby/app_templates/qtrubyapp/qtrubyapp.kdevtemplate
new file mode 100644
index 00000000..5fd82925
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/qtrubyapp.kdevtemplate
@@ -0,0 +1,140 @@
+# KDE Config File
+[General]
+Name=QtRuby Application
+Name[ca]=Aplicació en QtRuby
+Name[da]=QtRuby-program
+Name[de]=QtRuby-Anwendung
+Name[el]=Εφαρμογή QtRuby
+Name[es]=Aplicación en QtRuby
+Name[et]=QtRuby rakendus
+Name[eu]=QtRuby aplikazioa
+Name[fa]=کاربرد QtRuby
+Name[fr]=Application QtRuby
+Name[ga]=Feidhmchlár QtRuby
+Name[gl]=Aplicación QtRuby
+Name[hu]=QtRuby-alapú alkalmazás
+Name[it]=Applicazione QtRuby
+Name[ja]=QtRuby アプリケーション
+Name[nds]=QtRuby-Programm
+Name[ne]=QtRuby अनुप्रयोग
+Name[nl]=QtRuby-toepassing
+Name[pl]=Program w QtRuby
+Name[pt]=Aplicação em QtRuby
+Name[pt_BR]=Aplicativo QtRuby
+Name[ru]=Приложение QtRuby
+Name[sk]=QtRuby Aplikácia
+Name[sr]=QtRuby програм
+Name[sr@Latn]=QtRuby program
+Name[sv]=QtRuby-program
+Name[tr]=QtRuby Uygulaması
+Name[zh_CN]=QtRuby 应用程序
+Name[zh_TW]=QtRuby 應用程式
+Icon=qtrubyapp.png
+Category=Ruby/Qt
+Category[fr]=Ruby/Qt
+Comment=Generate a QtRuby based application (crossplatform compatible)
+Comment[ca]=Genera una aplicació basada en QtRuby (multi plataforma)
+Comment[da]=Genererer et QtRuby baseret program (krydsplatform kompatibelt)
+Comment[de]=Erstellt eine auf QtRuby basierende Anwendung (plattformunabhängig)
+Comment[el]=Δημιουργία μιας εφαρμογής βασισμένης σε QtRuby (συμβατή με πολλαπλές πλατφόρμες)
+Comment[es]=Genera una aplicación basada en QtRuby (compatible multiplataforma)
+Comment[et]=Rakenduse loomine QtRuby põhjal (mitmeplatvormne)
+Comment[eu]=Sortu QtRuby lengoaian oinarritutako aplikazioa (plataforma gurutzatuekin bateragarria)
+Comment[fa]=یک کاربرد بر مبنای QtRuby تولید می‌کند )همساز بین سکویی(
+Comment[fr]=Génèrer une application basée sur QtRuby (compatible multi-plateforme)
+Comment[gl]=Xera unha aplicación baseada en QtRuby (compatibilidade multiplataforma)
+Comment[hu]=Létrehoz egy QtRuby-alapú, keresztfordításra is megfelelő alkalmazást
+Comment[it]=Genera un'applicazione basata su QtRuby (compatibile multipiattaforma)
+Comment[ja]=QtRuby ベースのアプリケーションを作成 (クロスプラットフォーム)
+Comment[nds]=Stellt en op QtRuby opbuut Programm op (över Bedriefümgeven weg kompatibel)
+Comment[ne]= QtRuby आधारित अनुप्रयोग (क्रसप्लाटफर्म उपयुक्त) उत्पन्न गर्नुहोस्
+Comment[nl]=Genereert een QtRuby-toepassing (crossplatform compatible)
+Comment[pl]=Generuj program używający QtRuby (wieloplatformowy)
+Comment[pt]=Gera uma aplicação baseada em QtRuby (compatível com várias plataformas)
+Comment[pt_BR]=Gera um aplicativo baseado no QtRuby (compatível com várias plataformas)
+Comment[ru]=Создание кроссплатформенного приложения на QtRuby
+Comment[sk]=Vygeneruje QtRuby aplikáciu (multiplatformovo kompatibilnú)
+Comment[sr]=Прави програм на основу QtRuby-ја (прекоплатформски компатибилан)
+Comment[sr@Latn]=Pravi program na osnovu QtRuby-ja (prekoplatformski kompatibilan)
+Comment[sv]=Skapa ett program baserat på QtRuby (fungerar på andra plattformar)
+Comment[tr]=QtRuby tabanlı bir uygulama yarat (platformlararası geçimli)
+Comment[zh_TW]=產生一個 QtRuby 為基礎的應用程式(跨平台相容)
+FileTemplates=rb,ShellStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.rb,%{dest}/README
+Archive=qtrubyapp.tar.gz
+
+[FILE1]
+Type=install
+Source=%{src}/qtrubyapp.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/main.rb
+Dest=%{dest}/main.rb
+
+[FILE3]
+Type=install
+Source=%{src}/qtrubyapp.rb
+Dest=%{dest}/%{APPNAMELC}.rb
+
+[FILE4]
+Type=install
+Source=%{src}/fileopen.xpm
+Dest=%{dest}/fileopen.xpm
+
+[FILE5]
+Type=install
+Source=%{src}/filesave.xpm
+Dest=%{dest}/filesave.xpm
+
+[FILE6]
+Type=install
+Source=%{src}/fileprint.xpm
+Dest=%{dest}/fileprint.xpm
+
+[FILE7]
+Type=install
+Source=%{src}/app-Makefile
+Dest=%{dest}/Makefile
+
+[FILE8]
+Type=install
+Source=%{src}/app.filelist
+Dest=%{dest}/%{APPNAMELC}.kdevelop.filelist
+
+[FILE9]
+Type=install
+Source=%{src}/README
+Dest=%{dest}/README
+
+[MSG]
+Type=message
+Comment=A QtRuby based application was created in %{dest}
+Comment[ca]=Una aplicació basada en QtRuby ha estat creada en %{dest}
+Comment[da]=Et QtRuby baseret program blev oprettet i %{dest}
+Comment[de]=Eine auf QtRuby basierende Anwendung wurde in %{dest} erstellt.
+Comment[el]=Μια εφαρμογή βασισμένη σε QtRuby δημιουργήθηκε στο %{dest}
+Comment[es]=Una aplicación basada en QtRuby ha sido creada en %{dest}
+Comment[et]=Rakendus QtRuby põhjal loodi asukohta %{dest}
+Comment[eu]=QtRuby lengoaian oinarritutako aplikazioa sortu da hemen: %{dest}
+Comment[fa]=یک کاربرد بر مبنای QtRuby در %{dest} ایجاد شد
+Comment[fr]=Une application basée sur QtRuby a été créée dans %{dest}
+Comment[ga]=Cruthaíodh feidhmchlár bunaithe ar QtRuby i %{dest}
+Comment[gl]=Creouse unha aplicación baseada en QtRuby en %{dest}
+Comment[hu]=Létrejött egy QtRuby-alapú alkalmazás itt: %{dest}
+Comment[it]=È stata creata un'applicazione basata su QtRuby in %{dest}
+Comment[ja]=QtRuby ベースのアプリケーションを %{dest} に作成しました
+Comment[nds]=In %{dest} wöör en op QtRuby opbuut Programm opstellt.
+Comment[ne]=QtRuby आधारित अनुप्रयोग %{dest} मा सिर्जना गरियो
+Comment[nl]=Een QtRuby-toepassing is aangemaakt in %{dest}
+Comment[pl]=Program używający QtRuby został utworzony w %{dest}
+Comment[pt]=Foi criada uma aplicação baseada em QtRuby em %{dest}
+Comment[pt_BR]=Foi criada uma aplicação baseada em QtRuby em %{dest}
+Comment[ru]=Приложение QtRuby создано в %{dest}
+Comment[sk]=QtRuby aplikácia bola vytvorená v %{dest}
+Comment[sr]=QtRuby програм је направљен у %{dest}
+Comment[sr@Latn]=QtRuby program je napravljen u %{dest}
+Comment[sv]=Ett program baserat på QtRuby skapades i %{dest}
+Comment[tr]=Bir QtRuby tabanlı uygulama %{dest} içinde yaratıldı.
+Comment[zh_TW]=一個 QtRuby 為基礎的應用程式框架已建立於 %{dest}
diff --git a/languages/ruby/app_templates/qtrubyapp/qtrubyapp.png b/languages/ruby/app_templates/qtrubyapp/qtrubyapp.png
new file mode 100644
index 00000000..10f7ecec
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/qtrubyapp.png
Binary files differ
diff --git a/languages/ruby/app_templates/qtrubyapp/qtrubyapp.rb b/languages/ruby/app_templates/qtrubyapp/qtrubyapp.rb
new file mode 100644
index 00000000..18ecdc3f
--- /dev/null
+++ b/languages/ruby/app_templates/qtrubyapp/qtrubyapp.rb
@@ -0,0 +1,253 @@
+class %{APPNAMESC} < Qt::MainWindow
+
+ slots 'newDoc()',
+ 'choose()',
+ 'load( const QString& )',
+ 'save()',
+ 'saveAs()',
+ 'print()',
+ 'about()',
+ 'aboutQt()'
+
+ def initialize()
+ super( nil, "%{APPNAMESC}", WDestructiveClose )
+ @printer = Qt::Printer.new
+
+ fileTools = Qt::ToolBar.new( self, "file operations" )
+ fileTools.setLabel( tr("File Operations") )
+
+ openIcon = Qt::Pixmap.new( "fileopen.xpm" )
+ fileOpen = Qt::ToolButton.new( Qt::IconSet.new(openIcon), tr("Open File"), nil,
+ self, SLOT('choose()'), fileTools, "open file" )
+
+ saveIcon = Qt::Pixmap.new( "filesave.xpm" )
+ fileSave = Qt::ToolButton.new( Qt::IconSet.new(saveIcon), tr("Save File"), nil,
+ self, SLOT('save()'), fileTools, "save file" )
+
+ printIcon = Qt::Pixmap.new( "fileprint.xpm" )
+ filePrint = Qt::ToolButton.new( Qt::IconSet.new(printIcon), tr("Print File"), nil,
+ self, SLOT('print()'), fileTools, "print file" )
+
+
+ Qt::WhatsThis.whatsThisButton( fileTools )
+
+ fileOpenText = tr('<p><img source="fileopen"> ' +
+ "Click this button to open a <em>new file</em>. <br>" +
+ "You can also select the <b>Open</b> command " +
+ "from the <b>File</b> menu.</p>")
+
+ Qt::WhatsThis.add( fileOpen, fileOpenText )
+
+ Qt::MimeSourceFactory.defaultFactory().setPixmap( "fileopen", openIcon )
+
+ fileSaveText = tr("<p>Click this button to save the file you " +
+ "are editing. You will be prompted for a file name.\n" +
+ "You can also select the <b>Save</b> command " +
+ "from the <b>File</b> menu.</p>")
+
+ Qt::WhatsThis.add( fileSave, fileSaveText )
+
+ filePrintText = tr("Click this button to print the file you " +
+ "are editing.\n You can also select the Print " +
+ "command from the File menu.")
+
+ Qt::WhatsThis.add( filePrint, filePrintText )
+
+
+ file = Qt::PopupMenu.new( self )
+ menuBar().insertItem( tr("&File"), file )
+
+
+ file.insertItem( tr("&New"), self, SLOT('newDoc()'), Qt::KeySequence.new(CTRL+Key_N) )
+
+ id = file.insertItem( Qt::IconSet.new(openIcon), tr("&Open..."),
+ self, SLOT('choose()'), Qt::KeySequence.new(CTRL+Key_O) )
+ file.setWhatsThis( id, fileOpenText )
+
+ id = file.insertItem( Qt::IconSet.new(saveIcon), tr("&Save"),
+ self, SLOT('save()'), Qt::KeySequence.new(CTRL+Key_S) )
+ file.setWhatsThis( id, fileSaveText )
+
+ id = file.insertItem( tr("Save &As..."), self, SLOT('saveAs()') )
+ file.setWhatsThis( id, fileSaveText )
+
+ file.insertSeparator()
+
+ id = file.insertItem( Qt::IconSet.new(printIcon), tr("&Print..."),
+ self, SLOT('print()'), Qt::KeySequence.new(CTRL+Key_P) )
+ file.setWhatsThis( id, filePrintText )
+
+ file.insertSeparator()
+
+ file.insertItem( tr("&Close"), self, SLOT('close()'), Qt::KeySequence.new(CTRL+Key_W) )
+
+ file.insertItem( tr("&Quit"), $qApp, SLOT( 'closeAllWindows()' ), Qt::KeySequence.new(CTRL+Key_Q) )
+
+ menuBar().insertSeparator()
+
+ help = Qt::PopupMenu.new( self )
+ menuBar().insertItem( tr("&Help"), help )
+
+ help.insertItem( tr("&About"), self, SLOT('about()'), Qt::KeySequence.new(Key_F1) )
+ help.insertItem( tr("About &Qt"), self, SLOT('aboutQt()') )
+ help.insertSeparator()
+ help.insertItem( tr("What's &This"), self, SLOT('whatsThis()'), Qt::KeySequence.new(SHIFT+Key_F1) )
+
+ @e = Qt::TextEdit.new( self, "editor" )
+ @e.setFocus()
+ setCentralWidget( @e )
+ statusBar().message( tr("Ready"), 2000 )
+
+ resize( 450, 600 )
+ end
+
+ private
+
+ def newDoc()
+ ed = %{APPNAMESC}.new
+ ed.setCaption(tr("Qt Example - Application"))
+ ed.show()
+ end
+
+ def choose()
+ fn = Qt::FileDialog.getOpenFileName( nil, nil,
+ self)
+ if !fn.nil?
+ load( fn )
+ else
+ statusBar().message( tr("Loading aborted"), 2000 )
+ end
+ end
+
+
+ def load( filename )
+ f = Qt::File.new( filename )
+ if !f.open( Qt::IO_ReadOnly )
+ return
+ end
+
+ ts = Qt::TextStream.new( f )
+ @e.setText( ts.read() )
+ @e.setModified( false )
+ setCaption( filename )
+ statusBar().message( tr("Loaded document %s" % filename), 2000 )
+ end
+
+
+ def save()
+ if @filename.nil?
+ saveAs()
+ return
+ end
+
+ text = @e.text()
+ f = Qt::File.new( @filename )
+ if !f.open( Qt::IO_WriteOnly )
+ statusBar().message( tr("Could not write to %s" % @filename),
+ 2000 )
+ return
+ end
+
+ t = Qt::TextStream.new( f )
+ t << text
+ f.close()
+
+ @e.setModified( false )
+
+ setCaption( @filename )
+
+ statusBar().message( tr( "File %s saved" % @filename ), 2000 )
+ end
+
+
+ def saveAs()
+ fn = Qt::FileDialog.getSaveFileName( nil, nil,
+ self )
+ if !fn.nil?
+ @filename = fn
+ save()
+ else
+ statusBar().message( tr("Saving aborted"), 2000 )
+ end
+ end
+
+
+ def print()
+ # ###### Rewrite to use Qt::SimpleRichText to print here as well
+ margin = 10
+ pageNo = 1
+
+ if @printer.setup(self) # @printer dialog
+ statusBar().message( tr("Printing...") )
+ p = Qt::Painter.new
+ if !p.begin( @printer ) # paint on @printer
+ return
+ end
+
+ p.setFont( @e.font() )
+ yPos = 0 # y-position for each line
+ fm = p.fontMetrics()
+ metrics = Qt::PaintDeviceMetrics.new( @printer ) # need width/height
+ # of @printer surface
+ for i in [email protected]() do
+ if margin + yPos > metrics.height() - margin
+ msg = "Printing (page "
+ msg += pageNo.to_s
+ pageNo += 1
+ msg += ")..."
+ statusBar().message( msg )
+ @printer.newPage() # no more room on self page
+ yPos = 0 # back to top of page
+ end
+ p.drawText( margin, margin + yPos,
+ metrics.width(), fm.lineSpacing(),
+ ExpandTabs | DontClip,
+ @e.text( i ) )
+ yPos = yPos + fm.lineSpacing()
+ end
+ p.end() # send job to @printer
+ statusBar().message( tr("Printing completed"), 2000 )
+ else
+ statusBar().message( tr("Printing aborted"), 2000 )
+ end
+ end
+
+ protected
+
+ def closeEvent( ce )
+ ce.accept()
+ return
+ end
+
+ case Qt::MessageBox.information( self, tr("Qt Application Example"),
+ tr("Do you want to save the changes" +
+ " to the document?"),
+ tr("Yes"), tr("No"), tr("Cancel"),
+ 0, 1 )
+ when 0
+ save()
+ ce.accept()
+ when 1
+ ce.accept()
+ when 2
+ ce.ignore()
+ else # just for sanity
+ ce.ignore()
+ end
+ end
+
+ private
+
+ def about()
+ Qt::MessageBox.about( self, tr("Qt Application Example"),
+ tr("This example demonstrates simple use of " +
+ "Qt::MainWindow,\nQt::MenuBar and Qt::ToolBar."))
+ end
+
+
+ def aboutQt()
+ Qt::MessageBox.aboutQt( self, tr("Qt Application Example") )
+ end
+
+end
diff --git a/languages/ruby/app_templates/rails/CMakeLists.txt b/languages/ruby/app_templates/rails/CMakeLists.txt
new file mode 100644
index 00000000..34da0fde
--- /dev/null
+++ b/languages/ruby/app_templates/rails/CMakeLists.txt
@@ -0,0 +1,20 @@
+
+
+#original Makefile.am contents follow:
+
+#dataFiles = app.rb app.kdevelop
+#templateName= rubyhello
+#
+#### no need to change below:
+#template_DATA = $(templateName).kdevtemplate
+#templatedir = ${appwizarddatadir}/templates
+#
+#appwizarddatadir = ${kde_datadir}/kdevappwizard
+#$(templateName).tar.gz:
+# $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+# $(GZIP) -9 $(templateName).tar
+#
+#archivedir = ${appwizarddatadir}
+#archive_DATA = $(templateName).tar.gz ${templateName}.png
+#
+#CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/ruby/app_templates/rails/Makefile.am b/languages/ruby/app_templates/rails/Makefile.am
new file mode 100644
index 00000000..49d77bdd
--- /dev/null
+++ b/languages/ruby/app_templates/rails/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = app.kdevelop
+templateName= rails
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz
diff --git a/languages/ruby/app_templates/rails/app.kdevelop b/languages/ruby/app_templates/rails/app.kdevelop
new file mode 100644
index 00000000..c02c2057
--- /dev/null
+++ b/languages/ruby/app_templates/rails/app.kdevelop
@@ -0,0 +1,107 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevScriptProject</projectmanagement>
+ <primarylanguage>Ruby</primarylanguage>
+ <keywords>
+ <keyword>Ruby</keyword>
+ </keywords>
+ <ignoreparts>
+ <part>KDevDoxygen</part>
+ <part>KDevdistpart</part>
+ <part>KDevVisualBoyAdvance</part>
+ <part>KDevDebugger</part>
+ </ignoreparts>
+ </general>
+ <kdevscriptproject>
+ <general>
+ <includepatterns>*.rb,*.rhtml,*.rxml,*.rjs,*.css,*.js,*.html.erb,*.js.rjs,*.xml.builder</includepatterns>
+ <excludepatterns>*~</excludepatterns>
+ </general>
+ </kdevscriptproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.rb" name="Scripts" />
+ <group pattern="*.css" name="StyleSheets" />
+ <group pattern="*.js" name="JavaScripts" />
+ <group pattern="*.rhtml,*.html.erb" name="Views" />
+ <group pattern="*.rxml,*.xml.builder" name="BuilderTemplates" />
+ <group pattern="*.rjs,*.js.rjs" name="Ruby JavaScript" />
+ <group pattern="*.yml" name="Config" />
+ <group pattern="*.gif,*.jpg,*.png,*.ico" name="Images" />
+ <group pattern="*.html,*.cgi,*.fcgi,*.txt" name="Public" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="rb"/>
+ <type ext="rhtml"/>
+ <type ext="html.erb"/>
+ <type ext="rxml"/>
+ <type ext="xml.builder"/>
+ <type ext="rjs"/>
+ <type ext="js.rjs"/>
+ <type ext="css"/>
+ <type ext="js"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevrubysupport>
+ <run>
+ <interpreter>ruby</interpreter>
+ <shell>%{dest}/script/console</shell>
+ <terminal>false</terminal>
+ <mainprogram>script/server</mainprogram>
+ </run>
+ </kdevrubysupport>
+</kdevelop>
diff --git a/languages/ruby/app_templates/rails/rails.kdevtemplate b/languages/ruby/app_templates/rails/rails.kdevtemplate
new file mode 100644
index 00000000..e377e1c4
--- /dev/null
+++ b/languages/ruby/app_templates/rails/rails.kdevtemplate
@@ -0,0 +1,72 @@
+# KDE Config File
+[General]
+Name=Ruby On Rails
+Name[de]=Ruby on Rails
+Name[ne]=रूबि अन रेल्स
+Name[sv]=Ruby on Rails
+Icon=rails.png
+Category=Ruby
+Comment=This generates a Ruby On Rails project
+Comment[ca]=Genera un projecte Ruby On Rails
+Comment[da]=Dette genererer et Ruby On Rails projekt
+Comment[de]=Erstellt ein einfaches Ruby-on-Rails-Projekt
+Comment[el]=Δημιουργεί ένα έργο Ruby On Rails
+Comment[es]=Genera un proyecto Ruby On Rails
+Comment[et]=Lihtsa Ruby On Rails projekti loomine
+Comment[eu]=Ruby On Rails proiektu bat sortzen du.
+Comment[fa]=یک پروژۀ Ruby On Rails تولید می‌کند
+Comment[fr]=Génère un projet Ruby On Rails
+Comment[gl]=Isto xera un proxecto de Ruby On Rails
+Comment[hu]=Létrehoz egy Ruby On Rails-projektet
+Comment[it]=Genera un progetto Ruby On Rails
+Comment[ja]=Ruby On Rails プロジェクトを作成します
+Comment[nds]=Stellt en eenfach "Ruby-On-Rails"-Projekt op
+Comment[ne]=यसले रूबि अन रेल्स परियोजना उत्पन्न गर्दछ
+Comment[nl]=Genereert een Ruby On Rails-project.
+Comment[pl]=Generuje projekt Ruby On Rails
+Comment[pt]=Gera um projecto de Ruby On Rails
+Comment[pt_BR]=Gera um projecto de Ruby On Rails
+Comment[ru]=Создание проекта на Ruby On Rails
+Comment[sk]=Vygeneruje Ruby On Rails projekt
+Comment[sr]=Прави једноставан Ruby On Rails пројекат
+Comment[sr@Latn]=Pravi jednostavan Ruby On Rails projekat
+Comment[sv]=Det här skapar ett Ruby on Rails-projekt
+Comment[zh_TW]=產生一個 Ruby On Rails 專案
+FileTemplates=rb,ShellStyle,rhtml,XMLStyle,html.erb,XMLStyle,rxml,XMLStyle,xml.builder,XMLStyle,rjs,ShellStyle,js.rjs,ShellStyle,css,CPPStyle,js,CPPStyle
+ShowFilesAfterGeneration=%{dest}/script/server
+Archive=rails.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[MSG]
+Type=message
+Comment=A Ruby On Rails project created in %{dest}
+Comment[ca]=A simple projecte Ruby On Rails ha estat creat en %{dest}
+Comment[da]=Et Ruby On Rails projekt oprettet i %{dest}
+Comment[de]=Ein einfaches Ruby-on-Rails-Project wurde in %{dest} erstellt.
+Comment[el]=Ένα έργο Ruby On Rails δημιουργήθηκε στο %{dest}.
+Comment[es]=Un proyecto de Ruby On Rails ha sido creado en %{dest}.
+Comment[et]=Lihtne Ruby On Rails projekt loodi asukohta %{dest}.
+Comment[eu]=Ruby On Rails proiektu bat sortu da hemen: %{dest}.
+Comment[fa]=یک پروژۀ Ruby On Rails در %{dest} ایجاد شد
+Comment[fr]=Un projet Ruby On Rails a été créé dans %{dest}
+Comment[gl]=Creouse un proxecto de Ruby On Rails en %{dest}
+Comment[hu]=Létrejött egy Ruby On Rails-projekt itt: %{dest}
+Comment[it]=È stato creato un progetto Ruby On Rails in %{dest}
+Comment[ja]=Ruby On Rails プロジェクトを %{dest} に作成しました
+Comment[nds]=In %{dest} wöör en eenfach "Ruby-On-Rails"-Projekt opstellt.
+Comment[ne]=रूबि अन रेल्स परियोजना %{dest} मा सिर्जना गरिन्छ
+Comment[nl]=Een eenvoudig Ruby On Rails-project is aangemaakt in %{dest}.
+Comment[pl]=Projekt Ruby On Rails stworzony w %{dest}
+Comment[pt]=Foi criado um projecto de Ruby on Rails em %{dest}
+Comment[pt_BR]=Foi criado um projecto de Ruby on Rails em %{dest}
+Comment[ru]=Проект на Ruby On Rails создан в %{dest}
+Comment[sk]=Ruby On Rails projekt bol vytvorený v %{dest}
+Comment[sr]=Ruby On Rails пројекат направљен је у %{dest}
+Comment[sr@Latn]=Ruby On Rails projekat napravljen je u %{dest}
+Comment[sv]=Ett Ruby on Rails-projekt skapades i %{dest}
+Comment[zh_TW]=一個 Ruby On Rails 專案已建立於 %{dest}
diff --git a/languages/ruby/app_templates/rails/rails.png b/languages/ruby/app_templates/rails/rails.png
new file mode 100644
index 00000000..26d02009
--- /dev/null
+++ b/languages/ruby/app_templates/rails/rails.png
Binary files differ
diff --git a/languages/ruby/app_templates/ruby.appwizard b/languages/ruby/app_templates/ruby.appwizard
new file mode 100644
index 00000000..726daeed
--- /dev/null
+++ b/languages/ruby/app_templates/ruby.appwizard
@@ -0,0 +1,2 @@
+[General]
+List=rubyhello,qtruby,qtrubyapp,dcopserviceruby,kappruby,kxtruby,rails
diff --git a/languages/ruby/app_templates/rubyhello/.kdev_ignore b/languages/ruby/app_templates/rubyhello/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/ruby/app_templates/rubyhello/.kdev_ignore
diff --git a/languages/ruby/app_templates/rubyhello/Makefile.am b/languages/ruby/app_templates/rubyhello/Makefile.am
new file mode 100644
index 00000000..ecb3e535
--- /dev/null
+++ b/languages/ruby/app_templates/rubyhello/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = app.rb app.kdevelop
+templateName= rubyhello
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/ruby/app_templates/rubyhello/app.kdevelop b/languages/ruby/app_templates/rubyhello/app.kdevelop
new file mode 100644
index 00000000..2d1d24c5
--- /dev/null
+++ b/languages/ruby/app_templates/rubyhello/app.kdevelop
@@ -0,0 +1,91 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevScriptProject</projectmanagement>
+ <primarylanguage>Ruby</primarylanguage>
+ <keywords>
+ <keyword>Ruby</keyword>
+ </keywords>
+ <ignoreparts>
+ <part>KDevDoxygen</part>
+ <part>KDevdistpart</part>
+ <part>KDevVisualBoyAdvance</part>
+ <part>KDevDebugger</part>
+ </ignoreparts>
+ </general>
+ <kdevscriptproject>
+ <general>
+ <includepatterns>*.rb</includepatterns>
+ <excludepatterns>*~</excludepatterns>
+ </general>
+ </kdevscriptproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.rb" name="Scripts" />
+ </groups>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <useglobaltypes>
+ <type ext="rb"/>
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevrubysupport>
+ <run>
+ <mainprogram>./%{APPNAMELC}.rb</mainprogram>
+ <interpreter>ruby</interpreter>
+ <terminal>false</terminal>
+ </run>
+ </kdevrubysupport>
+
+</kdevelop>
diff --git a/languages/ruby/app_templates/rubyhello/app.rb b/languages/ruby/app_templates/rubyhello/app.rb
new file mode 100644
index 00000000..c3bc962d
--- /dev/null
+++ b/languages/ruby/app_templates/rubyhello/app.rb
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+
+puts "Hello world"
diff --git a/languages/ruby/app_templates/rubyhello/rubyhello b/languages/ruby/app_templates/rubyhello/rubyhello
new file mode 100644
index 00000000..4581605d
--- /dev/null
+++ b/languages/ruby/app_templates/rubyhello/rubyhello
@@ -0,0 +1,9 @@
+# KDE Config File
+[General]
+Name=Simple Ruby script
+Name[fr]=Un simple script de test � Hello world �
+Category=Ruby
+Comment=This generates a simplistic 'Hello world' program in Ruby
+Comment[fr]=G�n�re un simple script de test du type � Hello world � dans le language RUBY.
+FileTemplates=rb,ShellStyle
+ShowFilesAfterGeneration=APPNAMELC.rb
diff --git a/languages/ruby/app_templates/rubyhello/rubyhello.kdevtemplate b/languages/ruby/app_templates/rubyhello/rubyhello.kdevtemplate
new file mode 100644
index 00000000..3612becb
--- /dev/null
+++ b/languages/ruby/app_templates/rubyhello/rubyhello.kdevtemplate
@@ -0,0 +1,105 @@
+# KDE Config File
+[General]
+Name=Simple Ruby script
+Name[ca]=Simple script en Ruby
+Name[da]=Simpelt Ruby script
+Name[de]=Einfaches Ruby-Skript
+Name[el]=Απλό σενάριο Ruby
+Name[es]=Guión sencillo en Ruby
+Name[et]=Lihtne Ruby skript
+Name[eu]=Ruby script sinple bat
+Name[fa]=دست‌نوشتۀ سادۀ رابی
+Name[fr]=Script Ruby simple
+Name[ga]=Script shimplí Ruby
+Name[gl]=Script sinxelo en Ruby
+Name[hu]=Egyszerű Ruby-szkript
+Name[it]=Semplice script Ruby
+Name[ja]=簡単な Ruby スクリプト
+Name[nds]=Eenfach Ruby-Skript
+Name[ne]=साधारण रूबि स्क्रिप्ट
+Name[nl]=Eenvoudig Ruby-script
+Name[pl]=Prosty skrypt w języku Ruby
+Name[pt]=Programa simples em Ruby
+Name[pt_BR]=Programa simples em Ruby
+Name[ru]=Простой скрипт Ruby
+Name[sk]=Jednoduchý Ruby skript
+Name[sr]=Једноставна Ruby скрипта
+Name[sr@Latn]=Jednostavna Ruby skripta
+Name[sv]=Enkelt Ruby-skript
+Name[tg]=Скрипти Ruby оддӣ
+Name[tr]=Basit Ruby Betiği
+Name[zh_CN]=简单的 Ruyb 脚本
+Name[zh_TW]=簡單 Ruby 文稿
+Category=Ruby
+Comment=This generates a simplistic 'Hello world' program in Ruby
+Comment[ca]=Genera un simple programa de 'Hello world' en Ruby
+Comment[da]=Dette genererer et simplistisk 'Goddag verden' program i Ruby
+Comment[de]=Erstellt ein einfaches "Hello World"'-Programm in Ruby
+Comment[el]=Αυτό δημιουργεί ένα απλό πρόγραμμα 'Γεια σου κόσμε' σε Ruby
+Comment[es]=Genera un sencillo programa «Hola mundo» en Ruby
+Comment[et]=Lihtsa "Tere, maailm" programmi loomine Rubys
+Comment[eu]=Honek "Kaixo mundua" programa sinple bat sortzen du Ruby lengoaian
+Comment[fa]=یک برنامۀ سادۀ «Hello world» در رابی تولید می‌کند
+Comment[fr]=Génère un programme « Bonjour monde » simple en Ruby
+Comment[gl]=Isto xera un programa sinxelo 'Ola mundo' en Ruby
+Comment[hu]=Létrehoz egy egyszerű 'Hello world' programot Rubyban
+Comment[it]=Genera un semplice programma di "Hello world" in Ruby
+Comment[ja]=簡単な Hello world プログラムを Ruby で作成します
+Comment[nds]=Dit stellt en eenfach "Moin Welt"-Programm in Ruby op.
+Comment[ne]=यसले रूबिमा साधारण 'हेल्लो वोल्ड' कार्यक्रम उत्पन्न गर्दछ
+Comment[nl]=Dit genereert een eenvoudig Hello World-programma in Ruby
+Comment[pl]=Generuje prosty program "Witaj świecie" w języku Ruby
+Comment[pt]=Isto gera um programa simples 'Olá mundo' em Ruby
+Comment[pt_BR]=Isto gera um programa simples 'Olá mundo' em Ruby
+Comment[ru]=Создание простой программы 'Hello world' на Ruby
+Comment[sk]=Vygeneruje jednoduchý Ahoj svet program v Ruby
+Comment[sr]=Ово прави једноставан „Здраво свете“ у Ruby-ју
+Comment[sr@Latn]=Ovo pravi jednostavan „Zdravo svete“ u Ruby-ju
+Comment[sv]=Detta skapar ett förenklat 'Hello world'-program i Ruby
+Comment[tr]=Bu Ruby'de basit bir "Merhaba Dünya" programı yaratır.
+Comment[zh_TW]=產生一個簡單的 Ruby 的 Hello world 程式
+FileTemplates=rb,ShellStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.rb
+Archive=rubyhello.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/app.rb
+Dest=%{dest}/%{APPNAMELC}.rb
+
+[MSG]
+Type=message
+Comment=A simple ruby script was created in %{dest}
+Comment[ca]=Un simple script en Ruby ha estat creat en %{dest}
+Comment[da]=Et simpelt ruby script blev oprettet i %{dest}
+Comment[de]=Ein einfaches Ruby-Skript wurde in %{dest} erstellt.
+Comment[el]=Ένα απλό σενάριο ruby δημιουργήθηκε στο %{dest}
+Comment[es]=Un sencillo guión en Ruby ha sido creado en %{dest}
+Comment[et]=Lihtne Ruby skript loodi asukohta %{dest}
+Comment[eu]=Ruby script sinple bat sortu da hemen: %{dest}
+Comment[fa]=یک دست‌نوشتۀ سادۀ رابی در %{dest} ایجاد شد
+Comment[fr]=Un script Ruby simple a été créé dans %{dest}
+Comment[ga]=Cruthaíodh script shimplí ruby i %{dest}
+Comment[gl]=Creouse un scrip sinxelo en ruby en %{dest}
+Comment[hu]=Létrejött egy egyszerű Ruby-szkript itt: %{dest}
+Comment[it]=È stato creato un semplice script ruby in %{dest}
+Comment[ja]=簡単な ruby スクリプトを %{dest} に作成しました
+Comment[nds]=In %{dest} wöör en eenfach Ruby-Skript opstellt.
+Comment[ne]=साधारण रूबि स्क्रिप्ट %{dest} मा सिर्जना गरियो
+Comment[nl]=Een eenvoudig Ruby-script is aangemaakt in %{dest}
+Comment[pl]=Prosty skrypt w języku Ruby został utworzony w %{dest}
+Comment[pt]=Foi criado um programa simples em Ruby em %{dest}
+Comment[pt_BR]=Foi criado um programa simples em Ruby em %{dest}
+Comment[ru]=Простой скрипт Ruby создан в %{dest}
+Comment[sk]=Jednoduchý Ruby skript bol vytvorený v %{dest}
+Comment[sr]=Једноставна ruby скрипта направљена је у %{dest}
+Comment[sr@Latn]=Jednostavna ruby skripta napravljena je u %{dest}
+Comment[sv]=Ett enkelt Ruby-skript skapades i %{dest}
+Comment[tr]=Basit bir Ruby betiği %{dest} içinde yaratıldı.
+Comment[zh_TW]=一個簡單的 ruby 文稿已建立於 %{dest}
diff --git a/languages/ruby/app_templates/rubyhello/rubyhello.png b/languages/ruby/app_templates/rubyhello/rubyhello.png
new file mode 100644
index 00000000..840a953c
--- /dev/null
+++ b/languages/ruby/app_templates/rubyhello/rubyhello.png
Binary files differ
diff --git a/languages/ruby/debugger/Makefile.am b/languages/ruby/debugger/Makefile.am
new file mode 100644
index 00000000..f4c512c2
--- /dev/null
+++ b/languages/ruby/debugger/Makefile.am
@@ -0,0 +1,25 @@
+# Here resides the debugger part.
+
+INCLUDES = -I$(top_srcdir)/languages/lib/debugger \
+ -I$(top_srcdir)/lib/interfaces -I$(top_srcdir)/lib/interfaces/extensions -I$(top_srcdir)/lib/util \
+ -I$(top_srcdir)/lib/widgets $(all_includes)
+
+kde_module_LTLIBRARIES = libkdevrbdebugger.la
+libkdevrbdebugger_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkdevrbdebugger_la_LIBADD = $(top_builddir)/lib/libkdevelop.la $(top_builddir)/lib/widgets/libkdevwidgets.la $(LIB_KHTML) \
+ $(top_builddir)/languages/lib/debugger/liblang_debugger.la
+
+libkdevrbdebugger_la_SOURCES = debuggerpart.cpp dbgcontroller.cpp rdbcontroller.cpp dbgcommand.cpp rdbcommand.cpp rdbparser.cpp stty.cpp breakpoint.cpp variablewidget.cpp rdbbreakpointwidget.cpp framestackwidget.cpp dbgpsdlg.cpp dbgtoolbar.cpp rdboutputwidget.cpp rdbtable.cpp
+
+METASOURCES = AUTO
+KDE_ICON = AUTO
+
+rubysrc_DATA = debuggee.rb
+rubysrcdir = $(kde_datadir)/kdevrbdebugger
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevrbdebugger.desktop
+
+rcdir = $(kde_datadir)/kdevrbdebugger
+rc_DATA = kdevrbdebugger.rc
+noinst_HEADERS = rdbtable.h
diff --git a/languages/ruby/debugger/breakpoint.cpp b/languages/ruby/debugger/breakpoint.cpp
new file mode 100644
index 00000000..f210e359
--- /dev/null
+++ b/languages/ruby/debugger/breakpoint.cpp
@@ -0,0 +1,343 @@
+/***************************************************************************
+ begin : Tue May 13 2003
+ copyright : (C) 2003 by John Birch
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "breakpoint.h"
+
+#include <klocale.h>
+
+#include <qfileinfo.h>
+#include <qfontmetrics.h>
+#include <qpainter.h>
+#include <qregexp.h>
+#include <qstring.h>
+
+#include <stdio.h>
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+namespace RDBDebugger
+{
+
+static int BPKey_ = 0;
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+Breakpoint::Breakpoint(bool temporary, bool enabled)
+ : s_pending_(true),
+ s_actionAdd_(true),
+ s_actionClear_(false),
+ s_actionModify_(false),
+ s_actionDie_(false),
+ s_dbgProcessing_(false),
+ s_enabled_(enabled),
+ s_temporary_(temporary),
+ s_changedEnable_(false),
+ key_(BPKey_++),
+ active_(-1)
+{
+}
+
+/***************************************************************************/
+
+Breakpoint::~Breakpoint()
+{
+}
+
+/***************************************************************************/
+
+QString Breakpoint::dbgRemoveCommand() const
+{
+// if (dbgId_>0)
+// return QString("delete %1").arg(dbgId_); // gdb command - not translatable
+
+ return QString();
+}
+
+/***************************************************************************/
+
+// called when debugger ends
+void Breakpoint::reset()
+{
+ dbgId_ = -1;
+ s_pending_ = true;
+ s_actionAdd_ = true; // waiting for the debugger to start
+ s_actionClear_ = false;
+ s_changedEnable_ = !s_enabled_;
+ s_actionModify_ = s_changedEnable_;
+ s_dbgProcessing_ = false;
+// hits_ = 0;
+ active_ = -1;
+}
+
+/***************************************************************************/
+
+void Breakpoint::setActive(int active, int id)
+{
+ active_ = active;
+ dbgId_ = id;
+
+ if (s_pending_ && !(s_actionAdd_ && s_actionModify_)) {
+ s_pending_ = false;
+ s_actionModify_ = false;
+ }
+
+ s_actionAdd_ = false;
+ s_actionClear_ = false;
+ s_actionDie_ = false;
+ s_dbgProcessing_ = false;
+
+ if (!s_actionModify_) {
+ s_changedEnable_ = false;
+ }
+}
+
+/***************************************************************************/
+
+QString Breakpoint::statusDisplay(int activeFlag) const
+{
+ QString status="";
+ if (!s_enabled_)
+ status = i18n("Disabled");
+ else
+ if (s_pending_)
+ {
+ if (s_actionAdd_)
+ status = i18n("Pending (add)");
+ if (s_actionClear_)
+ status = i18n("Pending (clear)");
+ if (s_actionModify_)
+ status = i18n("Pending (modify)");
+ }
+ else
+ if (isActive(activeFlag))
+ status = i18n("Active");
+
+ return status;
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+FilePosBreakpoint::FilePosBreakpoint(const QString &fileName, int lineNum,
+ bool temporary, bool enabled)
+ : Breakpoint(temporary, enabled),
+ fileName_(fileName),
+ lineNo_(lineNum)
+{
+}
+
+/***************************************************************************/
+
+FilePosBreakpoint::~FilePosBreakpoint()
+{
+}
+
+/***************************************************************************/
+
+QString FilePosBreakpoint::dbgSetCommand() const
+{
+ QString cmdStr;
+ if (fileName_.isEmpty())
+ cmdStr = QString("break %1").arg(lineNo_); // gdb command - not translatable
+ else {
+ cmdStr = QString("break %1:%2").arg(fileName_).arg(lineNo_);
+ }
+
+ if (isTemporary())
+ cmdStr = "t"+cmdStr; // gdb command
+
+ return cmdStr;
+}
+
+/***************************************************************************/
+
+bool FilePosBreakpoint::match(const Breakpoint *brkpt) const
+{
+ // simple case
+ if (this == brkpt)
+ return true;
+
+ // Type case
+ const FilePosBreakpoint* check = dynamic_cast<const FilePosBreakpoint*>(brkpt);
+ if (!check)
+ return false;
+
+ // member case
+ return ( (fileName_ == check->fileName_) &&
+ (lineNo_ == check->lineNo_));
+}
+
+/***************************************************************************/
+
+QString FilePosBreakpoint::location(bool compact)
+{
+ if (compact)
+ return QFileInfo(fileName_).fileName()+":"+QString::number(lineNo_);
+
+ return fileName_+":"+QString::number(lineNo_);
+}
+
+/***************************************************************************/
+
+void FilePosBreakpoint::setLocation(const QString& location)
+{
+ QRegExp regExp1("(.*):(\\d+)$");
+ regExp1.setMinimal(true);
+ if ( regExp1.search(location, 0) >= 0 )
+ {
+ QString t = regExp1.cap(1);
+ QString dirPath = QFileInfo(t).dirPath();
+ if ( dirPath == "." )
+ fileName_ = QFileInfo(fileName_).dirPath()+"/"+regExp1.cap(1);
+ else
+ fileName_ = regExp1.cap(1);
+
+ lineNo_ = regExp1.cap(2).toInt();
+ }
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+Watchpoint::Watchpoint(const QString& varName, bool temporary, bool enabled)
+ : Breakpoint(temporary, enabled),
+ varName_(varName)
+{
+}
+
+/***************************************************************************/
+
+Watchpoint::~Watchpoint()
+{
+}
+
+/***************************************************************************/
+
+QString Watchpoint::dbgSetCommand() const
+{
+ return QString("watch ")+varName_; // gdb command - not translatable
+}
+
+/***************************************************************************/
+
+bool Watchpoint::match(const Breakpoint* brkpt) const
+{
+ // simple case
+ if (this == brkpt)
+ return true;
+
+ // Type case
+ const Watchpoint *watch = dynamic_cast<const Watchpoint*>(brkpt);
+ if (watch == 0)
+ return false;
+
+ // member case
+ return (varName_ == watch->varName_);
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+Catchpoint::Catchpoint(const QString& varName, bool temporary, bool enabled)
+ : Breakpoint(temporary, enabled),
+ varName_(varName)
+{
+}
+
+/***************************************************************************/
+
+Catchpoint::~Catchpoint()
+{
+}
+
+/***************************************************************************/
+
+QString Catchpoint::dbgSetCommand() const
+{
+ return QString("catch ")+varName_; // gdb command - not translatable
+}
+
+/***************************************************************************/
+
+bool Catchpoint::match(const Breakpoint* brkpt) const
+{
+ // simple case
+ if (this == brkpt)
+ return true;
+
+ // Type case
+ const Catchpoint *check = dynamic_cast<const Catchpoint*>(brkpt);
+ if (check == 0)
+ return false;
+
+ // member case
+ return (varName_ == check->varName_);
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+FunctionBreakpoint::FunctionBreakpoint(const QString& functionName, bool temporary, bool enabled)
+ : Breakpoint(temporary, enabled),
+ m_functionName(functionName)
+{
+}
+
+/***************************************************************************/
+
+FunctionBreakpoint::~FunctionBreakpoint()
+{
+}
+
+/***************************************************************************/
+
+QString FunctionBreakpoint::dbgSetCommand() const
+{
+ return QString("break ")+m_functionName; // gdb command - not translatable
+}
+
+/***************************************************************************/
+
+bool FunctionBreakpoint::match(const Breakpoint* brkpt) const
+{
+ // simple case
+ if (this == brkpt)
+ return true;
+
+ // Type case
+ const FunctionBreakpoint *check = dynamic_cast<const FunctionBreakpoint*>(brkpt);
+ if (!check)
+ return false;
+
+ // member case
+ return (m_functionName == check->m_functionName);
+}
+
+
+}
diff --git a/languages/ruby/debugger/breakpoint.h b/languages/ruby/debugger/breakpoint.h
new file mode 100644
index 00000000..e45e3856
--- /dev/null
+++ b/languages/ruby/debugger/breakpoint.h
@@ -0,0 +1,214 @@
+/***************************************************************************
+ begin : Tue May 13 2003
+ copyright : (C) 2003 by John Birch
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _BREAKPOINT_H_
+#define _BREAKPOINT_H_
+
+#include <klocale.h>
+
+#include <qstring.h>
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+namespace RDBDebugger
+{
+
+enum BP_TYPES
+{
+ BP_TYPE_Invalid,
+ BP_TYPE_FilePos,
+ BP_TYPE_Watchpoint,
+ BP_TYPE_Catchpoint,
+ BP_TYPE_Function
+};
+
+class Breakpoint
+{
+public:
+ Breakpoint(bool temporary=false, bool enabled=true);
+ virtual ~Breakpoint();
+
+ virtual QString dbgSetCommand() const = 0;
+ virtual QString dbgRemoveCommand() const;
+ virtual bool match(const Breakpoint* brkpt) const = 0;
+ virtual void reset();
+
+ void setActive(int active, int id);
+ bool isActive(int active) const { return (active_ == active) ||
+ (s_pending_ && !s_actionClear_); }
+ void setEnabled(bool enabled) { s_changedEnable_ = (s_enabled_ != enabled);
+ s_enabled_ = enabled; }
+ bool isEnabled() const { return s_enabled_; }
+ void setTemporary(bool temporary) { s_temporary_ = temporary; }
+ bool isTemporary() const { return s_temporary_; }
+
+ bool changedEnable() const { return s_changedEnable_; }
+
+ void setPending(bool pending) { s_pending_ = pending; }
+ bool isPending() const { return s_pending_; }
+ void setActionAdd(bool actionAdd) { s_actionDie_ = false;
+ s_actionAdd_ = actionAdd; }
+ bool isActionAdd() const { return s_actionAdd_; }
+ void setActionClear(bool actionClear) { s_actionClear_ = actionClear; }
+ bool isActionClear() const { return s_actionClear_; }
+ void setActionModify(bool actionModify) { s_actionDie_ = false;
+ s_actionModify_ = actionModify; }
+ bool isActionModify() const { return s_actionModify_; }
+ void setDbgProcessing(bool dbgProcessing) { s_dbgProcessing_ = dbgProcessing; }
+ bool isDbgProcessing() const { return s_dbgProcessing_; }
+ void setActionDie() { s_actionDie_ = true;
+ s_actionClear_ = false; }
+ bool isActionDie() const { return s_actionDie_; }
+
+ int key() const { return key_; }
+ void setDbgId(int dbgId) { dbgId_ = dbgId; }
+ int dbgId() const { return dbgId_; }
+
+ virtual QString statusDisplay(int activeFlag) const;
+ virtual BP_TYPES type() const { return BP_TYPE_Invalid; }
+ virtual QString displayType() const { return i18n( "Invalid" ); }
+
+ virtual QString location(bool compact=true) = 0;
+ virtual void setLocation(const QString& ) = 0;
+ virtual bool isValid() const = 0;
+
+private:
+ bool s_pending_ :1;
+ bool s_actionAdd_ :1;
+ bool s_actionClear_ :1;
+ bool s_actionModify_ :1;
+ bool s_actionDie_ :1;
+ bool s_dbgProcessing_ :1;
+ bool s_enabled_ :1;
+ bool s_temporary_ :1;
+ bool s_changedEnable_ :1;
+
+ int dbgId_; // assigned by gdb
+
+ int key_; // internal unique key
+ int active_; // counter incremented on receipt of all BP's
+
+ int ignoreCount_;
+ QString condition_;
+// QString type_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+class FilePosBreakpoint : public Breakpoint
+{
+public:
+ FilePosBreakpoint(const QString &fileName, int lineNum,
+ bool temporary=false, bool enabled=true);
+ virtual ~FilePosBreakpoint();
+ virtual QString dbgSetCommand() const;
+ virtual bool match(const Breakpoint *brkpt) const;
+
+ BP_TYPES type () const { return BP_TYPE_FilePos; }
+ QString displayType() const { return i18n( "File:line" ); }
+ void setFileName(const QString& fileName) { fileName_ = fileName; }
+ QString fileName() const { return fileName_; }
+ void setLineNum(int lineNum) { lineNo_ = lineNum; }
+ int lineNum() const { return lineNo_; }
+ QString location(bool compact=true);
+ void setLocation(const QString& location);
+ bool isValid() const { return lineNo_>0 && !fileName_.isEmpty(); }
+
+private:
+ QString fileName_;
+ int lineNo_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+class Watchpoint : public Breakpoint
+{
+public:
+ Watchpoint(const QString &varName, bool temporary=false, bool enabled=true);
+ virtual ~Watchpoint();
+ virtual QString dbgSetCommand() const;
+ bool match(const Breakpoint *brkpt) const;
+
+ BP_TYPES type () const { return BP_TYPE_Watchpoint; }
+ QString displayType() const { return i18n("Watchpoint"); }
+ void setVarName(const QString& varName) { varName_ = varName; }
+ QString varName() const { return varName_; }
+ QString location(bool) { return varName_; }
+ void setLocation(const QString& location) { varName_ = location; }
+ bool isValid() const { return !varName_.isEmpty(); }
+
+private:
+ QString varName_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+class Catchpoint : public Breakpoint
+{
+public:
+ Catchpoint(const QString &varName, bool temporary=false, bool enabled=true);
+ virtual ~Catchpoint();
+ virtual QString dbgSetCommand() const;
+ bool match(const Breakpoint *brkpt) const;
+
+ BP_TYPES type () const { return BP_TYPE_Catchpoint; }
+ QString displayType() const { return i18n("Catchpoint"); }
+ void setVarName(const QString& varName) { varName_ = varName; }
+ QString varName() const { return varName_; }
+ QString location(bool) { return varName_; }
+ void setLocation(const QString& location) { varName_ = location; }
+ bool isValid() const { return !varName_.isEmpty(); }
+
+private:
+ QString varName_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+class FunctionBreakpoint : public Breakpoint
+{
+public:
+ FunctionBreakpoint(const QString &functionName, bool temporary=false, bool enabled=true);
+ virtual ~FunctionBreakpoint();
+ virtual QString dbgSetCommand() const;
+ bool match(const Breakpoint *brkpt) const;
+
+ BP_TYPES type () const { return BP_TYPE_Function; }
+ QString displayType() const { return i18n("Method()"); }
+ void setfunctionName(const QString& functionName) { m_functionName = functionName; }
+ QString functionName() const { return m_functionName; }
+ QString location(bool) { return m_functionName; };
+ void setLocation(const QString& location) { m_functionName = location; }
+ bool isValid() const { return !m_functionName.isEmpty(); }
+
+private:
+ QString m_functionName;
+};
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/dbgcommand.cpp b/languages/ruby/debugger/dbgcommand.cpp
new file mode 100644
index 00000000..6c6a24ec
--- /dev/null
+++ b/languages/ruby/debugger/dbgcommand.cpp
@@ -0,0 +1,47 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "dbgcommand.h"
+
+#include <qstring.h>
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+namespace RDBDebugger
+{
+
+
+DbgCommand::DbgCommand(const QCString& command, bool isRunCmd, bool isInfoCmd) :
+ command_(command),
+ isRunCmd_(isRunCmd),
+ isInfoCmd_(isInfoCmd),
+ sent_(false),
+ waitForReply_(true)
+{
+ cmdBuffer_ = command_+"\n";
+}
+
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
diff --git a/languages/ruby/debugger/dbgcommand.h b/languages/ruby/debugger/dbgcommand.h
new file mode 100644
index 00000000..32ec7f7a
--- /dev/null
+++ b/languages/ruby/debugger/dbgcommand.h
@@ -0,0 +1,64 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef DBGCOMMAND_H
+#define DBGCOMMAND_H
+
+#include <qstring.h>
+
+/**
+ * @author John Birch
+ */
+
+namespace RDBDebugger
+{
+
+class DbgCommand
+{
+public:
+ DbgCommand(const QCString& command, bool isRunCmd, bool isInfoCmd);
+ virtual ~DbgCommand() {};
+
+ virtual QCString& cmdToSend() { sent_ = true; return cmdBuffer_; }
+ virtual int cmdLength() { return cmdBuffer_.length(); }
+
+ QCString rawDbgCommand() const { return command_; }
+ bool isARunCmd() const { return isRunCmd_;}
+ bool isAnInfoCmd() const { return isInfoCmd_; }
+ bool moreToSend() const { return !sent_; }
+ bool expectReply() const { return waitForReply_; }
+
+protected:
+ QCString cmdBuffer_;
+ QCString command_;
+ bool isRunCmd_;
+ bool isInfoCmd_;
+ bool sent_;
+ bool waitForReply_;
+};
+
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+#endif
diff --git a/languages/ruby/debugger/dbgcontroller.cpp b/languages/ruby/debugger/dbgcontroller.cpp
new file mode 100644
index 00000000..7ee560b7
--- /dev/null
+++ b/languages/ruby/debugger/dbgcontroller.cpp
@@ -0,0 +1,46 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "dbgcontroller.h"
+#include <kprocess.h>
+
+/***************************************************************************/
+
+namespace RDBDebugger
+{
+
+DbgController::DbgController()
+ : dbgProcess_(0)
+{
+}
+
+/***************************************************************************/
+
+DbgController::~DbgController()
+{
+ delete dbgProcess_;
+}
+
+/***************************************************************************/
+
+}
+
+#include "dbgcontroller.moc"
diff --git a/languages/ruby/debugger/dbgcontroller.h b/languages/ruby/debugger/dbgcontroller.h
new file mode 100644
index 00000000..13ee4382
--- /dev/null
+++ b/languages/ruby/debugger/dbgcontroller.h
@@ -0,0 +1,161 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _DBGCONTROLLER_H_
+#define _DBGCONTROLLER_H_
+
+#include <qobject.h>
+#include <domutil.h>
+
+class KProcess;
+class QString;
+class QStrList;
+
+namespace RDBDebugger
+{
+
+class Breakpoint;
+class DbgCommand;
+class LazyFetchItem;
+class VarItem;
+
+/***************************************************************************/
+/**
+ * @author jbb
+ */
+/***************************************************************************/
+// sigh - namespace's don't work on some of the older compilers
+enum DBGStateFlags
+{
+ s_dbgNotStarted = 1 << 0,
+ s_appNotStarted = 1 << 1,
+ s_appBusy = 1 << 2,
+ s_waitForWrite = 1 << 3,
+ s_programExited = 1 << 4,
+ s_silent = 1 << 5,
+ s_fetchLocals = 1 << 6,
+ s_viewBT = 1 << 7,
+ s_viewBP = 1 << 8,
+ s_attached = 1 << 9,
+ s_fetchGlobals = 1 << 10,
+ s_waitTimer = 1 << 11,
+ s_shuttingDown = 1 << 12,
+ s_viewThreads = 1 << 13
+};
+
+
+enum RttiValues {
+ RTTI_WATCH_ROOT = 1001,
+ RTTI_GLOBAL_ROOT = 1002,
+ RTTI_VAR_FRAME_ROOT = 1003,
+ RTTI_LAZY_FETCH_ITEM = 1004,
+ RTTI_VAR_ITEM = 1005,
+ RTTI_WATCH_VAR_ITEM = 1006,
+ RTTI_THREAD_STACK_ITEM = 1007,
+ RTTI_FRAME_STACK_ITEM = 1008
+};
+
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+class DbgController : public QObject
+{
+ Q_OBJECT
+
+public:
+
+ DbgController();
+ virtual ~DbgController();
+
+ virtual bool stateIsOn( int state ) = 0;
+
+protected:
+ virtual void queueCmd(DbgCommand *cmd, bool executeNext) = 0;
+ virtual void parse(char *str) = 0;
+
+public slots:
+ virtual void configure() = 0;
+
+ /**
+ * Start the debugger
+ * \param ruby_interpreter shell
+ * \param character_coding -K option
+ * \param run_directory Directory from where the program should be run
+ * \param debuggee_path Absolute path to debuggee.rb debugger script
+ * \param application Absolute path to application
+ * \param run_arguments Command line arguments to be passed to the application
+ * \param show_constants Show ruby constants in the variables view
+ */
+ virtual void slotStart(const QString& ruby_interpreter,
+ const QString& character_coding,
+ const QString& run_directory,
+ const QString& debuggee_path,
+ const QString& application,
+ const QString& run_arguments,
+ bool show_constants,
+ bool trace_into_ruby) = 0;
+
+ virtual void slotStopDebugger() = 0;
+
+ virtual void slotRun() = 0;
+ virtual void slotRunUntil(const QString &fileName, int lineNum) = 0;
+ virtual void slotStepInto() = 0;
+ virtual void slotStepOver() = 0;
+ virtual void slotStepOutOff() = 0;
+
+ virtual void slotBreakInto() = 0;
+ virtual void slotBPState(const Breakpoint&) = 0;
+
+
+ virtual void slotExpandItem(VarItem *parent,
+ const QCString &userRequest) = 0;
+ virtual void slotSelectFrame(int frame, int thread,
+ const QString& frameName) = 0;
+ virtual void slotFetchGlobals(bool fetch) = 0;
+
+protected slots:
+ virtual void slotDbgStdout(KProcess *proc, char *buf, int buflen) = 0;
+ virtual void slotDbgStderr(KProcess*, char*, int) {} ;
+ virtual void slotDbgWroteStdin(KProcess *proc) = 0;
+ virtual void slotDbgProcessExited(KProcess *proc) = 0;
+
+ virtual void slotAcceptConnection(int passive_socket) = 0;
+ virtual void slotReadFromSocket(int socket) = 0;
+
+signals:
+ void gotoSourcePosition (const QString &fileName, int lineNum);
+ void rawRDBBreakpointList (char *buf);
+ void rawRDBBreakpointSet (char *buf, int key);
+ void ttyStdout (const char *output);
+ void ttyStderr (const char *output);
+ void rdbStdout (const char *output);
+ void rdbStderr (const char *output);
+ void showStepInSource (const QString &fileName, int lineNum, const QString &address);
+ void dbgStatus (const QString &status, int statusFlag);
+
+protected:
+ KProcess *dbgProcess_;
+};
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/dbgpsdlg.cpp b/languages/ruby/debugger/dbgpsdlg.cpp
new file mode 100644
index 00000000..83dd1666
--- /dev/null
+++ b/languages/ruby/debugger/dbgpsdlg.cpp
@@ -0,0 +1,170 @@
+/***************************************************************************
+ begin : Mon Sep 20 1999
+ copyright : (C) 1999 by John Birch
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "dbgpsdlg.h"
+
+#include <kbuttonbox.h>
+#include <kdialog.h>
+#include <kglobalsettings.h>
+#include <klocale.h>
+#include <kprocess.h>
+#include <kstdguiitem.h>
+#include <kdeversion.h>
+
+#include <qframe.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlistbox.h>
+#include <qtoolbutton.h>
+#include <qpushbutton.h>
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+namespace RDBDebugger
+{
+
+/***************************************************************************/
+
+// Display a list of processes for the user to select one
+// only display processes that they can do something with so if the user
+// is root then display all processes
+// For use with the internal debugger, but this dialog doesn't know anything
+// about why it's doing it.
+
+Dbg_PS_Dialog::Dbg_PS_Dialog(QWidget *parent, const char *name)
+ : KDialog(parent, name, true), // modal
+ psProc_(0),
+ pids_(new QListBox(this)),
+ heading_(new QLabel(" ", this)),
+ pidLines_(QString())
+{
+ setCaption(i18n("Attach to Process"));
+
+ QBoxLayout *topLayout = new QVBoxLayout(this, 5);
+
+ heading_->setFont(KGlobalSettings::fixedFont());
+ heading_->setFrameStyle(QFrame::Panel|QFrame::Sunken);
+ heading_->setMaximumHeight(heading_->sizeHint().height());
+// heading_->setMinimumSize(heading_->sizeHint());
+ topLayout->addWidget(heading_, 5);
+
+ topLayout->addWidget(pids_, 5);
+ pids_->setFont(KGlobalSettings::fixedFont());
+
+ KButtonBox *buttonbox = new KButtonBox(this, Qt::Horizontal, 5);
+ QPushButton *ok = buttonbox->addButton(KStdGuiItem::ok());
+ buttonbox->addStretch();
+ QPushButton *cancel = buttonbox->addButton(KStdGuiItem::cancel());
+ buttonbox->layout();
+ topLayout->addWidget(buttonbox);
+
+ connect(ok, SIGNAL(clicked()), SLOT(accept()));
+ connect(cancel, SIGNAL(clicked()), SLOT(reject()));
+
+ psProc_ = new KShellProcess("/bin/sh");
+ #ifdef USE_SOLARIS
+ *psProc_ << "ps";
+ *psProc_ << "-opid";
+ *psProc_ << "-otty";
+ *psProc_ << "-os";
+ *psProc_ << "-otime";
+ *psProc_ << "-oargs";
+ pidCmd_ = "ps -opid -otty -os -otime -oargs";
+
+ if (getuid() == 0) {
+ *psProc_ << "-e";
+ pidCmd_ += " -e";
+ }
+ #else
+ *psProc_ << "ps";
+ *psProc_ << "x";
+ pidCmd_ = "ps x";
+
+ if (getuid() == 0) {
+ *psProc_ << "a";
+ pidCmd_ += " a";
+ }
+ #endif
+
+ connect( psProc_, SIGNAL(processExited(KProcess *)), SLOT(slotProcessExited()) );
+ connect( psProc_, SIGNAL(receivedStdout(KProcess *, char *, int)), SLOT(slotReceivedOutput(KProcess *, char *, int)) );
+ psProc_->start(KProcess::NotifyOnExit, KProcess::Stdout);
+
+ // Default display to 40 chars wide, default height is okay
+ resize( ((KGlobalSettings::fixedFont()).pointSize())*40, height());
+ topLayout->activate();
+}
+
+/***************************************************************************/
+
+Dbg_PS_Dialog::~Dbg_PS_Dialog()
+{
+ delete psProc_;
+}
+
+/***************************************************************************/
+
+int Dbg_PS_Dialog::pidSelected()
+{
+ QString pidText = pids_->text(pids_->currentItem());
+ if (!pidText.isEmpty())
+ return atoi(pidText.latin1());
+
+ return 0;
+}
+
+/***************************************************************************/
+
+void Dbg_PS_Dialog::slotReceivedOutput(KProcess */*proc*/, char *buffer, int buflen)
+{
+ pidLines_ += QString::fromLocal8Bit(buffer, buflen+1);
+}
+
+/***************************************************************************/
+
+void Dbg_PS_Dialog::slotProcessExited()
+{
+ delete psProc_;
+ psProc_ = 0;
+
+ pidLines_ += '\n';
+
+ int start = pidLines_.find('\n', 0); // Skip the first line (header line)
+ int pos;
+ if (start != -1)
+ heading_->setText(pidLines_.left(start));
+ while ( (pos = pidLines_.find('\n', start)) != -1) {
+ QString item = pidLines_.mid(start, pos-start);
+ if (!item.isEmpty()) {
+ if (item.find(pidCmd_) == -1)
+ pids_->insertItem(item);
+ }
+
+ start = pos+1;
+ }
+}
+
+}
+
+/***************************************************************************/
+#include "dbgpsdlg.moc"
diff --git a/languages/ruby/debugger/dbgpsdlg.h b/languages/ruby/debugger/dbgpsdlg.h
new file mode 100644
index 00000000..641f7aa5
--- /dev/null
+++ b/languages/ruby/debugger/dbgpsdlg.h
@@ -0,0 +1,60 @@
+/***************************************************************************
+ begin : Mon Sep 20 1999
+ copyright : (C) 1999 by John Birch
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _DBGPSDLG_H_
+#define _DBGPSDLG_H_
+
+#include <kdialog.h>
+
+class QListBox;
+class KProcess;
+class QLabel;
+
+namespace RDBDebugger
+{
+
+/***************************************************************************/
+
+class Dbg_PS_Dialog : public KDialog
+{
+ Q_OBJECT
+
+public:
+ Dbg_PS_Dialog( QWidget *parent=0, const char *name=0 );
+ ~Dbg_PS_Dialog();
+
+ int pidSelected();
+
+private slots:
+ void slotReceivedOutput(KProcess *proc, char *buffer, int buflen);
+ void slotProcessExited();
+
+private:
+ KProcess* psProc_;
+ QListBox* pids_;
+ QLabel* heading_;
+ QString pidLines_;
+ QString pidCmd_;
+};
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/dbgtoolbar.cpp b/languages/ruby/debugger/dbgtoolbar.cpp
new file mode 100644
index 00000000..702c8e83
--- /dev/null
+++ b/languages/ruby/debugger/dbgtoolbar.cpp
@@ -0,0 +1,483 @@
+/***************************************************************************
+ begin : Thu Dec 23 1999
+ copyright : (C) 1999 by John Birch
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "dbgtoolbar.h"
+#include "debuggerpart.h"
+#include "dbgcontroller.h"
+
+#include <kdockwindow.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kpopupmenu.h>
+#include <kstandarddirs.h>
+#include <kwin.h>
+#include <kwinmodule.h>
+
+#include <qapplication.h>
+#include <qcursor.h>
+#include <qframe.h>
+#include <qlayout.h>
+#include <qpainter.h>
+#include <qpushbutton.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+// Implements a floating toolbar for the debugger.
+
+// Unfortunately, I couldn't get the KToolBar to work nicely when it
+// was floating, so I was forced to write these classes. I'm not sure whether
+// I didn't try hard enough or ... and I've forgotten what the problems were
+// now.
+
+// The problem with using this is that it will not dock as a normal toolbar.
+// I'm not convince that this is a real problem though.
+
+// So, if you can get it to work as a KToolBar, and it works well when the
+// app is running, then all these classes can be removed.
+
+// This code is very specific to the internal debugger in kdevelop.
+
+namespace RDBDebugger
+{
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+// This just allows the user to click on the toolbar and drag it somewhere else.
+// I would have preferred to use normal decoration on the toolbar and removed
+// the iconify, close, etc buttons from the window title but again I kept running
+// into problems. Instead, I used no decoration and this class. Also this looks
+// similar to the KToolBar floating style.
+class DbgMoveHandle : public QFrame
+{
+public:
+ DbgMoveHandle(DbgToolBar *parent=0, const char * name=0, WFlags f=0);
+ virtual ~DbgMoveHandle();
+
+ virtual void mousePressEvent(QMouseEvent *e);
+ virtual void mouseReleaseEvent(QMouseEvent *e);
+ virtual void mouseMoveEvent(QMouseEvent *e);
+
+private:
+ DbgToolBar* toolBar_;
+ QPoint offset_;
+ bool moving_;
+};
+
+// **************************************************************************
+
+DbgMoveHandle::DbgMoveHandle(DbgToolBar *parent, const char * name, WFlags f)
+ : QFrame(parent, name, f),
+ toolBar_(parent),
+ offset_(QPoint(0,0)),
+ moving_(false)
+{
+ setFrameStyle(QFrame::Panel|QFrame::Raised);
+ setFixedHeight(12);
+}
+
+// **************************************************************************
+
+DbgMoveHandle::~DbgMoveHandle()
+{
+}
+
+// **************************************************************************
+
+void DbgMoveHandle::mousePressEvent(QMouseEvent *e)
+{
+ QFrame::mousePressEvent(e);
+ if (moving_)
+ return;
+
+ if (e->button() == RightButton) {
+ KPopupMenu *menu = new KPopupMenu(this);
+ menu->insertTitle(i18n("Debug Toolbar"));
+ menu->insertItem(i18n("Dock to Panel"),
+ parent(), SLOT(slotDock()));
+ menu->insertItem(i18n("Dock to Panel && Iconify KDevelop"),
+ parent(), SLOT(slotIconifyAndDock()));
+ menu->popup(e->globalPos());
+ } else {
+ moving_ = true;
+ offset_ = parentWidget()->pos() - e->globalPos();
+ setFrameStyle(QFrame::Panel|QFrame::Sunken);
+ QApplication::setOverrideCursor(QCursor(sizeAllCursor));
+ setPalette(QPalette(colorGroup().background()));
+ repaint();
+ }
+}
+
+// **************************************************************************
+
+void DbgMoveHandle::mouseReleaseEvent(QMouseEvent *e)
+{
+ QFrame::mouseReleaseEvent(e);
+ moving_ = false;
+ offset_ = QPoint(0,0);
+ setFrameStyle(QFrame::Panel|QFrame::Raised);
+ QApplication::restoreOverrideCursor();
+ setPalette(QPalette(colorGroup().background()));
+ repaint();
+}
+
+// **************************************************************************
+
+void DbgMoveHandle::mouseMoveEvent(QMouseEvent *e)
+{
+ QFrame::mouseMoveEvent(e);
+ if (!moving_)
+ return;
+
+ toolBar_->move(e->globalPos() + offset_);
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+// This class adds text _and_ a pixmap to a button. Why doesn't QPushButton
+// support that? It only allowed text _or_ pixmap.
+class DbgButton : public QPushButton
+{
+public:
+ DbgButton(const QPixmap &pixmap, const QString &text,
+ DbgToolBar *parent, const char *name=0);
+ virtual ~DbgButton() {};
+ void drawButtonLabel(QPainter *painter);
+ QSize sizeHint() const;
+
+private:
+ QPixmap pixmap_;
+};
+
+// **************************************************************************
+
+DbgButton::DbgButton(const QPixmap& pixmap, const QString& text,
+ DbgToolBar* parent, const char* name)
+ : QPushButton(parent, name),
+ pixmap_(pixmap)
+{
+ setText(text);
+}
+
+// **************************************************************************
+
+void DbgButton::drawButtonLabel(QPainter *painter)
+{
+ // We always have a pixmap (today...)
+ // Centre it if there's no text
+
+ bool hasText = !text().isEmpty();
+ int x = ((hasText ? height() : width()) - pixmap_.width()) / 2;
+ int y = (height() - pixmap_.height()) / 2;
+ painter->drawPixmap(x, y, pixmap_);
+
+ if (hasText) {
+ painter->setPen(colorGroup().text());
+ painter->drawText(height()+2, 0, width()-(height()+2), height(), AlignLeft|AlignVCenter, text());
+ }
+}
+
+// **************************************************************************
+
+QSize DbgButton::sizeHint() const
+{
+ if (text().isEmpty())
+ return pixmap_.size();
+ else
+ return QPushButton::sizeHint();
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+DbgDocker::DbgDocker(QWidget* parent, DbgToolBar* toolBar, const QPixmap& pixmap) :
+ KSystemTray(parent, "DbgDocker"),
+ toolBar_(toolBar)
+{
+ setPixmap(pixmap);
+ QToolTip::add( this, i18n("KDevelop ruby debugger: Click to execute one line of code (\"step\")") );
+}
+
+// **************************************************************************
+
+void DbgDocker::mousePressEvent(QMouseEvent *e)
+{
+ if (!rect().contains( e->pos()))
+ return;
+
+ switch (e->button()) {
+ case LeftButton:
+ {
+ // Not really a click, but it'll hold for the time being !!!
+ emit clicked();
+ break;
+ }
+ case RightButton:
+ {
+ KPopupMenu* menu = new KPopupMenu(this);
+ menu->insertTitle(i18n("Debug Toolbar"));
+ menu->insertItem(i18n("Activate"), toolBar_, SLOT(slotUndock()));
+ menu->insertItem(i18n("Activate (KDevelop gets focus)"), toolBar_, SLOT(slotActivateAndUndock()));
+ menu->popup(e->globalPos());
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+DbgToolBar::DbgToolBar(RubyDebuggerPart* part,
+ QWidget* parent, const char* name)
+ : QFrame(0, name),
+ part_(part),
+ activeWindow_(0),
+ winModule_(0),
+ bKDevFocus_(0),
+ bPrevFocus_(0),
+ appIsActive_(false),
+ docked_(false),
+ docker_(0),
+ dockWindow_(new KSystemTray(parent))
+{
+ winModule_ = new KWinModule(this);
+ docker_ = new DbgDocker(parent, this, BarIcon("dbgnext"));
+ connect(docker_, SIGNAL(clicked()), part_, SLOT(slotStepOver()));
+
+ // Must have noFocus set so that we can see what window was active.
+ // see slotDbgKdevFocus() for more comments
+ // I do not want the user to be able to "close" this widget. If we have any
+ // decoration then they can and that is bad.
+ // This widget is closed when the debugger finishes i.e. they press "Stop"
+
+ // Do we need NoFocus???
+ KWin::setState(winId(), NET::StaysOnTop | NET::Modal | NET::SkipTaskbar);
+// KWin::setType(winId(), NET::Override); // So it has no decoration
+ KWin::setType(winId(), NET::Dock);
+
+ setFocusPolicy(NoFocus);
+ setFrameStyle( QFrame::Box | QFrame::Plain );
+ setLineWidth(4);
+ setMidLineWidth(0);
+
+ QBoxLayout* topLayout = new QVBoxLayout(this);
+
+ QBoxLayout* nextLayout = new QHBoxLayout();
+ QBoxLayout* stepLayout = new QHBoxLayout();
+ QBoxLayout* focusLayout = new QHBoxLayout();
+
+ DbgMoveHandle* moveHandle= new DbgMoveHandle(this);
+
+ QPushButton* bRun = new DbgButton(BarIcon("dbgrun"), i18n("Run"), this);
+ QPushButton* bInterrupt = new DbgButton(BarIcon("player_pause"), i18n("Interrupt"), this);
+ QPushButton* bNext = new DbgButton(BarIcon("dbgnext"), i18n("Step Over"), this);
+ QPushButton* bStep = new DbgButton(BarIcon("dbgstep"), i18n("Step Into"), this);
+ QPushButton* bFinish = new DbgButton(BarIcon("dbgstepout"), i18n("Step Out"), this);
+ QPushButton* bRunTo = new DbgButton(BarIcon("dbgrunto"), i18n("Run to Cursor"), this);
+ bPrevFocus_ = new DbgButton(BarIcon("dbgmemview"), QString::null, this);
+ bKDevFocus_ = new DbgButton(BarIcon("kdevelop"), QString::null, this);
+
+ connect(bRun, SIGNAL(clicked()), part_, SLOT(slotRun()));
+ connect(bInterrupt, SIGNAL(clicked()), part_, SLOT(slotPause()));
+ connect(bNext, SIGNAL(clicked()), part_, SLOT(slotStepOver()));
+ connect(bStep, SIGNAL(clicked()), part_, SLOT(slotStepInto()));
+ connect(bFinish, SIGNAL(clicked()), part_, SLOT(slotStepOut()));
+ connect(bRunTo, SIGNAL(clicked()), part_, SLOT(slotRunToCursor()));
+ connect(bKDevFocus_, SIGNAL(clicked()), this, SLOT(slotKdevFocus()));
+ connect(bPrevFocus_, SIGNAL(clicked()), this, SLOT(slotPrevFocus()));
+
+ QToolTip::add( bRun, i18n("Continue with application execution, may start the application") );
+ QToolTip::add( bInterrupt, i18n("Interrupt the application execution") );
+ QToolTip::add( bNext, i18n("Execute one line of code, but run through methods") );
+ QToolTip::add( bStep, i18n("Execute one line of code, stepping into methods if appropriate") );
+ QToolTip::add( bFinish, i18n("Execute to end of current stack frame") );
+ QToolTip::add( bRunTo, i18n("Continues execution until the cursor position is reached.") );
+ QToolTip::add( bKDevFocus_, i18n("Set focus on KDevelop") );
+ QToolTip::add( bPrevFocus_, i18n("Set focus on window that had focus when KDevelop got focus") );
+
+ QWhatsThis::add( bRun, i18n("Continue with application execution. May start the application.") );
+ QWhatsThis::add( bInterrupt, i18n("Interrupt the application execution.") );
+ QWhatsThis::add( bNext, i18n("Execute one line of code, but run through methods.") );
+
+ QWhatsThis::add( bStep, i18n("Execute one line of code, stepping into methods if appropriate.") );
+
+ QWhatsThis::add( bFinish, i18n("Execute to end of current stack frame.") );
+ QWhatsThis::add( bRunTo, i18n("Continues execution until the cursor position is reached.") );
+ QWhatsThis::add( bKDevFocus_, i18n("Set focus on KDevelop.") );
+ QWhatsThis::add( bPrevFocus_, i18n("Set focus on window that had focus when KDevelop got focus.") );
+
+ topLayout->addWidget(moveHandle);
+ topLayout->addWidget(bRun);
+ topLayout->addLayout(nextLayout);
+ topLayout->addLayout(stepLayout);
+ topLayout->addWidget(bFinish);
+ topLayout->addWidget(bRunTo);
+ topLayout->addWidget(bInterrupt);
+ topLayout->addLayout(focusLayout);
+
+ focusLayout->addWidget(bKDevFocus_);
+ focusLayout->addWidget(bPrevFocus_);
+
+ stepLayout->addWidget(bStep);
+
+ nextLayout->addWidget(bNext);
+
+// int w = QMAX(bRun->sizeHint().width(), bFinish->sizeHint().width());
+// w = QMAX(w, bInterrupt->sizeHint().width());
+// w = QMAX(w, bView->sizeHint().width());
+
+ // they should have the same height, so don't be too fussy
+// int h = bFinish->sizeHint().height();
+//
+// bNext->setMinimumHeight(h);
+// bNexti->setMinimumHeight(h);
+// bStep->setMinimumHeight(h);
+// bStepi->setMinimumHeight(h);
+// bKDevFocus_->setMinimumHeight(h);
+// bPrevFocus_->setMinimumHeight(h);
+
+// setMinimumSize(w+10, h*7);
+// setMaximumSize(w+10, h*7);
+
+ setAppIndicator(appIsActive_);
+ topLayout->activate();
+}
+
+// **************************************************************************
+
+DbgToolBar::~DbgToolBar()
+{
+ slotUndock();
+}
+
+// **************************************************************************
+
+void DbgToolBar::slotKdevFocus()
+{
+ // I really want to be able to set the focus on the _application_ being debugged
+ // but this is the best compromise I can come up with. All we do is save the
+ // window that had focus when they switch to the kdevelop window. To do this
+ // the toolbar _cannot_ accept focus.
+ // If anyone has a way of determining what window the app is _actually_ running on
+ // then please fix and send a patch.
+
+ if (winModule_->activeWindow() != topLevelWidget()->winId())
+ activeWindow_ = winModule_->activeWindow();
+
+ KWin::activateWindow(topLevelWidget()->winId());
+}
+
+// **************************************************************************
+
+void DbgToolBar::slotPrevFocus()
+{
+ KWin::activateWindow(activeWindow_);
+}
+
+// **************************************************************************
+
+// If the app is active then the app button is highlighted, otherwise
+// kdev button is highlighted.
+void DbgToolBar::slotDbgStatus(const QString&, int state)
+{
+ bool appIndicator = state & s_appBusy;
+ if (appIndicator != appIsActive_) {
+ setAppIndicator(appIndicator);
+ appIsActive_ = appIndicator;
+ }
+}
+
+// **************************************************************************
+
+void DbgToolBar::setAppIndicator(bool appIndicator)
+{
+ if (appIndicator) {
+ bPrevFocus_->setPalette(QPalette(colorGroup().mid()));
+ bKDevFocus_->setPalette(QPalette(colorGroup().background()));
+ } else {
+ bPrevFocus_->setPalette(QPalette(colorGroup().background()));
+ bKDevFocus_->setPalette(QPalette(colorGroup().mid()));
+ }
+}
+
+// **************************************************************************
+
+void DbgToolBar::slotDock()
+{
+ if (docked_)
+ return;
+
+ // Q_ASSERT(!docker_);
+ hide();
+
+ docker_->show();
+ docked_ = true;
+}
+
+// **************************************************************************
+
+void DbgToolBar::slotIconifyAndDock()
+{
+ if (docked_)
+ return;
+
+ // KWin::iconifyWindow(ckDevelop_->winId(), true);
+ slotDock();
+}
+
+// **************************************************************************
+
+void DbgToolBar::slotUndock()
+{
+ if (!docked_)
+ return;
+
+ show();
+ docker_->hide();
+ docked_ = false;
+}
+
+// **************************************************************************
+
+void DbgToolBar::slotActivateAndUndock()
+{
+ if (!docked_)
+ return;
+
+ KWin::activateWindow(topLevelWidget()->winId());
+ slotUndock();
+}
+
+}
+
+// **************************************************************************
+#include "dbgtoolbar.moc"
diff --git a/languages/ruby/debugger/dbgtoolbar.h b/languages/ruby/debugger/dbgtoolbar.h
new file mode 100644
index 00000000..a19b2eae
--- /dev/null
+++ b/languages/ruby/debugger/dbgtoolbar.h
@@ -0,0 +1,90 @@
+/***************************************************************************
+ begin : Thu Dec 23 1999
+ copyright : (C) 1999 by John Birch
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *q
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _DBGTOOLBAR_H_
+#define _DBGTOOLBAR_H_
+
+class KWinModule;
+
+#include <ksystemtray.h>
+#include <kwin.h> // needed for WId :(
+
+#include <qframe.h>
+
+namespace RDBDebugger
+{
+
+class DbgButton;
+class DbgToolBar;
+class RubyDebuggerPart;
+
+class DbgDocker : public KSystemTray
+{
+ Q_OBJECT
+
+public:
+ DbgDocker(QWidget *parent, DbgToolBar *toolBar, const QPixmap &pixmap);
+ virtual ~DbgDocker() {};
+ virtual void mousePressEvent(QMouseEvent *e);
+
+signals:
+ void clicked();
+
+private:
+ DbgToolBar* toolBar_;
+};
+
+
+class DbgToolBar : public QFrame
+{
+ Q_OBJECT
+
+public:
+ DbgToolBar(RubyDebuggerPart *part, QWidget* parent, const char* name=0);
+ virtual ~DbgToolBar();
+
+private slots:
+ void slotDbgStatus(const QString&, int);
+ void slotDock();
+ void slotUndock();
+ void slotIconifyAndDock();
+ void slotActivateAndUndock();
+
+ void slotKdevFocus();
+ void slotPrevFocus();
+
+private:
+ void setAppIndicator(bool appIndicator);
+
+ RubyDebuggerPart* part_;
+ WId activeWindow_;
+ KWinModule* winModule_;
+ DbgButton* bKDevFocus_;
+ DbgButton* bPrevFocus_;
+ bool appIsActive_;
+ bool docked_;
+ DbgDocker* docker_;
+ KSystemTray* dockWindow_;
+};
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/debuggee.rb b/languages/ruby/debugger/debuggee.rb
new file mode 100644
index 00000000..38e2dea7
--- /dev/null
+++ b/languages/ruby/debugger/debuggee.rb
@@ -0,0 +1,1214 @@
+# Copyright (C) 2000 Network Applied Communication Laboratory, Inc.
+# Copyright (C) 2000 Information-technology Promotion Agency, Japan
+# Copyright (C) 2000-2003 NAKAMURA, Hiroshi <[email protected]>
+
+# Changes for the FreeRIDE IDE by Laurent JULLIARD. FreeRIDE uses
+# Distributed ruby (DRuby) to communicate with the debugger back
+# end. However, this can't interoperate with C++ in KDevelop and so
+# a Unix domain socket connection is used instead.
+
+# Adapted for KDevelop debugging
+# ------------------------------
+# begin : Mon Nov 1 2004
+# copyright : (C) 2004 by Richard Dale
+
+if $SAFE > 0
+ STDERR.print "-r debug.rb is not available in safe mode\n"
+ exit 1
+end
+
+require 'tracer'
+require 'pp'
+require 'rbconfig'
+
+class Tracer
+ def Tracer.trace_func(*vars)
+ Single.trace_func(*vars)
+ end
+end
+
+# FreeRIDE/KDevelop must always intercept exits hence the exit! redefinition
+# at_exit calls the quit method to cleanly disconnect from the
+# FreeRIDE/KDevelop debugger client
+module Kernel
+ alias_method :exit!, :exit
+end
+
+BEGIN {
+ at_exit do
+ set_trace_func nil
+ DEBUGGER__.quit
+ end
+}
+
+SCRIPT_LINES__ = {} unless defined? SCRIPT_LINES__
+
+class DEBUGGER__
+class Mutex
+ def initialize
+ @locker = nil
+ @waiting = []
+ @locked = false;
+ end
+
+ def locked?
+ @locked
+ end
+
+ def lock
+ return if Thread.critical
+ return if @locker == Thread.current
+ while (Thread.critical = true; @locked)
+ @waiting.push Thread.current
+ Thread.stop
+ end
+ @locked = true
+ @locker = Thread.current
+ Thread.critical = false
+ self
+ end
+
+ def unlock
+ return if Thread.critical
+ return unless @locked
+ unless @locker == Thread.current
+ raise RuntimeError, "unlocked by other"
+ end
+ Thread.critical = true
+ t = @waiting.shift
+ @locked = false
+ @locker = nil
+ Thread.critical = false
+ t.run if t
+ self
+ end
+end
+MUTEX = Mutex.new
+
+class Context
+ DEBUG_LAST_CMD = []
+
+ def readline(prompt_cmd, hist)
+ DEBUGGER__.client.readline(prompt_cmd)
+ end
+
+ def initialize
+ if Thread.current == Thread.main
+ @stop_next = 1
+ else
+ @stop_next = 0
+ end
+ @last_file = nil
+ @file = nil
+ @line = nil
+ @no_step = nil
+ @frames = []
+ @finish_pos = 0
+ @trace = false
+ @trace_ruby = false
+ @catch = "StandardError"
+ @suspend_next = false
+ end
+
+ def stop_next(n=1)
+ @stop_next = n
+ end
+
+ def set_suspend
+ @suspend_next = true
+ end
+
+ def clear_suspend
+ @suspend_next = false
+ end
+
+ def suspend_all
+ DEBUGGER__.suspend
+ end
+
+ def resume_all
+ DEBUGGER__.resume
+ end
+
+ def check_suspend
+ return if Thread.critical
+ while (Thread.critical = true; @suspend_next)
+ DEBUGGER__.waiting.push Thread.current
+ @suspend_next = false
+ Thread.stop
+ end
+ Thread.critical = false
+ end
+
+ def trace?
+ @trace
+ end
+
+ def set_trace(arg)
+ @trace = arg
+ end
+
+ def trace_ruby?
+ @trace_ruby
+ end
+
+ def set_trace_ruby(arg)
+ @trace_ruby = arg
+ end
+
+ def stdout
+ DEBUGGER__.stdout
+ end
+
+ def break_points
+ DEBUGGER__.break_points
+ end
+
+ def display
+ DEBUGGER__.display
+ end
+
+ def context(th)
+ DEBUGGER__.context(th)
+ end
+
+ def set_trace_all(arg)
+ DEBUGGER__.set_trace(arg)
+ end
+
+ def set_last_thread(th)
+ DEBUGGER__.set_last_thread(th)
+ end
+
+ def debug_eval(str, binding)
+ begin
+ val = eval(str, binding)
+ rescue StandardError, ScriptError => e
+ at = eval("caller(1)", binding)
+ stdout.printf "%s:%s\n", at.shift, e.to_s.sub(/\(eval\):1:(in `.*?':)?/, '')
+ for i in at
+ stdout.printf "\tfrom %s\n", i
+ end
+ throw :debug_error
+ end
+ end
+
+ def debug_silent_eval(str, binding)
+ begin
+ eval(str, binding)
+ rescue StandardError, ScriptError
+ nil
+ end
+ end
+
+ # Temporarily change the pretty_print methods to not expand arrays
+ # and hashes, just give the length
+ def customize_debug_pp
+ Array.module_eval %q{
+ def pretty_print(pp)
+ pp.pp "Array (%d element(s))" % length
+ end
+ }
+
+ Hash.module_eval %q{
+ def pretty_print(pp)
+ pp.pp "Hash (%d element(s))" % length
+ end
+ }
+ end
+
+ # Restore the original pretty_print methods for arrays and hashes
+ def restore_debug_pp
+ Array.module_eval %q{
+ def pretty_print(q)
+ q.group(1, '[', ']') {
+ self.each {|v|
+ q.comma_breakable unless q.first?
+ q.pp v
+ }
+ }
+ end
+ }
+ Hash.module_eval %q{
+ def pretty_print(q)
+ q.pp_hash self
+ end
+ }
+ end
+
+ # Prevent the 'var *' commands from expanding Arrays and Hashes
+ # This could be done by redefining inspect, but that would affect
+ # everywhere not just here and in the pp command.
+ def debug_inspect(obj)
+ if obj.kind_of? Array
+ "Array (%d element(s))" % obj.length
+ elsif obj.kind_of? Hash
+ "Hash (%d element(s))" % obj.length
+ elsif obj.kind_of? String
+ str = obj.inspect
+ if str.length > 255
+ "String (length %d)" % obj.length
+ else
+ str
+ end
+ else
+ obj.inspect
+ end
+ end
+
+ def var_list(ary, binding)
+ ary.sort!
+ for v in ary
+ stdout.printf " %s => %s\n", v, debug_inspect(eval(v, binding))
+ end
+ end
+
+ def const_list(ary, obj)
+ ary.sort!
+ for c in ary
+ str = debug_inspect(obj.module_eval(c))
+ if c.to_s != str &&
+ str !~ /^Qt::|^KDE::/ && c.to_s !~ /@@classes$|@@cpp_names$|@@idclass$|@@debug_level$/ &&
+ c.to_s !~ /^DCOPMeta$|^Meta$|SCRIPT_LINES__|TRUE|FALSE|NIL|MatchingData/ &&
+ c.to_s !~ /^PLATFORM$|^RELEASE_DATE$|^VERSION$|SilentClient|SilentObject/ &&
+ c.to_s !~ /^Client$|^Context$|^DEBUG_LAST_CMD$|^MUTEX$|^Mutex$|^SimpleDelegater$|^Delegater$/ &&
+ c.to_s !~ /IPsocket|IPserver|UDPsocket|UDPserver|TCPserver|TCPsocket|UNIXserver|UNIXsocket/
+ if c.to_s == "ENV"
+ stdout.printf " %s => Hash (%d element(s))\n", c, obj.module_eval(c).length
+ else
+ stdout.printf " %s => %s\n", c, str
+ end
+ end
+ end
+ end
+
+ def debug_variable_info(input, binding)
+ case input
+ when /^\s*g(?:lobal)?$/
+ var_list(global_variables, binding)
+
+ when /^\s*l(?:ocal)?$/
+ var_list(eval("local_variables", binding) << "self", binding)
+
+ when /^\s*i(?:nstance)?\s+/
+ obj = debug_eval($', binding)
+ var_list(obj.instance_variables, obj.instance_eval{binding()})
+
+ when /^\s*cl(?:ass)?\s+/
+ obj = debug_eval($', binding)
+ unless obj.kind_of? Module
+ stdout.print "Should be Class/Module: ", $', "\n"
+ else
+ const_list(obj.class_variables, obj)
+ end
+
+ when /^\s*c(?:onst(?:ant)?)?\s+/
+ obj = debug_eval($', binding)
+ unless obj.kind_of? Module
+ stdout.print "Should be Class/Module: ", $', "\n"
+ else
+ const_list(obj.constants, obj)
+ end
+ end
+ end
+
+ def debug_method_info(input, binding)
+ case input
+ when /^i(:?nstance)?\s+/
+ obj = debug_eval($', binding)
+
+ len = 0
+ for v in obj.methods.sort
+ len += v.size + 1
+ if len > 70
+ len = v.size + 1
+ stdout.print "\n"
+ end
+ stdout.print v, " "
+ end
+ stdout.print "\n"
+
+ else
+ obj = debug_eval(input, binding)
+ unless obj.kind_of? Module
+ stdout.print "Should be Class/Module: ", input, "\n"
+ else
+ len = 0
+ for v in obj.instance_methods(false).sort
+ len += v.size + 1
+ if len > 70
+ len = v.size + 1
+ stdout.print "\n"
+ end
+ stdout.print v, " "
+ end
+ stdout.print "\n"
+ end
+ end
+ end
+
+ def thnum
+ num = DEBUGGER__.instance_eval{@thread_list[Thread.current]}
+ unless num
+ DEBUGGER__.make_thread_list
+ num = DEBUGGER__.instance_eval{@thread_list[Thread.current]}
+ end
+ num
+ end
+
+ def debug_command(file, line, id, binding)
+ MUTEX.lock
+ set_last_thread(Thread.current)
+ frame_pos = 0
+ binding_file = file
+ binding_line = line
+ previous_line = nil
+ if ENV['EMACS']
+ stdout.printf "\032\032%s:%d:\n", binding_file, binding_line
+ else
+ stdout.printf "%s:%d:%s", binding_file, binding_line,
+ line_at(binding_file, binding_line)
+ end
+ @frames[0] = [binding, file, line, id]
+ display_expressions(binding)
+ prompt = true
+ while prompt and input = readline("(rdb:%d) "%thnum(), true)
+ catch(:debug_error) do
+ if input == ""
+ next unless DEBUG_LAST_CMD[0]
+ input = DEBUG_LAST_CMD[0]
+ stdout.print input, "\n"
+ else
+ DEBUG_LAST_CMD[0] = input
+ end
+
+ case input
+ when /^\s*trace_ruby(?:\s+(on|off))?$/
+ if defined?( $1 )
+ if $1 == 'on'
+ set_trace_ruby true
+ else
+ set_trace_ruby false
+ end
+ end
+
+ when /^\s*tr(?:ace)?(?:\s+(on|off))?(?:\s+(all))?$/
+ if defined?( $2 )
+ if $1 == 'on'
+ set_trace_all true
+ else
+ set_trace_all false
+ end
+ elsif defined?( $1 )
+ if $1 == 'on'
+ set_trace true
+ else
+ set_trace false
+ end
+ end
+ if trace?
+ stdout.print "Trace on.\n"
+ else
+ stdout.print "Trace off.\n"
+ end
+
+ when /^\s*b(?:reak)?\s+(?:(.+):)?([^.:]+)$/
+ pos = $2
+ if $1
+ klass = debug_silent_eval($1, binding)
+# file = $1
+ file = File.expand_path($1)
+ end
+ if pos =~ /^\d+$/
+ pname = pos
+ pos = pos.to_i
+ else
+ pname = pos = pos.intern.id2name
+ end
+ break_points.push [true, 0, klass || file, pos]
+ stdout.printf "Set breakpoint %d at %s:%s\n", break_points.size, klass || file, pname
+
+ when /^\s*b(?:reak)?\s+(.+)[#.]([^.:]+)$/
+ pos = $2.intern.id2name
+ klass = debug_eval($1, binding)
+ break_points.push [true, 0, klass, pos]
+ stdout.printf "Set breakpoint %d at %s.%s\n", break_points.size, klass, pos
+
+ when /^\s*wat(?:ch)?\s+(.+)$/
+ exp = $1
+ break_points.push [true, 1, exp]
+ stdout.printf "Set watchpoint %d\n", break_points.size, exp
+
+ when /^\s*b(?:reak)?$/
+ if break_points.find{|b| b[1] == 0}
+ n = 1
+ stdout.print "Breakpoints:\n"
+ for b in break_points
+ if b[0] and b[1] == 0
+ stdout.printf " %d %s:%s\n", n, b[2], b[3]
+ end
+ n += 1
+ end
+ end
+ if break_points.find{|b| b[1] == 1}
+ n = 1
+ stdout.print "\n"
+ stdout.print "Watchpoints:\n"
+ for b in break_points
+ if b[0] and b[1] == 1
+ stdout.printf " %d %s\n", n, b[2]
+ end
+ n += 1
+ end
+ end
+ if break_points.size == 0
+ stdout.print "No breakpoints\n"
+ else
+ stdout.print "\n"
+ end
+
+ when /^\s*del(?:ete)?(?:\s+(\d+))?$/
+ pos = $1
+ unless pos
+# input = readline("Clear all breakpoints? (y/n) ", false)
+# if input == "y"
+ for b in break_points
+ b[0] = false
+ end
+# end
+ else
+ pos = pos.to_i
+ if break_points[pos-1]
+ break_points[pos-1][0] = false
+ else
+ stdout.printf "Breakpoint %d is not defined\n", pos
+ end
+ end
+
+ when /^\s*disp(?:lay)?\s+(.+)$/
+ exp = $1
+ display.push [true, exp]
+ stdout.printf "%d: ", display.size
+ display_expression(exp, binding)
+
+ when /^\s*disp(?:lay)?$/
+ display_expressions(binding)
+
+ when /^\s*undisp(?:lay)?(?:\s+(\d+))?$/
+ pos = $1
+ unless pos
+# input = readline("Clear all expressions? (y/n) ", false)
+# if input == "y"
+ for d in display
+ d[0] = false
+ end
+# end
+ else
+ pos = pos.to_i
+ if display[pos-1]
+ display[pos-1][0] = false
+ else
+ stdout.printf "Display expression %d is not defined\n", pos
+ end
+ end
+
+ when /^\s*c(?:ont)?$/
+ prompt = false
+
+ when /^\s*s(?:tep)?(?:\s+(\d+))?$/
+ if $1
+ lev = $1.to_i
+ else
+ lev = 1
+ end
+ @stop_next = lev
+ prompt = false
+
+ when /^\s*n(?:ext)?(?:\s+(\d+))?$/
+ if $1
+ lev = $1.to_i
+ else
+ lev = 1
+ end
+ @stop_next = lev
+ @no_step = @frames.size - frame_pos
+ prompt = false
+
+ when /^\s*w(?:here)?$/, /^\s*f(?:rame)?$/
+ display_frames(frame_pos)
+
+ when /^\s*l(?:ist)?(?:\s+(.+))?$/
+ if not $1
+ b = previous_line ? previous_line + 10 : binding_line - 5
+ e = b + 9
+ elsif $1 == '-'
+ b = previous_line ? previous_line - 10 : binding_line - 5
+ e = b + 9
+ else
+ b, e = $1.split(/[-,]/)
+ if e
+ b = b.to_i
+ e = e.to_i
+ else
+ b = b.to_i - 5
+ e = b + 9
+ end
+ end
+ previous_line = b
+ display_list(b, e, binding_file, binding_line)
+
+ when /^\s*up(?:\s+(\d+))?$/
+ previous_line = nil
+ if $1
+ lev = $1.to_i
+ else
+ lev = 1
+ end
+ frame_pos += lev
+ if frame_pos >= @frames.size
+ frame_pos = @frames.size - 1
+ stdout.print "At toplevel\n"
+ end
+ binding, binding_file, binding_line = @frames[frame_pos]
+ stdout.print format_frame(frame_pos)
+
+ when /^\s*down(?:\s+(\d+))?$/
+ previous_line = nil
+ if $1
+ lev = $1.to_i
+ else
+ lev = 1
+ end
+ frame_pos -= lev
+ if frame_pos < 0
+ frame_pos = 0
+ stdout.print "At stack bottom\n"
+ end
+ binding, binding_file, binding_line = @frames[frame_pos]
+ stdout.print format_frame(frame_pos)
+
+ when /^\s*fin(?:ish)?$/
+ if frame_pos == @frames.size
+ stdout.print "\"finish\" not meaningful in the outermost frame.\n"
+ else
+ @finish_pos = @frames.size - frame_pos
+ frame_pos = 0
+ prompt = false
+ end
+
+ when /^\s*cat(?:ch)?(?:\s+(.+))?$/
+ if $1
+ excn = $1
+ if excn == 'off'
+ @catch = nil
+ stdout.print "Clear catchpoint.\n"
+ else
+ @catch = excn
+ stdout.printf "Set catchpoint %s.\n", @catch
+ end
+ else
+ if @catch
+ stdout.printf "Catchpoint %s.\n", @catch
+ else
+ stdout.print "No catchpoint.\n"
+ end
+ end
+
+ when /^\s*q(?:uit)?$/
+# input = readline("Really quit? (y/n) ", false)
+# if input == "y"
+ exit! # exit -> exit!: No graceful way to stop threads...
+# end
+
+
+ when /^\s*v(?:ar)?\s+/
+ debug_variable_info($', binding)
+
+ when /^\s*m(?:ethod)?\s+/
+ debug_method_info($', binding)
+
+ when /^\s*th(?:read)?\s+/
+ if DEBUGGER__.debug_thread_info($', binding) == :cont
+ prompt = false
+ end
+
+ when /^\s*pp\s+/
+ obj_name = $'
+ obj = debug_eval($', binding)
+ customize_debug_pp
+ if obj.kind_of? Array
+ obj.each_index { |i| stdout.printf "[%d]=%s\n", i.to_s, debug_inspect(obj[i]) }
+ elsif obj.kind_of? Hash or obj_name =~ /^ENV$/
+ # Special case ENV to print like a hash
+ obj.each { |key, value| stdout.printf "[%s]=%s\n", key.inspect, debug_inspect(value) }
+ elsif obj.kind_of?(String) && obj.inspect.length > 255
+ # Assume long strings contain packed data and show them as a
+ # sequence of 12 byte slices in hex
+ i = 0
+ while i < obj.length
+ j = (i + 12 < obj.length ? i + 12 : obj.length) - 1
+ stdout.printf "[%d..%d]=0x", i, j
+ for k in i..j
+ stdout.printf "%2.2x", obj[k]
+ end
+ stdout.printf " %s\n", obj[i..j].dump
+
+ i += 12
+ end
+ else
+ PP.pp(obj, stdout)
+ end
+ restore_debug_pp
+
+ when /^\s*p\s+/
+ stdout.printf "%s\n", debug_eval($', binding).inspect
+
+ when /^\s*h(?:elp)?$/
+ debug_print_help()
+
+ else
+ v = debug_eval(input, binding)
+ stdout.printf "%s\n", v.inspect
+ end
+ end
+ end
+ MUTEX.unlock
+ resume_all
+ end
+
+ def debug_print_help
+ stdout.print <<EOHELP
+Debugger help v.-0.002b
+Commands
+ b[reak] [file|class:]<line|method>
+ b[reak] [class.]<line|method>
+ set breakpoint to some position
+ wat[ch] <expression> set watchpoint to some expression
+ cat[ch] <an Exception> set catchpoint to an exception
+ b[reak] list breakpoints
+ cat[ch] show catchpoint
+ del[ete][ nnn] delete some or all breakpoints
+ disp[lay] <expression> add expression into display expression list
+ undisp[lay][ nnn] delete one particular or all display expressions
+ c[ont] run until program ends or hit breakpoint
+ s[tep][ nnn] step (into methods) one line or till line nnn
+ n[ext][ nnn] go over one line or till line nnn
+ w[here] display frames
+ f[rame] alias for where
+ l[ist][ (-|nn-mm)] list program, - lists backwards
+ nn-mm lists given lines
+ up[ nn] move to higher frame
+ down[ nn] move to lower frame
+ fin[ish] return to outer frame
+ tr[ace] (on|off) set trace mode of current thread
+ tr[ace] (on|off) all set trace mode of all threads
+ q[uit] exit from debugger
+ v[ar] g[lobal] show global variables
+ v[ar] l[ocal] show local variables
+ v[ar] i[nstance] <object> show instance variables of object
+ v[ar] cl[ass] <object> show class variables of object
+ v[ar] c[onst] <object> show constants of object
+ m[ethod] i[nstance] <obj> show methods of object
+ m[ethod] <class|module> show instance methods of class or module
+ th[read] l[ist] list all threads
+ th[read] c[ur[rent]] show current thread
+ th[read] [sw[itch]] <nnn> switch thread context to nnn
+ th[read] stop <nnn> stop thread nnn
+ th[read] resume <nnn> resume thread nnn
+ p expression evaluate expression and print its value
+ h[elp] print this help
+ <everything else> evaluate
+EOHELP
+ end
+
+ def display_expressions(binding)
+ n = 1
+ for d in display
+ if d[0]
+ stdout.printf "%d: ", n
+ display_expression(d[1], binding)
+ end
+ n += 1
+ end
+ end
+
+ def display_expression(exp, binding)
+ stdout.printf "%s = %s\n", exp, debug_silent_eval(exp, binding).to_s
+ end
+
+ def frame_set_pos(file, line)
+ if @frames[0]
+ @frames[0][1] = file
+ @frames[0][2] = line
+ end
+ end
+
+ def display_frames(pos)
+ 0.upto(@frames.size - 1) do |n|
+ if n == pos
+ stdout.print "--> "
+ else
+ stdout.print " "
+ end
+ stdout.print format_frame(n)
+ end
+ end
+
+ def format_frame(pos)
+ bind, file, line, id = @frames[pos]
+ sprintf "#%d %s:%s%s\n", pos + 1, file, line,
+ (id ? ":in `#{id.id2name}'" : "")
+ end
+
+ def display_list(b, e, file, line)
+ stdout.printf "[%d, %d] in %s\n", b, e, file
+ if lines = SCRIPT_LINES__[file] and lines != true
+ n = 0
+ b.upto(e) do |n|
+ if n > 0 && lines[n-1]
+ if n == line
+ stdout.printf "=> %d %s\n", n, lines[n-1].chomp
+ else
+ stdout.printf " %d %s\n", n, lines[n-1].chomp
+ end
+ end
+ end
+ else
+ stdout.printf "No sourcefile available for %s\n", file
+ end
+ end
+
+ def line_at(file, line)
+ lines = SCRIPT_LINES__[file]
+ if lines
+ return "\n" if lines == true
+ line = lines[line-1]
+ return "\n" unless line
+ return line
+ end
+ return "\n"
+ end
+
+ def debug_funcname(id)
+ if id.nil?
+ "toplevel"
+ else
+ id.id2name
+ end
+ end
+
+ def check_break_points(file, klass, pos, binding, id)
+ return false if break_points.empty?
+ n = 1
+ for b in break_points
+ if b[0] # valid
+ if b[1] == 0 # breakpoint
+ if (b[2] == file and b[3] == pos) or
+ (klass and b[2] == klass and b[3] == pos)
+ stdout.printf "Breakpoint %d, %s at %s:%s\n", n, debug_funcname(id), file, pos
+ return true
+ end
+ elsif b[1] == 1 # watchpoint
+ if debug_silent_eval(b[2], binding)
+ stdout.printf "Watchpoint %d, %s at %s:%s\n", n, debug_funcname(id), file, pos
+ return true
+ end
+ end
+ end
+ n += 1
+ end
+ return false
+ end
+
+ def excn_handle(file, line, id, binding)
+ if $!.class <= SystemExit
+ set_trace_func nil
+ exit
+ end
+
+ if @catch and ($!.class.ancestors.find { |e| e.to_s == @catch })
+ stdout.printf "%s:%d: `%s' (%s)\n", file, line, $!, $!.class
+ fs = @frames.size
+ tb = caller(0)[-fs..-1]
+ if tb
+ for i in tb
+ stdout.printf "\tfrom %s\n", i
+ end
+ end
+ suspend_all
+ debug_command(file, line, id, binding)
+ end
+ end
+
+ def trace_func(event, file, line, id, binding, klass)
+ Tracer.trace_func(event, file, line, id, binding, klass) if trace?
+ context(Thread.current).check_suspend
+
+ if not trace_ruby? and
+ ( file =~ /#{Config::CONFIG['sitelibdir']}/ or
+ file =~ /#{Config::CONFIG['rubylibdir']}/ or
+ file =~ %r{/debuggee.rb} )
+ case event
+ when 'line'
+ frame_set_pos(file, line)
+
+ when 'call'
+ @frames.unshift [binding, file, line, id]
+
+ when 'c-call'
+ frame_set_pos(file, line)
+
+ when 'class'
+ @frames.unshift [binding, file, line, id]
+
+ when 'return', 'end'
+ @frames.shift
+
+ when 'end'
+ @frames.shift
+
+ when 'raise'
+ excn_handle(file, line, id, binding)
+
+ end
+ return
+ end
+
+ @file = file
+ @line = line
+ case event
+ when 'line'
+ frame_set_pos(file, line)
+ if !@no_step or @frames.size == @no_step
+ @stop_next -= 1
+ @stop_next = -1 if @stop_next < 0
+ elsif @frames.size < @no_step
+ @stop_next = 0 # break here before leaving...
+ else
+ # nothing to do. skipped.
+ end
+ #LJ reverse the test here because we always want the breakpoint reached
+ # message to be display. if stop_next is null *AND* there is also a break point
+ # the message will never display.
+ if check_break_points(file, nil, line, binding, id) or @stop_next == 0
+ # LJ this test doesn't make sense and cause troubles when
+ # on a line with a recursive call and a breakpoint on it (e.g factorial)
+ # or when in a while loop with one line only inside the loop
+ #
+ # RJD: reinstated the test with a check on whether '@frames.size'
+ # has changed to catch the recursive factorial case LJ describes
+ # above. The while loop problem still exists though
+ if [file, line, @frames.size] == @last
+ @stop_next = 1
+ else
+ @no_step = nil
+ suspend_all
+ debug_command(file, line, id, binding)
+ @last = [file, line, @frames.size]
+ end
+ end
+
+ when 'call'
+ @frames.unshift [binding, file, line, id]
+ if check_break_points(file, klass, id.id2name, binding, id)
+ suspend_all
+ debug_command(file, line, id, binding)
+ end
+
+ when 'c-call'
+ frame_set_pos(file, line)
+
+ when 'class'
+ @frames.unshift [binding, file, line, id]
+
+ when 'return', 'end'
+ if @frames.size == @finish_pos
+ @stop_next = 1
+ @finish_pos = 0
+ end
+ @frames.shift
+
+ when 'end'
+ @frames.shift
+
+ when 'raise'
+ excn_handle(file, line, id, binding)
+
+ end
+ @last_file = file
+ end
+end
+
+trap("INT") { DEBUGGER__.interrupt }
+@last_thread = Thread::main
+@max_thread = 1
+@thread_list = {Thread::main => 1}
+@break_points = []
+@display = []
+@waiting = []
+@stdout = STDOUT
+
+ class SilentObject
+ def method_missing( msg_id, *a, &b ); end
+ end
+ SilentClient = SilentObject.new()
+ @client = SilentClient
+ @attached = false
+
+class << DEBUGGER__
+ def stdout
+ @stdout
+ end
+
+ def stdout=(s)
+ @stdout = s
+ end
+
+ def display
+ @display
+ end
+
+ def break_points
+ @break_points
+ end
+
+ def client
+ @client
+ end
+
+ def set_client( client )
+ @client = client
+ DEBUGGER__.stdout = Tracer.stdout = @client
+ end
+
+ def quit
+ #LJ flush STDOUT and ERR
+# @stdout.print "Quitting debugger"
+ STDERR.flush; STDOUT.flush
+ $stderr.flush; $stdout.flush
+# STDERR.close; STDOUT.close
+ detach
+ #DebugSvr.stop_service
+ end
+
+ def detach
+ @attached = false
+ @client.detach
+ set_client( SilentClient )
+ end
+
+ def waiting
+ @waiting
+ end
+
+ def set_trace( arg )
+ saved_crit = Thread.critical
+ Thread.critical = true
+ make_thread_list
+ for th, in @thread_list
+ context(th).set_trace arg
+ end
+ Thread.critical = saved_crit
+ arg
+ end
+
+ def set_last_thread(th)
+ @last_thread = th
+ end
+
+ def suspend
+ saved_crit = Thread.critical
+ Thread.critical = true
+ make_thread_list
+ for th, in @thread_list
+ next if th == Thread.current
+ context(th).set_suspend
+ end
+ Thread.critical = saved_crit
+ # Schedule other threads to suspend as soon as possible.
+ Thread.pass unless Thread.critical
+ end
+
+ def resume
+ saved_crit = Thread.critical
+ Thread.critical = true
+ make_thread_list
+ for th, in @thread_list
+ next if th == Thread.current
+ context(th).clear_suspend
+ end
+ waiting.each do |th|
+ th.run
+ end
+ waiting.clear
+ Thread.critical = saved_crit
+ # Schedule other threads to restart as soon as possible.
+ Thread.pass
+ end
+
+ def context(thread=Thread.current)
+ c = thread[:__debugger_data__]
+ unless c
+ thread[:__debugger_data__] = c = Context.new
+ end
+ c
+ end
+
+ def interrupt
+ context(@last_thread).stop_next
+ end
+
+ def get_thread(num)
+ th = @thread_list.index(num)
+ unless th
+ @stdout.print "No thread ##{num}\n"
+ throw :debug_error
+ end
+ th
+ end
+
+ def thread_list(num)
+ th = get_thread(num)
+ if th == Thread.current
+ @stdout.print "+"
+ else
+ @stdout.print " "
+ end
+ @stdout.printf "%d ", num
+ @stdout.print th.inspect, "\t"
+ file = context(th).instance_eval{@file}
+ if file
+ @stdout.print file,":",context(th).instance_eval{@line}
+ end
+ @stdout.print "\n"
+ end
+
+ def thread_list_all
+ for th in @thread_list.values.sort
+ thread_list(th)
+ end
+ end
+
+ def make_thread_list
+ hash = {}
+ for th in Thread::list
+ if @thread_list.key? th
+ hash[th] = @thread_list[th]
+ else
+ @max_thread += 1
+ hash[th] = @max_thread
+ end
+ end
+ @thread_list = hash
+ end
+
+ def debug_thread_info(input, binding)
+ case input
+ when /^l(?:ist)?/
+ make_thread_list
+ thread_list_all
+
+ when /^c(?:ur(?:rent)?)?$/
+ make_thread_list
+ thread_list(@thread_list[Thread.current])
+
+ when /^(?:sw(?:itch)?\s+)?(\d+)/
+ make_thread_list
+ th = get_thread($1.to_i)
+ if th == Thread.current
+ @stdout.print "It's the current thread.\n"
+ else
+ thread_list(@thread_list[th])
+ context(th).stop_next
+ th.run
+ return :cont
+ end
+
+ when /^stop\s+(\d+)/
+ make_thread_list
+ th = get_thread($1.to_i)
+ if th == Thread.current
+ @stdout.print "It's the current thread.\n"
+ elsif th.stop?
+ @stdout.print "Already stopped.\n"
+ else
+ thread_list(@thread_list[th])
+ context(th).suspend
+ end
+
+ when /^resume\s+(\d+)/
+ make_thread_list
+ th = get_thread($1.to_i)
+ if th == Thread.current
+ @stdout.print "It's the current thread.\n"
+ elsif !th.stop?
+ @stdout.print "Already running."
+ else
+ thread_list(@thread_list[th])
+ th.run
+ end
+ end
+ end
+end
+
+require 'socket'
+
+ ##
+ # DEBUGGEE -> socket -> KDevelop
+ # The Client class holds all the methods invoked from the debuggee that send and
+ # receive data from KDevelop via the Unix domain socket.
+ #
+ class Client
+ def initialize(path)
+ @debugger = UNIXSocket.open(path)
+ @debugger.sync=true
+ end
+
+ def detach
+# @debugger.close
+ end
+
+ def printf( *args )
+ str = sprintf(*args)
+ @debugger.send(str, 0)
+ end
+
+ def print( *args )
+ str = args.to_s
+ @debugger.send(str, 0)
+ end
+
+ def <<( arg )
+ @debugger.send(arg, 0)
+ end
+
+ # Return next command
+ def readline(prompt_cmd)
+ @debugger.send(prompt_cmd, 0)
+ msg = @debugger.recvfrom(2048)
+ return msg[0]
+ end
+ end
+
+#stdout.printf "Debug.rb\n"
+#stdout.printf "Emacs support available.\n\n"
+
+STDERR.sync=true
+STDOUT.sync=true
+
+path = $stdin.gets.chomp
+
+DEBUGGER__.set_client( Client.new(path) )
+
+set_trace_func proc { |event, file, line, id, binding, klass, *rest|
+
+ # LJ make sure the file path is always absolute. It is needed by
+ # the Debugger plugin in KDevelop and can only be determined here
+ # in the context of the debugged process
+ file = File.expand_path(file)
+
+ DEBUGGER__.context.trace_func event, file, line, id, binding, klass
+}
+
+end
diff --git a/languages/ruby/debugger/debuggerpart.cpp b/languages/ruby/debugger/debuggerpart.cpp
new file mode 100644
index 00000000..95b4dd09
--- /dev/null
+++ b/languages/ruby/debugger/debuggerpart.cpp
@@ -0,0 +1,785 @@
+/***************************************************************************
+ * Copyright (C) 1999-2001 by John Birch *
+ * Copyright (C) 2001 by Bernd Gehrmann *
+ * *
+ * Adapted for ruby debugging *
+ * -------------------------- *
+ * begin : Mon Nov 1 2004 *
+ * copyright : (C) 2004 by Richard Dale *
+ * email : [email protected] *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+#include "debuggerpart.h"
+
+#include <qdir.h>
+#include <qvbox.h>
+#include <qwhatsthis.h>
+#include <qpopupmenu.h>
+
+#include <kaction.h>
+#include <kdebug.h>
+#include <kfiledialog.h>
+#include <kdevgenericfactory.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kmainwindow.h>
+#include <kstatusbar.h>
+#include <kparts/part.h>
+#include <ktexteditor/viewcursorinterface.h>
+#include <kmessagebox.h>
+#include <kapplication.h>
+#include <dcopclient.h>
+#include <qtimer.h>
+#include <kstringhandler.h>
+#include <kstandarddirs.h>
+
+#include "kdevcore.h"
+#include "kdevproject.h"
+#include "kdevmainwindow.h"
+#include "kdevappfrontend.h"
+#include "kdevpartcontroller.h"
+#include "kdevdebugger.h"
+#include "domutil.h"
+#include "variablewidget.h"
+#include "rdbbreakpointwidget.h"
+#include "framestackwidget.h"
+#include "processwidget.h"
+#include "rdbcontroller.h"
+#include "breakpoint.h"
+#include "dbgpsdlg.h"
+#include "dbgtoolbar.h"
+#include "rdbparser.h"
+#include "rdboutputwidget.h"
+#include "processlinemaker.h"
+
+#include <iostream>
+
+#include <kdevplugininfo.h>
+#include <debugger.h>
+
+
+namespace RDBDebugger
+{
+static const KDevPluginInfo data("kdevrbdebugger");
+
+typedef KDevGenericFactory<RubyDebuggerPart> RubyDebuggerFactory;
+K_EXPORT_COMPONENT_FACTORY( libkdevrbdebugger, RubyDebuggerFactory( data ) )
+
+RubyDebuggerPart::RubyDebuggerPart( QObject *parent, const char *name, const QStringList & ) :
+ KDevPlugin( &data, parent, name ? name : "RubyDebuggerPart" ),
+ controller(0)
+{
+// setObjId("RubyDebuggerInterface");
+ setInstance(RubyDebuggerFactory::instance());
+
+ setXMLFile("kdevrbdebugger.rc");
+
+ m_debugger = new Debugger( partController() );
+
+ statusBarIndicator = new QLabel(" ", mainWindow()->statusBar());
+ statusBarIndicator->setFixedWidth(15);
+ mainWindow()->statusBar()->addWidget(statusBarIndicator, 0, true);
+ statusBarIndicator->show();
+
+ // Setup widgets and dbgcontroller
+ variableWidget = new VariableWidget( 0, "rdbVariablewidget");
+// /*variableWidget*/->setEnabled(false);
+ variableWidget->setIcon(SmallIcon("math_brace"));
+ variableWidget->setCaption(i18n("Variable Tree"));
+ QWhatsThis::add
+ (variableWidget, i18n("<b>Variable tree</b><p>"
+ "The variable tree allows you to see "
+ "the variable values as you step "
+ "through your program using the internal "
+ "debugger. Click the right mouse button on items in "
+ "this view to get a popup menu.\n"
+ "To speed up stepping through your code "
+ "leave the tree items closed.\n"));
+ mainWindow()->embedSelectView(variableWidget, i18n("Variables"), i18n("Debugger variable-view"));
+
+// mainWindow()->setViewAvailable(variableWidget, false);
+
+ rdbBreakpointWidget = new RDBBreakpointWidget( 0, "rdbBreakpointWidget" );
+ rdbBreakpointWidget->setCaption(i18n("Breakpoint List"));
+ QWhatsThis::add
+ (rdbBreakpointWidget, i18n("<b>Breakpoint list</b><p>"
+ "Displays a list of breakpoints with "
+ "their current status. Clicking on a "
+ "breakpoint item allows you to change "
+ "the breakpoint and will take you "
+ "to the source in the editor window."));
+ rdbBreakpointWidget->setIcon( SmallIcon("stop") );
+ mainWindow()->embedOutputView(rdbBreakpointWidget, i18n("Breakpoints"), i18n("Debugger breakpoints"));
+
+ framestackWidget = new FramestackWidget( 0, "rdbFramestackWidget" );
+ framestackWidget->setEnabled(false);
+ framestackWidget->setCaption(i18n("Frame Stack"));
+ QWhatsThis::add
+ (framestackWidget, i18n("<b>Frame stack</b><p>"
+ "Often referred to as the \"call stack\", "
+ "this is a list showing what method is "
+ "currently active and who called each "
+ "method to get to this point in your "
+ "program. By clicking on an item you "
+ "can see the values in any of the "
+ "previous calling methods."));
+ framestackWidget->setIcon( SmallIcon("table") );
+ mainWindow()->embedOutputView(framestackWidget, i18n("Frame Stack"), i18n("Debugger method call stack"));
+ mainWindow()->setViewAvailable(framestackWidget, false);
+
+
+ rdbOutputWidget = new RDBOutputWidget( 0, "rdbOutputWidget" );
+ rdbOutputWidget->setEnabled(false);
+ rdbOutputWidget->setIcon( SmallIcon("inline_image") );
+ rdbOutputWidget->setCaption(i18n("RDB Output"));
+ QWhatsThis::add
+ (rdbOutputWidget, i18n("<b>RDB output</b><p>"
+ "Shows all rdb commands being executed. "
+ "You can also issue any other rdb command while debugging."));
+ mainWindow()->embedOutputView(rdbOutputWidget, i18n("RDB"),
+ i18n("RDB output"));
+ mainWindow()->setViewAvailable(rdbOutputWidget, false);
+
+ // rdbBreakpointWidget -> this
+ connect( rdbBreakpointWidget, SIGNAL(refreshBPState(const Breakpoint&)),
+ this, SLOT(slotRefreshBPState(const Breakpoint&)));
+ connect( rdbBreakpointWidget, SIGNAL(publishBPState(const Breakpoint&)),
+ this, SLOT(slotRefreshBPState(const Breakpoint&)));
+ connect( rdbBreakpointWidget, SIGNAL(gotoSourcePosition(const QString&, int)),
+ this, SLOT(slotGotoSource(const QString&, int)) );
+
+ // Now setup the actions
+ KAction *action;
+
+// action = new KAction(i18n("&Start"), "1rightarrow", CTRL+SHIFT+Key_F9,
+ action = new KAction(i18n("&Start"), "dbgrun", CTRL+SHIFT+Key_F9,
+ this, SLOT(slotRun()),
+ actionCollection(), "debug_run");
+ action->setToolTip( i18n("Start in debugger") );
+ action->setWhatsThis( i18n("<b>Start in debugger</b><p>"
+ "Starts the debugger with the project's main "
+ "executable. You may set some breakpoints "
+ "before this, or you can interrupt the program "
+ "while it is running, in order to get information "
+ "about variables, frame stack, and so on.") );
+
+ action = new KAction(i18n("Sto&p"), "stop", 0,
+ this, SLOT(slotStop()),
+ actionCollection(), "debug_stop");
+ action->setToolTip( i18n("Stop debugger") );
+ action->setWhatsThis(i18n("<b>Stop debugger</b><p>Kills the executable and exits the debugger."));
+
+ action = new KAction(i18n("Interrupt"), "player_pause", 0,
+ this, SLOT(slotPause()),
+ actionCollection(), "debug_pause");
+ action->setToolTip( i18n("Interrupt application") );
+ action->setWhatsThis(i18n("<b>Interrupt application</b><p>Interrupts the debugged process or current RDB command."));
+
+ action = new KAction(i18n("Run to &Cursor"), "dbgrunto", 0,
+ this, SLOT(slotRunToCursor()),
+ actionCollection(), "debug_runtocursor");
+ action->setToolTip( i18n("Run to cursor") );
+ action->setWhatsThis(i18n("<b>Run to cursor</b><p>Continues execution until the cursor position is reached."));
+
+
+ action = new KAction(i18n("Step &Over"), "dbgnext", 0,
+ this, SLOT(slotStepOver()),
+ actionCollection(), "debug_stepover");
+ action->setToolTip( i18n("Step over the next line") );
+ action->setWhatsThis( i18n("<b>Step over</b><p>"
+ "Executes one line of source in the current source file. "
+ "If the source line is a call to a method the whole "
+ "method is executed and the app will stop at the line "
+ "following the method call.") );
+
+
+ action = new KAction(i18n("Step &Into"), "dbgstep", 0,
+ this, SLOT(slotStepInto()),
+ actionCollection(), "debug_stepinto");
+ action->setToolTip( i18n("Step into the next statement") );
+ action->setWhatsThis( i18n("<b>Step into</b><p>"
+ "Executes exactly one line of source. If the source line "
+ "is a call to a method then execution will stop after "
+ "the method has been entered.") );
+
+
+
+ action = new KAction(i18n("Step O&ut"), "dbgstepout", 0,
+ this, SLOT(slotStepOut()),
+ actionCollection(), "debug_stepout");
+ action->setToolTip( i18n("Steps out of the current method") );
+ action->setWhatsThis( i18n("<b>Step out</b><p>"
+ "Executes the application until the currently executing "
+ "method is completed. The debugger will then display "
+ "the line after the original call to that method. If "
+ "program execution is in the outermost frame (i.e. in "
+ "the topleveltoggleWatchpoint) then this operation has no effect.") );
+
+
+ action = new KAction(i18n("Toggle Breakpoint"), 0, 0,
+ this, SLOT(toggleBreakpoint()),
+ actionCollection(), "debug_toggle_breakpoint");
+ action->setToolTip(i18n("Toggle breakpoint"));
+ action->setWhatsThis(i18n("<b>Toggle breakpoint</b><p>Toggles the breakpoint at the current line in editor."));
+
+ connect( mainWindow()->main()->guiFactory(), SIGNAL(clientAdded(KXMLGUIClient*)),
+ this, SLOT(guiClientAdded(KXMLGUIClient*)) );
+
+
+ connect( partController(), SIGNAL(loadedFile(const KURL &)),
+ rdbBreakpointWidget, SLOT(slotRefreshBP(const KURL &)) );
+ connect( debugger(), SIGNAL(toggledBreakpoint(const QString &, int)),
+ rdbBreakpointWidget, SLOT(slotToggleBreakpoint(const QString &, int)) );
+ connect( debugger(), SIGNAL(editedBreakpoint(const QString &, int)),
+ rdbBreakpointWidget, SLOT(slotEditBreakpoint(const QString &, int)) );
+ connect( debugger(), SIGNAL(toggledBreakpointEnabled(const QString &, int)),
+ rdbBreakpointWidget, SLOT(slotToggleBreakpointEnabled(const QString &, int)) );
+
+ connect( core(), SIGNAL(contextMenu(QPopupMenu *, const Context *)),
+ this, SLOT(contextMenu(QPopupMenu *, const Context *)) );
+
+ connect( core(), SIGNAL(stopButtonClicked(KDevPlugin*)),
+ this, SLOT(slotStop(KDevPlugin*)) );
+ connect( core(), SIGNAL(projectClosed()),
+ this, SLOT(projectClosed()) );
+
+ connect( partController(), SIGNAL(activePartChanged(KParts::Part*)),
+ this, SLOT(slotActivePartChanged(KParts::Part*)) );
+
+ procLineMaker = new ProcessLineMaker();
+
+ connect( procLineMaker, SIGNAL(receivedStdoutLine(const QCString&)),
+ appFrontend(), SLOT(insertStdoutLine(const QCString&)) );
+ connect( procLineMaker, SIGNAL(receivedStderrLine(const QCString&)),
+ appFrontend(), SLOT(insertStderrLine(const QCString&)) );
+ connect( procLineMaker, SIGNAL(receivedPartialStdoutLine(const QCString&)),
+ appFrontend(), SLOT(addPartialStdoutLine(const QCString&)) );
+ connect( procLineMaker, SIGNAL(receivedPartialStderrLine(const QCString&)),
+ appFrontend(), SLOT(addPartialStderrLine(const QCString&)) );
+
+ setupController();
+ QTimer::singleShot(0, this, SLOT(setupDcop()));
+}
+
+RubyDebuggerPart::~RubyDebuggerPart()
+{
+ kapp->dcopClient()->setNotifications(false);
+
+ if (variableWidget)
+ mainWindow()->removeView(variableWidget);
+ if (rdbBreakpointWidget)
+ mainWindow()->removeView(rdbBreakpointWidget);
+ if (framestackWidget)
+ mainWindow()->removeView(framestackWidget);
+ if(rdbOutputWidget)
+ mainWindow()->removeView(rdbOutputWidget);
+
+ delete variableWidget;
+ delete rdbBreakpointWidget;
+ delete framestackWidget;
+ delete rdbOutputWidget;
+ delete controller;
+ delete floatingToolBar;
+ delete statusBarIndicator;
+ delete procLineMaker;
+}
+
+
+void RubyDebuggerPart::guiClientAdded( KXMLGUIClient* client )
+{
+ // Can't change state until after XMLGUI has been loaded...
+ // Anyone know of a better way of doing this?
+ if( client == this )
+ stateChanged( QString("stopped") );
+}
+
+void RubyDebuggerPart::contextMenu(QPopupMenu *popup, const Context *context)
+{
+ if (!context->hasType( Context::EditorContext ))
+ return;
+
+ const EditorContext *econtext = static_cast<const EditorContext*>(context);
+ m_contextIdent = econtext->currentWord();
+
+ popup->insertSeparator();
+ if (econtext->url().isLocalFile())
+ {
+ int id = popup->insertItem( i18n("Toggle Breakpoint"), this, SLOT(toggleBreakpoint()) );
+ popup->setWhatsThis(id, i18n("<b>Toggle breakpoint</b><p>Toggles breakpoint at the current line."));
+ }
+ if (!m_contextIdent.isEmpty())
+ {
+ QString squeezed = KStringHandler::csqueeze(m_contextIdent, 30);
+ int id = popup->insertItem( i18n("Watch: %1").arg(squeezed), this, SLOT(contextWatch()) );
+ popup->setWhatsThis(id, i18n("<b>Watch</b><p>Adds an expression under the cursor to the Variables/Watch list."));
+
+ id = popup->insertItem( i18n("Inspect: %1").arg(squeezed), this, SLOT(contextRubyInspect()) );
+ popup->setWhatsThis(id, i18n("<b>Inspect</b><p>Evaluates an expression under the cursor."));
+ }
+}
+
+
+void RubyDebuggerPart::toggleBreakpoint()
+{
+ KParts::ReadWritePart *rwpart
+ = dynamic_cast<KParts::ReadWritePart*>(partController()->activePart());
+ KTextEditor::ViewCursorInterface *cursorIface
+ = dynamic_cast<KTextEditor::ViewCursorInterface*>(partController()->activeWidget());
+
+ if (!rwpart || !cursorIface)
+ return;
+
+ uint line, col;
+ cursorIface->cursorPositionReal(&line, &col);
+
+ rdbBreakpointWidget->slotToggleBreakpoint(rwpart->url().path(), line);
+}
+
+
+void RubyDebuggerPart::contextWatch()
+{
+ variableWidget->slotAddWatchExpression(m_contextIdent);
+}
+
+// Evaluates the selected text
+void RubyDebuggerPart::contextRubyInspect()
+{
+ emit rubyInspect(m_contextIdent);
+}
+
+
+void RubyDebuggerPart::setupController()
+{
+ VariableTree *variableTree = variableWidget->varTree();
+
+ controller = new RDBController(variableTree, framestackWidget, *projectDom());
+
+ // this -> controller
+ connect( this, SIGNAL(rubyInspect(const QString&)),
+ controller, SLOT(slotRubyInspect(const QString&)));
+
+ // variableTree -> framestackWidget
+ connect( variableTree, SIGNAL(selectFrame(int, int)),
+ framestackWidget, SLOT(slotSelectFrame(int, int)));
+
+ // framestackWidget -> variableTree
+ connect( framestackWidget, SIGNAL(frameActive(int, int, const QString&)),
+ variableTree, SLOT(slotFrameActive(int, int, const QString&)));
+
+ // variableTree -> controller
+ connect( variableTree, SIGNAL(expandItem(VarItem*, const QCString&)),
+ controller, SLOT(slotExpandItem(VarItem*, const QCString&)));
+ connect( variableTree, SIGNAL(fetchGlobals(bool)),
+ controller, SLOT(slotFetchGlobals(bool)));
+ connect( variableTree, SIGNAL(addWatchExpression(const QString&, bool)),
+ controller, SLOT(slotAddWatchExpression(const QString&, bool)));
+ connect( variableTree, SIGNAL(removeWatchExpression(int)),
+ controller, SLOT(slotRemoveWatchExpression(int)));
+
+ // framestackWidget -> controller
+ connect( framestackWidget, SIGNAL(selectFrame(int,int,const QString&)),
+ controller, SLOT(slotSelectFrame(int,int,const QString&)));
+
+ // rdbBreakpointWidget -> controller
+ connect( rdbBreakpointWidget, SIGNAL(clearAllBreakpoints()),
+ controller, SLOT(slotClearAllBreakpoints()));
+ connect( rdbBreakpointWidget, SIGNAL(publishBPState(const Breakpoint&)),
+ controller, SLOT(slotBPState(const Breakpoint &)));
+
+
+ // rdbOutputWidget -> controller
+ connect( rdbOutputWidget, SIGNAL(userRDBCmd(const QString &)),
+ controller, SLOT(slotUserRDBCmd(const QString&)));
+ connect( rdbOutputWidget, SIGNAL(breakInto()),
+ controller, SLOT(slotBreakInto()));
+
+ // controller -> rdbBreakpointWidget
+ connect( controller, SIGNAL(acceptPendingBPs()),
+ rdbBreakpointWidget, SLOT(slotSetPendingBPs()));
+ connect( controller, SIGNAL(unableToSetBPNow(int)),
+ rdbBreakpointWidget, SLOT(slotUnableToSetBPNow(int)));
+ connect( controller, SIGNAL(rawRDBBreakpointList (char*)),
+ rdbBreakpointWidget, SLOT(slotParseRDBBrkptList(char*)));
+ connect( controller, SIGNAL(rawRDBBreakpointSet(char*, int)),
+ rdbBreakpointWidget, SLOT(slotParseRDBBreakpointSet(char*, int)));
+
+
+ // controller -> this
+ connect( controller, SIGNAL(dbgStatus(const QString&, int)),
+ this, SLOT(slotStatus(const QString&, int)));
+ connect( controller, SIGNAL(showStepInSource(const QString&, int, const QString&)),
+ this, SLOT(slotShowStep(const QString&, int)));
+
+ // controller -> procLineMaker
+ connect( controller, SIGNAL(ttyStdout(const char*)),
+ procLineMaker, SLOT(slotReceivedStdout(const char*)));
+ connect( controller, SIGNAL(ttyStderr(const char*)),
+ procLineMaker, SLOT(slotReceivedStderr(const char*)));
+
+ // controller -> rdbOutputWidget
+ connect( controller, SIGNAL(rdbStdout(const char*)),
+ rdbOutputWidget, SLOT(slotReceivedStdout(const char*)) );
+ connect( controller, SIGNAL(rdbStderr(const char*)),
+ rdbOutputWidget, SLOT(slotReceivedStderr(const char*)) );
+ connect( controller, SIGNAL(dbgStatus(const QString&, int)),
+ rdbOutputWidget, SLOT(slotDbgStatus(const QString&, int)));
+
+}
+
+
+bool RubyDebuggerPart::startDebugger()
+{
+ QString build_dir; // Currently selected build directory
+ QString run_directory; // Directory from where the program should be run
+ QString program; // Absolute path to application
+ QString run_arguments; // Command line arguments to be passed to the application
+ QString ruby_interpreter; // Absolute path to the ruby interpreter
+ QString debuggee_path; // Absolute path to debuggee.rb debugger script
+ bool show_constants; // Show constants in the debugger
+ bool trace_into_ruby; // Trace into the ruby code installed under sitedir
+
+ if (project()) {
+ build_dir = project()->buildDirectory();
+ run_directory = DomUtil::readEntry(*projectDom(), "/kdevscriptproject/run/globalcwd");
+ if (run_directory.isEmpty())
+ run_directory = project()->buildDirectory();
+ }
+
+ int runMainProgram = DomUtil::readIntEntry(*projectDom(), "/kdevrubysupport/run/runmainprogram");
+
+ if (runMainProgram == 0) {
+ program = project()->projectDirectory() + "/" + DomUtil::readEntry(*projectDom(), "/kdevrubysupport/run/mainprogram");
+ } else {
+ KParts::ReadOnlyPart *ro_part = dynamic_cast<KParts::ReadOnlyPart*>(partController()->activePart());
+ if (ro_part != 0) {
+ program = ro_part->url().path();
+ }
+ }
+
+ run_arguments = DomUtil::readEntry(*projectDom(), "/kdevrubysupport/run/programargs");
+
+ QString shell = DomUtil::readEntry(*projectDom(), "/kdevrbdebugger/general/dbgshell");
+ if( !shell.isEmpty() )
+ {
+ QFileInfo info( shell );
+ if( info.isRelative() )
+ {
+ shell = build_dir + "/" + shell;
+ info.setFile( shell );
+ }
+ if( !info.exists() )
+ {
+ KMessageBox::error(
+ mainWindow()->main(),
+ i18n("Could not locate the debugging shell '%1'.").arg( shell ),
+ i18n("Debugging Shell Not Found") );
+ return false;
+ }
+ }
+
+ core()->running(this, true);
+
+ stateChanged( QString("active") );
+
+ KActionCollection *ac = actionCollection();
+ ac->action("debug_run")->setText( i18n("&Continue") );
+// ac->action("debug_run")->setIcon( "dbgrun" );
+ ac->action("debug_run")->setToolTip( i18n("Continues the application execution") );
+ ac->action("debug_run")->setWhatsThis( i18n("Continue application execution\n\n"
+ "Continues the execution of your application in the "
+ "debugger. This only takes effect when the application "
+ "has been halted by the debugger (i.e. a breakpoint has "
+ "been activated or the interrupt was pressed).") );
+
+
+// mainWindow()->setViewAvailable(variableWidget, true);
+ mainWindow()->setViewAvailable(framestackWidget, true);
+ mainWindow()->setViewAvailable(rdbOutputWidget, true);
+
+// variableWidget->setEnabled(true);
+ framestackWidget->setEnabled(true);
+
+ rdbOutputWidget->clear();
+ rdbOutputWidget->setEnabled(true);
+
+ if (DomUtil::readBoolEntry(*projectDom(), "/kdevrbdebugger/general/floatingtoolbar", false))
+ {
+ floatingToolBar = new DbgToolBar(this, mainWindow()->main());
+ floatingToolBar->show();
+ }
+
+ ruby_interpreter = DomUtil::readEntry(*projectDom(), "/kdevrubysupport/run/interpreter");
+
+ int coding = DomUtil::readIntEntry(*projectDom(), "/kdevrubysupport/run/charactercoding");
+ QString character_coding("-K");
+
+ switch (coding) {
+ case 0:
+ character_coding.append("A");
+ break;
+ case 1:
+ character_coding.append("E");
+ break;
+ case 2:
+ character_coding.append("S");
+ break;
+ case 3:
+ character_coding.append("U");
+ break;
+ }
+
+// ruby_interpreter.append(QString(" -K") + code);
+
+ debuggee_path = ::locate("data", "kdevrbdebugger/debuggee.rb", instance());
+
+ show_constants = DomUtil::readBoolEntry(*projectDom(), "/kdevrbdebugger/general/showconstants");
+ trace_into_ruby = DomUtil::readBoolEntry(*projectDom(), "/kdevrbdebugger/general/traceintoruby");
+
+ controller->slotStart(ruby_interpreter, character_coding, run_directory, debuggee_path, program, run_arguments, show_constants, trace_into_ruby);
+ return true;
+}
+
+void RubyDebuggerPart::slotStopDebugger()
+{
+ controller->slotStopDebugger();
+ debugger()->clearExecutionPoint();
+
+ delete floatingToolBar;
+ floatingToolBar = 0;
+
+ rdbBreakpointWidget->reset();
+ framestackWidget->clear();
+ variableWidget->varTree()->clear();
+
+// variableWidget->setEnabled(false);
+ framestackWidget->setEnabled(false);
+ rdbOutputWidget->setEnabled(false);
+
+// mainWindow()->setViewAvailable(variableWidget, false);
+ mainWindow()->setViewAvailable(framestackWidget, false);
+ mainWindow()->setViewAvailable(rdbOutputWidget, false);
+
+ KActionCollection *ac = actionCollection();
+ ac->action("debug_run")->setText( i18n("&Start") );
+// ac->action("debug_run")->setIcon( "1rightarrow" );
+ ac->action("debug_run")->setToolTip( i18n("Runs the program in the debugger") );
+ ac->action("debug_run")->setWhatsThis( i18n("Start in debugger\n\n"
+ "Starts the debugger with the project's main "
+ "executable. You may set some breakpoints "
+ "before this, or you can interrupt the program "
+ "while it is running, in order to get information "
+ "about variables, frame stack, and so on.") );
+
+ stateChanged( QString("stopped") );
+
+ core()->running(this, false);
+}
+
+void RubyDebuggerPart::projectClosed()
+{
+ slotStopDebugger();
+}
+
+void RubyDebuggerPart::slotRun()
+{
+ if (controller->stateIsOn(s_programExited)) {
+ rdbBreakpointWidget->reset();
+ }
+
+ if ( controller->stateIsOn( s_dbgNotStarted ) ) {
+ mainWindow()->statusBar()->message(i18n("Debugging program"), 1000);
+ mainWindow()->raiseView(rdbOutputWidget);
+ appFrontend()->clearView();
+ startDebugger();
+ } else {
+ KActionCollection *ac = actionCollection();
+ ac->action("debug_run")->setText( i18n("&Continue") );
+ ac->action("debug_run")->setToolTip( i18n("Continues the application execution") );
+ ac->action("debug_run")->setWhatsThis( i18n("Continue application execution\n\n"
+ "Continues the execution of your application in the "
+ "debugger. This only takes effect when the application "
+ "has been halted by the debugger (i.e. a breakpoint has "
+ "been activated or the interrupt was pressed).") );
+
+ mainWindow()->statusBar()->message(i18n("Continuing program"), 1000);
+ }
+
+ controller->slotRun();
+}
+
+
+
+void RubyDebuggerPart::slotStop(KDevPlugin* which)
+{
+ if( which != 0 && which != this )
+ return;
+
+// if( !controller->stateIsOn( s_dbgNotStarted ) && !controller->stateIsOn( s_shuttingDown ) )
+ slotStopDebugger();
+}
+
+
+void RubyDebuggerPart::slotPause()
+{
+ controller->slotBreakInto();
+}
+
+
+void RubyDebuggerPart::slotRunToCursor()
+{
+ KParts::ReadWritePart *rwpart
+ = dynamic_cast<KParts::ReadWritePart*>(partController()->activePart());
+ KTextEditor::ViewCursorInterface *cursorIface
+ = dynamic_cast<KTextEditor::ViewCursorInterface*>(partController()->activeWidget());
+
+ if (!rwpart || !rwpart->url().isLocalFile() || !cursorIface)
+ return;
+
+ uint line, col;
+ cursorIface->cursorPosition(&line, &col);
+
+ controller->slotRunUntil(rwpart->url().path(), line);
+}
+
+void RubyDebuggerPart::slotStepOver()
+{
+ controller->slotStepOver();
+}
+
+
+
+void RubyDebuggerPart::slotStepInto()
+{
+ controller->slotStepInto();
+}
+
+
+void RubyDebuggerPart::slotStepOut()
+{
+ controller->slotStepOutOff();
+}
+
+
+
+
+void RubyDebuggerPart::slotRefreshBPState( const Breakpoint& BP)
+{
+ if (BP.type() == BP_TYPE_FilePos)
+ {
+ const FilePosBreakpoint& bp = dynamic_cast<const FilePosBreakpoint&>(BP);
+ if (bp.isActionDie())
+ debugger()->setBreakpoint(bp.fileName(), bp.lineNum()-1, -1, true, false);
+ else
+ debugger()->setBreakpoint(bp.fileName(), bp.lineNum()-1,
+ 1/*bp->id()*/, bp.isEnabled(), bp.isPending() );
+ }
+}
+
+
+void RubyDebuggerPart::slotStatus(const QString &msg, int state)
+{
+ QString stateIndicator;
+
+ if (state & s_dbgNotStarted)
+ {
+ stateIndicator = " ";
+ }
+ else if (state & s_appBusy)
+ {
+ stateIndicator = "A";
+ debugger()->clearExecutionPoint();
+ stateChanged( QString("active") );
+ }
+ else if (state & s_programExited)
+ {
+ stateIndicator = "E";
+ stateChanged( QString("stopped") );
+ KActionCollection *ac = actionCollection();
+ ac->action("debug_run")->setText( i18n("Restart") );
+// ac->action("debug_run")->setIcon( "1rightarrow" );
+ ac->action("debug_run")->setToolTip( i18n("Restart the program in the debugger") );
+ ac->action("debug_run")->setWhatsThis( i18n("Restart in debugger\n\n"
+ "Restarts the program in the debugger") );
+// slotStop();
+ }
+ else
+ {
+ stateIndicator = "P";
+ stateChanged( QString("paused") );
+ }
+
+ // And now? :-)
+ kdDebug(9012) << "Debugger state: " << stateIndicator << ": " << endl;
+ kdDebug(9012) << " " << msg << endl;
+
+ statusBarIndicator->setText(stateIndicator);
+ if (!msg.isEmpty())
+ mainWindow()->statusBar()->message(msg, 3000);
+}
+
+
+void RubyDebuggerPart::slotShowStep(const QString &fileName, int lineNum)
+{
+ if ( ! fileName.isEmpty() )
+ {
+ // Debugger counts lines from 1
+ debugger()->gotoExecutionPoint(KURL( fileName ), lineNum-1);
+ }
+}
+
+
+void RubyDebuggerPart::slotGotoSource(const QString &fileName, int lineNum)
+{
+ if ( ! fileName.isEmpty() )
+ partController()->editDocument(KURL( fileName ), lineNum);
+}
+
+
+void RubyDebuggerPart::slotActivePartChanged( KParts::Part* part )
+{
+ KAction* action = actionCollection()->action("debug_toggle_breakpoint");
+ if(!action)
+ return;
+
+ if(!part)
+ {
+ action->setEnabled(false);
+ return;
+ }
+ KTextEditor::ViewCursorInterface *iface
+ = dynamic_cast<KTextEditor::ViewCursorInterface*>(part->widget());
+ action->setEnabled( iface != 0 );
+}
+
+void RubyDebuggerPart::restorePartialProjectSession(const QDomElement* el)
+{
+ rdbBreakpointWidget->restorePartialProjectSession(el);
+ variableWidget->restorePartialProjectSession(el);
+}
+
+void RubyDebuggerPart::savePartialProjectSession(QDomElement* el)
+{
+ rdbBreakpointWidget->savePartialProjectSession(el);
+ variableWidget->savePartialProjectSession(el);
+}
+
+}
+
+KDevAppFrontend * RDBDebugger::RubyDebuggerPart::appFrontend( )
+{
+ return extension<KDevAppFrontend>("KDevelop/AppFrontend");
+}
+
+KDevDebugger * RDBDebugger::RubyDebuggerPart::debugger()
+{
+ return m_debugger;
+}
+
+#include "debuggerpart.moc"
diff --git a/languages/ruby/debugger/debuggerpart.h b/languages/ruby/debugger/debuggerpart.h
new file mode 100644
index 00000000..2f35df9a
--- /dev/null
+++ b/languages/ruby/debugger/debuggerpart.h
@@ -0,0 +1,110 @@
+/***************************************************************************
+ * Copyright (C) 1999-2001 by John Birch *
+ * Copyright (C) 2001 by Bernd Gehrmann *
+ * *
+ * Adapted for ruby debugging *
+ * -------------------------- *
+ * begin : Mon Nov 1 2004 *
+ * copyright : (C) 2004 by Richard Dale *
+ * email : [email protected] *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _DEBUGGERPART_H_
+#define _DEBUGGERPART_H_
+
+#include <qguardedptr.h>
+#include "kdevplugin.h"
+#include "kdevcore.h"
+
+namespace KParts { class Part; }
+
+class QLabel;
+class QPopupMenu;
+class KDialogBase;
+class ProcessWidget;
+class ProcessLineMaker;
+class KDevAppFrontend;
+class KDevDebugger;
+
+namespace RDBDebugger
+{
+
+class RDBBreakpointWidget;
+class FramestackWidget;
+class Breakpoint;
+class DbgController;
+class DbgToolBar;
+class VariableWidget;
+class RDBOutputWidget;
+
+class RubyDebuggerPart : public KDevPlugin
+{
+ Q_OBJECT
+
+public:
+ RubyDebuggerPart( QObject *parent, const char *name, const QStringList & );
+ ~RubyDebuggerPart();
+ virtual void restorePartialProjectSession(const QDomElement* el);
+ virtual void savePartialProjectSession(QDomElement* el);
+
+private slots:
+ void guiClientAdded(KXMLGUIClient*);
+ void contextMenu(QPopupMenu *popup, const Context *context);
+ void toggleBreakpoint();
+ void contextWatch();
+ void contextRubyInspect();
+// void projectOpened();
+ void projectClosed();
+ void slotActivePartChanged(KParts::Part*);
+
+ void slotRun();
+ void slotStopDebugger();
+ void slotStop(KDevPlugin* which = 0);
+ void slotPause();
+ void slotRunToCursor();
+ void slotStepOver();
+ void slotStepInto();
+ void slotStepOut();
+
+ void slotRefreshBPState(const Breakpoint&);
+ void slotStatus(const QString &msg, int state);
+ void slotShowStep(const QString &fileName, int lineNum);
+ void slotGotoSource(const QString &fileName, int lineNum);
+
+signals:
+ void rubyInspect(const QString&);
+
+private:
+ KDevAppFrontend *appFrontend();
+ KDevDebugger *debugger();
+
+ bool startDebugger();
+ void setupController();
+
+ QGuardedPtr<VariableWidget> variableWidget;
+ QGuardedPtr<RDBBreakpointWidget> rdbBreakpointWidget;
+ QGuardedPtr<FramestackWidget> framestackWidget;
+ QGuardedPtr<RDBOutputWidget> rdbOutputWidget;
+ DbgController *controller;
+ QGuardedPtr<QLabel> statusBarIndicator;
+ QGuardedPtr<DbgToolBar> floatingToolBar;
+ ProcessLineMaker* procLineMaker;
+ ProcessLineMaker* rdbLineMaker;
+
+ QString m_contextIdent;
+ QCString m_drkonqi;
+
+ KDevDebugger *m_debugger;
+};
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/framestackwidget.cpp b/languages/ruby/debugger/framestackwidget.cpp
new file mode 100644
index 00000000..836350b2
--- /dev/null
+++ b/languages/ruby/debugger/framestackwidget.cpp
@@ -0,0 +1,272 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "framestackwidget.h"
+#include "rdbparser.h"
+
+#include <klocale.h>
+#include <kdebug.h>
+
+#include <qheader.h>
+#include <qlistbox.h>
+#include <qregexp.h>
+#include <qstrlist.h>
+#include <qfileinfo.h>
+
+#include <ctype.h>
+
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+namespace RDBDebugger
+{
+
+FramestackWidget::FramestackWidget(QWidget *parent, const char *name, WFlags f)
+ : QListView(parent, name, f),
+ viewedThread_(0)
+{
+ setRootIsDecorated(true);
+ setSelectionMode(Single);
+ addColumn(QString());
+ setSorting(0);
+ header()->hide();
+
+ connect( this, SIGNAL(clicked(QListViewItem*)),
+ this, SLOT(slotSelectionChanged(QListViewItem*)) );
+}
+
+
+/***************************************************************************/
+
+FramestackWidget::~FramestackWidget()
+{
+}
+
+
+// **************************************************************************
+
+void FramestackWidget::clear()
+{
+ viewedThread_ = 0;
+ QListView::clear();
+}
+
+/***************************************************************************/
+
+void FramestackWidget::slotSelectionChanged(QListViewItem * item)
+{
+ if (item == 0) {
+ return;
+ }
+
+ if (item->rtti() == RTTI_THREAD_STACK_ITEM) {
+ ThreadStackItem * thread = (ThreadStackItem*) item;
+ slotSelectFrame(1, thread->threadNo());
+ } else if (item->rtti() == RTTI_FRAME_STACK_ITEM) {
+ FrameStackItem * frame = (FrameStackItem*) item;
+ slotSelectFrame(frame->frameNo(), frame->threadNo());
+ }
+
+ return;
+}
+
+/***************************************************************************/
+
+void FramestackWidget::slotSelectFrame(int frameNo, int threadNo)
+{
+ FrameStackItem * frame = findFrame(frameNo, threadNo);
+
+ if (frame != 0) {
+ setSelected(frame, true);
+ emit selectFrame(frameNo, threadNo, frame->frameName());
+ } else {
+ emit selectFrame(frameNo, threadNo, QString());
+ }
+}
+
+/***************************************************************************/
+
+void FramestackWidget::parseRDBThreadList(char *str)
+{
+ // on receipt of a thread list we must always clear the list.
+ clear();
+
+ QRegExp thread_re("(\\+)?\\s*(\\d+)\\s*(#<[^>]+>\\s*[^:]+:\\d+)");
+ int pos = thread_re.search(str);
+ viewedThread_ = 0;
+
+ while (pos != -1) {
+ ThreadStackItem* thread;
+ thread = new ThreadStackItem( this,
+ thread_re.cap(2).toInt(),
+ QString("%1 %2").arg(thread_re.cap(2)).arg(thread_re.cap(3)) );
+ // The thread with a '+' is always the viewedthread
+ if (thread_re.cap(1) == "+") {
+ viewedThread_ = thread;
+ }
+
+ pos += thread_re.matchedLength();
+ pos = thread_re.search(str, pos);
+ }
+
+ return;
+}
+
+/***************************************************************************/
+
+void FramestackWidget::parseRDBBacktraceList(char *str)
+{
+ QRegExp frame_re("#(\\d+) ([^:]+):(\\d+)(:in `([^\\n]+)')?");
+ int pos = frame_re.search(str);
+
+ while (pos != -1) {
+ QString method(frame_re.cap(5));
+ if (method == "") {
+ method = "toplevel";
+ } else {
+ method.append("(...)");
+ }
+
+ int frameNo = frame_re.cap(1).toInt();
+ QString frameName = QString("T%1#%2 %3").arg(viewedThread_->threadNo()).arg(frame_re.cap(1)).arg(method);
+ new FrameStackItem(viewedThread_, frameNo, QString(frame_re.cap(0)), frameName);
+
+ // Tell the Variable Tree that this frame is active
+ emit frameActive(frameNo, viewedThread_->threadNo(), frameName);
+
+ pos += frame_re.matchedLength();
+ pos = frame_re.search(str, pos);
+ }
+
+ if (viewedThread_ != 0) {
+ viewedThread_->setOpen(true);
+ }
+
+ return;
+}
+
+// **************************************************************************
+
+ThreadStackItem *FramestackWidget::findThread(int threadNo)
+{
+ QListViewItem *sibling = firstChild();
+ while (sibling != 0) {
+ ThreadStackItem *thread = (ThreadStackItem*) sibling;
+ if (thread->threadNo() == threadNo) {
+ return thread;
+ }
+ sibling = sibling->nextSibling();
+ }
+
+ return 0;
+}
+
+// **************************************************************************
+
+FrameStackItem *FramestackWidget::findFrame(int frameNo, int threadNo)
+{
+ ThreadStackItem * thread = findThread(threadNo);
+ if (thread == 0) {
+ kdDebug(9012) << "FramestackWidget::findFrame: no matching thread " <<
+ frameNo << " thread: " << threadNo << endl;
+ return 0; // no matching thread?
+ }
+
+ QListViewItem * frameItem = thread->firstChild();
+
+ while (frameItem != 0) {
+ if (((FrameStackItem *) frameItem)->frameNo() == frameNo) {
+ return (FrameStackItem *) frameItem;
+ }
+
+ frameItem = frameItem->nextSibling();
+ }
+
+ return 0;
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+// **************************************************************************
+
+FrameStackItem::FrameStackItem(ThreadStackItem *parent, int frameNo, const QString &frameDesc, const QString& frameName)
+ : QListViewItem(parent),
+ frameNo_(frameNo),
+ threadNo_(parent->threadNo()),
+ frameName_(frameName)
+{
+ setText(0, frameDesc);
+ key_.sprintf("%.6d", frameNo_);
+}
+
+// **************************************************************************
+
+FrameStackItem::~FrameStackItem()
+{
+}
+
+// **************************************************************************
+
+QString FrameStackItem::key(int /*column*/, bool /*ascending*/) const
+{
+
+ return key_;
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+ThreadStackItem::ThreadStackItem(FramestackWidget *parent, int threadNo, const QString &threadDesc)
+ : QListViewItem(parent),
+ threadNo_(threadNo)
+{
+ setText(0, threadDesc);
+ setExpandable(true);
+}
+
+// **************************************************************************
+
+ThreadStackItem::~ThreadStackItem()
+{
+}
+
+// **************************************************************************
+
+void ThreadStackItem::setOpen(bool open)
+{
+ if (open)
+ ((FramestackWidget*)listView())->slotSelectFrame(1, threadNo());
+
+ QListViewItem::setOpen(open);
+}
+
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+#include "framestackwidget.moc"
diff --git a/languages/ruby/debugger/framestackwidget.h b/languages/ruby/debugger/framestackwidget.h
new file mode 100644
index 00000000..373d0690
--- /dev/null
+++ b/languages/ruby/debugger/framestackwidget.h
@@ -0,0 +1,115 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _FRAMESTACKWIDGET_H_
+#define _FRAMESTACKWIDGET_H_
+
+#include <qlistview.h>
+#include <qstringlist.h>
+
+#include "rdbcontroller.h"
+
+namespace RDBDebugger
+{
+
+class FramestackWidget;
+
+
+class ThreadStackItem : public QListViewItem
+{
+public:
+ ThreadStackItem(FramestackWidget *parent, int threadNo, const QString &threadDesc);
+ virtual ~ThreadStackItem();
+
+ virtual int rtti() const { return RTTI_THREAD_STACK_ITEM; }
+
+ void setOpen(bool open);
+ int threadNo() { return threadNo_; }
+
+private:
+ int threadNo_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class FrameStackItem : public QListViewItem
+{
+public:
+ FrameStackItem(ThreadStackItem * parent, int frameNo, const QString & frameDesc, const QString & frameName);
+ virtual ~FrameStackItem();
+
+ virtual int rtti() const { return RTTI_FRAME_STACK_ITEM; }
+ virtual QString key(int column, bool ascending) const;
+
+ int frameNo() { return frameNo_; }
+ int threadNo() { return threadNo_; }
+ QString frameName() { return frameName_; }
+
+private:
+ int frameNo_;
+ int threadNo_;
+ QString frameName_;
+ QString key_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+/**
+ * @author John Birch
+ */
+class FramestackWidget : public QListView
+{
+ Q_OBJECT
+
+public:
+ FramestackWidget( QWidget *parent=0, const char *name=0, WFlags f=0 );
+ virtual ~FramestackWidget();
+
+ void clear();
+
+ void parseRDBThreadList(char *str);
+ void parseRDBBacktraceList(char *str);
+
+ ThreadStackItem *findThread(int threadNo);
+ FrameStackItem *findFrame(int frameNo, int threadNo);
+
+ int viewedThread()
+ { return viewedThread_ ? viewedThread_->threadNo() : -1; }
+
+public slots:
+ void slotSelectFrame(int frameNo, int threadNo);
+ void slotSelectionChanged(QListViewItem *thisItem);
+
+signals:
+ void selectFrame(int frameNo, int threadNo, const QString& frameName);
+ void frameActive(int frameNo, int threadNo, const QString& frameName);
+
+private:
+ ThreadStackItem *viewedThread_;
+};
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/hi16-action-breakpoint_add.png b/languages/ruby/debugger/hi16-action-breakpoint_add.png
new file mode 100644
index 00000000..1b41040c
--- /dev/null
+++ b/languages/ruby/debugger/hi16-action-breakpoint_add.png
Binary files differ
diff --git a/languages/ruby/debugger/hi16-action-breakpoint_delete.png b/languages/ruby/debugger/hi16-action-breakpoint_delete.png
new file mode 100644
index 00000000..c35e039f
--- /dev/null
+++ b/languages/ruby/debugger/hi16-action-breakpoint_delete.png
Binary files differ
diff --git a/languages/ruby/debugger/hi16-action-breakpoint_delete_all.png b/languages/ruby/debugger/hi16-action-breakpoint_delete_all.png
new file mode 100644
index 00000000..c35e039f
--- /dev/null
+++ b/languages/ruby/debugger/hi16-action-breakpoint_delete_all.png
Binary files differ
diff --git a/languages/ruby/debugger/hi16-action-breakpoint_edit.png b/languages/ruby/debugger/hi16-action-breakpoint_edit.png
new file mode 100644
index 00000000..ec92ced2
--- /dev/null
+++ b/languages/ruby/debugger/hi16-action-breakpoint_edit.png
Binary files differ
diff --git a/languages/ruby/debugger/kdevrbdebugger.desktop b/languages/ruby/debugger/kdevrbdebugger.desktop
new file mode 100644
index 00000000..47e59474
--- /dev/null
+++ b/languages/ruby/debugger/kdevrbdebugger.desktop
@@ -0,0 +1,73 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Comment=This plugin provides a frontend for the source-level debugger for Ruby.
+Comment[ca]=Aquest connector proveeix una interfície per a la depuració a nivell de codi per a Ruby.
+Comment[da]=Dette plugin sørger for en grænseflade til Ruby kildekode-fejlretteren.
+Comment[de]=Dieses Modul stellt eine Oberfläche für den Quelltext-Debugger für Ruby bereit.
+Comment[el]=Αυτό το πρόσθετο προσφέρει ένα πρόγραμμα για τον αποσφαλματωτή πηγαίου κώδικα της γλώσσας Ruby.
+Comment[es]=Este complemento proporciona un entorno para depurar código de Ruby.
+Comment[et]=See plugin pakub Ruby lähtekoodi siluri kasutajaliidest.
+Comment[eu]=Plugin honek Ruby-ren iturburu-mailako araztailearen interfaze bat bat eskeintzen du.
+Comment[fa]=این وصله، یک پایانه برای اشکال‌زدای سطح منبع رابی فراهم می‌کند.
+Comment[fr]=Ce module externe fournit une interface pour le débogueur au niveau source pour Ruby.
+Comment[gl]=Esta extensión proporciona un frontal para o depurador a nivel de código de Ruby.
+Comment[hu]=Ez a bővítőmodul grafikus felületet biztosít a Ruby forrásszintű nyomkövetőjének használatához.
+Comment[it]=Questo plugin fornisce un'interfaccia per il debugger a livello sorgente di Ruby.
+Comment[ja]=このプラグインは、Ruby のソースレベルデバッガのフロントエンドを提供します。
+Comment[nds]=Dit Moduul stellt en Böversiet för den Ruby-Borntextfehlersöker praat.
+Comment[ne]=यो प्लगइनले रूबिका लागि स्रोत-तह डिबगरका लागि फ्रेन्टइन्ड प्रदान गर्दछ ।
+Comment[nl]=Deze plugin biedt een grafische schil voor de broncode-debugger voor Ruby.
+Comment[pl]=Ta wtyczka udostępnia interfejs do debugera poziomu źródłowego dla języka Ruby.
+Comment[pt]=Este 'plugin' oferece uma interface o depurador ao nível do código para Ruby.
+Comment[pt_BR]=Este plug-in fornece uma interface para o depurador a nível de código para Ruby.
+Comment[ru]=Этот модуль предоставляет интерфейс к отладчику исходного кода для Ruby.
+Comment[sk]=Modul pre rozhranie debugera pre Ruby.
+Comment[sr]=Овај прикључак обезбеђује интерфејс за исправљач на нивоу изворног кода за Ruby.
+Comment[sr@Latn]=Ovaj priključak obezbeđuje interfejs za ispravljač na nivou izvornog koda za Ruby.
+Comment[sv]=Insticksprogrammet tillhandahåller ett gränssnitt till källkodsavlusaren för Ruby.
+Comment[tr]=Bu eklenti, Ruby için kaynak-düzeyi hata ayıklayıcıya bir önuç sağlar.
+Comment[zh_CN]=此插件提供了一个 Ruby 的源代码级调试器的前端。
+Comment[zh_TW]=此外掛程式提供 Ruby 除錯器的前端介面。
+Name=KDevRbDebugger
+Name[da]=KDevelop Ruby fejlretter
+Name[nds]=Ruby-Fehlersöök för KDevelop
+Name[pl]=KDevDebugerRb
+Name[sk]=KDev Ruby debuger
+Name[sv]=KDevelop Ruby-avlusare
+Name[zh_TW]=KDevelop Ruby 除錯器
+GenericName=Ruby Debugger Frontend
+GenericName[ca]=Interfície per al depurador Ruby
+GenericName[da]=Ruby fejlretningsgrænseflade
+GenericName[de]=Debugger-Oberfläche für Ruby
+GenericName[el]=Πρόγραμμα αποσφαλματωτή Ruby
+GenericName[es]=Interfaz para el depurador de Ruby
+GenericName[et]=Ruby siluri kasutajaliides
+GenericName[eu]=Ruby araztailearen interfazea
+GenericName[fa]=پایانۀ اشکال‌زدای رابی
+GenericName[fr]=Interface du débogueur pour Ruby
+GenericName[gl]=Frontal do depurador Ruby
+GenericName[hu]=Grafikus felület a Ruby nyomkövetőjéhez
+GenericName[it]=Interfaccia di debug per Ruby
+GenericName[ja]=Ruby デバッガフロントエンド
+GenericName[nds]=Böversiet för den Ruby-Fehlersöker
+GenericName[ne]=रूबि डिबगर फ्रेन्टइन्ड
+GenericName[nl]=Grafische schil voor de Ruby-debugger
+GenericName[pl]=Interfejs do debugera dla języka Ruby
+GenericName[pt]=Interface de Depuração Ruby
+GenericName[pt_BR]=Interface para o Depurador Ruby
+GenericName[ru]=Интегрированный отладчик Ruby
+GenericName[sk]=Ruby debuger rozhranie
+GenericName[sr]=Интерфејс исправљача за Ruby
+GenericName[sr@Latn]=Interfejs ispravljača za Ruby
+GenericName[sv]=Gränssnitt för Ruby-avlusare
+GenericName[tr]=Ruby Hata Ayıklayıcı Önucu
+GenericName[zh_CN]=Ruby 调试器前端
+GenericName[zh_TW]=Ruby 除錯器前端介面
+Icon=
+ServiceTypes=KDevelop/Plugin
+X-KDE-Library=libkdevrbdebugger
+X-KDevelop-Version=5
+X-KDevelop-Scope=Project
+X-KDevelop-ProgrammingLanguages=Ruby
+X-KDevelop-Properties=RubyDebugger
diff --git a/languages/ruby/debugger/kdevrbdebugger.rc b/languages/ruby/debugger/kdevrbdebugger.rc
new file mode 100644
index 00000000..c7e3b336
--- /dev/null
+++ b/languages/ruby/debugger/kdevrbdebugger.rc
@@ -0,0 +1,68 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="KDevRbDebugger" version="10">
+<MenuBar>
+ <Menu name="debug">
+ <text>&amp;Debug</text>
+ <Action name="debug_run" group="debug"/>
+ <Action name="debug_stop" group="debug"/>
+ <Action name="debug_pause" group="debug"/>
+ <Action name="debug_runtocursor" group="debug"/>
+ <Separator group="debug"/>
+ <Action name="debug_stepover" group="debug"/>
+ <Action name="debug_stepinto" group="debug"/>
+ <Action name="debug_stepout" group="debug"/>
+ <Separator group="debug"/>
+ <Action name="debug_toggle_breakpoint" group="debug"/>
+ <Action name="debug_disable_breakpoint" group="debug"/>
+ <Separator group="debug"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="debugToolBar">
+ <text>Debugger Toolbar</text>
+ <Action name="debug_run"/>
+ <Action name="debug_stepover"/>
+ <Action name="debug_stepinto"/>
+ <Action name="debug_stepout"/>
+ <WeakSeparator/>
+</ToolBar>
+<State name="stopped">
+ <enable>
+ <Action name="debug_run"/>
+ </enable>
+ <disable>
+ <Action name="debug_stop"/>
+ <Action name="debug_pause"/>
+ <Action name="debug_runtocursor"/>
+ <Action name="debug_stepover"/>
+ <Action name="debug_stepinto"/>
+ <Action name="debug_stepout"/>
+ </disable>
+</State>
+<State name="paused">
+ <enable>
+ <Action name="debug_run"/>
+ <Action name="debug_stop"/>
+ <Action name="debug_runtocursor"/>
+ <Action name="debug_stepover"/>
+ <Action name="debug_stepinto"/>
+ <Action name="debug_stepout"/>
+ </enable>
+ <disable>
+ <Action name="debug_pause"/>
+ </disable>
+</State>
+<State name="active">
+ <enable>
+ <Action name="debug_pause"/>
+ <Action name="debug_stop"/>
+ </enable>
+ <disable>
+ <Action name="debug_run"/>
+ <Action name="debug_runtocursor"/>
+ <Action name="debug_stepover"/>
+ <Action name="debug_stepinto"/>
+ <Action name="debug_stepout"/>
+ </disable>
+</State>
+</kpartgui>
+
diff --git a/languages/ruby/debugger/rdbbreakpointwidget.cpp b/languages/ruby/debugger/rdbbreakpointwidget.cpp
new file mode 100644
index 00000000..e31831de
--- /dev/null
+++ b/languages/ruby/debugger/rdbbreakpointwidget.cpp
@@ -0,0 +1,921 @@
+/***************************************************************************
+ begin : Tue May 13 2003
+ copyright : (C) 2003 by John Birch
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "rdbbreakpointwidget.h"
+#include "rdbtable.h"
+
+#include "breakpoint.h"
+#include "domutil.h"
+
+#include <kdebug.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kpopupmenu.h>
+#include <kurl.h>
+
+#include <qvbuttongroup.h>
+#include <qfileinfo.h>
+#include <qheader.h>
+#include <qtable.h>
+#include <qtoolbutton.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+#include <qvbox.h>
+#include <qlayout.h>
+#include <qregexp.h>
+
+#include <stdlib.h>
+#include <ctype.h>
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+namespace RDBDebugger
+{
+
+enum Column {
+ Control = 0,
+ Enable = 1,
+ Type = 2,
+ Status = 3,
+ Location = 4
+};
+
+
+#define numCols 5
+
+static int m_activeFlag = 0;
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class BreakpointTableRow : public QTableItem
+{
+public:
+
+ BreakpointTableRow(QTable* table, EditType editType, Breakpoint* bp);
+ ~BreakpointTableRow();
+
+ bool match (Breakpoint* bp) const;
+ void reset ();
+ void setRow();
+
+ Breakpoint* breakpoint() { return m_breakpoint; }
+
+private:
+ void appendEmptyRow();
+
+private:
+ Breakpoint* m_breakpoint;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+BreakpointTableRow::BreakpointTableRow(QTable* parent, EditType editType,
+ Breakpoint* bp) :
+ QTableItem(parent, editType, ""),
+ m_breakpoint(bp)
+{
+ appendEmptyRow();
+ setRow();
+}
+
+/***************************************************************************/
+
+BreakpointTableRow::~BreakpointTableRow()
+{
+ delete m_breakpoint;
+}
+
+/***************************************************************************/
+
+bool BreakpointTableRow::match(Breakpoint* breakpoint) const
+{
+ return m_breakpoint->match(breakpoint);
+}
+
+/***************************************************************************/
+
+void BreakpointTableRow::reset()
+{
+ m_breakpoint->reset();
+ setRow();
+}
+
+/***************************************************************************/
+
+void BreakpointTableRow::appendEmptyRow()
+{
+ int row = table()->numRows();
+ table()->setNumRows(row+1);
+
+ table()->setItem(row, Control, this);
+
+ QCheckTableItem* cti = new QCheckTableItem( table(), "");
+ table()->setItem(row, Enable, cti);
+}
+
+/***************************************************************************/
+
+void BreakpointTableRow::setRow()
+{
+ if ( m_breakpoint )
+ {
+ QTableItem *item = table()->item ( row(), Enable );
+ Q_ASSERT(item->rtti() == 2);
+ ((QCheckTableItem*)item)->setChecked(m_breakpoint->isEnabled());
+
+ QString status=m_breakpoint->statusDisplay(m_activeFlag);
+
+ table()->setText(row(), Status, status);
+
+ QString displayType = m_breakpoint->displayType();
+ table()->setText(row(), Location, m_breakpoint->location());
+
+ if (m_breakpoint->isTemporary())
+ displayType = i18n(" temporary");
+
+ table()->setText(row(), Type, displayType);
+ table()->adjustColumn(Type);
+ table()->adjustColumn(Status);
+ table()->adjustColumn(Location);
+ }
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+RDBBreakpointWidget::RDBBreakpointWidget(QWidget *parent, const char *name) :
+ QHBox(parent, name)
+{
+ QFrame* toolbar = new QFrame( this );
+ QVBoxLayout *l = new QVBoxLayout(toolbar, 0, 0);
+
+ toolbar->setFrameStyle( QFrame::ToolBarPanel | QFrame::Plain );
+ toolbar->setLineWidth( 0 );
+
+ m_add = new QToolButton( toolbar, "add breakpoint" );
+ m_add->setPixmap ( SmallIcon ( "breakpoint_add" ) );
+ QToolTip::add ( m_add, i18n ( "Add empty breakpoint" ) + I18N_NOOP(" <Alt+A>"));
+ QWhatsThis::add( m_add, i18n("<b>Add empty breakpoint</b><p>Shows a popup menu that allows you to choose "
+ "the type of breakpoint, then adds a breakpoint of the selected type to the breakpoints list."));
+
+ m_delete = new QToolButton( toolbar, "delete breakpoint" );
+ m_delete->setPixmap ( SmallIcon ( "breakpoint_delete" ) );
+ QToolTip::add ( m_delete, i18n ( "Delete selected breakpoint" ) + I18N_NOOP(" <Delete>") );
+ QWhatsThis::add( m_delete, i18n("<b>Delete selected breakpoint</b><p>Deletes the selected breakpoint in the breakpoints list."));
+
+ m_edit = new QToolButton( toolbar, "edit breakpoint" );
+ m_edit->setPixmap ( SmallIcon ( "breakpoint_edit" ) );
+ QToolTip::add ( m_edit, i18n ( "Edit selected breakpoint" ) + I18N_NOOP(" <Return>") );
+ QWhatsThis::add( m_edit, i18n("<b>Edit selected breakpoint</b><p>Allows to edit location, condition and ignore count properties of the selected breakpoint in the breakpoints list."));
+
+ m_removeAll = new QToolButton( toolbar, "Delete all breakppoints" );
+ m_removeAll->setPixmap ( SmallIcon ( "breakpoint_delete_all" ) );
+ QToolTip::add ( m_removeAll, i18n ( "Remove all breakpoints" ) );
+ QWhatsThis::add( m_removeAll, i18n("<b>Remove all breakpoints</b><p>Removes all breakpoints in the project."));
+
+ l->addWidget(m_add);
+ l->addWidget(m_edit);
+ l->addWidget(m_delete);
+ l->addWidget(m_removeAll);
+ QSpacerItem* spacer = new QSpacerItem( 5, 5, QSizePolicy::Minimum, QSizePolicy::Expanding );
+ l->addItem(spacer);
+
+ QPopupMenu *addMenu = new QPopupMenu( this );
+ addMenu->insertItem( i18n( "File:line" ), BP_TYPE_FilePos );
+ addMenu->insertItem( i18n( "Watchpoint" ), BP_TYPE_Watchpoint );
+ addMenu->insertItem( i18n( "Catchpoint" ), BP_TYPE_Catchpoint );
+ addMenu->insertItem( i18n( "Method()" ), BP_TYPE_Function );
+ m_add->setPopup( addMenu );
+ m_add->setPopupDelay(1);
+
+ m_table = new RDBTable(0, numCols, this, name);
+ m_table->setSelectionMode(QTable::SingleRow);
+ m_table->setShowGrid (false);
+ m_table->setLeftMargin(0);
+ m_table->setFocusStyle(QTable::FollowStyle);
+
+ m_table->hideColumn(Control);
+ m_table->setColumnReadOnly(Type, true);
+ m_table->setColumnReadOnly(Status, true);
+ m_table->setColumnWidth( Enable, 20);
+
+ QHeader *header = m_table->horizontalHeader();
+
+ header->setLabel( Enable, "" );
+ header->setLabel( Type, i18n("Type") );
+ header->setLabel( Status, i18n("Status") );
+ header->setLabel( Location, i18n("Location") );
+
+ m_table->show();
+
+ m_ctxMenu = new QPopupMenu( this );
+ m_ctxMenu->insertItem( i18n( "Show" ), BW_ITEM_Show );
+ m_ctxMenu->insertItem( i18n( "Edit" ), BW_ITEM_Edit );
+ m_ctxMenu->insertItem( i18n( "Disable" ), BW_ITEM_Disable );
+ m_ctxMenu->insertItem( i18n( "Delete" ), BW_ITEM_Delete );
+
+ connect( addMenu, SIGNAL(activated(int)),
+ this, SLOT(slotAddBlankBreakpoint(int)) );
+ connect( m_delete, SIGNAL(clicked()),
+ this, SLOT(slotRemoveBreakpoint()) );
+ connect( m_edit, SIGNAL(clicked()),
+ this, SLOT(slotEditBreakpoint()) );
+ connect( m_removeAll, SIGNAL(clicked()),
+ this, SLOT(slotRemoveAllBreakpoints()) );
+
+ connect( m_table, SIGNAL(contextMenuRequested(int, int, const QPoint &)),
+ this, SLOT(slotContextMenuShow(int, int, const QPoint & )) );
+ connect( m_ctxMenu, SIGNAL(activated(int)),
+ this, SLOT(slotContextMenuSelect(int)) );
+
+ connect( m_table, SIGNAL(doubleClicked(int, int, int, const QPoint &)),
+ this, SLOT(slotRowDoubleClicked(int, int, int, const QPoint &)));
+
+ connect( m_table, SIGNAL(valueChanged(int, int)),
+ this, SLOT(slotNewValue(int, int)));
+
+ connect( m_table, SIGNAL(returnPressed()),
+ this, SLOT(slotEditBreakpoint()));
+// connect( m_table, SIGNAL(f2Pressed()),
+// this, SLOT(slotEditBreakpoint()));
+ connect( m_table, SIGNAL(deletePressed()),
+ this, SLOT(slotRemoveBreakpoint()));
+ connect( m_table, SIGNAL(insertPressed()),
+ this, SLOT(slotAddBreakpoint()));
+}
+
+/***************************************************************************/
+
+RDBBreakpointWidget::~RDBBreakpointWidget()
+{
+ delete m_table;
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::reset()
+{
+ for ( int row = 0; row < m_table->numRows(); row++ )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr)
+ {
+ btr->reset();
+ emit publishBPState(*(btr->breakpoint()));
+ }
+ }
+}
+
+/***************************************************************************/
+
+// When a file is loaded then we need to tell the editor (display window)
+// which lines contain a breakpoint.
+void RDBBreakpointWidget::slotRefreshBP(const KURL &filename)
+{
+ for ( int row = 0; row < m_table->numRows(); row++ )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr)
+ {
+ FilePosBreakpoint* bp = dynamic_cast<FilePosBreakpoint*>(btr->breakpoint());
+ if (bp && (bp->fileName() == filename.path()))
+ emit refreshBPState(*bp);
+ }
+ }
+}
+
+/***************************************************************************/
+
+BreakpointTableRow* RDBBreakpointWidget::find(Breakpoint *breakpoint)
+{
+ // NOTE:- The match doesn't have to be equal. Each type of bp
+ // must decide on the match criteria.
+ Q_ASSERT (breakpoint);
+
+ for ( int row = 0; row < m_table->numRows(); row++ )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr && btr->match(breakpoint))
+ return btr;
+ }
+
+ return 0;
+}
+
+/***************************************************************************/
+
+// The Id is supplied by the debugger
+BreakpointTableRow* RDBBreakpointWidget::findId(int dbgId)
+{
+ for ( int row = 0; row < m_table->numRows(); row++ )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr && btr->breakpoint()->dbgId() == dbgId)
+ return btr;
+ }
+
+ return 0;
+}
+
+/***************************************************************************/
+
+// The key is a unique number supplied by us
+BreakpointTableRow* RDBBreakpointWidget::findKey(int BPKey)
+{
+ for ( int row = 0; row < m_table->numRows(); row++ )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr && btr->breakpoint()->key() == BPKey)
+ return btr;
+ }
+
+ return 0;
+}
+
+/***************************************************************************/
+
+BreakpointTableRow* RDBBreakpointWidget::addBreakpoint(Breakpoint *bp)
+{
+ BreakpointTableRow* btr =
+ new BreakpointTableRow( m_table, QTableItem::WhenCurrent, bp );
+ emit publishBPState(*bp);
+ return btr;
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::removeBreakpoint(BreakpointTableRow* btr)
+{
+ if (!btr)
+ return;
+
+ // Pending but the debugger hasn't started processing this bp so
+ // we can just remove it.
+ Breakpoint* bp = btr->breakpoint();
+ if (bp->isPending() && !bp->isDbgProcessing())
+ {
+ bp->setActionDie();
+ emit publishBPState(*bp);
+ m_table->removeRow(btr->row());
+ }
+ else
+ {
+ bp->setPending(true);
+ bp->setActionClear(true);
+ emit publishBPState(*bp);
+ btr->setRow();
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotToggleBreakpoint(const QString &fileName, int lineNum)
+{
+ FilePosBreakpoint *fpBP = new FilePosBreakpoint(fileName, lineNum+1);
+
+ BreakpointTableRow* btr = find(fpBP);
+ if (btr)
+ {
+ delete fpBP;
+ removeBreakpoint(btr);
+ }
+ else
+ addBreakpoint(fpBP);
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotToggleBreakpointEnabled(const QString &fileName, int lineNum)
+{
+ FilePosBreakpoint *fpBP = new FilePosBreakpoint(fileName, lineNum+1);
+
+ BreakpointTableRow* btr = find(fpBP);
+ delete fpBP;
+ if (btr)
+ {
+ Breakpoint* bp=btr->breakpoint();
+ bp->setEnabled(!bp->isEnabled());
+ emit publishBPState(*bp);
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotToggleWatchpoint(const QString &varName)
+{
+ Watchpoint *watchpoint = new Watchpoint(varName, false, true);
+ BreakpointTableRow* btr = find(watchpoint);
+ if (btr)
+ {
+ removeBreakpoint(btr);
+ delete watchpoint;
+ }
+ else
+ addBreakpoint(watchpoint);
+}
+
+/***************************************************************************/
+
+// The debugger allows us to set pending breakpoints => do it
+void RDBBreakpointWidget::slotSetPendingBPs()
+{
+ for ( int row = 0; row < m_table->numRows(); row++ )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+
+ if (btr)
+ {
+ Breakpoint* bp = btr->breakpoint();
+ if (bp->isPending() && !bp->isDbgProcessing() && bp->isValid())
+ emit publishBPState(*bp);
+ }
+ }
+}
+
+/***************************************************************************/
+
+// The debugger is having trouble with this bp - probably because a library
+// was unloaded and invalidated a bp that was previously set in the library
+// code. Reset the bp so that we can try again later.
+void RDBBreakpointWidget::slotUnableToSetBPNow(int BPid)
+{
+ if (BPid == -1)
+ reset();
+ else
+ if (BreakpointTableRow *btr = findId(BPid))
+ btr->reset();
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotParseRDBBrkptList(char *str)
+{
+ // Another example of a not too uncommon occurance
+ // No breakpoints.
+
+ // Set the new active flag so that after we have read the
+ // breakpoint list we can trim the breakpoints that have been
+ // removed (temporary breakpoints do this)
+ m_activeFlag++;
+ QRegExp breakpoint_re("(\\d+) [^:]+:\\d+");
+ int pos = 0;
+
+ pos = breakpoint_re.search(str, pos);
+ while (pos >= 0) {
+ int id = breakpoint_re.cap(1).toInt();
+
+ BreakpointTableRow* btr = findId(id);
+ if (btr)
+ {
+ Breakpoint *bp = btr->breakpoint();
+ bp->setActive(m_activeFlag, id);
+ btr->setRow();
+ emit publishBPState(*bp);
+ }
+
+ pos += breakpoint_re.matchedLength();
+ pos = breakpoint_re.search(str, pos);
+ }
+
+ str = strstr(str, "Watchpoints:");
+ if (str != 0) {
+ QRegExp watchpoint_re("(\\d+) [^\n]+\n");
+ int pos = 0;
+
+ pos = watchpoint_re.search(str, pos);
+ while (pos >= 0) {
+ int id = watchpoint_re.cap(1).toInt();
+
+ BreakpointTableRow* btr = findId(id);
+ if (btr)
+ {
+ Breakpoint *bp = btr->breakpoint();
+ bp->setActive(m_activeFlag, id);
+ btr->setRow();
+ emit publishBPState(*bp);
+ }
+
+ pos += watchpoint_re.matchedLength();
+ pos = watchpoint_re.search(str, pos);
+ }
+ }
+
+ // Remove any inactive breakpoints.
+ for ( int row = m_table->numRows()-1; row >= 0 ; row-- )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr)
+ {
+ Breakpoint* bp = btr->breakpoint();
+ if (!(bp->isActive(m_activeFlag)))
+ removeBreakpoint(btr);
+ }
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotParseRDBBreakpointSet(char *str, int BPKey)
+{
+ BreakpointTableRow* btr = findKey(BPKey);
+ if (!btr)
+ return;
+
+ Breakpoint *bp = btr->breakpoint();
+ bp->setDbgProcessing(false);
+
+ QRegExp breakpoint_re("Set breakpoint (\\d+) at [^:]+:\\d+");
+ QRegExp watchpoint_re("Set watchpoint (\\d+)");
+
+ int id = 0;
+ if (breakpoint_re.search(str, 0) != -1) {
+ id = breakpoint_re.cap(1).toInt();
+ } else if (watchpoint_re.search(str, 0) != -1) {
+ id = watchpoint_re.cap(1).toInt();
+ }
+
+ if (id > 0)
+ {
+ bp->setActive(m_activeFlag, id);
+ emit publishBPState(*bp);
+ btr->setRow();
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotAddBlankBreakpoint(int idx)
+{
+ BreakpointTableRow* btr = 0;
+ switch (idx)
+ {
+ case BP_TYPE_FilePos:
+ btr = addBreakpoint(new FilePosBreakpoint("", 0));
+ break;
+
+ case BP_TYPE_Watchpoint:
+ btr = addBreakpoint(new Watchpoint(""));
+ break;
+
+ case BP_TYPE_Catchpoint:
+ btr = addBreakpoint(new Catchpoint(""));
+ break;
+
+ case BP_TYPE_Function:
+ btr = addBreakpoint(new FunctionBreakpoint(""));
+ break;
+
+ default:
+ break;
+ }
+
+ if (btr)
+ {
+ QTableSelection ts;
+ ts.init(btr->row(), 0);
+ ts.expandTo(btr->row(), numCols );
+ m_table->addSelection(ts);
+ m_table->editCell(btr->row(), Location, false);
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotRemoveBreakpoint()
+{
+ int row = m_table->currentRow();
+ if ( row != -1)
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ removeBreakpoint(btr);
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotRemoveAllBreakpoints()
+{
+ while (m_table->numRows() > 0)
+ {
+ for ( int row = m_table->numRows()-1; row>=0; row-- )
+ {
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ removeBreakpoint(btr);
+ }
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotRowDoubleClicked(int row, int col, int btn, const QPoint &)
+{
+ if ( btn == Qt::LeftButton )
+ {
+// kdDebug(9012) << "in slotRowSelected row=" << row << endl;
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr)
+ {
+ FilePosBreakpoint* bp = dynamic_cast<FilePosBreakpoint*>(btr->breakpoint());
+ if (bp)
+ emit gotoSourcePosition(bp->fileName(), bp->lineNum()-1);
+
+ // put the focus back on the clicked item if appropriate
+ if (col == Location)
+ m_table->editCell(row, col, false);
+ }
+ }
+}
+
+void RDBBreakpointWidget::slotContextMenuShow( int row, int /*col*/, const QPoint &mousePos )
+{
+ BreakpointTableRow *btr = (BreakpointTableRow *)m_table->item( row, Control );
+
+ if (btr != NULL)
+ {
+ m_ctxMenu->setItemEnabled( BW_ITEM_Show, (btr->breakpoint( )->type( ) == BP_TYPE_FilePos) );
+ if (btr->breakpoint( )->isEnabled( ))
+ {
+ m_ctxMenu->changeItem( BW_ITEM_Disable, i18n("Disable") );
+ }
+ else
+ {
+ m_ctxMenu->changeItem( BW_ITEM_Disable, i18n("Enable") );
+ }
+
+ //m_ctxMenu->popup( mapToGlobal( mousePos ) );
+ m_ctxMenu->popup( mousePos );
+ }
+}
+
+void RDBBreakpointWidget::slotContextMenuSelect( int item )
+{
+ int row, col;
+ BreakpointTableRow *btr;
+ Breakpoint *bp;
+ FilePosBreakpoint *fbp;
+
+ row= m_table->currentRow( );
+ if (row == -1)
+ return;
+ btr = (BreakpointTableRow *)m_table->item( row, Control );
+ if (btr == NULL)
+ return;
+ bp = btr->breakpoint( );
+ if (bp == NULL)
+ return;
+ fbp = dynamic_cast<FilePosBreakpoint*>(bp);
+
+ switch( item )
+ {
+ case BW_ITEM_Show:
+ if (fbp)
+ emit gotoSourcePosition(fbp->fileName(), fbp->lineNum()-1);
+ break;
+ case BW_ITEM_Edit:
+ col = m_table->currentColumn( );
+ if (col == Location)
+ m_table->editCell(row, col, false);
+ break;
+ case BW_ITEM_Disable:
+ bp->setEnabled( !bp->isEnabled( ) );
+ btr->setRow( );
+ emit publishBPState( *bp );
+ break;
+ case BW_ITEM_Delete:
+ slotRemoveBreakpoint( );
+ break;
+ default:
+ // oops, check it out! this case is not in sync with the
+ // m_ctxMenu. Check the enum in the header file.
+ return;
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotEditRow(int row, int col, const QPoint &)
+{
+// kdDebug(9012) << "in slotEditRow row=" << row << endl;
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+ if (btr)
+ {
+ if (col == Location)
+ m_table->editCell(row, col, false);
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotNewValue(int row, int col)
+{
+// kdDebug(9012) << "in slotNewValue row=" << row << endl;
+ BreakpointTableRow* btr = (BreakpointTableRow *) m_table->item(row, Control);
+
+ if (btr)
+ {
+ bool changed=false;
+ Breakpoint* bp = btr->breakpoint();
+ switch (col)
+ {
+
+ case Enable:
+ {
+ QCheckTableItem *item = (QCheckTableItem*)m_table->item ( row, Enable );
+ if ( item->isChecked() != bp->isEnabled() )
+ {
+ bp->setEnabled(item->isChecked());
+ bp->setPending(true);
+ bp->setActionModify(true);
+ changed = true;
+ }
+ break;
+ }
+
+ case Location:
+ {
+ if (bp->location() != m_table->text(btr->row(), Location))
+ {
+// kdDebug(9012) << "Old location [" << bp->location() << "]" << endl;
+// kdDebug(9012) << "New location [" << m_table->text(btr->row(), Location) << "]" << endl;
+ bp->setActionDie();
+ emit publishBPState(*bp);
+ bp->setPending(true);
+ bp->setActionAdd(true);
+ bp->setLocation(m_table->text(btr->row(), Location));
+ changed = true;
+ }
+ break;
+ }
+
+ case Type:
+ case Status:
+ default:
+ break;
+ }
+
+ if (changed)
+ {
+ btr->setRow();
+ emit publishBPState(*bp);
+ }
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotEditBreakpoint(const QString &fileName, int lineNum)
+{
+ FilePosBreakpoint *fpBP = new FilePosBreakpoint(fileName, lineNum+1);
+
+ BreakpointTableRow* btr = find(fpBP);
+ delete fpBP;
+
+ if (btr)
+ {
+ QTableSelection ts;
+ ts.init(btr->row(), 0);
+ ts.expandTo(btr->row(), numCols);
+ m_table->addSelection(ts);
+ m_table->editCell(btr->row(), Location, false);
+ }
+
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotEditBreakpoint()
+{
+ m_table->editCell(m_table->currentRow(), Location, false);
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::savePartialProjectSession(QDomElement* el)
+{
+ QDomDocument domDoc = el->ownerDocument();
+ if (domDoc.isNull())
+ return;
+
+ QDomElement breakpointListEl = domDoc.createElement("breakpointList");
+ for ( int row = 0; row < m_table->numRows(); row++ )
+ {
+ BreakpointTableRow* btr =
+ (BreakpointTableRow *) m_table->item(row, Control);
+ Breakpoint* bp = btr->breakpoint();
+
+ QDomElement breakpointEl =
+ domDoc.createElement("breakpoint"+QString::number(row));
+
+ breakpointEl.setAttribute("type", bp->type());
+ breakpointEl.setAttribute("location", bp->location(false));
+ breakpointEl.setAttribute("enabled", bp->isEnabled());
+
+ breakpointListEl.appendChild(breakpointEl);
+ }
+
+ if (!breakpointListEl.isNull())
+ el->appendChild(breakpointListEl);
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::restorePartialProjectSession(const QDomElement* el)
+{
+ QDomElement breakpointListEl = el->namedItem("breakpointList").toElement();
+ if (!breakpointListEl.isNull())
+ {
+ QDomElement breakpointEl;
+ for (breakpointEl = breakpointListEl.firstChild().toElement();
+ !breakpointEl.isNull();
+ breakpointEl = breakpointEl.nextSibling().toElement())
+ {
+ Breakpoint* bp=0;
+ BP_TYPES type = (BP_TYPES) breakpointEl.attribute( "type", "0").toInt();
+ switch (type)
+ {
+ case BP_TYPE_FilePos:
+ {
+ bp = new FilePosBreakpoint("", 0);
+ break;
+ }
+ case BP_TYPE_Watchpoint:
+ {
+ bp = new Watchpoint("");
+ break;
+ }
+ case BP_TYPE_Catchpoint:
+ {
+ bp = new Catchpoint("");
+ break;
+ }
+ case BP_TYPE_Function:
+ {
+ bp = new FunctionBreakpoint("");
+ break;
+ }
+ default:
+ break;
+ }
+
+ // Common settings for any type of breakpoint
+ if (bp)
+ {
+ bp->setLocation(breakpointEl.attribute( "location", ""));
+ bp->setEnabled(breakpointEl.attribute( "enabled", "1").toInt());
+
+ // Add the bp if we don't already have it.
+ if (!find(bp))
+ addBreakpoint(bp);
+ else
+ delete bp;
+ }
+ }
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::slotAddBreakpoint( )
+{
+ if (m_add->popup())
+ {
+ m_add->popup()->popup(mapToGlobal(this->geometry().topLeft()));
+ }
+}
+
+/***************************************************************************/
+
+void RDBBreakpointWidget::focusInEvent( QFocusEvent */* e*/ )
+{
+ m_table->setFocus();
+}
+
+}
+
+
+#include "rdbbreakpointwidget.moc"
diff --git a/languages/ruby/debugger/rdbbreakpointwidget.h b/languages/ruby/debugger/rdbbreakpointwidget.h
new file mode 100644
index 00000000..65e6e15b
--- /dev/null
+++ b/languages/ruby/debugger/rdbbreakpointwidget.h
@@ -0,0 +1,120 @@
+/***************************************************************************
+ begin : Tue May 13 2003
+ copyright : (C) 2003 by John Birch
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _RDBBreakpointWidget_H_
+#define _RDBBreakpointWidget_H_
+
+#include <qhbox.h>
+#include <qpopupmenu.h>
+
+class QDomElement;
+class QToolButton;
+class KURL;
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+namespace RDBDebugger
+{
+class Breakpoint;
+class BreakpointTableRow;
+class RDBTable;
+
+class RDBBreakpointWidget : public QHBox
+{
+ Q_OBJECT
+
+public:
+ RDBBreakpointWidget( QWidget* parent=0, const char* name=0 );
+ virtual ~RDBBreakpointWidget();
+
+ void reset();
+
+ void savePartialProjectSession(QDomElement* el);
+ void restorePartialProjectSession(const QDomElement* el);
+
+
+public slots:
+ // Connected to from the editor widget:
+ void slotToggleBreakpoint(const QString &filename, int lineNum);
+ void slotToggleBreakpointEnabled(const QString &fileName, int lineNum);
+
+ // Connected to from the variable widget:
+ void slotToggleWatchpoint(const QString &varName);
+
+ // Connected to from the dbgcontroller:
+ void slotSetPendingBPs();
+ void slotUnableToSetBPNow(int BPNo);
+ void slotParseRDBBrkptList(char *str);
+ void slotParseRDBBreakpointSet(char *str, int BPKey);
+
+ void slotRefreshBP(const KURL &filename);
+
+protected:
+ enum BW_ITEMS { BW_ITEM_Show, BW_ITEM_Edit, BW_ITEM_Disable, BW_ITEM_Delete };
+ virtual void focusInEvent(QFocusEvent *e);
+
+private slots:
+ void slotRemoveBreakpoint();
+ void slotRemoveAllBreakpoints();
+ void slotEditBreakpoint(const QString &fileName, int lineNum);
+ void slotEditBreakpoint();
+ void slotAddBreakpoint();
+ void slotAddBlankBreakpoint(int idx);
+ void slotRowDoubleClicked(int row, int col, int button, const QPoint & mousePos);
+ void slotContextMenuShow( int row, int col, const QPoint &mousePos );
+ void slotContextMenuSelect( int item );
+ void slotEditRow(int row, int col, const QPoint & mousePos);
+ void slotNewValue(int row, int col);
+
+signals:
+ void publishBPState(const Breakpoint& brkpt);
+ void refreshBPState(const Breakpoint& brkpt);
+ void gotoSourcePosition(const QString &fileName, int lineNum);
+ void clearAllBreakpoints();
+
+private:
+ BreakpointTableRow* find(Breakpoint *bp);
+ BreakpointTableRow* findId(int id);
+ BreakpointTableRow* findKey(int BPKey);
+
+ void setActive();
+ BreakpointTableRow* addBreakpoint(Breakpoint *bp);
+ void removeBreakpoint(BreakpointTableRow* btr);
+
+private:
+ RDBTable* m_table;
+
+ QToolButton* m_add;
+ QToolButton* m_delete;
+ QToolButton* m_edit;
+ QToolButton* m_removeAll;
+ QPopupMenu* m_ctxMenu;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/rdbcommand.cpp b/languages/ruby/debugger/rdbcommand.cpp
new file mode 100644
index 00000000..98dc3a80
--- /dev/null
+++ b/languages/ruby/debugger/rdbcommand.cpp
@@ -0,0 +1,81 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "rdbcommand.h"
+#include "breakpoint.h"
+#include "variablewidget.h"
+
+namespace RDBDebugger
+{
+
+
+RDBCommand::RDBCommand(const QCString &setCommand, bool isRunCmd, bool isInfoCmd)
+ : DbgCommand(setCommand, isRunCmd, isInfoCmd)
+{
+// if (prompt_) {
+// cmdBuffer_ = QCString().sprintf("set prompt %c%c\n", BLOCK_START, prompt_) +
+// command_ +
+// idlePrompt_;
+// }
+}
+
+/***************************************************************************/
+
+RDBCommand::~RDBCommand()
+{
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+RDBItemCommand::RDBItemCommand( VarItem *item,
+ const QCString &command,
+ bool isRunCmd)
+ : RDBCommand(command, isRunCmd, true),
+ item_(item)
+{
+}
+
+/***************************************************************************/
+
+RDBItemCommand::~RDBItemCommand()
+{
+}
+
+
+RDBSetBreakpointCommand::RDBSetBreakpointCommand(const QCString &command, int key)
+ : RDBCommand(command, false, false),
+ key_(key)
+{
+}
+
+/***************************************************************************/
+
+RDBSetBreakpointCommand::~RDBSetBreakpointCommand()
+{
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+}
diff --git a/languages/ruby/debugger/rdbcommand.h b/languages/ruby/debugger/rdbcommand.h
new file mode 100644
index 00000000..663c8119
--- /dev/null
+++ b/languages/ruby/debugger/rdbcommand.h
@@ -0,0 +1,99 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _RDBCOMMAND_H_
+#define _RDBCOMMAND_H_
+
+#include "dbgcommand.h"
+
+namespace RDBDebugger
+{
+
+class Breakpoint;
+class VarItem;
+
+// sigh - namespace's don't work on some of the older compilers
+enum RDBCmd
+{
+ CONSTANTS = 'C',
+ CVARS = 'V',
+ IVARS = 'I',
+ LOCALS = 'L'
+};
+
+#define RUNCMD (true)
+#define NOTRUNCMD (false)
+#define INFOCMD (true)
+#define NOTINFOCMD (false)
+
+/**
+ * @author John Birch
+ */
+
+class RDBCommand : public DbgCommand
+{
+public:
+ RDBCommand(const QCString& command, bool isRunCmd=false, bool isInfoCmd=true);
+ virtual ~RDBCommand();
+
+private:
+ static QCString idlePrompt_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+class RDBItemCommand : public RDBCommand
+{
+public:
+ RDBItemCommand(VarItem *item, const QCString &command,
+ bool isRunCmd=false);
+ virtual ~RDBItemCommand();
+
+ VarItem *getItem() { return item_; }
+
+private:
+ VarItem *item_;
+};
+
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+class RDBSetBreakpointCommand : public RDBCommand
+{
+public:
+ RDBSetBreakpointCommand(const QCString& setCommand, int key);
+ virtual ~RDBSetBreakpointCommand();
+
+ int getKey() const { return key_; }
+
+private:
+ int key_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/rdbcontroller.cpp b/languages/ruby/debugger/rdbcontroller.cpp
new file mode 100644
index 00000000..160754a0
--- /dev/null
+++ b/languages/ruby/debugger/rdbcontroller.cpp
@@ -0,0 +1,1414 @@
+// *************************************************************************
+// rdbcontroller.cpp - description
+// -------------------
+// begin : Sun Aug 8 1999
+// copyright : (C) 1999 by John Birch
+// email : [email protected]
+//
+// Adapted for ruby debugging
+// --------------------------
+// begin : Mon Nov 1 2004
+// copyright : (C) 2004 by Richard Dale
+// email : [email protected]
+// **************************************************************************
+//
+// **************************************************************************
+// * *
+// * This program is free software; you can redistribute it and/or modify *
+// * it under the terms of the GNU General Public License as published by *
+// * the Free Software Foundation; either version 2 of the License, or *
+// * (at your option) any later version. *
+// * *
+// **************************************************************************
+
+#include "rdbcontroller.h"
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <errno.h>
+
+#include "breakpoint.h"
+#include "framestackwidget.h"
+#include "rdbcommand.h"
+#include "stty.h"
+#include "variablewidget.h"
+#include "domutil.h"
+#include "settings.h"
+
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kprocess.h>
+
+#include <qdatetime.h>
+#include <qfileinfo.h>
+#include <qregexp.h>
+#include <qstring.h>
+#include <qtextstream.h>
+
+#include <iostream>
+#include <ctype.h>
+#include <stdlib.h>
+using namespace std;
+
+// **************************************************************************
+//
+// Does all the communication between rdb and the kdevelop's debugger code.
+// Significatant classes being used here are
+//
+// RDBParser - parses the "variable" data using the vartree and varitems
+// VarTree - where the variable data will end up
+// FrameStack - tracks the program frames and allows the user to switch between
+// and therefore view the calling funtions and their data
+// Breakpoint - Where and what to do with breakpoints.
+// STTY - the tty that the _application_ will run on.
+//
+// Significant variables
+// state_ - be very careful setting this. The controller is totally
+// dependent on this reflecting the correct state. For instance,
+// if the app is busy but we don't think so, then we lose control
+// of the app. The only way to get out of these situations is to
+// delete (stop) the controller.
+// currentFrame_
+// - Holds the frame number where and locals/variable information will
+// go to
+//
+//
+// **************************************************************************
+
+namespace RDBDebugger
+{
+
+// This is here so we can check for startup /shutdown problems
+int debug_controllerExists = false;
+
+// At the moment a Unix domain socket is used. It might be better to
+// change to tcp/ip and listen on a port instead
+QCString RDBController::unixSocketPath_;
+
+
+RDBController::RDBController(VariableTree *varTree, FramestackWidget *frameStack, QDomDocument &projectDom)
+ : DbgController(),
+ frameStack_(frameStack),
+ varTree_(varTree),
+ currentFrame_(1),
+ viewedThread_(-1),
+ stdoutOutputLen_(0),
+ stdoutOutput_(new char[4096]),
+ holdingZone_(),
+ rdbOutputLen_(0),
+ rdbOutput_(new char[49152]),
+ socketNotifier_(0),
+ currentCmd_(0),
+ currentPrompt_("(rdb:1) "),
+ tty_(0),
+ state_(s_dbgNotStarted|s_appNotStarted|s_silent),
+ programHasExited_(false),
+ dom(projectDom),
+ config_forceBPSet_(true),
+ config_dbgTerminal_(false)
+{
+ struct sockaddr_un sockaddr;
+ unixSocketPath_.sprintf("/tmp/.rubydebugger%d", getpid());
+ QFileInfo unixSocket(unixSocketPath_);
+
+ stdoutSizeofBuf_ = sizeof(stdoutOutput_);
+ rdbSizeofBuf_ = sizeof(rdbOutput_);
+
+ if (unixSocket.exists()) {
+ unlink(unixSocketPath_);
+ }
+
+ masterSocket_ = socket(AF_UNIX, SOCK_STREAM, 0);
+ sockaddr.sun_family = AF_UNIX;
+ strcpy(sockaddr.sun_path, unixSocketPath_);
+ bind(masterSocket_, (const struct sockaddr*) &sockaddr, sizeof(sockaddr));
+ listen(masterSocket_, 1);
+ acceptNotifier_ = new QSocketNotifier(masterSocket_, QSocketNotifier::Read, this);
+ QObject::connect( acceptNotifier_, SIGNAL(activated(int)),
+ this, SLOT(slotAcceptConnection(int)) );
+
+ configure();
+ cmdList_.setAutoDelete(true);
+
+ Q_ASSERT(! debug_controllerExists);
+ debug_controllerExists = true;
+}
+
+// **************************************************************************
+
+// Deleting the controller involves shutting down rdb nicely.
+// When were attached to a process, we must first detach so that the process
+// can continue running as it was before being attached. rdb is quite slow to
+// detach from a process, so we must process events within here to get a "clean"
+// shutdown.
+RDBController::~RDBController()
+{
+ delete[] stdoutOutput_;
+ delete[] rdbOutput_;
+ debug_controllerExists = false;
+
+ QFileInfo unixSocket(unixSocketPath_);
+ if (unixSocket.exists()) {
+ unlink(unixSocketPath_);
+ }
+}
+
+// **************************************************************************
+
+void RDBController::configure()
+{
+}
+
+// **************************************************************************
+
+// Fairly obvious that we'll add whatever command you give me to a queue
+// If you tell me to, I'll put it at the head of the queue so it'll run ASAP
+// Not quite so obvious though is that if we are going to run again. then any
+// information requests become redundent and must be removed.
+// We also try and run whatever command happens to be at the head of
+// the queue.
+void RDBController::queueCmd(DbgCommand *cmd, bool executeNext)
+{
+ // We remove any info command or _run_ command if we are about to
+ // add a run command.
+ if (cmd->isARunCmd())
+ removeInfoRequests();
+
+ if (executeNext)
+ cmdList_.insert(0, cmd);
+ else
+ cmdList_.append (cmd);
+}
+
+// **************************************************************************
+
+// If the appliction can accept a command and we've got one waiting
+// then send it.
+// Commands can be just request for data (or change rdbs state in someway)
+// or they can be "run" commands. If a command is sent to rdb our internal
+// state will get updated.
+void RDBController::executeCmd()
+{
+ if (stateIsOn(s_dbgNotStarted|s_waitForWrite|s_appBusy|s_shuttingDown) || !dbgProcess_)
+ return;
+
+ if (currentCmd_ == 0) {
+ if (cmdList_.isEmpty())
+ return;
+
+ currentCmd_ = cmdList_.take(0);
+ }
+
+ if (!currentCmd_->moreToSend()) {
+ delete currentCmd_;
+ if (cmdList_.isEmpty()) {
+ currentCmd_ = 0;
+ return;
+ }
+
+ currentCmd_ = cmdList_.take(0);
+ }
+
+ char * ptr = currentCmd_->cmdToSend().data();
+ int bytesToWrite = currentCmd_->cmdLength();
+ int bytesWritten = 0;
+
+ while (bytesToWrite > 0) {
+ bytesWritten = write(socket_, ptr, bytesToWrite);
+ bytesToWrite -= bytesWritten;
+ ptr += bytesWritten;
+ }
+
+ if (currentCmd_->isARunCmd()) {
+ setStateOn(s_appBusy);
+ kdDebug(9012) << "App is busy" << endl;
+ setStateOff(s_appNotStarted|s_programExited|s_silent);
+ }
+
+ QString prettyCmd = currentCmd_->cmdToSend();
+ prettyCmd = currentPrompt_ + prettyCmd;
+ emit rdbStdout( prettyCmd.latin1() );
+
+ if (!stateIsOn(s_silent))
+ emit dbgStatus("", state_);
+}
+
+// **************************************************************************
+
+void RDBController::destroyCmds()
+{
+ if (currentCmd_)
+ {
+ delete currentCmd_;
+ currentCmd_ = 0;
+ }
+
+ while (!cmdList_.isEmpty())
+ delete cmdList_.take(0);
+}
+
+// **********************************************************************
+
+void RDBController::removeInfoRequests()
+{
+ int i = cmdList_.count();
+ while (i)
+ {
+ i--;
+ DbgCommand *cmd = cmdList_.at(i);
+ if (cmd->isAnInfoCmd() || cmd->isARunCmd())
+ delete cmdList_.take(i);
+ }
+}
+
+// **********************************************************************
+
+// Pausing an app removes any pending run commands so that the app doesn't
+// start again. If we want to be silent then we remove any pending info
+// commands as well.
+void RDBController::pauseApp()
+{
+ int i = cmdList_.count();
+ while (i)
+ {
+ i--;
+ DbgCommand *cmd = cmdList_.at(i);
+ if ((stateIsOn(s_silent) && cmd->isAnInfoCmd()) || cmd->isARunCmd())
+ delete cmdList_.take(i);
+ }
+
+ if (dbgProcess_ && stateIsOn(s_appBusy))
+ dbgProcess_->kill(SIGINT);
+}
+
+// **********************************************************************
+
+// Whenever the program pauses we need to refresh the data visible to
+// the user. The reason we've stopped may be passed in to be emitted.
+void RDBController::actOnProgramPause(const QString &msg)
+{
+ // We're only stopping if we were running, of course.
+ if (stateIsOn(s_appBusy))
+ {
+ kdDebug(9012) << "App is paused" << endl;
+ setStateOff(s_appBusy);
+ if (stateIsOn(s_silent))
+ return;
+
+ emit dbgStatus (msg, state_);
+
+ // We're always at frame one when the program stops
+ // and we must reset the active flag
+ currentFrame_ = 1;
+ varTree_->nextActivationId();
+ setStateOn(s_fetchLocals);
+
+ queueCmd(new RDBCommand("where", NOTRUNCMD, INFOCMD), true);
+ queueCmd(new RDBCommand("thread list", NOTRUNCMD, INFOCMD), true);
+
+ if (stateIsOn(s_fetchGlobals)) {
+ queueCmd(new RDBCommand("var global", NOTRUNCMD, INFOCMD));
+ }
+
+ emit acceptPendingBPs();
+ }
+}
+
+// **************************************************************************
+
+// There is no app anymore. This can be caused by program exiting
+// an invalid program specified or ...
+// rdb is still running though, but only the run command (may) make sense
+// all other commands are disabled.
+void RDBController::programNoApp(const QString &msg, bool msgBox)
+{
+ state_ = (s_appNotStarted|s_programExited|(state_&(s_shuttingDown)));
+ destroyCmds();
+
+ // We're always at frame one when the program stops
+ // and we must reset the active flag
+ viewedThread_ = -1;
+ currentFrame_ = 1;
+ varTree_->nextActivationId();
+
+ // Now wipe the tree out
+ varTree_->viewport()->setUpdatesEnabled(false);
+ varTree_->prune();
+ varTree_->viewport()->setUpdatesEnabled(true);
+ varTree_->repaint();
+
+ frameStack_->clear();
+
+ if (msgBox)
+ KMessageBox::error(0, i18n("rdb message:\n")+msg);
+
+ emit dbgStatus (msg, state_);
+}
+
+// **************************************************************************
+
+// The program location falls out of rdb. We treat
+// it as a wrapped command.
+// The data gets parsed here and emitted in its component parts.
+void RDBController::parseProgramLocation(char *buf)
+{
+ QString buffer(buf);
+ QString line;
+ QTextStream input(&buffer, IO_ReadOnly);
+ QString sourceFile;
+ int sourceLine = 0;
+
+ // "1: a = 1"
+ QRegExp display_re("^(\\d+):\\s(.*)$");
+
+ // "/opt/qt/src/widgets/qlistview.rb:1558:puts 'hello world'"
+ QRegExp sourcepos_re("^([^:]+):(\\d+):");
+
+ line = input.readLine();
+ while (! line.isNull()) {
+ if (sourcepos_re.search(line, 0) >= 0) {
+ sourceFile = sourcepos_re.cap(1);
+ sourceLine = sourcepos_re.cap(2).toInt();
+ } else if (display_re.search(line, 0) >= 0) {
+ varTree_->watchRoot()->updateWatchExpression(display_re.cap(1).toInt(), display_re.cap(2));
+ }
+
+ line = input.readLine();
+ }
+
+ if ( !sourceFile.isNull()
+ && ( traceIntoRuby_
+ || ( !sourceFile.endsWith("/qtruby.rb")
+ && !sourceFile.endsWith("/korundum.rb") ) )
+ && !sourceFile.endsWith("/debuggee.rb") )
+ {
+ actOnProgramPause(QString());
+ emit showStepInSource(sourceFile, sourceLine, "");
+ return;
+ }
+
+ if (stateIsOn(s_appBusy))
+ actOnProgramPause(i18n("No source: %1").arg(sourceFile));
+ else
+ emit dbgStatus (i18n("No source: %1").arg(sourceFile), state_);
+}
+
+// **************************************************************************
+
+// parsing the backtrace list will cause the vartree to be refreshed
+void RDBController::parseBacktraceList(char *buf)
+{
+ frameStack_->parseRDBBacktraceList(buf);
+}
+
+// **************************************************************************
+
+void RDBController::parseThreadList(char *buf)
+{
+ frameStack_->parseRDBThreadList(buf);
+ viewedThread_ = frameStack_->viewedThread();
+ varTree_->setCurrentThread(viewedThread_);
+}
+
+// **************************************************************************
+
+void RDBController::parseSwitchThread(char *buf)
+{
+ // Look for the thread number
+ // 2 #<Thread:0x30091998 sleep> /home/duke/play/testit/trykorundum/src/bar.rb:13
+ QRegExp thread_re("(\\d+)");
+ if (thread_re.search(buf) != -1) {
+ viewedThread_ = thread_re.cap(1).toInt();
+ currentFrame_ = 1;
+ }
+}
+
+// **************************************************************************
+
+// After an 'up nnn' or 'down nnn' command, get the new source file and line no.
+void RDBController::parseFrameMove(char *buf)
+{
+ QString sourceFile;
+ int sourceLine = 0;
+
+ if (stateIsOn(s_fetchLocals)) {
+ return;
+ }
+
+ // "#2 /home/duke/play/testit/trykorundum/src/main.rb:11"
+ QRegExp sourcepos_re("#\\d+\\s([^:]+):(\\d+)");
+ if (sourcepos_re.search(buf) != -1) {
+ sourceFile = sourcepos_re.cap(1);
+ sourceLine = sourcepos_re.cap(2).toInt();
+
+ if ( !sourceFile.isNull()
+ && ( traceIntoRuby_
+ || ( !sourceFile.endsWith("/qtruby.rb")
+ && !sourceFile.endsWith("/korundum.rb") ) )
+ && !sourceFile.endsWith("/debuggee.rb") )
+ {
+ emit showStepInSource(sourceFile, sourceLine, "");
+ return;
+ }
+ }
+
+ emit dbgStatus(i18n("No source: %1").arg(sourceFile), state_);
+}
+
+// **************************************************************************
+
+// When a breakpoint has been set, rdb responds with some data about the
+// new breakpoint. We just inform the breakpoint system about this.
+void RDBController::parseBreakpointSet(char *buf)
+{
+ if (RDBSetBreakpointCommand *BPCmd = dynamic_cast<RDBSetBreakpointCommand*>(currentCmd_))
+ {
+ // ... except in this case :-) A -1 key tells us that this is
+ // a special internal breakpoint, and we shouldn't do anything
+ // with it. Currently there are _no_ internal breakpoints.
+ if (BPCmd->getKey() != -1) {
+ emit rawRDBBreakpointSet(buf, BPCmd->getKey());
+ }
+ }
+}
+
+// **************************************************************************
+
+// Extra data needed by an item was requested. Here's the result.
+// If it's an ordinary 'p ' command then just echo the result on
+// the RDB console and don't bother parsing.
+void RDBController::parseRequestedData(char *buf)
+{
+ if (RDBItemCommand *rdbItemCommand = dynamic_cast<RDBItemCommand*> (currentCmd_))
+ {
+ // Fish out the item from the command and let it deal with the data
+ VarItem *item = rdbItemCommand->getItem();
+ varTree_->viewport()->setUpdatesEnabled(false);
+ item->expandValue(buf);
+ varTree_->viewport()->setUpdatesEnabled(true);
+ varTree_->repaint();
+ }
+}
+
+
+// **************************************************************************
+
+// Select a different frame to view. We need to get and (maybe) display
+// where we are in the program source.
+void RDBController::parseFrameSelected(char *buf)
+{
+ if (!stateIsOn(s_silent)) {
+ emit showStepInSource("", -1, "");
+ emit dbgStatus (i18n("No source: %1").arg(QString(buf)), state_);
+ }
+}
+
+// **************************************************************************
+
+// Sets the id of the display in the VarTree and a current value.
+void RDBController::parseDisplay(char *buf, char * expr)
+{
+ varTree_->viewport()->setUpdatesEnabled(false);
+ varTree_->watchRoot()->setWatchExpression(buf, expr);
+ varTree_->viewport()->setUpdatesEnabled(true);
+ varTree_->repaint();
+}
+
+// **************************************************************************
+
+// Updates the watch expressions with current values
+void RDBController::parseUpdateDisplay(char *buf)
+{
+ varTree_->viewport()->setUpdatesEnabled(false);
+
+ QRegExp display_re("(\\d+):\\s([^\n]*)\n");
+
+ int pos = display_re.search(buf);
+ while (pos != -1) {
+ varTree_->watchRoot()->updateWatchExpression(display_re.cap(1).toInt(), display_re.cap(2));
+
+ pos += display_re.matchedLength();
+ pos = display_re.search(buf, pos);
+ }
+
+ varTree_->viewport()->setUpdatesEnabled(true);
+ varTree_->repaint();
+}
+
+// **************************************************************************
+
+// This is called on program stop to process the globals.
+void RDBController::parseGlobals(char *buf)
+{
+ varTree_->viewport()->setUpdatesEnabled(false);
+ varTree_->globalRoot()->setGlobals(buf);
+ varTree_->viewport()->setUpdatesEnabled(true);
+ varTree_->repaint();
+}
+
+// **************************************************************************
+
+// This is called on program stop to process the locals.
+// Once the locals have been processed we prune the tree of items that are
+// inactive.
+void RDBController::parseLocals(char type, char *buf)
+{
+ varTree_->viewport()->setUpdatesEnabled(false);
+
+ // The locals are always attached to the currentFrame
+ VarFrameRoot *frame = varTree_->findFrame(currentFrame_, viewedThread_);
+ if (!frame)
+ {
+ frame = new VarFrameRoot(varTree_, currentFrame_, viewedThread_);
+ frame->setFrameName(
+ frameStack_->findFrame(currentFrame_, viewedThread_)->frameName());
+ }
+
+ Q_ASSERT(frame);
+
+ if (type == (char) CONSTANTS) {
+ frame->addLocals(buf);
+ } else if (type == (char) CVARS) {
+ frame->addLocals(buf);
+ } else if (type == (char) IVARS) {
+ frame->addLocals(buf);
+ } else {
+ frame->addLocals(buf);
+ frame->setLocals();
+ }
+
+ varTree_->viewport()->setUpdatesEnabled(true);
+ varTree_->repaint();
+}
+
+
+
+// **************************************************************************
+
+void RDBController::parse(char *buf)
+{
+ if (currentCmd_ == 0) {
+ return;
+ }
+
+ if (currentCmd_->isARunCmd()) {
+ parseProgramLocation(buf);
+ } else if (currentCmd_->rawDbgCommand() == "break") {
+ emit rawRDBBreakpointList(buf);
+ } else if (qstrncmp(currentCmd_->rawDbgCommand(), "break ", strlen("break ")) == 0) {
+ parseBreakpointSet(buf);
+ } else if (qstrncmp(currentCmd_->rawDbgCommand(), "watch ", strlen("watch ")) == 0) {
+ parseBreakpointSet(buf);
+ } else if (qstrncmp(currentCmd_->rawDbgCommand(), "display ", strlen("display ")) == 0) {
+ parseDisplay(buf, currentCmd_->rawDbgCommand().data() + strlen("display "));
+ } else if (currentCmd_->rawDbgCommand() == "display") {
+ parseUpdateDisplay(buf);
+ } else if (qstrncmp(currentCmd_->rawDbgCommand(), "undisplay ", strlen("undisplay ")) == 0) {
+ ;
+ } else if (qstrncmp(currentCmd_->rawDbgCommand(), "method instance ", strlen("method instance ")) == 0) {
+ } else if (qstrncmp(currentCmd_->rawDbgCommand(), "method ", strlen("method ")) == 0) {
+ } else if (qstrncmp(currentCmd_->rawDbgCommand(), "pp ", strlen("pp ")) == 0) {
+ parseRequestedData(buf);
+ } else if (currentCmd_->rawDbgCommand() == "thread list") {
+ parseThreadList(buf);
+ } else if ( qstrncmp(currentCmd_->rawDbgCommand(), "up ", strlen("up ")) == 0
+ || qstrncmp(currentCmd_->rawDbgCommand(), "down ", strlen("down ")) == 0 )
+ {
+ parseFrameMove(buf);
+ } else if (qstrncmp(currentCmd_->rawDbgCommand(), "thread switch ", strlen("thread switch ")) == 0) {
+ parseSwitchThread(buf);
+ } else if (currentCmd_->rawDbgCommand() == "thread current") {
+ parseThreadList(buf);
+ } else if (currentCmd_->rawDbgCommand() == "where") {
+ parseBacktraceList(buf);
+ } else if (currentCmd_->rawDbgCommand() == "var global") {
+ parseGlobals(buf);
+ } else if (currentCmd_->rawDbgCommand() == "var local") {
+ parseLocals(LOCALS, buf);
+ } else if (qstrncmp(currentCmd_->rawDbgCommand(), "var instance ", strlen("var instance ")) == 0) {
+ parseLocals(IVARS, buf);
+ } else if (qstrncmp(currentCmd_->rawDbgCommand(), "var class ", strlen("var class ")) == 0) {
+ parseLocals(CVARS, buf);
+ } else if (qstrncmp(currentCmd_->rawDbgCommand(), "var const ", strlen("var const ")) == 0) {
+ parseLocals(CONSTANTS, buf);
+ }
+
+ return;
+}
+
+// **************************************************************************
+
+void RDBController::setBreakpoint(const QCString &BPSetCmd, int key)
+{
+ queueCmd(new RDBSetBreakpointCommand(BPSetCmd, key));
+}
+
+// **************************************************************************
+
+void RDBController::clearBreakpoint(const QCString &BPClearCmd)
+{
+ queueCmd(new RDBCommand(BPClearCmd, NOTRUNCMD, NOTINFOCMD));
+ // Note: this is NOT an info command, because rdb doesn't explictly tell
+ // us that the breakpoint has been deleted, so if we don't have it the
+ // BP list doesn't get updated.
+ queueCmd(new RDBCommand("break", NOTRUNCMD, NOTINFOCMD));
+}
+
+// **************************************************************************
+
+void RDBController::modifyBreakpoint( const Breakpoint& BP )
+{
+ Q_ASSERT(BP.isActionModify());
+ if (BP.dbgId() > 0)
+ {
+ if (BP.changedEnable())
+ queueCmd(new RDBCommand(QCString().sprintf("%s %d",
+ BP.isEnabled() ? "enable" : "disable",
+ BP.dbgId()), NOTRUNCMD, NOTINFOCMD));
+
+ // BP.setDbgProcessing(true);
+ // Note: this is NOT an info command, because rdb doesn't explictly tell
+ // us that the breakpoint has been deleted, so if we don't have it the
+ // BP list doesn't get updated.
+ queueCmd(new RDBCommand("break", NOTRUNCMD, NOTINFOCMD));
+ }
+}
+
+// **************************************************************************
+// SLOTS
+// *****
+// For most of these slots data can only be sent to rdb when it
+// isn't busy and it is running.
+
+// **************************************************************************
+
+void RDBController::slotStart(const QString& ruby_interpreter, const QString& character_coding, const QString& run_directory, const QString& debuggee_path, const QString &application, const QString& run_arguments, bool show_constants, bool trace_into_ruby)
+{
+ Q_ASSERT (!dbgProcess_ && !tty_);
+
+// tty_ = new STTY(config_dbgTerminal_, "konsole");
+ tty_ = new STTY(config_dbgTerminal_, Settings::terminalEmulatorName( *kapp->config() ));
+ if (!config_dbgTerminal_)
+ {
+ connect( tty_, SIGNAL(OutOutput(const char*)), SIGNAL(ttyStdout(const char*)) );
+ connect( tty_, SIGNAL(ErrOutput(const char*)), SIGNAL(ttyStderr(const char*)) );
+ }
+
+ QString tty(tty_->getSlave());
+ if (tty.isEmpty())
+ {
+ KMessageBox::error(0, i18n("The ruby debugger cannot use the tty* or pty* devices.\n"
+ "Check the settings on /dev/tty* and /dev/pty*\n"
+ "As root you may need to \"chmod ug+rw\" tty* and pty* devices "
+ "and/or add the user to the tty group using "
+ "\"usermod -G tty username\"."));
+
+ delete tty_;
+ tty_ = 0;
+ return;
+ }
+
+ dbgProcess_ = new KProcess;
+
+ connect( dbgProcess_, SIGNAL(receivedStdout(KProcess *, char *, int)),
+ this, SLOT(slotDbgStdout(KProcess *, char *, int)) );
+
+ connect( dbgProcess_, SIGNAL(receivedStderr(KProcess *, char *, int)),
+ this, SLOT(slotDbgStderr(KProcess *, char *, int)) );
+
+ connect( dbgProcess_, SIGNAL(wroteStdin(KProcess *)),
+ this, SLOT(slotDbgWroteStdin(KProcess *)) );
+
+ connect( dbgProcess_, SIGNAL(processExited(KProcess*)),
+ this, SLOT(slotDbgProcessExited(KProcess*)) );
+
+ rubyInterpreter_ = ruby_interpreter;
+ characterCoding_ = character_coding;
+ runDirectory_ = run_directory;
+ debuggeePath_ = debuggee_path;
+ application_ = application;
+ runArguments_ = run_arguments;
+ showConstants_ = show_constants;
+ traceIntoRuby_ = trace_into_ruby;
+
+ *dbgProcess_ << ruby_interpreter;
+ *dbgProcess_ << character_coding;
+ *dbgProcess_ << "-C" << QString(QFile::encodeName( run_directory ));
+ *dbgProcess_ << "-r" << debuggee_path;
+ *dbgProcess_ << application;
+
+ if (!run_arguments.isNull() && !run_arguments.isEmpty()) {
+ *dbgProcess_ << run_arguments;
+ }
+
+ emit rdbStdout(QString( ruby_interpreter + " " + character_coding
+ + " -C " + QString(QFile::encodeName( run_directory ))
+ + " -r " + debuggee_path + " "
+ + application + " " + run_arguments ).latin1() );
+
+ if (!dbgProcess_->start( KProcess::NotifyOnExit,
+ KProcess::Communication(KProcess::All)) )
+ {
+ kdDebug(9012) << "Couldn't start ruby debugger" << endl;
+ }
+
+ // Initialise rdb. At this stage rdb is sitting wondering what to do,
+ // and to whom. Organise a few things, then set up the tty for the application,
+ // and the application itself
+
+ // Now the ruby debugger has been started and the application has been loaded,
+ // BUT the app hasn't been started yet! A run command is about to be issued
+ // by whoever is controlling us.
+
+ if (!dbgProcess_->writeStdin(QString("%1\n").arg(unixSocketPath_).latin1(), strlen(unixSocketPath_) + 1)) {
+ kdDebug(9012) << "failed to write Unix domain socket path to rdb "
+ << QString("%1\n").arg(unixSocketPath_).latin1() << endl;
+ }
+
+ setStateOff(s_programExited);
+ setStateOn(s_dbgNotStarted|s_appNotStarted|s_silent);
+}
+
+// **************************************************************************
+
+void RDBController::slotStopDebugger()
+{
+ if (stateIsOn(s_shuttingDown) || !dbgProcess_)
+ return;
+
+ setStateOn(s_shuttingDown|s_silent);
+ destroyCmds();
+
+ QTime start;
+ QTime now;
+
+ // Get rdb's attention if it's busy. We need rdb to be at the
+ // command line so we can stop it.
+ if (stateIsOn(s_appBusy))
+ {
+ kdDebug(9012) << "ruby debugger busy on shutdown - stopping rdb (SIGINT)" << endl;
+ dbgProcess_->kill(SIGINT);
+ start = QTime::currentTime();
+ while (-1)
+ {
+ kapp->processEvents(20);
+ now = QTime::currentTime();
+ if (!stateIsOn(s_appBusy) || start.msecsTo( now ) > 2000)
+ break;
+ }
+ }
+
+
+ // Now try to stop the ruby debugger running.
+ kdDebug(9012) << "App is busy" << endl;
+ setStateOn(s_appBusy);
+ const char *quit="quit\n";
+ if (!dbgProcess_->writeStdin(quit, strlen(quit)))
+ kdDebug(9012) << "failed to write 'quit' to ruby debugger" << endl;
+
+ emit rdbStdout("(rdb:1) quit");
+ start = QTime::currentTime();
+ while (-1)
+ {
+ kapp->processEvents(20);
+ now = QTime::currentTime();
+ if (stateIsOn(s_programExited) || start.msecsTo( now ) > 2000)
+ break;
+ }
+
+ // We cannot wait forever.
+ if (!stateIsOn(s_programExited))
+ {
+ kdDebug(9012) << "rdb not shutdown - killing" << endl;
+ dbgProcess_->kill(SIGKILL);
+ }
+
+ delete dbgProcess_; dbgProcess_ = 0;
+ delete tty_; tty_ = 0;
+
+ state_ = s_dbgNotStarted | s_appNotStarted | s_silent;
+ emit dbgStatus (i18n("Debugger stopped"), state_);
+}
+
+
+
+// **************************************************************************
+
+void RDBController::slotRun()
+{
+ if (stateIsOn(s_appBusy|s_dbgNotStarted|s_shuttingDown))
+ return;
+
+ if (stateIsOn(s_programExited)) {
+ slotStart(rubyInterpreter_, characterCoding_, runDirectory_, debuggeePath_, application_, runArguments_, showConstants_, traceIntoRuby_);
+ return;
+ }
+
+ queueCmd(new RDBCommand("cont", RUNCMD, NOTINFOCMD));
+ if (currentCmd_ == 0) {
+ executeCmd();
+ }
+}
+
+// **************************************************************************
+
+void RDBController::slotRunUntil(const QString &fileName, int lineNum)
+{
+ if (stateIsOn(s_appBusy|s_dbgNotStarted|s_shuttingDown))
+ return;
+
+ if (fileName.isEmpty())
+ queueCmd(new RDBCommand( QCString().sprintf("break %d", lineNum),
+ RUNCMD, NOTINFOCMD));
+ else
+ queueCmd(new RDBCommand(
+ QCString().sprintf("break %s:%d", fileName.latin1(), lineNum),
+ RUNCMD, NOTINFOCMD));
+ queueCmd(new RDBCommand("cont", RUNCMD, NOTINFOCMD));
+
+ if (currentCmd_ == 0) {
+ executeCmd();
+ }
+}
+
+// **************************************************************************
+
+void RDBController::slotStepInto()
+{
+ if (stateIsOn(s_appBusy|s_appNotStarted|s_shuttingDown))
+ return;
+
+ queueCmd(new RDBCommand("step", RUNCMD, NOTINFOCMD));
+ if (currentCmd_ == 0) {
+ executeCmd();
+ }
+}
+
+
+// **************************************************************************
+
+void RDBController::slotStepOver()
+{
+ if (stateIsOn(s_appBusy|s_appNotStarted|s_shuttingDown))
+ return;
+
+ queueCmd(new RDBCommand("next", RUNCMD, NOTINFOCMD));
+ if (currentCmd_ == 0) {
+ executeCmd();
+ }
+}
+
+
+// **************************************************************************
+
+void RDBController::slotStepOutOff()
+{
+ if (stateIsOn(s_appBusy|s_appNotStarted|s_shuttingDown))
+ return;
+
+ queueCmd(new RDBCommand("finish", RUNCMD, NOTINFOCMD));
+ if (currentCmd_ == 0) {
+ executeCmd();
+ }
+}
+
+// **************************************************************************
+
+// Only interrupt a running program.
+void RDBController::slotBreakInto()
+{
+ pauseApp();
+}
+
+// **************************************************************************
+
+// See what, if anything needs doing to this breakpoint.
+void RDBController::slotBPState( const Breakpoint& BP )
+{
+ // Are we in a position to do anything to this breakpoint?
+ if (stateIsOn(s_dbgNotStarted|s_shuttingDown) || !BP.isPending() ||
+ BP.isActionDie())
+ return;
+
+ // We need this flag so that we can continue execution. I did use
+ // the s_silent state flag but it can be set prior to this method being
+ // called, hence is invalid.
+ bool restart = false;
+ if (stateIsOn(s_appBusy))
+ {
+ if (!config_forceBPSet_)
+ return;
+
+ // When forcing breakpoints to be set/unset, interrupt a running app
+ // and change the state.
+ setStateOn(s_silent);
+ pauseApp();
+ restart = true;
+ }
+
+ if (BP.isActionAdd())
+ {
+ setBreakpoint(BP.dbgSetCommand().latin1(), BP.key());
+ // BP.setDbgProcessing(true);
+ }
+ else
+ {
+ if (BP.isActionClear())
+ {
+ clearBreakpoint(BP.dbgRemoveCommand().latin1());
+ // BP.setDbgProcessing(true);
+ }
+ else
+ {
+ if (BP.isActionModify())
+ {
+ modifyBreakpoint(BP); // Note: DbgProcessing gets set in modify fn
+ }
+ }
+ }
+
+ if (restart)
+ queueCmd(new RDBCommand("cont", RUNCMD, NOTINFOCMD));
+}
+
+// **************************************************************************
+
+void RDBController::slotClearAllBreakpoints()
+{
+ // Are we in a position to do anything to this breakpoint?
+ if (stateIsOn(s_dbgNotStarted|s_shuttingDown))
+ return;
+
+ bool restart = false;
+ if (stateIsOn(s_appBusy))
+ {
+ if (!config_forceBPSet_)
+ return;
+
+ // When forcing breakpoints to be set/unset, interrupt a running app
+ // and change the state.
+ setStateOn(s_silent);
+ pauseApp();
+ restart = true;
+ }
+
+ queueCmd(new RDBCommand("delete", NOTRUNCMD, NOTINFOCMD));
+ // Note: this is NOT an info command, because rdb doesn't explictly tell
+ // us that the breakpoint has been deleted, so if we don't have it the
+ // BP list doesn't get updated.
+ queueCmd(new RDBCommand("break", NOTRUNCMD, NOTINFOCMD));
+
+ if (restart)
+ queueCmd(new RDBCommand("cont", RUNCMD, NOTINFOCMD));
+
+ executeCmd();
+}
+
+
+
+// **************************************************************************
+
+void RDBController::slotSelectFrame(int frameNo, int threadNo, const QString& frameName)
+{
+ if (stateIsOn(s_appBusy|s_dbgNotStarted|s_shuttingDown)) {
+ kdDebug(9012) << "RDBController::slotSelectFrame wrong state" << endl;
+ return;
+ }
+
+ if (viewedThread_ != threadNo) {
+ // Note that 'thread switch nnn' is a run command
+ queueCmd(new RDBCommand(QCString().sprintf("thread switch %d",
+ threadNo), RUNCMD, INFOCMD));
+ executeCmd();
+ return;
+ }
+
+ if (frameNo > currentFrame_) {
+ queueCmd(new RDBCommand(QCString().sprintf("up %d", frameNo - currentFrame_), NOTRUNCMD, INFOCMD));
+ if (!stateIsOn(s_fetchLocals)) {
+ queueCmd(new RDBCommand("display", NOTRUNCMD, INFOCMD));
+ }
+ } else if (frameNo < currentFrame_) {
+ queueCmd(new RDBCommand(QCString().sprintf("down %d", currentFrame_ - frameNo), NOTRUNCMD, INFOCMD));
+ if (!stateIsOn(s_fetchLocals)) {
+ queueCmd(new RDBCommand("display", NOTRUNCMD, INFOCMD));
+ }
+ }
+
+ // Hold on to this thread/frame so that we know where to put the local
+ // variables if generated.
+ viewedThread_ = threadNo;
+ currentFrame_ = frameNo;
+
+ VarFrameRoot *frame = varTree_->findFrame(frameNo, viewedThread_);
+ if (frame == 0) {
+ frame = new VarFrameRoot(varTree_, currentFrame_, viewedThread_);
+ }
+
+ frame->setFrameName(frameName);
+ varTree_->setSelected(frame, true);
+
+ // Have we already got these details?
+ if (frame->needsVariables()) {
+ // Ask for the locals
+
+ if (showConstants_) {
+ queueCmd(new RDBCommand("var const self.class", NOTRUNCMD, INFOCMD));
+ }
+
+ queueCmd(new RDBCommand("var instance self", NOTRUNCMD, INFOCMD));
+ queueCmd(new RDBCommand("var class self.class", NOTRUNCMD, INFOCMD));
+ queueCmd(new RDBCommand("var local", NOTRUNCMD, INFOCMD));
+ frame->startWaitingForData();
+ }
+
+ if (currentCmd_ == 0) {
+ executeCmd();
+ }
+
+ return;
+}
+
+
+
+// **************************************************************************
+
+// This is called when an item needs special processing to show a value.
+void RDBController::slotExpandItem(VarItem *item, const QCString &userRequest)
+{
+ if (stateIsOn(s_appBusy|s_dbgNotStarted|s_shuttingDown))
+ return;
+
+ Q_ASSERT(item != 0);
+
+ // Bad user data!!
+ if (userRequest.isEmpty())
+ return;
+
+ queueCmd(new RDBItemCommand(item, QCString("pp ") + userRequest.data(), false));
+
+ if (currentCmd_ == 0) {
+ executeCmd();
+ }
+}
+
+// **************************************************************************
+
+// This method evaluates text selected with the 'Inspect:' context menu
+void RDBController::slotRubyInspect(const QString &inspectText)
+{
+ queueCmd(new RDBCommand( QCString().sprintf("p %s", inspectText.latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ executeCmd();
+}
+
+
+// **************************************************************************
+
+// Add a new expression to be displayed in the Watch variable tree
+void RDBController::slotAddWatchExpression(const QString& expr, bool execute)
+{
+ queueCmd(new RDBCommand( QCString().sprintf("display %s", expr.latin1()),
+ NOTRUNCMD,
+ NOTINFOCMD ) );
+ if (execute) {
+ executeCmd();
+ }
+}
+
+// **************************************************************************
+
+// Add a new expression to be displayed in the Watch variable tree
+void RDBController::slotRemoveWatchExpression(int displayId)
+{
+ queueCmd(new RDBCommand( QCString().sprintf("undisplay %d", displayId),
+ NOTRUNCMD,
+ INFOCMD ) );
+ executeCmd();
+}
+
+
+// **************************************************************************
+
+// The user will only get globals if the Global frame is open
+void RDBController::slotFetchGlobals(bool fetch)
+{
+ if (fetch) {
+ setStateOn(s_fetchGlobals);
+ queueCmd(new RDBCommand("var global", NOTRUNCMD, INFOCMD));
+ executeCmd();
+ } else {
+ setStateOff(s_fetchGlobals);
+ }
+
+ kdDebug(9012) << (fetch ? "<Globals ON>": "<Globals OFF>") << endl;
+}
+
+// **************************************************************************
+
+// Data from the ruby program's stdout gets processed here.
+void RDBController::slotDbgStdout(KProcess *, char *buf, int buflen)
+{
+ QCString msg(buf, buflen+1);
+ emit ttyStdout(msg);
+}
+
+// **************************************************************************
+
+// Data from the ruby program's stderr gets processed here.
+void RDBController::slotDbgStderr(KProcess *, char *buf, int buflen)
+{
+ QCString msg(buf, buflen+1);
+ emit ttyStderr(msg);
+}
+
+// **************************************************************************
+
+void RDBController::slotDbgWroteStdin(KProcess *)
+{
+// setStateOff(s_waitForWrite);
+ // if (!stateIsOn(s_silent))
+ // emit dbgStatus ("", state_);
+// executeCmd();
+}
+
+// **************************************************************************
+
+void RDBController::slotAcceptConnection(int masterSocket)
+{
+ Q_ASSERT(masterSocket == masterSocket_);
+
+ struct sockaddr sockaddr;
+ socklen_t fromlen;
+
+ if (socketNotifier_ != 0) {
+ close(socket_);
+ delete socketNotifier_;
+ }
+
+ socket_ = accept(masterSocket, &sockaddr, &fromlen);
+ if (fcntl(socket_, F_SETFL, O_NONBLOCK) == -1) {
+ kdDebug(9012) << "RDBController::slotAcceptConnection can't set nonblocking socket " << errno << endl;
+ }
+
+ socketNotifier_ = new QSocketNotifier(socket_, QSocketNotifier::Read, 0);
+ QObject::connect( socketNotifier_, SIGNAL(activated(int)),
+ this, SLOT(slotReadFromSocket(int)) );
+
+ setStateOff(s_dbgNotStarted);
+ emit dbgStatus ("", state_);
+
+ cmdList_.clear();
+ rdbOutputLen_ = 0;
+
+ // Organise any breakpoints.
+ emit acceptPendingBPs();
+
+ if (traceIntoRuby_) {
+ queueCmd(new RDBCommand("trace_ruby on", NOTRUNCMD, NOTINFOCMD));
+ }
+
+ queueCmd(new RDBCommand("cont", RUNCMD, NOTINFOCMD));
+
+ // Reset the display id for any watch expressions already in the variable tree
+ varTree_->resetWatchVars();
+}
+
+// **************************************************************************
+
+// Output from rdb via the Unix socket gets processed here.
+void RDBController::slotReadFromSocket(int socket)
+{
+ Q_ASSERT(socket == socket_);
+
+ static bool parsing = false;
+
+ int bytesRead = read(socket, rdbOutput_ + rdbOutputLen_, rdbSizeofBuf_);
+
+ rdbOutputLen_ += bytesRead;
+ *(rdbOutput_ + rdbOutputLen_) = 0;
+
+
+ // Already parsing? then get out quick.
+ if (parsing)
+ {
+ kdDebug(9012) << "Already parsing" << endl;
+ return;
+ }
+
+// kdDebug(9012) << "RDBController::slotReadFromSocket length: " << rdbOutputLen_ << " input: " << rdbOutput_ << endl;
+
+ QRegExp prompt_re("(\\(rdb:(\\d+)\\) )$");
+ int promptPos = prompt_re.search(rdbOutput_, 0);
+
+ // Keep appending output to the rbdOutput_ buffer until the
+ // ruby debugger writes the next prompt
+ if (promptPos == -1) {
+ return;
+ }
+
+// kdDebug(9012) << "RDBController::slotReadFromSocket length: " << rdbOutputLen_ << " input: " << rdbOutput_ << endl;
+
+ // Save the prompt, and remove it from the buffer
+ currentPrompt_ = prompt_re.cap(1).latin1();
+ rdbOutputLen_ -= prompt_re.matchedLength();
+ *(rdbOutput_ + rdbOutputLen_) = 0;
+
+ emit rdbStdout(rdbOutput_);
+
+ parsing = true;
+ parse(rdbOutput_);
+ parsing = false;
+ rdbOutputLen_ = 0;
+
+ executeCmd();
+
+ if (currentCmd_ == 0 && stateIsOn(s_fetchLocals)) {
+ if (!varTree_->schedule()) {
+ setStateOff(s_fetchLocals);
+ }
+ }
+}
+
+// **************************************************************************
+
+void RDBController::slotDbgProcessExited(KProcess*)
+{
+ destroyCmds();
+ state_ = s_appNotStarted|s_programExited|(state_&(s_shuttingDown));
+ emit dbgStatus (i18n("Process exited"), state_);
+ emit rdbStdout("(rdb:1) Process exited\n");
+ frameStack_->clear();
+ varTree_->clear();
+
+ if (socketNotifier_ != 0) {
+ delete socketNotifier_;
+ socketNotifier_ = 0;
+ close(socket_);
+ }
+
+ delete dbgProcess_; dbgProcess_ = 0;
+ delete tty_; tty_ = 0;
+}
+
+
+// **************************************************************************
+
+// Takes abbreviated commands and expands them, before passing them on to rdb
+//
+void RDBController::slotUserRDBCmd(const QString& cmd)
+{
+ kdDebug(9012) << "Requested user cmd: " << cmd << endl;
+ QRegExp break_re("^b(reak)?(\\s.*)?");
+ QRegExp watch_re("^wat(ch)?\\s+(.*)");
+ QRegExp delete_re("^del(ete)?(\\s.*)?");
+ QRegExp display_re("^disp(lay)?(\\s.*)?");
+ QRegExp undisplay_re("^undisp(lay)?(\\s.*)?");
+ QRegExp step_re("^s(tep)?(\\s[\\d]+)?$");
+ QRegExp next_re("^n(ext)?(\\s[\\d]+)?$");
+ QRegExp varlocal_re("^v(ar)?\\s+l(ocal)?");
+ QRegExp varglobal_re("^v(ar)?\\s+g(lobal)?");
+ QRegExp varinstance_re("^v(ar)?\\s+i(nstance)?\\s(.*)");
+ QRegExp varconst_re("^v(ar)?\\s+c(onst)?\\s(.*)");
+ QRegExp threadlist_re("^th(read)?\\s+l(ist)?");
+ QRegExp threadcurrent_re("^th(read)?(\\sc(ur(rent)?)?)?$");
+ QRegExp threadswitch_re("^th(read)?(\\ssw(itch)?)?(\\s.*)");
+ QRegExp thread_re("^th(read)?(\\s+.*)?");
+ QRegExp methodinstance_re("^m(ethod)?\\s+i(nstance)?\\s+(.*)");
+ QRegExp method_re("^m(ethod)?\\s+(.*)");
+ QRegExp list_re("^l(ist)?(\\s+\\d+-\\d+)?$");
+
+ if ( break_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("break%s", break_re.cap(2).latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ } else if ( watch_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("watch %s", watch_re.cap(2).latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ } else if ( delete_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("delete%s", delete_re.cap(2).latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ } else if ( display_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("display%s", display_re.cap(2).latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ } else if ( undisplay_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("undisplay%s", undisplay_re.cap(2).latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ } else if ( step_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("step%s", step_re.cap(2).latin1()),
+ RUNCMD,
+ INFOCMD ), true );
+ } else if ( next_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("next%s", next_re.cap(2).latin1()),
+ RUNCMD,
+ INFOCMD ), true );
+ } else if ( varlocal_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand("var local", NOTRUNCMD, INFOCMD));
+ } else if ( varglobal_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand("var global", NOTRUNCMD, INFOCMD));
+ } else if ( varinstance_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("var instance %s", varinstance_re.cap(3).latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ } else if ( varconst_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("var const %s", varconst_re.cap(3).latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ } else if ( methodinstance_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("method instance %s", methodinstance_re.cap(3).latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ } else if ( method_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("method %s", method_re.cap(2).latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ } else if ( list_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("list%s", list_re.cap(2).latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ } else if (cmd == "c" || cmd == "cont") {
+ queueCmd(new RDBCommand("cont", RUNCMD, NOTINFOCMD));
+ } else if (cmd == "fi" || cmd == "finish") {
+ queueCmd(new RDBCommand("finish", RUNCMD, NOTINFOCMD));
+ } else if ( threadlist_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand("thread list", NOTRUNCMD, INFOCMD), true);
+ } else if ( threadcurrent_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand("thread current", NOTRUNCMD, INFOCMD), true );
+ } else if ( threadswitch_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("thread switch%s", threadswitch_re.cap(4).latin1()),
+ RUNCMD,
+ INFOCMD ), true );
+ } else if ( thread_re.search(cmd) >= 0 ) {
+ queueCmd(new RDBCommand( QCString().sprintf("thread%s", thread_re.cap(2).latin1()),
+ NOTRUNCMD,
+ INFOCMD ), true );
+ } else if (cmd == "frame" || cmd == "f" || cmd == "where" || cmd == "w") {
+ queueCmd(new RDBCommand("where", NOTRUNCMD, INFOCMD), true);
+ } else if (cmd == "q" || cmd == "quit") {
+ slotStopDebugger();
+ return;
+ } else {
+ kdDebug(9012) << "Passing directly to rdb: " << cmd << endl;
+ queueCmd(new RDBCommand(cmd.latin1(), NOTRUNCMD, INFOCMD));
+ }
+
+ executeCmd();
+}
+
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+#include "rdbcontroller.moc"
diff --git a/languages/ruby/debugger/rdbcontroller.h b/languages/ruby/debugger/rdbcontroller.h
new file mode 100644
index 00000000..2d303218
--- /dev/null
+++ b/languages/ruby/debugger/rdbcontroller.h
@@ -0,0 +1,192 @@
+/***************************************************************************
+ rdbcontroller.h - description
+ -------------------
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+
+ Adapted for ruby debugging
+ --------------------------
+
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+
+
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _RDBCONTROLLER_H_
+#define _RDBCONTROLLER_H_
+
+#include "dbgcontroller.h"
+
+#include <qcstring.h>
+#include <qdom.h>
+#include <qobject.h>
+#include <qptrlist.h>
+#include <qstring.h>
+#include <qsocketnotifier.h>
+
+class KProcess;
+
+namespace RDBDebugger
+{
+
+class Breakpoint;
+class DbgCommand;
+class FramestackWidget;
+class VarItem;
+class VariableTree;
+class STTY;
+
+/**
+ * A front end implementation to the ruby command line debugger
+ * @author jbb
+ */
+
+class RDBController : public DbgController
+{
+ Q_OBJECT
+
+public:
+ RDBController(VariableTree *varTree, FramestackWidget *frameStack, QDomDocument &projectDom);
+ ~RDBController();
+
+protected:
+ void queueCmd(DbgCommand *cmd, bool executeNext=false);
+
+private:
+ void parseProgramLocation (char *buf);
+ void parseBacktraceList (char *buf);
+ void parseThreadList (char* buf);
+ void parseSwitchThread (char* buf);
+ void parseFrameMove (char *buf);
+ void parseBreakpointSet (char *buf);
+ void parseDisplay (char *buf, char * expr);
+ void parseUpdateDisplay (char *buf);
+ void parseGlobals (char *buf);
+ void parseLocals (char type, char *buf);
+ void parseRequestedData (char *buf);
+ void parseFrameSelected (char *buf);
+
+ void parse (char *buf);
+
+ void pauseApp();
+ void executeCmd ();
+ void destroyCmds();
+ void removeInfoRequests();
+ void actOnProgramPause(const QString &msg);
+ void programNoApp(const QString &msg, bool msgBox);
+
+ void setBreakpoint(const QCString &BPSetCmd, int key);
+ void clearBreakpoint(const QCString &BPClearCmd);
+ void modifyBreakpoint(const Breakpoint&);
+
+ void setStateOn(int stateOn) { state_ |= stateOn; }
+ void setStateOff(int stateOff) { state_ &= ~stateOff; }
+ bool stateIsOn(int state) { return state_ &state; }
+
+public slots:
+ void configure();
+
+ void slotStart( const QString& shell, const QString& characterCoding,
+ const QString& run_directory, const QString& debuggee_path,
+ const QString &application, const QString& run_arguments,
+ bool show_constants, bool trace_into_ruby );
+ //void slotStart(const QString& shell, const QString &application);
+
+ void slotStopDebugger();
+
+ void slotRun();
+ void slotRunUntil(const QString &filename, int lineNum);
+ void slotStepInto();
+ void slotStepOver();
+ void slotStepOutOff();
+
+ void slotBreakInto();
+ void slotBPState( const Breakpoint& );
+ void slotClearAllBreakpoints();
+
+ void slotExpandItem(VarItem *parent, const QCString &userRequest);
+ void slotRubyInspect(const QString &inspectText);
+ void slotSelectFrame(int frameNo, int threadNo, const QString& frameName);
+ void slotFetchGlobals(bool fetch);
+ void slotAddWatchExpression(const QString& expr, bool execute);
+ void slotRemoveWatchExpression(int displayId);
+
+ void slotUserRDBCmd(const QString&);
+
+protected slots:
+ void slotDbgStdout(KProcess *proc, char *buf, int buflen);
+ void slotDbgStderr(KProcess *proc, char *buf, int buflen);
+ void slotDbgWroteStdin(KProcess *proc);
+ void slotDbgProcessExited(KProcess *proc);
+
+ void slotAcceptConnection(int masterSocket);
+ void slotReadFromSocket(int socket);
+
+signals:
+ void acceptPendingBPs ();
+ void unableToSetBPNow (int BPNo);
+ void addWatchExpression (const QString&);
+
+private:
+ FramestackWidget* frameStack_;
+ VariableTree* varTree_;
+ int currentFrame_;
+ int viewedThread_;
+
+ int stdoutSizeofBuf_; // size of the buffer for holding stdout piped
+ // from the ruby program
+ int stdoutOutputLen_; // amount of data in the output buffer
+ char* stdoutOutput_; // buffer for the output from kprocess
+ QCString holdingZone_;
+
+ int rdbSizeofBuf_; // size of the output buffer from rdb
+ int rdbOutputLen_; // amount of data in the rdb buffer
+ char* rdbOutput_; // buffer for the output from rdb via the Unix socket
+
+ int masterSocket_; // The socket to accept connections
+ QSocketNotifier* acceptNotifier_;
+ static QCString unixSocketPath_; // The name of the Unix Domain socket
+ int socket_; // The socket to read and write to the debuggee
+ QSocketNotifier* socketNotifier_;
+
+ QPtrList<DbgCommand> cmdList_;
+ DbgCommand* currentCmd_;
+ QString currentPrompt_;
+
+ STTY* tty_;
+
+ // Details for starting the ruby debugger process
+ QString rubyInterpreter_;
+ QString characterCoding_;
+ QString runDirectory_;
+ QString debuggeePath_;
+ QString application_;
+ QString runArguments_;
+ bool showConstants_;
+ bool traceIntoRuby_;
+
+ // Some state variables
+ int state_;
+ bool programHasExited_;
+
+ // Configuration values
+ QDomDocument &dom;
+ bool config_forceBPSet_;
+ bool config_dbgTerminal_;
+};
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/rdboutputwidget.cpp b/languages/ruby/debugger/rdboutputwidget.cpp
new file mode 100644
index 00000000..5e08e116
--- /dev/null
+++ b/languages/ruby/debugger/rdboutputwidget.cpp
@@ -0,0 +1,171 @@
+// *************************************************************************
+// rdboutputwidget.cpp - description
+// -------------------
+// begin : 10th April 2003
+// copyright : (C) 2003 by John Birch
+// email : [email protected]
+//
+// Adapted for ruby debugging
+// --------------------------
+// begin : Mon Nov 1 2004
+// copyright : (C) 2004 by Richard Dale
+// email : [email protected]
+// **************************************************************************
+//
+// **************************************************************************
+// * *
+// * This program is free software; you can redistribute it and/or modify *
+// * it under the terms of the GNU General Public License as published by *
+// * the Free Software Foundation; either version 2 of the License, or *
+// * (at your option) any later version. *
+// * *
+// **************************************************************************
+
+#include "rdboutputwidget.h"
+#include "dbgcontroller.h"
+
+#include <kcombobox.h>
+#include <kdebug.h>
+#include <kiconloader.h>
+#include <klocale.h>
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qtextedit.h>
+#include <qtoolbutton.h>
+#include <qtooltip.h>
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+namespace RDBDebugger
+{
+
+/***************************************************************************/
+
+RDBOutputWidget::RDBOutputWidget( QWidget *parent, const char *name) :
+ QWidget(parent, name),
+ m_userRDBCmdEditor(0),
+ m_Interrupt(0),
+ m_rdbView(0)
+{
+
+ m_rdbView = new QTextEdit (this, name);
+ m_rdbView->setReadOnly(true);
+
+ QBoxLayout *userRDBCmdEntry = new QHBoxLayout();
+ m_userRDBCmdEditor = new KHistoryCombo (this, "rdb-user-cmd-editor");
+
+ QLabel *label = new QLabel(i18n("&RDB cmd:"), this);
+ label->setBuddy(m_userRDBCmdEditor);
+ userRDBCmdEntry->addWidget(label);
+
+ userRDBCmdEntry->addWidget(m_userRDBCmdEditor);
+ userRDBCmdEntry->setStretchFactor(m_userRDBCmdEditor, 1);
+
+ m_Interrupt = new QToolButton( this, "add breakpoint" );
+ m_Interrupt->setSizePolicy ( QSizePolicy ( (QSizePolicy::SizeType)0,
+ ( QSizePolicy::SizeType)0,
+ 0,
+ 0,
+ m_Interrupt->sizePolicy().hasHeightForWidth())
+ );
+ m_Interrupt->setPixmap ( SmallIcon ( "player_pause" ) );
+ userRDBCmdEntry->addWidget(m_Interrupt);
+ QToolTip::add ( m_Interrupt, i18n ( "Pause execution of the app to enter rdb commands" ) );
+
+ QVBoxLayout *topLayout = new QVBoxLayout(this, 2);
+ topLayout->addWidget(m_rdbView, 10);
+ topLayout->addLayout(userRDBCmdEntry);
+
+ slotDbgStatus( "", s_dbgNotStarted);
+
+ connect( m_userRDBCmdEditor, SIGNAL(returnPressed()), SLOT(slotRDBCmd()) );
+ connect( m_Interrupt, SIGNAL(clicked()), SIGNAL(breakInto()));
+}
+
+/***************************************************************************/
+
+RDBOutputWidget::~RDBOutputWidget()
+{
+ delete m_rdbView;
+ delete m_userRDBCmdEditor;
+}
+
+/***************************************************************************/
+
+void RDBOutputWidget::clear()
+{
+ if (m_rdbView)
+ m_rdbView->clear();
+}
+
+/***************************************************************************/
+
+void RDBOutputWidget::slotReceivedStdout(const char* line)
+{
+ if (strncmp(line, "(rdb:", 5) == 0)
+ m_rdbView->append(QString("<font color=\"blue\">").append( line ).append("</font>") );
+ else
+ m_rdbView->append(line);
+}
+
+/***************************************************************************/
+
+void RDBOutputWidget::slotReceivedStderr(const char* line)
+{
+ m_rdbView->append(QString("<font color=\"red\">").append( line ).append("</font>") );
+}
+
+/***************************************************************************/
+
+void RDBOutputWidget::slotRDBCmd()
+{
+ QString RDBCmd(m_userRDBCmdEditor->currentText());
+ if (!RDBCmd.isEmpty())
+ {
+ m_userRDBCmdEditor->addToHistory(RDBCmd);
+ m_userRDBCmdEditor->clearEdit();
+ emit userRDBCmd(RDBCmd);
+ }
+}
+
+/***************************************************************************/
+
+void RDBOutputWidget::slotDbgStatus(const QString &, int statusFlag)
+{
+ if (statusFlag & s_dbgNotStarted)
+ {
+ m_Interrupt->setEnabled(false);
+ m_userRDBCmdEditor->setEnabled(false);
+ return;
+ }
+
+ if (statusFlag & s_appBusy)
+ {
+ m_Interrupt->setEnabled(true);
+ m_userRDBCmdEditor->setEnabled(false);
+ }
+ else
+ {
+ m_Interrupt->setEnabled(false);
+ m_userRDBCmdEditor->setEnabled(true);
+ }
+}
+
+/***************************************************************************/
+
+void RDBOutputWidget::focusInEvent(QFocusEvent */*e*/)
+{
+ m_userRDBCmdEditor->setFocus();
+}
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+}
+
+
+#include "rdboutputwidget.moc"
+
diff --git a/languages/ruby/debugger/rdboutputwidget.h b/languages/ruby/debugger/rdboutputwidget.h
new file mode 100644
index 00000000..ef466757
--- /dev/null
+++ b/languages/ruby/debugger/rdboutputwidget.h
@@ -0,0 +1,69 @@
+// *************************************************************************
+// gdboutputwidget.cpp - description
+// -------------------
+// begin : 10th April 2003
+// copyright : (C) 2003 by John Birch
+// email : [email protected]
+//
+// Adapted for ruby debugging
+// --------------------------
+// begin : Mon Nov 1 2004
+// copyright : (C) 2004 by Richard Dale
+// email : [email protected]
+// **************************************************************************
+//
+// **************************************************************************
+// * *
+// * This program is free software; you can redistribute it and/or modify *
+// * it under the terms of the GNU General Public License as published by *
+// * the Free Software Foundation; either version 2 of the License, or *
+// * (at your option) any later version. *
+// * *
+// **************************************************************************
+
+#ifndef _RDBOUTPUTWIDGET_H_
+#define _RDBOUTPUTWIDGET_H_
+
+#include <qwidget.h>
+
+class KHistoryCombo;
+
+class QTextEdit;
+class QToolButton;
+
+namespace RDBDebugger
+{
+
+class RDBOutputWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ RDBOutputWidget( QWidget *parent=0, const char *name=0 );
+ ~RDBOutputWidget();
+
+ void clear();
+
+public slots:
+ void slotReceivedStdout(const char* line);
+ void slotReceivedStderr(const char* line);
+ void slotDbgStatus (const QString &status, int statusFlag);
+
+ void slotRDBCmd();
+
+protected:
+ virtual void focusInEvent(QFocusEvent *e);
+
+signals:
+ void userRDBCmd(const QString &cmd);
+ void breakInto();
+
+private:
+ KHistoryCombo* m_userRDBCmdEditor;
+ QToolButton* m_Interrupt;
+ QTextEdit* m_rdbView;
+};
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/rdbparser.cpp b/languages/ruby/debugger/rdbparser.cpp
new file mode 100644
index 00000000..7792acc5
--- /dev/null
+++ b/languages/ruby/debugger/rdbparser.cpp
@@ -0,0 +1,350 @@
+// **************************************************************************
+// begin : Tue Aug 17 1999
+// copyright : (C) 1999 by John Birch
+// email : [email protected]
+//
+// Adapted for ruby debugging
+// --------------------------
+// begin : Mon Nov 1 2004
+// copyright : (C) 2004 by Richard Dale
+// email : [email protected]
+// **************************************************************************
+
+// **************************************************************************
+// *
+// This program is free software; you can redistribute it and/or modify *
+// it under the terms of the GNU General Public License as published by *
+// the Free Software Foundation; either version 2 of the License, or *
+// (at your option) any later version. *
+// *
+// **************************************************************************
+
+#include "rdbparser.h"
+#include "variablewidget.h"
+
+#include <qregexp.h>
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <kdebug.h>
+
+namespace RDBDebugger
+{
+
+
+// **************************************************************************
+
+void RDBParser::parseVariables(LazyFetchItem *parent, char *buf)
+{
+ static const char *unknown = "?";
+
+ QString varName;
+ QCString value;
+ int pos;
+
+ Q_ASSERT(parent);
+ if (buf == 0 || strlen(buf) == 0) {
+ return;
+ }
+
+ if (buf[0] == 0) {
+ buf = (char*)unknown;
+ }
+
+ QRegExp var_re("\\s*([^\\n\\s]+) => ([^\\n]+)");
+ QRegExp ref_re("(#<([^:]|::)+:0x[\\da-f]+)\\s*([^=]*)>?");
+ QRegExp struct_re("#<struct Struct::(\\w+)");
+
+ // Look for 'dataitem => value' pairs. For example:
+ // a => 1
+ // m => #<MyClass:0x30093540 @temp={"z"=>"zed", "p"=>"pee"}, @foobar="hello">
+ //
+ pos = var_re.search(buf);
+ if (pos != -1) {
+ while (pos != -1) {
+ varName = var_re.cap(1);
+ if (ref_re.search(var_re.cap(2)) != -1) {
+ if (var_re.cap(2).contains("=") > 0) {
+ value = (ref_re.cap(1) + ">").latin1();
+ } else {
+ // There are no 'name=value' pairs, as in #<Qt::Color:0x0 #ff0000>
+ value = var_re.cap(2).latin1();
+ }
+ } else if (struct_re.search(var_re.cap(2)) != -1) {
+ value = (QString("#<Struct::") + struct_re.cap(1) + ">").latin1();
+ } else {
+ value = var_re.cap(2).latin1();
+ }
+
+ DataType dataType = determineType((char *) var_re.cap(2).latin1());
+
+ // 'self' variables don't need to be expandable, as their details are
+ // already shown in the current frame. So always make them VALUE_TYPE's.
+ if (varName == "self") {
+ dataType = VALUE_TYPE;
+ }
+
+ setItem(parent, varName, dataType, value);
+
+ pos += var_re.matchedLength();
+ pos = var_re.search(buf, pos);
+ }
+
+ return;
+ }
+}
+
+void RDBParser::parseExpandedVariable(VarItem *parent, char *buf)
+{
+ DataType dataType;
+ int pos;
+ QString varName;
+ QCString value;
+ QRegExp ppref_re("(#<([^:]|::)+:0x[\\da-f]+)([^\\n>]*)(>?)");
+
+ switch (parent->dataType()) {
+ case REFERENCE_TYPE:
+ {
+ // Look for a reference type which has been printed via a 'pp' command, to
+ // expand its sub items on multiple lines. For example:
+ // #<MyClass:0x30093540
+ // @foobar="hello",
+ // @sleeper=#<Thread:0x3008fd18 sleep>,
+ // @temp={"z"=>"zed", "p"=>"pee"}>
+ //
+ QRegExp ppvalue_re("\\s*([^\\n\\s=]+)=([^\\n]+)[,>]");
+
+ pos = ppref_re.search(buf);
+ if (pos != -1) {
+ if (ppref_re.cap(4) != "") {
+ // The value is all on one line, so match against name=value
+ // pairs which can't have commas in their values
+ ppvalue_re = QRegExp("\\s*([^\\s=]+)=([^,>]+)([,>])");
+ }
+
+ pos = ppvalue_re.search(buf, pos);
+
+ while (pos != -1) {
+ varName = ppvalue_re.cap(1);
+
+ if (ppref_re.search(ppvalue_re.cap(2)) != -1) {
+ if (ppvalue_re.cap(2).contains("=") > 0) {
+ value = (ppref_re.cap(1) + ">").latin1();
+ } else {
+ // There are no 'name=value' pairs, as in #<Qt::Color:0x0 #ff0000>
+ value = ppvalue_re.cap(2).latin1();
+ }
+ } else {
+ value = ppvalue_re.cap(2).latin1();
+ }
+
+ dataType = determineType((char *) ppvalue_re.cap(2).latin1());
+ setItem(parent, varName, dataType, value);
+
+ pos += ppvalue_re.matchedLength();
+ pos = ppvalue_re.search(buf, pos);
+ }
+
+ }
+ return;
+ }
+
+ case ARRAY_TYPE:
+ {
+ // Look for a array type which has been printed via a 'pp' command, to
+ // expand its sub items. For example:
+ // [0]="hello"
+ // [1]=#"goodbye"
+ //
+ QRegExp pparray_re("\\s*([^=]+)=([^\\n]+)\\n");
+
+ pos = pparray_re.search(buf);
+
+ while (pos != -1) {
+ varName = pparray_re.cap(1);
+
+ if (ppref_re.search(pparray_re.cap(2)) != -1) {
+ value = (ppref_re.cap(1) + ">").latin1();
+ } else {
+ value = pparray_re.cap(2).latin1();
+ }
+
+ DataType dataType = determineType((char *) pparray_re.cap(2).latin1());
+ setItem(parent, varName, dataType, value);
+
+ pos += pparray_re.matchedLength();
+ pos = pparray_re.search(buf, pos);
+ }
+
+ return;
+ }
+
+ case HASH_TYPE:
+ {
+ // Look for a hash type which has been printed via a 'pp' command, to
+ // expand its sub items. For example:
+ // ["greeting"]="hello"
+ // ["farewell"]="goodbye"
+ //
+ QRegExp pphash_re("\\s*(\\[[^\\]]+\\])=([^\\n]+)\\n");
+ pos = pphash_re.search(buf);
+
+ while (pos != -1) {
+ varName = pphash_re.cap(1);
+ value = pphash_re.cap(2).latin1();
+ DataType dataType = determineType(value.data());
+ setItem(parent, varName, dataType, value);
+
+ pos += pphash_re.matchedLength();
+ pos = pphash_re.search(buf, pos);
+ }
+
+ return;
+ }
+
+ case STRUCT_TYPE:
+ {
+ // Look for a reference type which has been printed via a 'pp' command, to
+ // expand its sub items. For example:
+ // #<Struct::Customer
+ // @foobar="hello",
+ // @sleeper=#<Thread:0x3008fd18 sleep>,
+ // @temp={"z"=>"zed", "p"=>"pee"}>
+ //
+ QRegExp ppstruct_re("(#<Struct::\\w+)\\s([^\\n>]*)(>?)");
+ QRegExp ppvalue_re("\\s*([^\\n\\s=]+)=([^\\n]+)[,>]");
+
+ pos = ppstruct_re.search(buf);
+ if (pos != -1) {
+ if (ppstruct_re.cap(3) != "" && ppvalue_re.search(ppstruct_re.cap(0)) != -1) {
+ // The line ends with a '>', but we have this case now..
+ // If there is only one instance variable, pp puts everything
+ // on a single line:
+ // #<Struct::Customer @foobar="hello">
+ // So search for '@foobar="hello"', to use as the
+ // first name=value pair
+ pos = 0;
+ } else {
+ // Mltiple lines with name=value pairs:
+ // #<Struct::Customer
+ // @foobar="hello",
+ pos = ppvalue_re.search(buf, pos);
+ }
+
+ while (pos != -1) {
+ varName = ppvalue_re.cap(1);
+ value = ppvalue_re.cap(2).latin1();
+ dataType = determineType(value.data());
+ setItem(parent, varName, dataType, value);
+
+ pos += ppvalue_re.matchedLength();
+ pos = ppvalue_re.search(buf, pos);
+ }
+
+ }
+ return;
+ }
+
+ case STRING_TYPE:
+ {
+ // Look for a long String which has been printed via a 'pp' command, to
+ // show it as a sequence of 12 bytes slices in hex. For example:
+ // [0..11]=0x89504e470d0a1a0a0000000d
+ // [12..23]=0x494844520000001600000016
+ //
+ QRegExp ppstring_re("\\s*(\\[[^\\]]+\\])=([^\\n]+)\\n");
+ pos = ppstring_re.search(buf);
+
+ while (pos != -1) {
+ varName = ppstring_re.cap(1);
+ value = ppstring_re.cap(2).latin1();
+ DataType dataType = determineType(value.data());
+ setItem(parent, varName, dataType, value);
+
+ pos += ppstring_re.matchedLength();
+ pos = ppstring_re.search(buf, pos);
+ }
+
+ return;
+ }
+
+ default:
+ Q_ASSERT(false);
+ }
+
+ return;
+}
+
+
+// **************************************************************************
+
+void RDBParser::setItem(LazyFetchItem *parent, const QString &varName,
+ DataType dataType, const QCString &value)
+{
+ VarItem *item = parent->findItem(varName);
+ if (item == 0) {
+ item = new VarItem(parent, varName, dataType);
+ } else {
+ // The dataType of an item can change, so update it
+ item->setDataType(dataType);
+ }
+
+ switch (dataType) {
+ case HASH_TYPE:
+ case ARRAY_TYPE:
+ case REFERENCE_TYPE:
+ case STRUCT_TYPE:
+ case STRING_TYPE:
+ item->setText(VALUE_COLUMN, value);
+ item->setExpandable(true);
+ item->update();
+ break;
+
+ case COLOR_TYPE:
+ case VALUE_TYPE:
+ item->setText(VALUE_COLUMN, value);
+ item->setExpandable(false);
+ break;
+
+ default:
+ break;
+ }
+}
+
+// **************************************************************************
+
+DataType RDBParser::determineType(char *buf)
+{
+ QRegExp array_re("(Array \\(\\d+ element\\(s\\)\\))");
+ QRegExp hash_re("(Hash \\(\\d+ element\\(s\\)\\))");
+ QRegExp string_re("(String \\(length \\d+\\))");
+
+ if (qstrncmp(buf, "#<struct", strlen("#<struct")) == 0) {
+ return STRUCT_TYPE;
+ } else if (qstrncmp(buf, "#<Qt::Color:0x", strlen("#<Qt::Color:0x")) == 0) {
+ return COLOR_TYPE;
+ } else if (qstrncmp(buf, "#<", strlen("#<")) == 0 && strstr(buf, "=") != 0) {
+ // An object instance reference is only expandable and a 'REFERENCE_TYPE'
+ // if it contains an '=' (ie it has at least one '@instance_variable=value').
+ // Otherwise, treat it as a 'VALUE_TYPE'.
+ return REFERENCE_TYPE;
+ } else if (array_re.search(buf) != -1) {
+ return ARRAY_TYPE;
+ } else if (hash_re.search(buf) != -1) {
+ return HASH_TYPE;
+ } else if (string_re.search(buf) != -1) {
+ return STRING_TYPE;
+ } else if (qstrncmp(buf, "nil", strlen("nil")) == 0) {
+// return UNKNOWN_TYPE;
+ return VALUE_TYPE;
+ } else {
+ return VALUE_TYPE;
+ }
+}
+
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+}
diff --git a/languages/ruby/debugger/rdbparser.h b/languages/ruby/debugger/rdbparser.h
new file mode 100644
index 00000000..12bc937e
--- /dev/null
+++ b/languages/ruby/debugger/rdbparser.h
@@ -0,0 +1,41 @@
+/***************************************************************************
+ begin : Tue Aug 17 1999
+ copyright : (C) 1999 by John Birch
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _RDBPARSER_H_
+#define _RDBPARSER_H_
+
+#include "variablewidget.h"
+
+namespace RDBDebugger
+{
+
+namespace RDBParser
+{
+ void parseVariables(LazyFetchItem *parent, char *buf);
+ void parseExpandedVariable(VarItem *parent, char *buf);
+ DataType determineType(char *buf);
+ void setItem( LazyFetchItem *parent, const QString &varName,
+ DataType dataType, const QCString &value );
+}
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/rdbtable.cpp b/languages/ruby/debugger/rdbtable.cpp
new file mode 100644
index 00000000..2f470b2d
--- /dev/null
+++ b/languages/ruby/debugger/rdbtable.cpp
@@ -0,0 +1,62 @@
+/***************************************************************************
+* Copyright (C) 2003 by Alexander Dymo *
+* *
+* *
+* Adapted for ruby debugging *
+* -------------------------- *
+* begin : Mon Nov 1 2004 *
+* copyright : (C) 2004 by Richard Dale *
+* email : [email protected] *
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation; either version 2 of the License, or *
+* (at your option) any later version. *
+***************************************************************************/
+#include "rdbtable.h"
+
+namespace RDBDebugger {
+
+RDBTable::RDBTable(QWidget *parent, const char *name)
+ : QTable(parent, name)
+{
+}
+
+RDBTable::RDBTable(int nr, int nc, QWidget * parent, const char * name)
+ : QTable(nr, nc, parent, name)
+{
+}
+
+RDBTable::~RDBTable()
+{
+}
+
+void RDBTable::keyPressEvent( QKeyEvent * e )
+{
+ emit keyPressed(e->key());
+
+ if (e->key() == Key_Return)
+ emit returnPressed();
+ else if (e->key() == Key_F2)
+ emit f2Pressed();
+ else if ((e->text() == QString("a")) && (e->state() == AltButton))
+ {
+ emit insertPressed();
+ return;
+ }
+ else if ((e->text() == QString("A")) && (e->state() == AltButton))
+ {
+ emit insertPressed();
+ return;
+ }
+ else if (e->key() == Key_Delete)
+ emit deletePressed();
+
+ QTable::keyPressEvent(e);
+}
+
+}
+
+#include "rdbtable.moc"
+
diff --git a/languages/ruby/debugger/rdbtable.h b/languages/ruby/debugger/rdbtable.h
new file mode 100644
index 00000000..04f47c2b
--- /dev/null
+++ b/languages/ruby/debugger/rdbtable.h
@@ -0,0 +1,45 @@
+/***************************************************************************
+* Copyright (C) 2003 by Alexander Dymo *
+* *
+* Adapted for ruby debugging *
+* -------------------------- *
+* begin : Mon Nov 1 2004 *
+* copyright : (C) 2004 by Richard Dale *
+* email : [email protected] *
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation; either version 2 of the License, or *
+* (at your option) any later version. *
+***************************************************************************/
+#ifndef RDBDEBUGGERRDBTABLE_H
+#define RDBDEBUGGERRDBTABLE_H
+
+#include <qtable.h>
+
+namespace RDBDebugger {
+
+class RDBTable : public QTable
+{
+Q_OBJECT
+public:
+ RDBTable(QWidget *parent = 0, const char *name = 0);
+ RDBTable( int numRows, int numCols, QWidget * parent = 0, const char * name = 0 );
+ ~RDBTable();
+
+ virtual void keyPressEvent ( QKeyEvent * e );
+
+signals:
+ void keyPressed(int key);
+
+ void returnPressed();
+ void f2Pressed();
+ void insertPressed();
+ void deletePressed();
+};
+
+}
+
+#endif
+
diff --git a/languages/ruby/debugger/stty.cpp b/languages/ruby/debugger/stty.cpp
new file mode 100644
index 00000000..44cb3795
--- /dev/null
+++ b/languages/ruby/debugger/stty.cpp
@@ -0,0 +1,370 @@
+/***************************************************************************
+ begin : Mon Sep 13 1999
+ copyright : (C) 1999 by John Birch
+
+ This code was originally written by Judin Maxim, from the
+ KDEStudio project.
+
+ It was then updated with later code from konsole (KDE).
+
+ It has also been enhanced with an idea from the code in kdbg
+ written by Johannes Sixt<[email protected]>
+
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef __osf__
+#define _XOPEN_SOURCE_EXTENDED
+#define O_NDELAY O_NONBLOCK
+#endif
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+
+#ifdef HAVE_SYS_STROPTS_H
+#include <sys/stropts.h>
+#define _NEW_TTY_CTRL
+#endif
+
+#include <assert.h>
+#include <fcntl.h>
+#include <grp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <termios.h>
+#include <time.h>
+#include <unistd.h>
+
+#if defined (_HPUX_SOURCE)
+#define _TERMIOS_INCLUDED
+#include <bsdtty.h>
+#endif
+
+#include <qintdict.h>
+#include <qsocketnotifier.h>
+#include <qstring.h>
+#include <qfile.h>
+
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kapplication.h>
+
+#include "stty.h"
+
+#define PTY_FILENO 3
+#define BASE_CHOWN "konsole_grantpty"
+
+namespace RDBDebugger
+{
+
+static int chownpty(int fd, int grant)
+// param fd: the fd of a master pty.
+// param grant: 1 to grant, 0 to revoke
+// returns 1 on success 0 on fail
+{
+ void(*tmp)(int) = signal(SIGCHLD,SIG_DFL);
+ pid_t pid = fork();
+ if (pid < 0) {
+ signal(SIGCHLD,tmp);
+ return 0;
+ }
+ if (pid == 0) {
+ /* We pass the master pseudo terminal as file descriptor PTY_FILENO. */
+ if (fd != PTY_FILENO && dup2(fd, PTY_FILENO) < 0)
+ ::exit(1);
+
+ QString path = locate("exe", BASE_CHOWN);
+ execle(QFile::encodeName(path), BASE_CHOWN, grant?"--grant":"--revoke", (void *)0, NULL);
+ ::exit(1); // should not be reached
+ }
+ if (pid > 0) {
+ int w;
+ // retry:
+ int rc = waitpid (pid, &w, 0);
+ if (rc != pid)
+ ::exit(1);
+
+ // { // signal from other child, behave like catchChild.
+ // // guess this gives quite some control chaos...
+ // Shell* sh = shells.find(rc);
+ // if (sh) { shells.remove(rc); sh->doneShell(w); }
+ // goto retry;
+ // }
+ signal(SIGCHLD,tmp);
+ return (rc != -1 && WIFEXITED(w) && WEXITSTATUS(w) == 0);
+ }
+ signal(SIGCHLD,tmp);
+ return 0; //dummy.
+}
+
+// **************************************************************************
+
+STTY::STTY(bool ext, const QString &termAppName)
+ : QObject(),
+ out(0),
+ err(0),
+ ttySlave(""),
+ pid_(0)
+{
+ if (ext) {
+ findExternalTTY(termAppName);
+ } else {
+ fout = findTTY();
+ if (fout >= 0) {
+ ttySlave = QString(tty_slave);
+ out = new QSocketNotifier(fout, QSocketNotifier::Read, this);
+ connect( out, SIGNAL(activated(int)), this, SLOT(OutReceived(int)) );
+ }
+ }
+}
+
+// **************************************************************************
+
+STTY::~STTY()
+{
+ if (pid_)
+ ::kill(pid_, SIGTERM);
+
+ if (out) {
+ ::close(fout);
+ delete out;
+ }
+
+ // if ( err )
+ // {
+ // ::close( ferr );
+ // delete err;
+ // }
+}
+
+// **************************************************************************
+
+int STTY::findTTY()
+{
+ int ptyfd = -1;
+ bool needGrantPty = TRUE;
+
+ // Find a master pty that we can open ////////////////////////////////
+
+#ifdef __sgi__
+ ptyfd = open("/dev/ptmx",O_RDWR);
+ if (ptyfd < 0) {
+ perror("Can't open a pseudo teletype");
+ return(-1);
+ }
+ strncpy(tty_slave, ptsname(ptyfd), 50);
+ grantpt(ptyfd);
+ unlockpt(ptyfd);
+ needGrantPty = FALSE;
+#endif
+
+ // first we try UNIX PTY's
+#ifdef TIOCGPTN
+ strcpy(pty_master,"/dev/ptmx");
+ strcpy(tty_slave,"/dev/pts/");
+ ptyfd = open(pty_master,O_RDWR);
+ if (ptyfd >= 0) { // got the master pty
+ int ptyno;
+ if (ioctl(ptyfd, TIOCGPTN, &ptyno) == 0) {
+ struct stat sbuf;
+ sprintf(tty_slave,"/dev/pts/%d",ptyno);
+ if (stat(tty_slave,&sbuf) == 0 && S_ISCHR(sbuf.st_mode))
+ needGrantPty = FALSE;
+ else {
+ close(ptyfd);
+ ptyfd = -1;
+ }
+ } else {
+ close(ptyfd);
+ ptyfd = -1;
+ }
+ }
+#endif
+
+#if defined(_SCO_DS) || defined(__USLC__) /* SCO OSr5 and UnixWare */
+ if (ptyfd < 0) {
+ for (int idx = 0; idx < 256; idx++)
+ { sprintf(pty_master, "/dev/ptyp%d", idx);
+ sprintf(tty_slave, "/dev/ttyp%d", idx);
+ if (access(tty_slave, F_OK) < 0) { idx = 256; break; }
+ if ((ptyfd = open (pty_master, O_RDWR)) >= 0)
+ { if (access (tty_slave, R_OK|W_OK) == 0) break;
+ close(ptyfd); ptyfd = -1;
+ }
+ }
+ }
+#endif
+ if (ptyfd < 0) { /// \FIXME Linux, Trouble on other systems?
+ for (const char* s3 = "pqrstuvwxyzabcde"; *s3 != 0; s3++) {
+ for (const char* s4 = "0123456789abcdef"; *s4 != 0; s4++) {
+ sprintf(pty_master,"/dev/pty%c%c",*s3,*s4);
+ sprintf(tty_slave,"/dev/tty%c%c",*s3,*s4);
+ if ((ptyfd = open(pty_master, O_RDWR)) >= 0) {
+ if (geteuid() == 0 || access(tty_slave, R_OK|W_OK) == 0)
+ break;
+
+ close(ptyfd);
+ ptyfd = -1;
+ }
+ }
+
+ if (ptyfd >= 0)
+ break;
+ }
+ }
+
+ if (ptyfd >= 0) {
+ if (needGrantPty && !chownpty(ptyfd, TRUE)) {
+ fprintf(stderr,"kdevelop: chownpty failed for device %s::%s.\n",pty_master,tty_slave);
+ fprintf(stderr," : This means the session can be eavesdroped.\n");
+ fprintf(stderr," : Make sure konsole_grantpty is installed and setuid root.\n");
+ }
+
+ ::fcntl(ptyfd, F_SETFL, O_NDELAY);
+#ifdef TIOCSPTLCK
+ int flag = 0;
+ ioctl(ptyfd, TIOCSPTLCK, &flag); // unlock pty
+#endif
+ }
+
+ return ptyfd;
+}
+
+// **************************************************************************
+
+void STTY::OutReceived(int f)
+{
+ char buf[1024];
+ int n;
+
+ // read until socket is empty. We shouldn't be receiving a continuous
+ // stream of data, so the loop is unlikely to cause problems.
+ while ((n = ::read(f, buf, sizeof(buf)-1)) > 0) {
+ *(buf+n) = 0; // a standard string
+ if ( f == fout )
+ emit OutOutput(buf);
+ else
+ emit ErrOutput(buf);
+ }
+}
+
+// **************************************************************************
+
+#define FIFO_FILE "/tmp/debug_tty.XXXXXX"
+
+bool STTY::findExternalTTY(const QString &termApp)
+{
+ QString appName(termApp.isEmpty() ? QString("xterm") : termApp);
+
+ char fifo[] = FIFO_FILE;
+ int fifo_fd;
+ if ((fifo_fd = mkstemp(fifo)) == -1)
+ return false;
+
+ ::close(fifo_fd);
+ ::unlink(fifo);
+
+ // create a fifo that will pass in the tty name
+#ifdef HAVE_MKFIFO
+ if (::mkfifo(fifo, S_IRUSR|S_IWUSR) < 0)
+#else
+ if (::mknod(fifo, S_IFIFO | S_IRUSR|S_IWUSR, 0) < 0)
+#endif
+ return false;
+
+ int pid = ::fork();
+ if (pid < 0) { // No process
+ ::unlink(fifo);
+ return false;
+ }
+
+ if (pid == 0) { // child process
+ /*
+ * Spawn a console that in turn runs a shell script that passes us
+ * back the terminal name and then only sits and waits.
+ */
+
+ const char* prog = appName.latin1();
+ QString script = QString("tty>") + QString(fifo) +
+ QString(";" // fifo name
+ "trap \"\" INT QUIT TSTP;" // ignore various signals
+ "exec<&-;exec>&-;" // close stdin and stdout
+ "while :;do sleep 3600;done");
+ const char* scriptStr = script.latin1();
+ const char* end = 0;
+
+ if ( termApp == "konsole" )
+ {
+ ::execlp( prog, prog,
+ "-caption", i18n("kdevelop: Debug application console").local8Bit().data(),
+ "-e", "sh",
+ "-c", scriptStr,
+ end);
+ }
+ else
+ {
+ ::execlp( prog, prog,
+ "-e", "sh",
+ "-c", scriptStr,
+ end);
+ }
+
+ // Should not get here, as above should always work
+ ::exit(1);
+ }
+
+ // parent process
+ if (pid <= 0)
+ ::exit(1);
+
+ // Open the communication between us (the parent) and the
+ // child (the process running on a tty console)
+ fifo_fd = ::open(fifo, O_RDONLY);
+ if (fifo_fd < 0)
+ return false;
+
+ // Get the ttyname from the fifo buffer that the child process
+ // has sent.
+ char ttyname[50];
+ int n = ::read(fifo_fd, ttyname, sizeof(ttyname)-sizeof(char));
+
+ ::close(fifo_fd);
+ ::unlink(fifo);
+
+ // No name??
+ if (n <= 0)
+ return false;
+
+ // remove whitespace
+ ttyname[n] = 0;
+ if (char* newline = strchr(ttyname, '\n'))
+ *newline = 0; // clobber the new line
+
+ ttySlave = ttyname;
+ pid_ = pid;
+
+ return true;
+}
+
+}
+
+// **************************************************************************
+#include "stty.moc"
diff --git a/languages/ruby/debugger/stty.h b/languages/ruby/debugger/stty.h
new file mode 100644
index 00000000..31c8fbfe
--- /dev/null
+++ b/languages/ruby/debugger/stty.h
@@ -0,0 +1,71 @@
+/***************************************************************************
+ begin : Mon Sep 13 1999
+ copyright : (C) 1999 by John Birch
+
+ This code was originally written by Judin Maxim, from the
+ KDEStudio project.
+
+ It was then updated with later code from konsole (KDE).
+
+ It has also been enhanced with an idea from the code in kdbg
+ written by Johannes Sixt<[email protected]>
+
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _STTY_H_
+#define _STTY_H_
+
+class QSocketNotifier;
+
+#include <qobject.h>
+#include <qstring.h>
+
+namespace RDBDebugger
+{
+
+class STTY : public QObject
+{
+ Q_OBJECT
+
+public:
+ STTY(bool ext=false, const QString &termAppName=QString());
+ ~STTY();
+
+ QString getSlave() { return ttySlave; };
+
+private slots:
+ void OutReceived(int);
+
+signals:
+ void OutOutput(const char *);
+ void ErrOutput(const char*);
+
+private:
+ int findTTY();
+ bool findExternalTTY(const QString &termApp);
+
+private:
+ int fout;
+ int ferr;
+ QSocketNotifier *out;
+ QSocketNotifier *err;
+ QString ttySlave;
+ int pid_;
+
+ char pty_master[50]; // "/dev/ptyxx" | "/dev/ptmx"
+ char tty_slave[50]; // "/dev/ttyxx" | "/dev/pts/########..."
+};
+
+}
+
+#endif
diff --git a/languages/ruby/debugger/variablewidget.cpp b/languages/ruby/debugger/variablewidget.cpp
new file mode 100644
index 00000000..0dbdce9a
--- /dev/null
+++ b/languages/ruby/debugger/variablewidget.cpp
@@ -0,0 +1,1018 @@
+// **************************************************************************
+// begin : Sun Aug 8 1999
+// copyright : (C) 1999 by John Birch
+// email : [email protected]
+//
+// Adapted for ruby debugging
+// --------------------------
+// begin : Mon Nov 1 2004
+// copyright : (C) 2004 by Richard Dale
+// email : [email protected]
+// **************************************************************************
+
+// **************************************************************************
+// * *
+// * This program is free software; you can redistribute it and/or modify *
+// * it under the terms of the GNU General Public License as published by *
+// * the Free Software Foundation; either version 2 of the License, or *
+// * (at your option) any later version. *
+// * *
+// **************************************************************************
+
+#include "variablewidget.h"
+#include "rdbparser.h"
+#include "rdbcommand.h"
+
+#include <kdebug.h>
+#include <kpopupmenu.h>
+#include <klineedit.h>
+#include <kdeversion.h>
+
+#include <qheader.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qhbox.h>
+#include <qpainter.h>
+#include <qpushbutton.h>
+#include <qregexp.h>
+#include <qcursor.h>
+#include <klocale.h>
+
+#include <qpoint.h>
+#include <qclipboard.h>
+#include <kapplication.h>
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+namespace RDBDebugger
+{
+
+VariableWidget::VariableWidget(QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+ varTree_ = new VariableTree(this);
+ QLabel *label = new QLabel(i18n("E&xpression to watch:"), this);
+
+ QHBox *watchEntry = new QHBox( this );
+ watchVarEditor_ = new KHistoryCombo( watchEntry, "var-to-watch editor");
+ label->setBuddy(watchVarEditor_);
+
+ QPushButton *addButton = new QPushButton(i18n("&Add"), watchEntry );
+ addButton->adjustSize();
+ addButton->setFixedWidth(addButton->width());
+
+ QBoxLayout * vbox = new QVBoxLayout();
+ vbox->addWidget( label );
+ vbox->addWidget( watchEntry );
+
+ QVBoxLayout *topLayout = new QVBoxLayout(this, 2);
+ topLayout->addWidget(varTree_, 10);
+ topLayout->addLayout( vbox );
+
+ connect( addButton, SIGNAL(clicked()), SLOT(slotAddWatchExpression()) );
+ connect( watchVarEditor_, SIGNAL(returnPressed()), SLOT(slotAddWatchExpression()) );
+}
+
+
+// **************************************************************************
+
+void VariableWidget::setEnabled(bool bEnabled)
+{
+ QWidget::setEnabled(bEnabled);
+ if (bEnabled && parentWidget() != 0) {
+ varTree_->setColumnWidth(0, parentWidget()->width()/2);
+ }
+}
+// **************************************************************************
+
+void VariableWidget::slotAddWatchExpression()
+{
+ QString watchVar(watchVarEditor_->currentText());
+ if (!watchVar.isEmpty()) {
+ slotAddWatchExpression(watchVar);
+ }
+}
+
+// **************************************************************************
+
+void VariableWidget::slotAddWatchExpression(const QString &ident)
+{
+ if (!ident.isEmpty()) {
+ watchVarEditor_->addToHistory(ident);
+ varTree_->slotAddWatchExpression(ident);
+ watchVarEditor_->clearEdit();
+ }
+}
+
+// **************************************************************************
+
+void VariableWidget::focusInEvent(QFocusEvent */*e*/)
+{
+ varTree_->setFocus();
+}
+
+void VariableWidget::restorePartialProjectSession(const QDomElement* el)
+{
+ varTree_->watchRoot()->restorePartialProjectSession(el);
+}
+
+void VariableWidget::savePartialProjectSession(QDomElement* el)
+{
+ varTree_->watchRoot()->savePartialProjectSession(el);
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+VariableTree::VariableTree(VariableWidget *parent, const char *name)
+ : KListView(parent, name),
+ QToolTip( viewport() ),
+ activationId_(0),
+ currentThread_(-1),
+ selectedFrame_(0),
+ watchRoot_(0),
+ globalRoot_(0)
+{
+ setRootIsDecorated(true);
+ setAllColumnsShowFocus(true);
+ setColumnWidthMode(0, Manual);
+ setSorting(VAR_NAME_COLUMN);
+ QListView::setSelectionMode(QListView::Single);
+
+ addColumn(i18n("Variable"), 100 );
+ addColumn(i18n("Value"), 100 );
+
+ connect( this, SIGNAL(contextMenu(KListView*, QListViewItem*, const QPoint&)),
+ SLOT(slotContextMenu(KListView*, QListViewItem*)) );
+
+ connect( this, SIGNAL(pressed(QListViewItem*)),
+ this, SLOT(slotPressed(QListViewItem*)) );
+
+ watchRoot_ = new WatchRoot(this);
+}
+
+// **************************************************************************
+
+VariableTree::~VariableTree()
+{
+}
+
+// **************************************************************************
+
+void VariableTree::clear()
+{
+ QListViewItem *sibling = firstChild();
+ while (sibling != 0) {
+ QListViewItem * current = sibling;
+ sibling = sibling->nextSibling();
+ if (current->rtti() != RTTI_WATCH_ROOT) {
+ delete current;
+ }
+ }
+
+ globalRoot_ = 0;
+ selectedFrame_ = 0;
+ return;
+}
+
+// **************************************************************************
+
+void VariableTree::slotContextMenu(KListView *, QListViewItem *item)
+{
+ if (item == 0)
+ return;
+
+ setSelected(item, true); // Need to select this item.
+
+ if (item->parent() != 0) {
+ KPopupMenu popup(this);
+ popup.insertTitle(item->text(VAR_NAME_COLUMN));
+ int idRemoveWatch = -2;
+ if (item->rtti() == RTTI_WATCH_VAR_ITEM) {
+ idRemoveWatch = popup.insertItem( i18n("Remove Watch Expression") );
+ }
+
+ int idCopyToClipboard = popup.insertItem( i18n("Copy to Clipboard") );
+ int res = popup.exec(QCursor::pos());
+
+ if (res == idRemoveWatch) {
+ emit removeWatchExpression(((WatchVarItem*)item)->displayId());
+ delete item;
+ } else if (res == idCopyToClipboard) {
+ QClipboard *qb = KApplication::clipboard();
+ QString text = "{ \"" + item->text( VAR_NAME_COLUMN ) + "\", " +
+ "\"" + item->text( VALUE_COLUMN ) + "\" }";
+
+ qb->setText( text, QClipboard::Clipboard );
+ }
+ }
+}
+
+/***************************************************************************/
+
+void VariableTree::setSelected(QListViewItem * item, bool selected)
+{
+ // Save the last selected VarFrameRoot for slotPressed() to restore
+ if (item->rtti() == RTTI_VAR_FRAME_ROOT && selected) {
+ selectedFrame_ = (VarFrameRoot *) item;
+ }
+
+ QListView::setSelected(item, selected);
+}
+
+/***************************************************************************/
+
+// Makes sure that only VarFrameRoot items can be selected
+void VariableTree::slotPressed(QListViewItem * item)
+{
+ if (item == 0) {
+ return;
+ }
+
+ while (item->rtti() == RTTI_VAR_ITEM) {
+ item = item->parent();
+ }
+
+ if ( item->rtti() == RTTI_GLOBAL_ROOT
+ || item->rtti() == RTTI_WATCH_ROOT
+ || item->rtti() == RTTI_WATCH_VAR_ITEM )
+ {
+ if (selectedFrame_ != 0) {
+ setSelected(selectedFrame_, true);
+ }
+ return;
+ }
+
+ if (item->rtti() == RTTI_VAR_FRAME_ROOT) {
+ VarFrameRoot * frame = (VarFrameRoot*) item;
+ emit selectFrame(frame->frameNo(), frame->threadNo());
+ }
+
+ return;
+}
+
+// **************************************************************************
+
+void VariableTree::prune()
+{
+ QListViewItem *child = firstChild();
+
+ while (child != 0) {
+ QListViewItem *nextChild = child->nextSibling();
+
+ // Only prune var frames, not the watch or global root
+ if (child->rtti() == RTTI_VAR_FRAME_ROOT) {
+ if (((VarFrameRoot*) child)->isActive()) {
+ if (child->isOpen()) {
+ ((VarFrameRoot*) child)->prune();
+ }
+ } else {
+ delete child;
+ }
+ }
+
+ child = nextChild;
+ }
+}
+
+// **************************************************************************
+
+// The debugger has moved onto the next program pause, so invalidate
+// everything in the Variable Tree
+void VariableTree::nextActivationId()
+{
+ activationId_++;
+ globalRoot()->setActivationId();
+ watchRoot()->setActivationId();
+ // ..but that's only the Watch and Global roots
+}
+
+// **************************************************************************
+
+// VarFrameRoot frames in the Variable Tree from the previous program pause,
+// are set active here. Notified by the Frame Stack widget when it parses the
+// backtrace from the 'where' command after a pause.
+//
+// After that, any frames which aren't marked as active must have gone
+// out of scope and will end up pruned.
+void VariableTree::slotFrameActive(int frameNo, int threadNo, const QString& frameName)
+{
+ VarFrameRoot * frame = findFrame(frameNo, threadNo);
+ if (frameNo == 1) {
+ // If the current frame 1 doesn't exist, create it
+ if (frame == 0) {
+ frame = new VarFrameRoot(this, frameNo, threadNo);
+ }
+
+ frame->setFrameName(frameName);
+ }
+
+ if (frame != 0 && frame->text(VAR_NAME_COLUMN) == frameName) {
+ frame->setActivationId();
+ }
+}
+
+// **************************************************************************
+
+bool VariableTree::schedule()
+{
+ QListViewItem * child = firstChild();
+ VarFrameRoot * frame = 0;
+
+ while (child != 0) {
+ if (child->rtti() == RTTI_VAR_FRAME_ROOT) {
+ frame = (VarFrameRoot *) child;
+ Q_ASSERT( !frame->isWaitingForData() );
+
+ if (frame->needsVariables()) {
+ if (QApplication::overrideCursor() == 0) {
+ QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
+ }
+
+ // Tell the controller to fetch the variable values
+ emit selectFrame(frame->frameNo(), frame->threadNo());
+ return true;
+ }
+ }
+
+ child = child->nextSibling();
+ }
+
+ frame = findFrame(1, currentThread_);
+ Q_ASSERT( frame != 0 );
+ Q_ASSERT( !frame->needsVariables() );
+
+ // All over, nothing left to fetch.
+ // Return to frame 1, and prune the inactive items
+ // from the variable tree..
+ QApplication::restoreOverrideCursor();
+ emit selectFrame(1, currentThread_);
+ prune();
+
+ return false;
+}
+
+// **************************************************************************
+
+void VariableTree::slotAddWatchExpression(const QString &watchVar)
+{
+ new WatchVarItem(watchRoot(), watchVar, UNKNOWN_TYPE);
+ emit addWatchExpression(watchVar, true);
+}
+
+
+// **************************************************************************
+
+void VariableTree::setFetchGlobals(bool fetch)
+{
+ emit fetchGlobals(fetch);
+}
+
+// **************************************************************************
+
+VarFrameRoot *VariableTree::findFrame(int frameNo, int threadNo) const
+{
+ // frames only exist on the top level so we only need to
+ // check the siblings
+ QListViewItem *sibling = firstChild();
+ while (sibling != 0) {
+ if ( sibling->rtti() == RTTI_VAR_FRAME_ROOT
+ && ((VarFrameRoot*) sibling)->frameNo() == frameNo
+ && ((VarFrameRoot*) sibling)->threadNo() == threadNo )
+ {
+ return (VarFrameRoot*) sibling;
+ }
+
+ sibling = sibling->nextSibling();
+ }
+
+ return 0;
+}
+
+// **************************************************************************
+
+WatchRoot *VariableTree::watchRoot()
+{
+ return watchRoot_;
+}
+
+// **************************************************************************
+
+GlobalRoot *VariableTree::globalRoot()
+{
+ if (globalRoot_ == 0) {
+ globalRoot_ = new GlobalRoot(this);
+ }
+
+ return globalRoot_;
+}
+
+// **************************************************************************
+
+// Watch variables can be added before the start of a debugging session,
+// so tell the controller about any already in the tree at start.
+void VariableTree::resetWatchVars()
+{
+ for (QListViewItem *child = watchRoot()->firstChild(); child != 0; child = child->nextSibling()) {
+ ((WatchVarItem*) child)->setDisplayId(-1);
+ emit addWatchExpression(child->text(VAR_NAME_COLUMN), false);
+ }
+}
+
+// **************************************************************************
+
+void VariableTree::maybeTip(const QPoint &p)
+{
+ VarItem * item = dynamic_cast<VarItem*>( itemAt(p) );
+ if (item != 0) {
+ QRect r = itemRect(item);
+ if (r.isValid()) {
+ tip(r, item->tipText());
+ }
+ }
+}
+
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+LazyFetchItem::LazyFetchItem(VariableTree *parent)
+ : KListViewItem(parent),
+ activationId_(0),
+ waitingForData_(false)
+{
+ setActivationId();
+}
+
+// **************************************************************************
+
+LazyFetchItem::LazyFetchItem(LazyFetchItem *parent)
+ : KListViewItem(parent),
+ activationId_(0),
+ waitingForData_(false)
+{
+ setActivationId();
+}
+
+// **************************************************************************
+
+LazyFetchItem::~LazyFetchItem()
+{
+}
+
+// **************************************************************************
+
+void LazyFetchItem::paintCell(QPainter *p, const QColorGroup &cg,
+ int column, int width, int align)
+{
+ if (p == 0) {
+ return;
+ }
+
+ // make toplevel item (watch and frame items) names bold
+ if (column == VAR_NAME_COLUMN && parent() == 0) {
+ QFont f = p->font();
+ f.setBold(true);
+ p->setFont(f);
+ }
+
+ QListViewItem::paintCell( p, cg, column, width, align );
+}
+
+// **************************************************************************
+
+VarItem *LazyFetchItem::findItem(const QString &name) const
+{
+ QListViewItem *child = firstChild();
+
+ // Check the siblings on this branch
+ while (child != 0) {
+ if (child->text(VAR_NAME_COLUMN) == name) {
+ return (VarItem*) child;
+ }
+
+ child = child->nextSibling();
+ }
+
+ return 0;
+}
+
+// **************************************************************************
+
+void LazyFetchItem::prune()
+{
+ QListViewItem *child = firstChild();
+
+ while (child != 0) {
+ LazyFetchItem *item = (LazyFetchItem*) child;
+ child = child->nextSibling();
+ // Never prune a branch if we are waiting on data to arrive.
+ if (!waitingForData_) {
+ if (item->isActive()) {
+ item->prune();
+ } else {
+ delete item;
+ }
+ }
+ }
+}
+
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+VarItem::VarItem(LazyFetchItem *parent, const QString &varName, DataType dataType)
+ : LazyFetchItem (parent),
+ cache_(QCString()),
+ dataType_(dataType),
+ highlight_(false)
+{
+ setText(VAR_NAME_COLUMN, varName);
+ setSelectable(false);
+
+ // Order the VarItems so that globals are first, then
+ // constants, class variables, instance variables and
+ // finally local variables
+
+ // Matches either an array element or a string slice,
+ // Order on the array index or the first number in the
+ // range specifying the slice.
+ QRegExp arrayelement_re("\\[(\\d+)(\\.\\.\\d+)?\\]");
+ key_ = varName;
+
+ if (arrayelement_re.search(varName) != -1) {
+ key_.sprintf("%.6d", arrayelement_re.cap(1).toInt());
+ } else if (key_.startsWith("$")) {
+ key_.prepend("1001"); // Global variable
+ } else if (QRegExp("^[A-Z]").search(varName) != -1) {
+ key_.prepend("1002"); // Constant
+ } else if (key_.startsWith("@@")) {
+ key_.prepend("1003"); // Class variable
+ } else if (key_.startsWith("@")) {
+ key_.prepend("1004"); // Instance variable
+ } else {
+ key_.prepend("1005"); // Local variable or parameter
+ }
+
+// kdDebug(9012) << " ### VarItem::VarItem *CONSTR* " << varName << endl;
+}
+
+// **************************************************************************
+
+VarItem::~VarItem()
+{
+}
+
+QString VarItem::key(int /*column*/, bool /*ascending*/) const
+{
+ return key_;
+}
+
+// **************************************************************************
+
+// Returns the path of a ruby item. If it is an instance variable, assume
+// that there is an attr_accessor method for it.
+// For example, @foobar within instance obj is accessed as obj.foobar.
+// But don't strip off the @ for an instance variable with no path,
+// and leave a plain '@foobar' as it is.
+QString VarItem::fullName() const
+{
+ QString itemName = text(VAR_NAME_COLUMN);
+ QString vPath("");
+ const VarItem *item = this;
+
+ if (item->parent()->rtti() != RTTI_VAR_ITEM) {
+ return itemName;
+ }
+
+ // This stops at the root item (FrameRoot or GlobalRoot)
+ while (item->rtti() == RTTI_VAR_ITEM) {
+ QString itemName = item->text(VAR_NAME_COLUMN);
+
+ if (vPath.startsWith("[")) {
+ // If it's a Hash or an Array, then just insert the value. As
+ // in adding '[0]' to foo.bar to give foo.bar[0]
+ vPath.prepend(itemName);
+ } else {
+ if (vPath.isEmpty()) {
+ vPath = itemName;
+ } else {
+ vPath.prepend(itemName + ".");
+ }
+ }
+ item = (VarItem*) item->parent();
+ }
+
+ // Change 'self.@foobar' to '@foobar'
+ vPath.replace(QRegExp("^self\\.@"), "@");
+
+ // Use instance_variable_get() to access any '@var's in the middle of a path
+ QRegExp re_instance_var("\\.(@[^\\[.]+)");
+ int pos = re_instance_var.search(vPath);
+ while (pos != -1) {
+ vPath.replace( pos,
+ re_instance_var.matchedLength(),
+ QString(".instance_variable_get(:") + re_instance_var.cap(1) + ")" );
+ pos = re_instance_var.search(vPath, pos);
+ }
+
+ return vPath;
+}
+
+// **************************************************************************
+
+void VarItem::setText(int column, const QString &data)
+{
+ setActivationId();
+
+ if (column == VALUE_COLUMN) {
+ highlight_ = (!text(VALUE_COLUMN).isEmpty() && text(VALUE_COLUMN) != data);
+ }
+
+ QListViewItem::setText(column, data);
+ repaint();
+}
+
+// **************************************************************************
+
+void VarItem::expandValue(char *buf)
+{
+ LazyFetchItem::stopWaitingForData();
+ RDBParser::parseExpandedVariable(this, buf);
+}
+
+// **************************************************************************
+
+void VarItem::setOpen(bool open)
+{
+ QListViewItem::setOpen(open);
+
+ Q_ASSERT( dataType_ == REFERENCE_TYPE
+ || dataType_ == ARRAY_TYPE
+ || dataType_ == HASH_TYPE
+ || dataType_ == STRING_TYPE
+ || dataType_ == STRUCT_TYPE );
+
+ update();
+ return;
+}
+
+// **************************************************************************
+
+void VarItem::update()
+{
+ if (isOpen()) {
+ startWaitingForData();
+// emit ((VariableTree*)listView())->expandItem(this, fullName().latin1());
+ ((VariableTree*)listView())->expandItem(this, fullName().latin1());
+ }
+
+ return;
+}
+
+// **************************************************************************
+
+DataType VarItem::dataType() const
+{
+ return dataType_;
+}
+
+// **************************************************************************
+
+void VarItem::setDataType(DataType dataType)
+{
+ dataType_ = dataType;
+}
+
+// **************************************************************************
+
+// Overridden to highlight the changed items
+void VarItem::paintCell(QPainter *p, const QColorGroup &cg,
+ int column, int width, int align)
+{
+ if (p == 0) {
+ return;
+ }
+
+ if (column == VALUE_COLUMN) {
+ // Show color values as colors, and make the text color the same
+ // as the base color
+ if (dataType_ == COLOR_TYPE) {
+ QRegExp color_re("\\s(#.*)>");
+
+ if (color_re.search(text(column)) != -1) {
+ QColorGroup color_cg( cg.foreground(), cg.background(),
+ cg.light(), cg.dark(), cg.mid(),
+ QColor(color_re.cap(1)), QColor(color_re.cap(1)) );
+ QListViewItem::paintCell(p, color_cg, column, width, align);
+ return;
+ }
+ }
+
+ // Highlight recently changed items in red
+ if (highlight_) {
+ QColorGroup hl_cg( cg.foreground(), cg.background(),
+ cg.light(), cg.dark(), cg.mid(),
+ red, cg.base() );
+ QListViewItem::paintCell(p, hl_cg, column, width, align);
+ return;
+ }
+ }
+
+ QListViewItem::paintCell(p, cg, column, width, align);
+ return;
+}
+
+// **************************************************************************
+
+QString VarItem::tipText() const
+{
+ const unsigned int MAX_TOOLTIP_SIZE = 70;
+ QString tip = text(VALUE_COLUMN);
+
+ if (tip.length() < MAX_TOOLTIP_SIZE) {
+ return tip;
+ } else {
+ return tip.mid(0, MAX_TOOLTIP_SIZE - 1) + " [...]";
+ }
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+VarFrameRoot::VarFrameRoot(VariableTree *parent, int frameNo, int threadNo)
+ : LazyFetchItem(parent),
+ needsVariables_(true),
+ frameNo_(frameNo),
+ threadNo_(threadNo),
+ cache_("")
+{
+ setExpandable(true);
+}
+
+// **************************************************************************
+
+VarFrameRoot::~VarFrameRoot()
+{
+}
+
+// **************************************************************************
+
+void VarFrameRoot::addLocals(char *variables)
+{
+ cache_.append(variables);
+}
+
+// **************************************************************************
+
+void VarFrameRoot::setLocals()
+{
+ RDBParser::parseVariables(this, cache_.data());
+ cache_ = "";
+ needsVariables_ = false;
+ stopWaitingForData();
+ prune();
+
+ return;
+}
+
+// **************************************************************************
+
+// Override setOpen so that we can decide what to do when we do change
+// state.
+void VarFrameRoot::setOpen(bool open)
+{
+ bool localsViewChanged = (isOpen() != open);
+ QListViewItem::setOpen(open);
+
+ if (localsViewChanged) {
+ ((VariableTree*)listView())->selectFrame(frameNo_, threadNo_);
+ }
+
+ return;
+}
+
+void VarFrameRoot::setFrameName(const QString &frameName)
+{
+ setText(VAR_NAME_COLUMN, frameName);
+ setText(VALUE_COLUMN, "");
+
+ return;
+}
+
+void VarFrameRoot::setActivationId()
+{
+ LazyFetchItem::setActivationId();
+ stopWaitingForData();
+ needsVariables_ = true;
+ cache_ = "";
+}
+
+bool VarFrameRoot::needsVariables() const
+{
+ return ( text(VAR_NAME_COLUMN).contains("try_initialize") == 0
+ && isOpen()
+ && !isWaitingForData()
+ && needsVariables_ );
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+
+GlobalRoot::GlobalRoot(VariableTree *parent)
+ : LazyFetchItem(parent)
+{
+ setText(0, i18n("Global"));
+ setExpandable(true);
+ setOpen(false);
+ setSelectable(false);
+}
+
+// **************************************************************************
+
+GlobalRoot::~GlobalRoot()
+{
+}
+
+// **************************************************************************
+
+void GlobalRoot::setGlobals(char * globals)
+{
+ setActivationId();
+ RDBParser::parseVariables(this, globals);
+
+ return;
+}
+
+// **************************************************************************
+
+void GlobalRoot::setOpen(bool open)
+{
+ bool globalsViewChanged = (isOpen() != open);
+ QListViewItem::setOpen(open);
+
+ if (globalsViewChanged) {
+ ((VariableTree*)listView())->setFetchGlobals(isOpen());
+ }
+
+ return;
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+WatchVarItem::WatchVarItem( LazyFetchItem *parent, const QString &varName, DataType dataType, int displayId )
+ : VarItem(parent, varName, dataType),
+ displayId_(displayId)
+{
+}
+
+// **************************************************************************
+
+WatchVarItem::~WatchVarItem()
+{
+}
+
+// **************************************************************************
+
+void WatchVarItem::setDisplayId(int id)
+{
+ displayId_ = id;
+}
+
+// **************************************************************************
+
+int WatchVarItem::displayId()
+{
+ return displayId_;
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+WatchRoot::WatchRoot(VariableTree *parent)
+ : LazyFetchItem(parent)
+{
+ setText(VAR_NAME_COLUMN, i18n("Watch"));
+ setOpen(true);
+ setSelectable(false);
+}
+
+// **************************************************************************
+
+WatchRoot::~WatchRoot()
+{
+}
+
+// **************************************************************************
+
+// Sets the initial value of a new Watch item, along with the
+// display id
+void WatchRoot::setWatchExpression(char * buf, char * expression)
+{
+ QString expr(expression);
+ QRegExp display_re("^(\\d+):\\s([^\n]+)\n");
+
+ for ( QListViewItem *child = firstChild();
+ child != 0;
+ child = child->nextSibling() )
+ {
+ WatchVarItem *varItem = (WatchVarItem*) child;
+ if ( varItem->text(VAR_NAME_COLUMN) == expr
+ && varItem->displayId() == -1
+ && display_re.search(buf) >= 0 )
+ {
+ varItem->setDisplayId(display_re.cap(1).toInt());
+ // Skip over the 'thing = ' part of expr to get the value
+ varItem->setText( VALUE_COLUMN,
+ display_re.cap(2).mid(varItem->text(VAR_NAME_COLUMN).length() + strlen(" = ")) );
+ return;
+ }
+ }
+}
+
+// After a program pause, this updates the new value of a Watch item
+// expr is the thing = value part of "1: a = 1", id is the display number
+void WatchRoot::updateWatchExpression(int id, const QString& expr)
+{
+ for ( QListViewItem *child = firstChild();
+ child != 0;
+ child = child->nextSibling() )
+ {
+ WatchVarItem *varItem = (WatchVarItem*) child;
+ if (varItem->displayId() == id) {
+ Q_ASSERT( expr.startsWith(varItem->text(VAR_NAME_COLUMN)) );
+ // Skip over the 'thing = ' part of expr to get the value
+ varItem->setText( VALUE_COLUMN,
+ expr.mid(varItem->text(VAR_NAME_COLUMN).length() + strlen(" = ")) );
+ return;
+ }
+ }
+}
+
+void WatchRoot::savePartialProjectSession(QDomElement* el)
+{
+ QDomDocument domDoc = el->ownerDocument();
+ if (domDoc.isNull()) {
+ return;
+ }
+
+ QDomElement watchEl = domDoc.createElement("watchExpressions");
+
+ for ( QListViewItem *child = firstChild();
+ child != 0;
+ child = child->nextSibling() )
+ {
+ QDomElement subEl = domDoc.createElement("el");
+ subEl.appendChild(domDoc.createTextNode(child->text(VAR_NAME_COLUMN)));
+ watchEl.appendChild(subEl);
+ }
+
+ if (!watchEl.isNull()) {
+ el->appendChild(watchEl);
+ }
+
+ return;
+}
+
+void WatchRoot::restorePartialProjectSession(const QDomElement* el)
+{
+ QDomDocument domDoc = el->ownerDocument();
+ if (domDoc.isNull()) {
+ return;
+ }
+
+ QDomElement watchEl = el->namedItem("watchExpressions").toElement();
+ QDomElement subEl = watchEl.firstChild().toElement();
+
+ while (!subEl.isNull()) {
+ new WatchVarItem(this, subEl.firstChild().toText().data(), UNKNOWN_TYPE);
+
+ subEl = subEl.nextSibling().toElement();
+ }
+
+ return;
+}
+
+// **************************************************************************
+// **************************************************************************
+// **************************************************************************
+
+}
+
+
+#include "variablewidget.moc"
+
diff --git a/languages/ruby/debugger/variablewidget.h b/languages/ruby/debugger/variablewidget.h
new file mode 100644
index 00000000..c608ec45
--- /dev/null
+++ b/languages/ruby/debugger/variablewidget.h
@@ -0,0 +1,348 @@
+/***************************************************************************
+ begin : Sun Aug 8 1999
+ copyright : (C) 1999 by John Birch
+
+ Adapted for ruby debugging
+ --------------------------
+ begin : Mon Nov 1 2004
+ copyright : (C) 2004 by Richard Dale
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _VARIABLEWIDGET_H_
+#define _VARIABLEWIDGET_H_
+
+#include "rdbcontroller.h"
+
+#include <klistview.h>
+#include <kcombobox.h>
+#include <qwidget.h>
+#include <qtooltip.h>
+#include <kdebug.h>
+
+class KLineEdit;
+
+namespace RDBDebugger
+{
+
+class LazyFetchItem;
+class VarFrameRoot;
+class GlobalRoot;
+class WatchRoot;
+class VarItem;
+class VariableTree;
+class DbgController;
+class Breakpoint;
+
+enum {
+ VAR_NAME_COLUMN = 0,
+ VALUE_COLUMN = 1
+};
+
+enum DataType {
+ UNKNOWN_TYPE,
+ VALUE_TYPE,
+ REFERENCE_TYPE,
+ ARRAY_TYPE,
+ HASH_TYPE,
+ STRUCT_TYPE,
+ COLOR_TYPE,
+ STRING_TYPE
+};
+
+class VariableWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ VariableWidget( QWidget *parent=0, const char *name=0 );
+
+ VariableTree *varTree() const
+ { return varTree_; }
+
+ virtual void setEnabled(bool b);
+
+ void restorePartialProjectSession(const QDomElement* el);
+ void savePartialProjectSession(QDomElement* el);
+
+protected:
+ virtual void focusInEvent(QFocusEvent *e);
+
+public slots:
+ void slotAddWatchExpression();
+ void slotAddWatchExpression(const QString &expr);
+
+private:
+ VariableTree *varTree_;
+ KHistoryCombo *watchVarEditor_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class VariableTree : public KListView, public QToolTip
+{
+ Q_OBJECT
+//we need this to be able to emit expandItem() from within LazyFetchItem
+friend class LazyFetchItem;
+
+public:
+ VariableTree( VariableWidget *parent, const char *name=0 );
+ virtual ~VariableTree();
+
+ // Clear everything but the Watch frame
+ void clear();
+
+ int activationId() const { return activationId_; }
+ void nextActivationId();
+
+ VarFrameRoot *findFrame(int frameNo, int threadNo) const;
+
+ GlobalRoot *globalRoot();
+ WatchRoot *watchRoot();
+
+ void resetWatchVars();
+ void setCurrentThread(int currentThread) { currentThread_ = currentThread; }
+
+ // Remove items that are not active
+ void prune();
+
+ // Look for a frame where 'needsVariables()' is true.
+ // If found, send commands to the debugger to fetch
+ // the variable values.
+ // Return true if a fetch has been scheduled, otherwise
+ // false.
+ bool schedule();
+
+ // Tell the controller whether or not to fetch the
+ // values of the global variables
+ void setFetchGlobals(bool fetch);
+
+ // (from QToolTip) Display a tooltip when the cursor is over an item
+ virtual void maybeTip(const QPoint &);
+
+ virtual void setSelected(QListViewItem * item, bool selected);
+
+signals:
+ void toggleWatchpoint(const QString &varName);
+ void selectFrame(int frame, int thread);
+ void expandItem(VarItem *item, const QCString &request);
+ void fetchGlobals(bool fetch);
+ void addWatchExpression(const QString& expr, bool execute);
+ void removeWatchExpression(int displayId);
+
+public slots:
+ void slotAddWatchExpression(const QString& watchVar);
+ void slotFrameActive(int frameNo, int threadNo, const QString& frameName);
+ void slotPressed(QListViewItem * item);
+
+private slots:
+ void slotContextMenu(KListView *, QListViewItem *item);
+
+private:
+ int activationId_;
+ int currentThread_;
+ VarFrameRoot * selectedFrame_;
+
+ WatchRoot * watchRoot_;
+ GlobalRoot * globalRoot_;
+
+ friend class VarFrameRoot;
+ friend class VarItem;
+ friend class WatchRoot;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class LazyFetchItem : public KListViewItem
+{
+public:
+ LazyFetchItem(VariableTree *parent);
+ LazyFetchItem(LazyFetchItem *parent);
+
+ virtual ~LazyFetchItem();
+
+ virtual int rtti() const { return RTTI_LAZY_FETCH_ITEM; }
+
+ virtual void prune();
+ virtual VarItem *findItem(const QString& name) const;
+
+ int currentActivationId() const { return ((VariableTree*) listView())->activationId(); }
+ virtual void setActivationId() { activationId_ = currentActivationId(); }
+ bool isActive() const { return activationId_ == currentActivationId(); }
+
+ void startWaitingForData() { waitingForData_ = true; }
+ void stopWaitingForData() { waitingForData_ = false; }
+ bool isWaitingForData() const { return waitingForData_; }
+
+protected:
+ void paintCell( QPainter *p, const QColorGroup &cg,
+ int column, int width, int align );
+
+private:
+ int activationId_;
+ bool waitingForData_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class VarItem : public LazyFetchItem
+{
+public:
+ VarItem( LazyFetchItem *parent, const QString &varName, DataType dataType );
+
+ virtual ~VarItem();
+
+ virtual int rtti() const { return RTTI_VAR_ITEM; }
+ virtual QString key(int column, bool ascending) const;
+
+ QString fullName() const;
+
+ DataType dataType() const;
+ void setDataType(DataType dataType);
+
+ void setOpen(bool open);
+ void setText (int column, const QString& text);
+
+ // Returns the text to be displayed as tooltip (the value)
+ QString tipText() const;
+
+ // If the item is open, fetch details via a pp command
+ void update();
+
+ // The details from the pp command have arrived, parse them
+ // and update the UI
+ void expandValue(char *data);
+
+private:
+ void paintCell( QPainter *p, const QColorGroup &cg,
+ int column, int width, int align );
+
+private:
+ QString key_;
+ QCString cache_;
+ DataType dataType_;
+ bool highlight_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class WatchVarItem : public VarItem
+{
+public:
+ WatchVarItem( LazyFetchItem *parent, const QString &varName, DataType dataType, int displayId = -1);
+
+ virtual ~WatchVarItem();
+
+ virtual int rtti() const { return RTTI_WATCH_VAR_ITEM; }
+
+ // The id returned by rdb after a display expression is added
+ void setDisplayId(int id);
+ int displayId();
+
+private:
+ int displayId_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class VarFrameRoot : public LazyFetchItem
+{
+public:
+ VarFrameRoot(VariableTree *parent, int frame, int thread);
+ virtual ~VarFrameRoot();
+
+ virtual int rtti() const { return RTTI_VAR_FRAME_ROOT; }
+
+ virtual QString key(int column, bool /*ascending*/) const {
+ return QString("%1%2").arg(RTTI_VAR_FRAME_ROOT).arg(text(column));
+ }
+
+ void addLocals(char *variables);
+ void setLocals();
+ void setOpen(bool open);
+
+ void setFrameName(const QString &frameName);
+
+ virtual void setActivationId();
+ bool needsVariables() const;
+
+ int frameNo() { return frameNo_; }
+ int threadNo() { return threadNo_; }
+
+private:
+ bool needsVariables_;
+ int frameNo_;
+ int threadNo_;
+ QCString cache_;
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class WatchRoot : public LazyFetchItem
+{
+public:
+ WatchRoot(VariableTree * parent);
+ virtual ~WatchRoot();
+
+ virtual int rtti() const { return RTTI_WATCH_ROOT; }
+
+ virtual QString key(int column, bool /*ascending*/) const {
+ return QString("%1%2").arg(RTTI_WATCH_ROOT).arg(text(column));
+ }
+
+ void setWatchExpression(char * buf, char * expr);
+ void updateWatchExpression(int id, const QString& expr);
+
+ void restorePartialProjectSession(const QDomElement* el);
+ void savePartialProjectSession(QDomElement* el);
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+class GlobalRoot : public LazyFetchItem
+{
+public:
+ GlobalRoot(VariableTree * parent);
+ virtual ~GlobalRoot();
+
+ virtual int rtti() const { return RTTI_GLOBAL_ROOT; }
+
+ virtual QString key(int column, bool /*ascending*/) const {
+ return QString("%1%2").arg(RTTI_GLOBAL_ROOT).arg(text(column));
+ }
+
+ void setOpen(bool open);
+ void setGlobals(char * globals);
+};
+
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+
+}
+
+#endif
diff --git a/languages/ruby/doc/Makefile.am b/languages/ruby/doc/Makefile.am
new file mode 100644
index 00000000..245b8fe5
--- /dev/null
+++ b/languages/ruby/doc/Makefile.am
@@ -0,0 +1,6 @@
+tocdir = ${kde_datadir}/kdevdocumentation/tocs
+toc_DATA = ruby.toc ruby_bugs.toc qtruby.toc rails.toc
+
+#indexdir = ${kde_datadir}/devdoctreeview/indices
+#index_DATA = ruby.index
+
diff --git a/languages/ruby/doc/qtruby.toc b/languages/ruby/doc/qtruby.toc
new file mode 100644
index 00000000..85fc3836
--- /dev/null
+++ b/languages/ruby/doc/qtruby.toc
@@ -0,0 +1,9 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>QtRuby and Korundum</title>
+<base href="http://developer.kde.org/language-bindings/ruby/"/>
+<tocsect1 name="Qt Tutorial #1" url="tutorial/tutorial.html"></tocsect1>
+<tocsect1 name="Qt Tutorial #2" url="tutorial2/tutorial2.html"></tocsect1>
+<tocsect1 name="Qt Designer Tutorial" url="colortooltutorial/designer-manual-3.html"></tocsect1>
+<tocsect1 name="KDE 3.0 Tutorial" url="kde3tutorial/index.html"></tocsect1>
+</kdeveloptoc>
diff --git a/languages/ruby/doc/rails.toc b/languages/ruby/doc/rails.toc
new file mode 100644
index 00000000..6f92fcd6
--- /dev/null
+++ b/languages/ruby/doc/rails.toc
@@ -0,0 +1,9 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>Rails</title>
+<base href="http://"/>
+<tocsect1 name="Rails Site" url="rubyonrails.org/"></tocsect1>
+<tocsect1 name="Rails API Reference" url="api.rubyonrails.com/"></tocsect1>
+<tocsect1 name="Wiki" url="wiki.rubyonrails.org/"></tocsect1>
+<tocsect1 name="Bug tracker" url="dev.rubyonrails.org/"></tocsect1>
+</kdeveloptoc>
diff --git a/languages/ruby/doc/ruby.toc b/languages/ruby/doc/ruby.toc
new file mode 100644
index 00000000..bce60158
--- /dev/null
+++ b/languages/ruby/doc/ruby.toc
@@ -0,0 +1,1399 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>Ruby</title>
+<base href="http://www.ruby-doc.org/docs/ProgrammingRuby/"/>
+<tocsect1 name="Pickaxe Book" url="">
+<tocsect2 name="Contents" url="html/index.html"></tocsect2>
+<tocsect2 name="Foreword" url="html/foreword.html"></tocsect2>
+<tocsect2 name="Preface" url="html/preface.html"></tocsect2>
+<tocsect2 name="Roadmap" url="html/roadmap.html"></tocsect2>
+<tocsect2 name="Ruby.new" url="html/intro.html"></tocsect2>
+<tocsect2 name="Classes, Objects, and Variables" url="html/tut_classes.html"></tocsect2>
+<tocsect2 name="Containers, Blocks, and Iterators" url="html/tut_containers.html"></tocsect2>
+<tocsect2 name="Standard Types" url="html/tut_stdtypes.html"></tocsect2>
+<tocsect2 name="More About Methods" url="html/tut_methods.html"></tocsect2>
+<tocsect2 name="Expressions" url="html/tut_expressions.html"></tocsect2>
+<tocsect2 name="Exceptions, Catch, and Throw" url="html/tut_exceptions.html"></tocsect2>
+<tocsect2 name="Modules" url="html/tut_modules.html"></tocsect2>
+<tocsect2 name="Basic Input and Output" url="html/tut_io.html"></tocsect2>
+<tocsect2 name="Threads and Processes" url="html/tut_threads.html"></tocsect2>
+<tocsect2 name="When Trouble Strikes" url="html/trouble.html"></tocsect2>
+<tocsect2 name="Ruby and Its World" url="html/rubyworld.html"></tocsect2>
+<tocsect2 name="Ruby and the Web" url="html/web.html"></tocsect2>
+<tocsect2 name="Ruby Tk" url="html/ext_tk.html"></tocsect2>
+<tocsect2 name="Ruby and Microsoft Windows" url="html/win32.html"></tocsect2>
+<tocsect2 name="Extending Ruby" url="html/ext_ruby.html"></tocsect2>
+<tocsect2 name="The Ruby Language" url="html/language.html"></tocsect2>
+<tocsect2 name="Classes and Objects" url="html/classes.html"></tocsect2>
+<tocsect2 name="Locking Ruby in the Safe" url="html/taint.html"></tocsect2>
+<tocsect2 name="Reflection, ObjectSpace, and Distributed Ruby" url="html/ospace.html"></tocsect2>
+<tocsect2 name="Built-in Classes and Methods" url="html/builtins.html"></tocsect2>
+<tocsect2 name="Standard Library" url="html/lib_standard.html"></tocsect2>
+<tocsect2 name="Object-Oriented Design Libraries" url="html/lib_patterns.html"></tocsect2>
+<tocsect2 name="Network and Web Libraries" url="html/lib_network.html"></tocsect2>
+<tocsect2 name="Microsoft Windows Support" url="html/lib_windows.html"></tocsect2>
+<tocsect2 name="Embedded Documentation" url="html/rdtool.html"></tocsect2>
+<tocsect2 name="Interactive Ruby Shell" url="html/irb.html"></tocsect2>
+<tocsect2 name="Support" url="html/support.html"></tocsect2>
+</tocsect1>
+<index>
+<entry name="$CFLAGS (mkmf)" url="html/lib_standard.html#mkmf.$CFLAGS"/>
+<entry name="$LDFLAGS (mkmf)" url="html/lib_standard.html#mkmf.$LDFLAGS"/>
+<entry name="% (String)" url="html/ref_c_string.html#String._pc"/>
+<entry name="&amp; (Array)" url="html/ref_c_array.html#Array._et"/>
+<entry name="&amp; (FalseClass)" url="html/ref_c_falseclass.html#FalseClass._et"/>
+<entry name="&amp; (NilClass)" url="html/ref_c_nilclass.html#NilClass._et"/>
+<entry name="&amp; (TrueClass)" url="html/ref_c_trueclass.html#TrueClass._et"/>
+<entry name="* (Array)" url="html/ref_c_array.html#Array._st"/>
+<entry name="* (String)" url="html/ref_c_string.html#String._st"/>
+<entry name="+ (Array)" url="html/ref_c_array.html#Array._pl"/>
+<entry name="+ (Date)" url="html/lib_standard.html#Date._pl"/>
+<entry name="+ (String)" url="html/ref_c_string.html#String._pl"/>
+<entry name="+ (Time)" url="html/ref_c_time.html#Time._pl"/>
+<entry name="+@ (Numeric)" url="html/ref_c_numeric.html#Numeric._pl_at"/>
+<entry name="- (Array)" url="html/ref_c_array.html#Array._mi"/>
+<entry name="- (Time)" url="html/ref_c_time.html#Time._mi"/>
+<entry name="-- (Array)" url="html/ref_c_array.html#Array._mi_mi"/>
+<entry name="-- (Date)" url="html/lib_standard.html#Date._mi_mi"/>
+<entry name="-- (Time)" url="html/ref_c_time.html#Time._mi_mi"/>
+<entry name="--@ (Numeric)" url="html/ref_c_numeric.html#Numeric._mi_mi_at"/>
+<entry name="-@ (Numeric)" url="html/ref_c_numeric.html#Numeric._mi_at"/>
+<entry name="&lt;, &lt;=, &gt;, &gt;= (Module)" url="html/ref_c_module.html#Module._lt_cm_lt_eq_cm_lt_cm_lt_eq"/>
+<entry name="&lt;&lt; (Array)" url="html/ref_c_array.html#Array._lt_lt"/>
+<entry name="&lt;&lt; (Date)" url="html/lib_standard.html#Date._lt_lt"/>
+<entry name="&lt;&lt; (IO)" url="html/ref_c_io.html#IO._lt_lt"/>
+<entry name="&lt;&lt; (String)" url="html/ref_c_string.html#String._lt_lt"/>
+<entry name="&lt;=&gt; (Array)" url="html/ref_c_array.html#Array._lt_eq_lt"/>
+<entry name="&lt;=&gt; (Bignum)" url="html/ref_c_bignum.html#Bignum._lt_eq_lt"/>
+<entry name="&lt;=&gt; (Complex)" url="html/lib_standard.html#Complex._lt_eq_lt"/>
+<entry name="&lt;=&gt; (Date)" url="html/lib_standard.html#Date._lt_eq_lt"/>
+<entry name="&lt;=&gt; (File::Stat)" url="html/ref_c_file__stat.html#File::Stat._lt_eq_lt"/>
+<entry name="&lt;=&gt; (Fixnum)" url="html/ref_c_fixnum.html#Fixnum._lt_eq_lt"/>
+<entry name="&lt;=&gt; (Float)" url="html/ref_c_float.html#Float._lt_eq_lt"/>
+<entry name="&lt;=&gt; (Module)" url="html/ref_c_module.html#Module._lt_eq_lt"/>
+<entry name="&lt;=&gt; (String)" url="html/ref_c_string.html#String._lt_eq_lt"/>
+<entry name="&lt;=&gt; (Time)" url="html/ref_c_time.html#Time._lt_eq_lt"/>
+<entry name="== (Array)" url="html/ref_c_array.html#Array._eq_eq"/>
+<entry name="== (Comparable)" url="html/ref_m_comparable.html#Comparable._eq_eq"/>
+<entry name="== (Complex)" url="html/lib_standard.html#Complex._eq_eq"/>
+<entry name="== (Hash)" url="html/ref_c_hash.html#Hash._eq_eq"/>
+<entry name="== (Object)" url="html/ref_c_object.html#Object._eq_eq"/>
+<entry name="== (Regexp)" url="html/ref_c_regexp.html#Regexp._eq_eq"/>
+<entry name="== (String)" url="html/ref_c_string.html#String._eq_eq"/>
+<entry name="== (Struct)" url="html/ref_c_struct.html#Struct._eq_eq"/>
+<entry name="=== (Array)" url="html/ref_c_array.html#Array._eq_eq_eq"/>
+<entry name="=== (Date)" url="html/lib_standard.html#Date._eq_eq_eq"/>
+<entry name="=== (Module)" url="html/ref_c_module.html#Module._eq_eq_eq"/>
+<entry name="=== (Object)" url="html/ref_c_object.html#Object._eq_eq_eq"/>
+<entry name="=== (Range)" url="html/ref_c_range.html#Range._eq_eq_eq"/>
+<entry name="=== (Regexp)" url="html/ref_c_regexp.html#Regexp._eq_eq_eq"/>
+<entry name="=== (String)" url="html/ref_c_string.html#String._eq_eq_eq"/>
+<entry name="=~ (Object)" url="html/ref_c_object.html#Object._eq_sd"/>
+<entry name="=~ (Regexp)" url="html/ref_c_regexp.html#Regexp._eq_sd"/>
+<entry name="=~ (String)" url="html/ref_c_string.html#String._eq_sd"/>
+<entry name="&gt;&gt; (Date)" url="html/lib_standard.html#Date._lt_lt"/>
+<entry name="abort (Kernel)" url="html/ref_m_kernel.html#Kernel.abort"/>
+<entry name="abort (PStore)" url="html/lib_standard.html#PStore.abort"/>
+<entry name="abort_on_exception (Thread)" url="html/ref_c_thread.html#Thread.abort_on_exception"/>
+<entry name="abort_on_exception= (Thread)" url="html/ref_c_thread.html#Thread.abort_on_exception_eq"/>
+<entry name="abs (Complex)" url="html/lib_standard.html#Complex.abs"/>
+<entry name="abs (Numeric)" url="html/ref_c_numeric.html#Numeric.abs"/>
+<entry name="abs2 (Complex)" url="html/lib_standard.html#Complex.abs2"/>
+<entry name="accept (Socket)" url="html/lib_network.html#Socket.accept"/>
+<entry name="accept (TCPServer)" url="html/lib_network.html#TCPServer.accept"/>
+<entry name="accept (UNIXServer)" url="html/lib_network.html#UNIXServer.accept"/>
+<entry name="Access Control (classes)" url="html/tut_classes.html#S4"/>
+<entry name="Accessors (Date)" url="html/lib_standard.html#Date.Accessors"/>
+<entry name="Acknowledgments (preface)" url="html/preface.html#S9"/>
+<entry name="add (ThreadGroup)" url="html/ref_c_threadgroup.html#ThreadGroup.add"/>
+<entry name="Adding Information to Exceptions (exceptions)" url="html/tut_exceptions.html#UC"/>
+<entry name="addr (IPSocket)" url="html/lib_network.html#IPSocket.addr"/>
+<entry name="addr (UNIXSocket)" url="html/lib_network.html#UNIXSocket.addr"/>
+<entry name="alias_method (Module)" url="html/ref_c_module.html#Module.alias_method"/>
+<entry name="alive? (Thread)" url="html/ref_c_thread.html#Thread.alive_qm"/>
+<entry name="all (Net::POPMail)" url="html/lib_network.html#Net::POPMail.all"/>
+<entry name="Alternation (stdtypes)" url="html/tut_stdtypes.html#UI"/>
+<entry name="An Example (ruby)" url="html/ext_ruby.html#UF"/>
+<entry name="An Example (win32)" url="html/win32.html#UD"/>
+<entry name="ancestors (Module)" url="html/ref_c_module.html#Module.ancestors"/>
+<entry name="Anchors (stdtypes)" url="html/tut_stdtypes.html#UF"/>
+<entry name="append_features (Module)" url="html/ref_c_module.html#Module.append_features"/>
+<entry name="arg (Complex)" url="html/lib_standard.html#Complex.arg"/>
+<entry name="ARGV (rubyworld)" url="html/rubyworld.html#UB"/>
+<entry name="Arithmetic operations (Bignum)" url="html/ref_c_bignum.html#Bignum.Arithmeticoperations"/>
+<entry name="Arithmetic operations (Complex)" url="html/lib_standard.html#Complex.Arithmeticoperations"/>
+<entry name="Arithmetic operations (Fixnum)" url="html/ref_c_fixnum.html#Fixnum.Arithmeticoperations"/>
+<entry name="Arithmetic operations (Float)" url="html/ref_c_float.html#Float.Arithmeticoperations"/>
+<entry name="arity (Method)" url="html/ref_c_method.html#Method.arity"/>
+<entry name="arity (Proc)" url="html/ref_c_proc.html#Proc.arity"/>
+<entry name="Array" url="html/ref_c_array.html"/>
+<entry name="Array (Kernel)" url="html/ref_m_kernel.html#Kernel.Array"/>
+<entry name="Arrays (containers)" url="html/tut_containers.html#UA"/>
+<entry name="Arrays (language)" url="html/language.html#UF"/>
+<entry name="Arrays and Hashes (intro)" url="html/intro.html#S3"/>
+<entry name="asctime (Time)" url="html/ref_c_time.html#Time.asctime"/>
+<entry name="Assignment (expressions)" url="html/tut_expressions.html#S3"/>
+<entry name="assoc (Array)" url="html/ref_c_array.html#Array.assoc"/>
+<entry name="at (Array)" url="html/ref_c_array.html#Array.at"/>
+<entry name="at (Time)" url="html/ref_c_time.html#Time.at"/>
+<entry name="atan2 (Math)" url="html/ref_m_math.html#Math.atan2"/>
+<entry name="atime (File)" url="html/ref_c_file.html#File.atime"/>
+<entry name="atime (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.atime"/>
+<entry name="attr (Module)" url="html/ref_c_module.html#Module.attr"/>
+<entry name="attr_accessor (Module)" url="html/ref_c_module.html#Module.attr_accessor"/>
+<entry name="attr_reader (Module)" url="html/ref_c_module.html#Module.attr_reader"/>
+<entry name="attr_writer (Module)" url="html/ref_c_module.html#Module.attr_writer"/>
+<entry name="at_exit (Kernel)" url="html/ref_m_kernel.html#Kernel.at_exit"/>
+<entry name="autoload (Kernel)" url="html/ref_m_kernel.html#Kernel.autoload"/>
+<entry name="Backquotes Are Soft (expressions)" url="html/tut_expressions.html#UB"/>
+<entry name="Backslash Sequences in the Substitution (stdtypes)" url="html/tut_stdtypes.html#UL"/>
+<entry name="backtrace (Exception)" url="html/ref_c_exception.html#Exception.backtrace"/>
+<entry name="basename (File)" url="html/ref_c_file.html#File.basename"/>
+<entry name="Basic Input and Output (io)" url="html/tut_io.html"/>
+<entry name="begin (MatchData)" url="html/ref_c_matchdata.html#MatchData.begin"/>
+<entry name="begin (Range)" url="html/ref_c_range.html#Range.begin"/>
+<entry name="BEGIN and END Blocks (language)" url="html/language.html#UA"/>
+<entry name="between? (Comparable)" url="html/ref_m_comparable.html#Comparable.between_qm"/>
+<entry name="Bignum" url="html/ref_c_bignum.html"/>
+<entry name="bind (Socket)" url="html/lib_network.html#Socket.bind"/>
+<entry name="bind (UDPSocket)" url="html/lib_network.html#UDPSocket.bind"/>
+<entry name="Binding" url="html/ref_c_binding.html"/>
+<entry name="binding (Kernel)" url="html/ref_m_kernel.html#Kernel.binding"/>
+<entry name="Binding Events (tk)" url="html/ext_tk.html#S3"/>
+<entry name="binmode (IO)" url="html/ref_c_io.html#IO.binmode"/>
+<entry name="binmode (Net::Telnet)" url="html/lib_network.html#Net::Telnet.binmode"/>
+<entry name="binmode= (Net::Telnet)" url="html/lib_network.html#Net::Telnet.binmode_eq"/>
+<entry name="Bit operations (Bignum)" url="html/ref_c_bignum.html#Bignum.Bitoperations"/>
+<entry name="Bit operations (Fixnum)" url="html/ref_c_fixnum.html#Fixnum.Bitoperations"/>
+<entry name="blksize (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.blksize"/>
+<entry name="blockdev? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.blockdev_qm"/>
+<entry name="blockdev? (FileTest)" url="html/ref_m_filetest.html#FileTest.blockdev_qm"/>
+<entry name="blocks (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.blocks"/>
+<entry name="Blocks and Iterators (containers)" url="html/tut_containers.html#S2"/>
+<entry name="Blocks and Iterators (intro)" url="html/intro.html#S6"/>
+<entry name="Blocks and Subprocesses (threads)" url="html/tut_threads.html#UI"/>
+<entry name="Blocks Can Be Closures (containers)" url="html/tut_containers.html#UG"/>
+<entry name="Blocks for Transactions (containers)" url="html/tut_containers.html#UF"/>
+<entry name="block_given? (Kernel)" url="html/ref_m_kernel.html#Kernel.block_given_qm"/>
+<entry name="Boolean Expressions (expressions)" url="html/tut_expressions.html#UF"/>
+<entry name="Break, Redo, and Next (expressions)" url="html/tut_expressions.html#UL"/>
+<entry name="Bridging Ruby to Other Languages (ruby)" url="html/ext_ruby.html#S7"/>
+<entry name="broadcast (ConditionVariable)" url="html/lib_standard.html#ConditionVariable.broadcast"/>
+<entry name="Bug Reporting (support)" url="html/support.html#S5"/>
+<entry name="Build Environment (rubyworld)" url="html/rubyworld.html#S5"/>
+<entry name="Building Ruby (preface)" url="html/preface.html#UA"/>
+<entry name="Built-in Classes and Methods (builtins)" url="html/builtins.html"/>
+<entry name="But I Miss My C++ Iostream (io)" url="html/tut_io.html#UC"/>
+<entry name="But It Doesn't Work! (trouble)" url="html/trouble.html#S3"/>
+<entry name="But It's Too Slow! (trouble)" url="html/trouble.html#S4"/>
+<entry name="call (Continuation)" url="html/ref_c_continuation.html#Continuation.call"/>
+<entry name="call (Method)" url="html/ref_c_method.html#Method.call"/>
+<entry name="call (Proc)" url="html/ref_c_proc.html#Proc.call"/>
+<entry name="Call (Win32API)" url="html/lib_windows.html#Win32API.Call"/>
+<entry name="call (Win32API)" url="html/lib_windows.html#Win32API.call"/>
+<entry name="callcc (Kernel)" url="html/ref_m_kernel.html#Kernel.callcc"/>
+<entry name="caller (Kernel)" url="html/ref_m_kernel.html#Kernel.caller"/>
+<entry name="Calling a Method (methods)" url="html/tut_methods.html#S2"/>
+<entry name="Calling Methods Dynamically (ospace)" url="html/ospace.html#S3"/>
+<entry name="Canvas (tk)" url="html/ext_tk.html#S4"/>
+<entry name="capitalize (String)" url="html/ref_c_string.html#String.capitalize"/>
+<entry name="capitalize! (String)" url="html/ref_c_string.html#String.capitalize_oh"/>
+<entry name="Case Expressions (expressions)" url="html/tut_expressions.html#S5"/>
+<entry name="casefold? (Regexp)" url="html/ref_c_regexp.html#Regexp.casefold_qm"/>
+<entry name="catch (Kernel)" url="html/ref_m_kernel.html#Kernel.catch"/>
+<entry name="Catch and Throw (exceptions)" url="html/tut_exceptions.html#S4"/>
+<entry name="ceil (Float)" url="html/ref_c_float.html#Float.ceil"/>
+<entry name="center (String)" url="html/ref_c_string.html#String.center"/>
+<entry name="CGI Development (network)" url="html/lib_network.html#S3"/>
+<entry name="Character Classes (stdtypes)" url="html/tut_stdtypes.html#UG"/>
+<entry name="chardev? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.chardev_qm"/>
+<entry name="chardev? (FileTest)" url="html/ref_m_filetest.html#FileTest.chardev_qm"/>
+<entry name="chdir (Dir)" url="html/ref_c_dir.html#Dir.chdir"/>
+<entry name="chmod (File)" url="html/ref_c_file.html#File.chmod"/>
+<entry name="chomp (Kernel)" url="html/ref_m_kernel.html#Kernel.chomp"/>
+<entry name="chomp (String)" url="html/ref_c_string.html#String.chomp"/>
+<entry name="chomp! (Kernel)" url="html/ref_m_kernel.html#Kernel.chomp_oh"/>
+<entry name="chomp! (String)" url="html/ref_c_string.html#String.chomp_oh"/>
+<entry name="chop (Kernel)" url="html/ref_m_kernel.html#Kernel.chop"/>
+<entry name="chop (String)" url="html/ref_c_string.html#String.chop"/>
+<entry name="chop! (Kernel)" url="html/ref_m_kernel.html#Kernel.chop_oh"/>
+<entry name="chop! (String)" url="html/ref_c_string.html#String.chop_oh"/>
+<entry name="chown (File)" url="html/ref_c_file.html#File.chown"/>
+<entry name="chr (Integer)" url="html/ref_c_integer.html#Integer.chr"/>
+<entry name="chroot (Dir)" url="html/ref_c_dir.html#Dir.chroot"/>
+<entry name="Class" url="html/ref_c_class.html"/>
+<entry name="class (Object)" url="html/ref_c_object.html#Object.class"/>
+<entry name="Class and Module Definitions (classes)" url="html/classes.html#S2"/>
+<entry name="Class Methods (classes)" url="html/tut_classes.html#UE"/>
+<entry name="Class Names Are Constants (classes)" url="html/classes.html#UE"/>
+<entry name="Class Variables (classes)" url="html/tut_classes.html#UD"/>
+<entry name="Class Variables and Class Methods (classes)" url="html/tut_classes.html#S3"/>
+<entry name="Classes and Objects (classes)" url="html/classes.html"/>
+<entry name="Classes, Objects, and Variables (classes)" url="html/tut_classes.html"/>
+<entry name="class_eval (Module)" url="html/ref_c_module.html#Module.class_eval"/>
+<entry name="class_variables (Module)" url="html/ref_c_module.html#Module.class_variables"/>
+<entry name="clear (Array)" url="html/ref_c_array.html#Array.clear"/>
+<entry name="clear (Hash)" url="html/ref_c_hash.html#Hash.clear"/>
+<entry name="clone (IO)" url="html/ref_c_io.html#IO.clone"/>
+<entry name="clone (Module)" url="html/ref_c_module.html#Module.clone"/>
+<entry name="clone (Object)" url="html/ref_c_object.html#Object.clone"/>
+<entry name="close (Dir)" url="html/ref_c_dir.html#Dir.close"/>
+<entry name="close (IO)" url="html/ref_c_io.html#IO.close"/>
+<entry name="close (Net::FTP)" url="html/lib_network.html#Net::FTP.close"/>
+<entry name="close (SOCKSSocket)" url="html/lib_network.html#SOCKSSocket.close"/>
+<entry name="close (Tempfile)" url="html/lib_standard.html#Tempfile.close"/>
+<entry name="closed? (IO)" url="html/ref_c_io.html#IO.closed_qm"/>
+<entry name="closed? (Net::FTP)" url="html/lib_network.html#Net::FTP.closed_qm"/>
+<entry name="close_read (BasicSocket)" url="html/lib_network.html#BasicSocket.close_read"/>
+<entry name="close_read (IO)" url="html/ref_c_io.html#IO.close_read"/>
+<entry name="close_write (BasicSocket)" url="html/lib_network.html#BasicSocket.close_write"/>
+<entry name="close_write (IO)" url="html/ref_c_io.html#IO.close_write"/>
+<entry name="cmd (Net::Telnet)" url="html/lib_network.html#Net::Telnet.cmd"/>
+<entry name="cmp (File)" url="html/lib_standard.html#File.cmp"/>
+<entry name="code (Net::HTTPResponse)" url="html/lib_network.html#Net::HTTPResponse.code"/>
+<entry name="coerce (Numeric)" url="html/ref_c_numeric.html#Numeric.coerce"/>
+<entry name="collect (Array)" url="html/ref_c_array.html#Array.collect"/>
+<entry name="collect (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.collect"/>
+<entry name="collect! (Array)" url="html/ref_c_array.html#Array.collect_oh"/>
+<entry name="Collecting Hash Arguments (methods)" url="html/tut_methods.html#UE"/>
+<entry name="Command Expansion (expressions)" url="html/tut_expressions.html#UA"/>
+<entry name="Command Line (irb)" url="html/irb.html#S1"/>
+<entry name="Command-Line Arguments (rubyworld)" url="html/rubyworld.html#S1"/>
+<entry name="Command-Line Options (rubyworld)" url="html/rubyworld.html#UA"/>
+<entry name="Commands (irb)" url="html/irb.html#S3"/>
+<entry name="commit (PStore)" url="html/lib_standard.html#PStore.commit"/>
+<entry name="compact (Array)" url="html/ref_c_array.html#Array.compact"/>
+<entry name="compact! (Array)" url="html/ref_c_array.html#Array.compact_oh"/>
+<entry name="Comparable" url="html/ref_m_comparable.html"/>
+<entry name="compare (File)" url="html/ref_c_file.html#File.compare"/>
+<entry name="Comparisons (Comparable)" url="html/ref_m_comparable.html#Comparable.Comparisons"/>
+<entry name="compile (Regexp)" url="html/ref_c_regexp.html#Regexp.compile"/>
+<entry name="Compile Time? Runtime? Anytime! (ospace)" url="html/ospace.html#S7"/>
+<entry name="concat (Array)" url="html/ref_c_array.html#Array.concat"/>
+<entry name="concat (String)" url="html/ref_c_string.html#String.concat"/>
+<entry name="Condition Variables (threads)" url="html/tut_threads.html#UF"/>
+<entry name="Conditional Execution (expressions)" url="html/tut_expressions.html#S4"/>
+<entry name="Configuring the Prompt (irb)" url="html/irb.html#UA"/>
+<entry name="conjugate (Complex)" url="html/lib_standard.html#Complex.conjugate"/>
+<entry name="connect (Net::FTP)" url="html/lib_network.html#Net::FTP.connect"/>
+<entry name="connect (Socket)" url="html/lib_network.html#Socket.connect"/>
+<entry name="connect (UDPSocket)" url="html/lib_network.html#UDPSocket.connect"/>
+<entry name="connect (WIN32OLE)" url="html/lib_windows.html#WIN32OLE.connect"/>
+<entry name="constants (Module)" url="html/ref_c_module.html#Module.constants"/>
+<entry name="const_defined? (Module)" url="html/ref_c_module.html#Module.const_defined_qm"/>
+<entry name="const_get (Module)" url="html/ref_c_module.html#Module.const_get"/>
+<entry name="const_load (WIN32OLE)" url="html/lib_windows.html#WIN32OLE.const_load"/>
+<entry name="const_set (Module)" url="html/ref_c_module.html#Module.const_set"/>
+<entry name="Containers" url="html/tut_containers.html#S1"/>
+<entry name="Containers, Blocks, and Iterators (containers)" url="html/tut_containers.html"/>
+<entry name="Continuation" url="html/ref_c_continuation.html"/>
+<entry name="Control Structures (intro)" url="html/intro.html#S4"/>
+<entry name="Controlling the Thread Scheduler (threads)" url="html/tut_threads.html#S2"/>
+<entry name="cookies (CGI)" url="html/lib_network.html#CGI.cookies"/>
+<entry name="Cookies (web)" url="html/web.html#UE"/>
+<entry name="copy (File)" url="html/ref_c_file.html#File.copy"/>
+<entry name="cos (Math)" url="html/ref_m_math.html#Math.cos"/>
+<entry name="count (String)" url="html/ref_c_string.html#String.count"/>
+<entry name="cp (File)" url="html/lib_standard.html#File.cp"/>
+<entry name="Create Locals Outside Blocks (trouble)" url="html/trouble.html#UB"/>
+<entry name="create_makefile (mkmf)" url="html/lib_standard.html#mkmf.create_makefile"/>
+<entry name="Creating a Makefile with extconf.rb (ruby)" url="html/ext_ruby.html#UG"/>
+<entry name="Creating an Extension (ruby)" url="html/ext_ruby.html#S5"/>
+<entry name="Creating Forms and HTML (web)" url="html/web.html#UD"/>
+<entry name="Creating Ruby Threads (threads)" url="html/tut_threads.html#UA"/>
+<entry name="critical (Thread)" url="html/ref_c_thread.html#Thread.critical"/>
+<entry name="critical= (Thread)" url="html/ref_c_thread.html#Thread.critical_eq"/>
+<entry name="Cross References (rdtool)" url="html/rdtool.html#S2"/>
+<entry name="crypt (String)" url="html/ref_c_string.html#String.crypt"/>
+<entry name="ctime (File)" url="html/ref_c_file.html#File.ctime"/>
+<entry name="ctime (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.ctime"/>
+<entry name="ctime (Time)" url="html/ref_c_time.html#Time.ctime"/>
+<entry name="current (Thread)" url="html/ref_c_thread.html#Thread.current"/>
+<entry name="Custom Serialization Strategy (ospace)" url="html/ospace.html#UF"/>
+<entry name="day (Time)" url="html/ref_c_time.html#Time.day"/>
+<entry name="debug_mode (Net::FTP)" url="html/lib_network.html#Net::FTP.debug_mode"/>
+<entry name="debug_mode= (Net::FTP)" url="html/lib_network.html#Net::FTP.debug_mode_eq"/>
+<entry name="default (Hash)" url="html/ref_c_hash.html#Hash.default"/>
+<entry name="Default (ThreadGroup)" url="html/ref_c_threadgroup.html#ThreadGroup.Default"/>
+<entry name="default= (Hash)" url="html/ref_c_hash.html#Hash.default_eq"/>
+<entry name="Defined?, And, Or, and Not (expressions)" url="html/tut_expressions.html#UG"/>
+<entry name="define_finalizer (ObjectSpace)" url="html/ref_m_objectspace.html#ObjectSpace.define_finalizer"/>
+<entry name="Defining a Method (methods)" url="html/tut_methods.html#S1"/>
+<entry name="delete (Array)" url="html/ref_c_array.html#Array.delete"/>
+<entry name="delete (CGI::Session)" url="html/lib_network.html#CGI::Session.delete"/>
+<entry name="delete (Dir)" url="html/ref_c_dir.html#Dir.delete"/>
+<entry name="delete (File)" url="html/ref_c_file.html#File.delete"/>
+<entry name="delete (Hash)" url="html/ref_c_hash.html#Hash.delete"/>
+<entry name="delete (Net::POPMail)" url="html/lib_network.html#Net::POPMail.delete"/>
+<entry name="delete (String)" url="html/ref_c_string.html#String.delete"/>
+<entry name="delete! (Net::POPMail)" url="html/lib_network.html#Net::POPMail.delete_oh"/>
+<entry name="delete! (String)" url="html/ref_c_string.html#String.delete_oh"/>
+<entry name="delete_at (Array)" url="html/ref_c_array.html#Array.delete_at"/>
+<entry name="delete_if (Array)" url="html/ref_c_array.html#Array.delete_if"/>
+<entry name="delete_if (Hash)" url="html/ref_c_hash.html#Hash.delete_if"/>
+<entry name="detect (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.detect"/>
+<entry name="dev (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.dev"/>
+<entry name="Dir" url="html/ref_c_dir.html"/>
+<entry name="dir (Net::FTP)" url="html/lib_network.html#Net::FTP.dir"/>
+<entry name="Directly Sharing Variables (ruby)" url="html/ext_ruby.html#UD"/>
+<entry name="directory? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.directory_qm"/>
+<entry name="directory? (FileTest)" url="html/ref_m_filetest.html#FileTest.directory_qm"/>
+<entry name="dirname (File)" url="html/ref_c_file.html#File.dirname"/>
+<entry name="dir_config (mkmf)" url="html/lib_standard.html#mkmf.dir_config"/>
+<entry name="disable (GC)" url="html/ref_m_gc.html#GC.disable"/>
+<entry name="display (Object)" url="html/ref_c_object.html#Object.display"/>
+<entry name="Distributed Ruby (ospace)" url="html/ospace.html#UG"/>
+<entry name="divmod (Numeric)" url="html/ref_c_numeric.html#Numeric.divmod"/>
+<entry name="downcase (String)" url="html/ref_c_string.html#String.downcase"/>
+<entry name="downcase! (String)" url="html/ref_c_string.html#String.downcase_oh"/>
+<entry name="Download Sites (support)" url="html/support.html#S2"/>
+<entry name="downto (Date)" url="html/lib_standard.html#Date.downto"/>
+<entry name="downto (Integer)" url="html/ref_c_integer.html#Integer.downto"/>
+<entry name="do_not_reverse_lookup (BasicSocket)" url="html/lib_network.html#BasicSocket.do_not_reverse_lookup"/>
+<entry name="do_not_reverse_lookup= (BasicSocket)" url="html/lib_network.html#BasicSocket.do_not_reverse_lookup_eq"/>
+<entry name="dump (Marshal)" url="html/ref_m_marshal.html#Marshal.dump"/>
+<entry name="dump (String)" url="html/ref_c_string.html#String.dump"/>
+<entry name="dup (Object)" url="html/ref_c_object.html#Object.dup"/>
+<entry name="E (Math)" url="html/ref_m_math.html#Math.E"/>
+<entry name="each (Array)" url="html/ref_c_array.html#Array.each"/>
+<entry name="each (Dir)" url="html/ref_c_dir.html#Dir.each"/>
+<entry name="each (GetoptLong)" url="html/lib_standard.html#GetoptLong.each"/>
+<entry name="each (Hash)" url="html/ref_c_hash.html#Hash.each"/>
+<entry name="each (IO)" url="html/ref_c_io.html#IO.each"/>
+<entry name="each (Net::HTTPResponse)" url="html/lib_network.html#Net::HTTPResponse.each"/>
+<entry name="each (Net::POP)" url="html/lib_network.html#Net::POP.each"/>
+<entry name="each (Range)" url="html/ref_c_range.html#Range.each"/>
+<entry name="each (String)" url="html/ref_c_string.html#String.each"/>
+<entry name="each (Struct)" url="html/ref_c_struct.html#Struct.each"/>
+<entry name="each (WIN32OLE)" url="html/lib_windows.html#WIN32OLE.each"/>
+<entry name="each_byte (IO)" url="html/ref_c_io.html#IO.each_byte"/>
+<entry name="each_byte (String)" url="html/ref_c_string.html#String.each_byte"/>
+<entry name="each_index (Array)" url="html/ref_c_array.html#Array.each_index"/>
+<entry name="each_key (Hash)" url="html/ref_c_hash.html#Hash.each_key"/>
+<entry name="each_line (IO)" url="html/ref_c_io.html#IO.each_line"/>
+<entry name="each_line (String)" url="html/ref_c_string.html#String.each_line"/>
+<entry name="each_object (ObjectSpace)" url="html/ref_m_objectspace.html#ObjectSpace.each_object"/>
+<entry name="each_pair (Hash)" url="html/ref_c_hash.html#Hash.each_pair"/>
+<entry name="each_value (Hash)" url="html/ref_c_hash.html#Hash.each_value"/>
+<entry name="each_with_index (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.each_with_index"/>
+<entry name="Editor Support (trouble)" url="html/trouble.html#UA"/>
+<entry name="egid (Process)" url="html/ref_m_process.html#Process.egid"/>
+<entry name="egid= (Process)" url="html/ref_m_process.html#Process.egid_eq"/>
+<entry name="Embedded Documentation (rdtool)" url="html/rdtool.html"/>
+<entry name="Embedding a Ruby Interpreter (ruby)" url="html/ext_ruby.html#S6"/>
+<entry name="Embedding Ruby in HTML (web)" url="html/web.html#S2"/>
+<entry name="empty? (Array)" url="html/ref_c_array.html#Array.empty_qm"/>
+<entry name="empty? (Hash)" url="html/ref_c_hash.html#Hash.empty_qm"/>
+<entry name="empty? (String)" url="html/ref_c_string.html#String.empty_qm"/>
+<entry name="enable (GC)" url="html/ref_m_gc.html#GC.enable"/>
+<entry name="end (MatchData)" url="html/ref_c_matchdata.html#MatchData.end"/>
+<entry name="end (Range)" url="html/ref_c_range.html#Range.end"/>
+<entry name="england (Date)" url="html/lib_standard.html#Date.england"/>
+<entry name="entries (Dir)" url="html/ref_c_dir.html#Dir.entries"/>
+<entry name="entries (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.entries"/>
+<entry name="Enumerable" url="html/ref_m_enumerable.html"/>
+<entry name="Environment Variables (rubyworld)" url="html/rubyworld.html#S3"/>
+<entry name="eof (IO)" url="html/ref_c_io.html#IO.eof"/>
+<entry name="eof? (IO)" url="html/ref_c_io.html#IO.eof_qm"/>
+<entry name="eql? (Array)" url="html/ref_c_array.html#Array.eql_qm"/>
+<entry name="eql? (Numeric)" url="html/ref_c_numeric.html#Numeric.eql_qm"/>
+<entry name="eql? (Object)" url="html/ref_c_object.html#Object.eql_qm"/>
+<entry name="equal? (Object)" url="html/ref_c_object.html#Object.equal_qm"/>
+<entry name="Errno" url="html/ref_m_errno.html"/>
+<entry name="error? (GetoptLong)" url="html/lib_standard.html#GetoptLong.error_qm"/>
+<entry name="error_message (GetoptLong)" url="html/lib_standard.html#GetoptLong.error_message"/>
+<entry name="escape (CGI)" url="html/lib_network.html#CGI.escape"/>
+<entry name="escape (Regexp)" url="html/ref_c_regexp.html#Regexp.escape"/>
+<entry name="escapeElement (CGI)" url="html/lib_network.html#CGI.escapeElement"/>
+<entry name="escapeHTML (CGI)" url="html/lib_network.html#CGI.escapeHTML"/>
+<entry name="euid (Process)" url="html/ref_m_process.html#Process.euid"/>
+<entry name="euid= (Process)" url="html/ref_m_process.html#Process.euid_eq"/>
+<entry name="eval (Kernel)" url="html/ref_m_kernel.html#Kernel.eval"/>
+<entry name="Evaluating Ruby Expressions in C (ruby)" url="html/ext_ruby.html#UC"/>
+<entry name="Exception" url="html/ref_c_exception.html"/>
+<entry name="exception" url="html/ref_c_exception.html#Exception.exception"/>
+<entry name="Exceptions, Catch, and Throw (exceptions)" url="html/tut_exceptions.html"/>
+<entry name="exclude_end? (Range)" url="html/ref_c_range.html#Range.exclude_end_qm"/>
+<entry name="exec (Kernel)" url="html/ref_m_kernel.html#Kernel.exec"/>
+<entry name="executable? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.executable_qm"/>
+<entry name="executable? (FileTest)" url="html/ref_m_filetest.html#FileTest.executable_qm"/>
+<entry name="executable_real? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.executable_real_qm"/>
+<entry name="executable_real? (FileTest)" url="html/ref_m_filetest.html#FileTest.executable_real_qm"/>
+<entry name="exist2? (Date)" url="html/lib_standard.html#Date.exist2_qm"/>
+<entry name="exist? (Date)" url="html/lib_standard.html#Date.exist_qm"/>
+<entry name="exist? (FileTest)" url="html/ref_m_filetest.html#FileTest.exist_qm"/>
+<entry name="exists? (FileTest)" url="html/ref_m_filetest.html#FileTest.exists_qm"/>
+<entry name="existw? (Date)" url="html/lib_standard.html#Date.existw_qm"/>
+<entry name="exit (Kernel)" url="html/ref_m_kernel.html#Kernel.exit"/>
+<entry name="exit (Thread)" url="html/ref_c_thread.html#Thread.exit"/>
+<entry name="exit! (Kernel)" url="html/ref_m_kernel.html#Kernel.exit_oh"/>
+<entry name="exit! (Process)" url="html/ref_m_process.html#Process.exit_oh"/>
+<entry name="exp (Math)" url="html/ref_m_math.html#Math.exp"/>
+<entry name="Expanding Arrays in Method Calls (methods)" url="html/tut_methods.html#UC"/>
+<entry name="expand_path (File)" url="html/ref_c_file.html#File.expand_path"/>
+<entry name="Expressions" url="html/tut_expressions.html"/>
+<entry name="extend (Object)" url="html/ref_c_object.html#Object.extend"/>
+<entry name="EXTENDED (Regexp)" url="html/ref_c_regexp.html#Regexp.EXTENDED"/>
+<entry name="Extending Objects (classes)" url="html/classes.html#UD"/>
+<entry name="Extending Ruby (ruby)" url="html/ext_ruby.html"/>
+<entry name="extend_object (Module)" url="html/ref_c_module.html#Module.extend_object"/>
+<entry name="Extensions (language)" url="html/language.html#UN"/>
+<entry name="fail (Kernel)" url="html/ref_m_kernel.html#Kernel.fail"/>
+<entry name="FalseClass" url="html/ref_c_falseclass.html"/>
+<entry name="fcntl (IO)" url="html/ref_c_io.html#IO.fcntl"/>
+<entry name="fetch (Hash)" url="html/ref_c_hash.html#Hash.fetch"/>
+<entry name="File" url="html/ref_c_file.html"/>
+<entry name="file? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.file_qm"/>
+<entry name="file? (FileTest)" url="html/ref_m_filetest.html#FileTest.file_qm"/>
+<entry name="fileno (IO)" url="html/ref_c_io.html#IO.fileno"/>
+<entry name="FileTest" url="html/ref_m_filetest.html"/>
+<entry name="fill (Array)" url="html/ref_c_array.html#Array.fill"/>
+<entry name="find" url="html/lib_standard.html#Find.find"/>
+<entry name="find (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.find"/>
+<entry name="find_all (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.find_all"/>
+<entry name="find_library (mkmf)" url="html/lib_standard.html#mkmf.find_library"/>
+<entry name="finish (Net::POP)" url="html/lib_network.html#Net::POP.finish"/>
+<entry name="finite? (Float)" url="html/ref_c_float.html#Float.finite_qm"/>
+<entry name="first (Array)" url="html/ref_c_array.html#Array.first"/>
+<entry name="first (Range)" url="html/ref_c_range.html#Range.first"/>
+<entry name="Fixnum" url="html/ref_c_fixnum.html"/>
+<entry name="flatten (Array)" url="html/ref_c_array.html#Array.flatten"/>
+<entry name="flatten! (Array)" url="html/ref_c_array.html#Array.flatten_oh"/>
+<entry name="Float" url="html/ref_c_float.html"/>
+<entry name="Float (Kernel)" url="html/ref_m_kernel.html#Kernel.Float"/>
+<entry name="flock (File)" url="html/ref_c_file.html#File.flock"/>
+<entry name="floor (Float)" url="html/ref_c_float.html#Float.floor"/>
+<entry name="flush (IO)" url="html/ref_c_io.html#IO.flush"/>
+<entry name="For ... In (expressions)" url="html/tut_expressions.html#UK"/>
+<entry name="for each (win32)" url="html/win32.html#UC"/>
+<entry name="foreach (Dir)" url="html/ref_c_dir.html#Dir.foreach"/>
+<entry name="foreach (IO)" url="html/ref_c_io.html#IO.foreach"/>
+<entry name="Foreword" url="html/foreword.html"/>
+<entry name="fork (Kernel)" url="html/ref_m_kernel.html#Kernel.fork"/>
+<entry name="fork (Process)" url="html/ref_m_process.html#Process.fork"/>
+<entry name="fork (Thread)" url="html/ref_c_thread.html#Thread.fork"/>
+<entry name="format (Kernel)" url="html/ref_m_kernel.html#Kernel.format"/>
+<entry name="Forms (web)" url="html/web.html#UC"/>
+<entry name="for_fd (Socket)" url="html/lib_network.html#Socket.for_fd"/>
+<entry name="freeze (Object)" url="html/ref_c_object.html#Object.freeze"/>
+<entry name="Freezing Objects (classes)" url="html/classes.html#S5"/>
+<entry name="frexp (Math)" url="html/ref_m_math.html#Math.frexp"/>
+<entry name="frozen? (Object)" url="html/ref_c_object.html#Object.frozen_qm"/>
+<entry name="FTP_PORT (Net::FTP)" url="html/lib_network.html#Net::FTP.FTP_PORT"/>
+<entry name="ftype (File)" url="html/ref_c_file.html#File.ftype"/>
+<entry name="ftype (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.ftype"/>
+<entry name="garbage_collect (GC)" url="html/ref_m_gc.html#GC.garbage_collect"/>
+<entry name="garbage_collect (ObjectSpace)" url="html/ref_m_objectspace.html#ObjectSpace.garbage_collect"/>
+<entry name="GC" url="html/ref_m_gc.html"/>
+<entry name="General Delimited Input (language)" url="html/language.html#UB"/>
+<entry name="get (GetoptLong)" url="html/lib_standard.html#GetoptLong.get"/>
+<entry name="get (Net::HTTP)" url="html/lib_network.html#Net::HTTP.get"/>
+<entry name="getaddress (IPSocket)" url="html/lib_network.html#IPSocket.getaddress"/>
+<entry name="getaddrinfo (Socket)" url="html/lib_network.html#Socket.getaddrinfo"/>
+<entry name="getbinaryfile (Net::FTP)" url="html/lib_network.html#Net::FTP.getbinaryfile"/>
+<entry name="getc (IO)" url="html/ref_c_io.html#IO.getc"/>
+<entry name="gethostbyaddr (Socket)" url="html/lib_network.html#Socket.gethostbyaddr"/>
+<entry name="gethostbyname (Socket)" url="html/lib_network.html#Socket.gethostbyname"/>
+<entry name="gethostbyname (TCPSocket)" url="html/lib_network.html#TCPSocket.gethostbyname"/>
+<entry name="gethostname (Socket)" url="html/lib_network.html#Socket.gethostname"/>
+<entry name="getnameinfo (Socket)" url="html/lib_network.html#Socket.getnameinfo"/>
+<entry name="getpeername (BasicSocket)" url="html/lib_network.html#BasicSocket.getpeername"/>
+<entry name="getpgid (Process)" url="html/ref_m_process.html#Process.getpgid"/>
+<entry name="getpgrp (Process)" url="html/ref_m_process.html#Process.getpgrp"/>
+<entry name="getpriority (Process)" url="html/ref_m_process.html#Process.getpriority"/>
+<entry name="gets (IO)" url="html/ref_c_io.html#IO.gets"/>
+<entry name="gets (Kernel)" url="html/ref_m_kernel.html#Kernel.gets"/>
+<entry name="getservbyname (Socket)" url="html/lib_network.html#Socket.getservbyname"/>
+<entry name="getsockname (BasicSocket)" url="html/lib_network.html#BasicSocket.getsockname"/>
+<entry name="getsockopt (BasicSocket)" url="html/lib_network.html#BasicSocket.getsockopt"/>
+<entry name="gettextfile (Net::FTP)" url="html/lib_network.html#Net::FTP.gettextfile"/>
+<entry name="Getting and Setting Properties (win32)" url="html/win32.html#UA"/>
+<entry name="Getting Widget Data (tk)" url="html/ext_tk.html#UB"/>
+<entry name="getwd (Dir)" url="html/ref_c_dir.html#Dir.getwd"/>
+<entry name="get_option (GetoptLong)" url="html/lib_standard.html#GetoptLong.get_option"/>
+<entry name="gid (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.gid"/>
+<entry name="gid (Process)" url="html/ref_m_process.html#Process.gid"/>
+<entry name="gid= (Process)" url="html/ref_m_process.html#Process.gid_eq"/>
+<entry name="glob (Dir)" url="html/ref_c_dir.html#Dir.glob"/>
+<entry name="global_variables (Kernel)" url="html/ref_m_kernel.html#Kernel.global_variables"/>
+<entry name="gm (Time)" url="html/ref_c_time.html#Time.gm"/>
+<entry name="gmt? (Time)" url="html/ref_c_time.html#Time.gmt_qm"/>
+<entry name="gmtime (Time)" url="html/ref_c_time.html#Time.gmtime"/>
+<entry name="gregorian (Date)" url="html/lib_standard.html#Date.gregorian"/>
+<entry name="gregorian_leap? (Date)" url="html/lib_standard.html#Date.gregorian_leap_qm"/>
+<entry name="grep (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.grep"/>
+<entry name="Grouping (stdtypes)" url="html/tut_stdtypes.html#UJ"/>
+<entry name="grpowned? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.grpowned_qm"/>
+<entry name="grpowned? (FileTest)" url="html/ref_m_filetest.html#FileTest.grpowned_qm"/>
+<entry name="gsub (Kernel)" url="html/ref_m_kernel.html#Kernel.gsub"/>
+<entry name="gsub (String)" url="html/ref_c_string.html#String.gsub"/>
+<entry name="gsub! (Kernel)" url="html/ref_m_kernel.html#Kernel.gsub_oh"/>
+<entry name="gsub! (String)" url="html/ref_c_string.html#String.gsub_oh"/>
+<entry name="Handling Exceptions (exceptions)" url="html/tut_exceptions.html#S2"/>
+<entry name="Hash" url="html/ref_c_hash.html"/>
+<entry name="hash (Object)" url="html/ref_c_object.html#Object.hash"/>
+<entry name="hash (String)" url="html/ref_c_string.html#String.hash"/>
+<entry name="Hashes (containers)" url="html/tut_containers.html#UB"/>
+<entry name="Hashes (language)" url="html/language.html#UG"/>
+<entry name="has_key? (CGI)" url="html/lib_network.html#CGI.has_key_qm"/>
+<entry name="has_key? (Hash)" url="html/ref_c_hash.html#Hash.has_key_qm"/>
+<entry name="has_value? (Hash)" url="html/ref_c_hash.html#Hash.has_value_qm"/>
+<entry name="have_func (mkmf)" url="html/lib_standard.html#mkmf.have_func"/>
+<entry name="have_header (mkmf)" url="html/lib_standard.html#mkmf.have_header"/>
+<entry name="have_library (mkmf)" url="html/lib_standard.html#mkmf.have_library"/>
+<entry name="head (Net::HTTP)" url="html/lib_network.html#Net::HTTP.head"/>
+<entry name="header (CGI)" url="html/lib_network.html#CGI.header"/>
+<entry name="header (Net::POPMail)" url="html/lib_network.html#Net::POPMail.header"/>
+<entry name="hex (String)" url="html/ref_c_string.html#String.hex"/>
+<entry name="Higher-Level Access (network)" url="html/lib_network.html#S2"/>
+<entry name="hour (Time)" url="html/ref_c_time.html#Time.hour"/>
+<entry name="How Classes and Objects Interact (classes)" url="html/classes.html#S1"/>
+<entry name="How Did We Get Here? (ospace)" url="html/ospace.html#UE"/>
+<entry name="HTML Output Methods (network)" url="html/lib_network.html#UA"/>
+<entry name="I (Complex)" url="html/lib_standard.html#Complex.Complex::I"/>
+<entry name="id (Object)" url="html/ref_c_object.html#Object.id"/>
+<entry name="id2name (Fixnum)" url="html/ref_c_fixnum.html#Fixnum.id2name"/>
+<entry name="id2name (Symbol)" url="html/ref_c_symbol.html#Symbol.id2name"/>
+<entry name="If and Unless Expressions (expressions)" url="html/tut_expressions.html#UH"/>
+<entry name="If and Unless Modifiers (expressions)" url="html/tut_expressions.html#UI"/>
+<entry name="IGNORECASE (Regexp)" url="html/ref_c_regexp.html#Regexp.IGNORECASE"/>
+<entry name="im (Numeric)" url="html/ref_c_numeric.html#Numeric.im"/>
+<entry name="image (Complex)" url="html/lib_standard.html#Complex.image"/>
+<entry name="Implementing a SongList Container (containers)" url="html/tut_containers.html#UC"/>
+<entry name="Implementing Iterators (containers)" url="html/tut_containers.html#UD"/>
+<entry name="Improving Performance (web)" url="html/web.html#S3"/>
+<entry name="include (Module)" url="html/ref_c_module.html#Module.include"/>
+<entry name="include? (Array)" url="html/ref_c_array.html#Array.include_qm"/>
+<entry name="include? (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.include_qm"/>
+<entry name="include? (Hash)" url="html/ref_c_hash.html#Hash.include_qm"/>
+<entry name="include? (String)" url="html/ref_c_string.html#String.include_qm"/>
+<entry name="included_modules (Module)" url="html/ref_c_module.html#Module.included_modules"/>
+<entry name="Including Other Files (modules)" url="html/tut_modules.html#S4"/>
+<entry name="Including Other Files (rdtool)" url="html/rdtool.html#S4"/>
+<entry name="Independent Children (threads)" url="html/tut_threads.html#UH"/>
+<entry name="index (Array)" url="html/ref_c_array.html#Array.index"/>
+<entry name="index (Hash)" url="html/ref_c_hash.html#Hash.index"/>
+<entry name="index (String)" url="html/ref_c_string.html#String.index"/>
+<entry name="indexes (Array)" url="html/ref_c_array.html#Array.indexes"/>
+<entry name="indexes (Hash)" url="html/ref_c_hash.html#Hash.indexes"/>
+<entry name="indices (Array)" url="html/ref_c_array.html#Array.indices"/>
+<entry name="indices (Hash)" url="html/ref_c_hash.html#Hash.indices"/>
+<entry name="infinite? (Float)" url="html/ref_c_float.html#Float.infinite_qm"/>
+<entry name="Inheritance and Messages (classes)" url="html/tut_classes.html#S1"/>
+<entry name="Inheritance and Mixins (classes)" url="html/tut_classes.html#UA"/>
+<entry name="Inheritance and Visibility (classes)" url="html/classes.html#S4"/>
+<entry name="inherited (Class)" url="html/ref_c_class.html#Class.inherited"/>
+<entry name="Initialization File (irb)" url="html/irb.html#S2"/>
+<entry name="Inline Formatting (rdtool)" url="html/rdtool.html#S1"/>
+<entry name="ino (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.ino"/>
+<entry name="inspect (Object)" url="html/ref_c_object.html#Object.inspect"/>
+<entry name="inspect (Symbol)" url="html/ref_c_symbol.html#Symbol.inspect"/>
+<entry name="install (File)" url="html/lib_standard.html#File.install"/>
+<entry name="Installing eruby in Apache (web)" url="html/web.html#UH"/>
+<entry name="Installing Ruby (preface)" url="html/preface.html#S6"/>
+<entry name="Instance Variables in Mixins (modules)" url="html/tut_modules.html#UA"/>
+<entry name="instance_eval (Object)" url="html/ref_c_object.html#Object.instance_eval"/>
+<entry name="instance_methods (Module)" url="html/ref_c_module.html#Module.instance_methods"/>
+<entry name="instance_of? (Object)" url="html/ref_c_object.html#Object.instance_of_qm"/>
+<entry name="instance_variables (Object)" url="html/ref_c_object.html#Object.instance_variables"/>
+<entry name="Integer" url="html/ref_c_integer.html"/>
+<entry name="Integer (Kernel)" url="html/ref_m_kernel.html#Kernel.Integer"/>
+<entry name="Integer and Floating Point Numbers (language)" url="html/language.html#UC"/>
+<entry name="integer? (Integer)" url="html/ref_c_integer.html#Integer.integer_qm"/>
+<entry name="integer? (Numeric)" url="html/ref_c_numeric.html#Numeric.integer_qm"/>
+<entry name="Interactive Ruby (preface)" url="html/preface.html#UB"/>
+<entry name="Interactive Ruby (trouble)" url="html/trouble.html#S2"/>
+<entry name="Interactive Ruby Shell (irb)" url="html/irb.html"/>
+<entry name="intern (String)" url="html/ref_c_string.html#String.intern"/>
+<entry name="invert (Hash)" url="html/ref_c_hash.html#Hash.invert"/>
+<entry name="invoke (WIN32OLE)" url="html/lib_windows.html#WIN32OLE.invoke"/>
+<entry name="IO" url="html/ref_c_io.html"/>
+<entry name="ioctl (IO)" url="html/ref_c_io.html#IO.ioctl"/>
+<entry name="Is Ruby for Me? (preface)" url="html/preface.html#S3"/>
+<entry name="isatty (IO)" url="html/ref_c_io.html#IO.isatty"/>
+<entry name="isdst (Time)" url="html/ref_c_time.html#Time.isdst"/>
+<entry name="is_a? (Object)" url="html/ref_c_object.html#Object.is_a_qm"/>
+<entry name="italy (Date)" url="html/lib_standard.html#Date.italy"/>
+<entry name="iterator? (Kernel)" url="html/ref_m_kernel.html#Kernel.iterator_qm"/>
+<entry name="Iterators (expressions)" url="html/tut_expressions.html#UJ"/>
+<entry name="Iterators and the Enumerable Module (modules)" url="html/tut_modules.html#S3"/>
+<entry name="Iterators for Reading (io)" url="html/tut_io.html#UA"/>
+<entry name="jd (Date)" url="html/lib_standard.html#Date.jd"/>
+<entry name="join (Array)" url="html/ref_c_array.html#Array.join"/>
+<entry name="join (File)" url="html/ref_c_file.html#File.join"/>
+<entry name="join (Thread)" url="html/ref_c_thread.html#Thread.join"/>
+<entry name="julian (Date)" url="html/lib_standard.html#Date.julian"/>
+<entry name="julian_leap? (Date)" url="html/lib_standard.html#Date.julian_leap_qm"/>
+<entry name="Just One More Thing (tk)" url="html/ext_tk.html#UE"/>
+<entry name="kcode (Regexp)" url="html/ref_c_regexp.html#Regexp.kcode"/>
+<entry name="Kernel" url="html/ref_m_kernel.html"/>
+<entry name="key? (Hash)" url="html/ref_c_hash.html#Hash.key_qm"/>
+<entry name="key? (Net::HTTPResponse)" url="html/lib_network.html#Net::HTTPResponse.key_qm"/>
+<entry name="key? (Thread)" url="html/ref_c_thread.html#Thread.key_qm"/>
+<entry name="keys (CGI)" url="html/lib_network.html#CGI.keys"/>
+<entry name="keys (Hash)" url="html/ref_c_hash.html#Hash.keys"/>
+<entry name="kill (Process)" url="html/ref_m_process.html#Process.kill"/>
+<entry name="kill (Thread)" url="html/ref_c_thread.html#Thread.kill"/>
+<entry name="kind_of? (Object)" url="html/ref_c_object.html#Object.kind_of_qm"/>
+<entry name="lambda (Kernel)" url="html/ref_m_kernel.html#Kernel.lambda"/>
+<entry name="last (Array)" url="html/ref_c_array.html#Array.last"/>
+<entry name="last (Range)" url="html/ref_c_range.html#Range.last"/>
+<entry name="lastresp (Net::FTP)" url="html/lib_network.html#Net::FTP.lastresp"/>
+<entry name="last_match (Regexp)" url="html/ref_c_regexp.html#Regexp.last_match"/>
+<entry name="ldexp (Math)" url="html/ref_m_math.html#Math.ldexp"/>
+<entry name="leap? (Date)" url="html/lib_standard.html#Date.leap_qm"/>
+<entry name="length (Array)" url="html/ref_c_array.html#Array.length"/>
+<entry name="length (Hash)" url="html/ref_c_hash.html#Hash.length"/>
+<entry name="length (MatchData)" url="html/ref_c_matchdata.html#MatchData.length"/>
+<entry name="length (Range)" url="html/ref_c_range.html#Range.length"/>
+<entry name="length (String)" url="html/ref_c_string.html#String.length"/>
+<entry name="length (Struct)" url="html/ref_c_struct.html#Struct.length"/>
+<entry name="lineno (IO)" url="html/ref_c_io.html#IO.lineno"/>
+<entry name="lineno= (IO)" url="html/ref_c_io.html#IO.lineno_eq"/>
+<entry name="link (File)" url="html/ref_c_file.html#File.link"/>
+<entry name="list (Net::FTP)" url="html/lib_network.html#Net::FTP.list"/>
+<entry name="list (Thread)" url="html/ref_c_thread.html#Thread.list"/>
+<entry name="list (ThreadGroup)" url="html/ref_c_threadgroup.html#ThreadGroup.list"/>
+<entry name="listen (Socket)" url="html/lib_network.html#Socket.listen"/>
+<entry name="ljust (String)" url="html/ref_c_string.html#String.ljust"/>
+<entry name="load (Kernel)" url="html/ref_m_kernel.html#Kernel.load"/>
+<entry name="load (Marshal)" url="html/ref_m_marshal.html#Marshal.load"/>
+<entry name="local (Time)" url="html/ref_c_time.html#Time.local"/>
+<entry name="localtime (Time)" url="html/ref_c_time.html#Time.localtime"/>
+<entry name="local_variables (Kernel)" url="html/ref_m_kernel.html#Kernel.local_variables"/>
+<entry name="lock (Mutex)" url="html/lib_standard.html#Mutex.lock"/>
+<entry name="locked? (Mutex)" url="html/lib_standard.html#Mutex.locked_qm"/>
+<entry name="Locking Ruby in the Safe (taint)" url="html/taint.html"/>
+<entry name="log (Math)" url="html/ref_m_math.html#Math.log"/>
+<entry name="log10 (Math)" url="html/ref_m_math.html#Math.log10"/>
+<entry name="login (Net::FTP)" url="html/lib_network.html#Net::FTP.login"/>
+<entry name="login (Net::Telnet)" url="html/lib_network.html#Net::Telnet.login"/>
+<entry name="Looking at Classes (ospace)" url="html/ospace.html#S2"/>
+<entry name="Looking at Objects (ospace)" url="html/ospace.html#S1"/>
+<entry name="Looking Inside Classes (ospace)" url="html/ospace.html#UB"/>
+<entry name="Looking Inside Objects (ospace)" url="html/ospace.html#UA"/>
+<entry name="lookup_order (BasicSocket)" url="html/lib_network.html#BasicSocket.lookup_order"/>
+<entry name="lookup_order= (BasicSocket)" url="html/lib_network.html#BasicSocket.lookup_order_eq"/>
+<entry name="loop (Kernel)" url="html/ref_m_kernel.html#Kernel.loop"/>
+<entry name="Loops (expressions)" url="html/tut_expressions.html#S6"/>
+<entry name="ls (Net::FTP)" url="html/lib_network.html#Net::FTP.ls"/>
+<entry name="lstat (File)" url="html/ref_c_file.html#File.lstat"/>
+<entry name="Mailing Lists (support)" url="html/support.html#S4"/>
+<entry name="mails (Net::POP)" url="html/lib_network.html#Net::POP.mails"/>
+<entry name="main (Thread)" url="html/ref_c_thread.html#Thread.main"/>
+<entry name="makedirs (File)" url="html/ref_c_file.html#File.makedirs"/>
+<entry name="Making Blocks More Dynamic (methods)" url="html/tut_methods.html#UD"/>
+<entry name="Mandatory Disclaimer (rdtool)" url="html/rdtool.html#S6"/>
+<entry name="Manipulating Threads (threads)" url="html/tut_threads.html#UB"/>
+<entry name="map (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.map"/>
+<entry name="map! (Array)" url="html/ref_c_array.html#Array.map_oh"/>
+<entry name="Marshal" url="html/ref_m_marshal.html"/>
+<entry name="Marshaling and Distributed Ruby (ospace)" url="html/ospace.html#S6"/>
+<entry name="match (Regexp)" url="html/ref_c_regexp.html#Regexp.match"/>
+<entry name="MatchData" url="html/ref_c_matchdata.html"/>
+<entry name="Math" url="html/ref_m_math.html"/>
+<entry name="max (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.max"/>
+<entry name="mday (Time)" url="html/ref_c_time.html#Time.mday"/>
+<entry name="member? (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.member_qm"/>
+<entry name="member? (Hash)" url="html/ref_c_hash.html#Hash.member_qm"/>
+<entry name="members (Struct)" url="html/ref_c_struct.html#Struct.members"/>
+<entry name="Memory Allocation (ruby)" url="html/ext_ruby.html#S4"/>
+<entry name="message (Exception)" url="html/ref_c_exception.html#Exception.message"/>
+<entry name="message (Net::HTTPResponse)" url="html/lib_network.html#Net::HTTPResponse.message"/>
+<entry name="message_loop (WIN32OLE_EVENT)" url="html/lib_windows.html#WIN32OLE_EVENT.message_loop"/>
+<entry name="Method" url="html/ref_c_method.html"/>
+<entry name="method (Object)" url="html/ref_c_object.html#Object.method"/>
+<entry name="Method Names (rdtool)" url="html/rdtool.html#S3"/>
+<entry name="methods (Object)" url="html/ref_c_object.html#Object.methods"/>
+<entry name="Methods and Blocks (methods)" url="html/tut_methods.html#UB"/>
+<entry name="method_added (Module)" url="html/ref_c_module.html#Module.method_added"/>
+<entry name="method_defined? (Module)" url="html/ref_c_module.html#Module.method_defined_qm"/>
+<entry name="method_missing (Object)" url="html/ref_c_object.html#Object.method_missing"/>
+<entry name="Microsoft Windows Support (windows)" url="html/lib_windows.html"/>
+<entry name="min (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.min"/>
+<entry name="min (Time)" url="html/ref_c_time.html#Time.min"/>
+<entry name="Miscellaneous Expressions (expressions)" url="html/tut_expressions.html#S2"/>
+<entry name="Mixin Modules (classes)" url="html/classes.html#UC"/>
+<entry name="Mixins (modules)" url="html/tut_modules.html#S2"/>
+<entry name="mjd (Date)" url="html/lib_standard.html#Date.mjd"/>
+<entry name="mkdir (Dir)" url="html/ref_c_dir.html#Dir.mkdir"/>
+<entry name="mkpath (File)" url="html/lib_standard.html#File.mkpath"/>
+<entry name="mktime (Time)" url="html/ref_c_time.html#Time.mktime"/>
+<entry name="mode (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.mode"/>
+<entry name="Module" url="html/ref_c_module.html"/>
+<entry name="Modules" url="html/tut_modules.html"/>
+<entry name="module_eval (Module)" url="html/ref_c_module.html#Module.module_eval"/>
+<entry name="module_function (Module)" url="html/ref_c_module.html#Module.module_function"/>
+<entry name="modulo (Numeric)" url="html/ref_c_numeric.html#Numeric.modulo"/>
+<entry name="mon (Time)" url="html/ref_c_time.html#Time.mon"/>
+<entry name="month (Time)" url="html/ref_c_time.html#Time.month"/>
+<entry name="More About Methods (methods)" url="html/tut_methods.html"/>
+<entry name="move (File)" url="html/ref_c_file.html#File.move"/>
+<entry name="mtime (File)" url="html/ref_c_file.html#File.mtime"/>
+<entry name="mtime (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.mtime"/>
+<entry name="mtime (Net::FTP)" url="html/lib_network.html#Net::FTP.mtime"/>
+<entry name="MULTILINE (Regexp)" url="html/ref_c_regexp.html#Regexp.MULTILINE"/>
+<entry name="Multipart Form Values (network)" url="html/lib_network.html#UB"/>
+<entry name="Multithreading (threads)" url="html/tut_threads.html#S1"/>
+<entry name="Mutual Exclusion (threads)" url="html/tut_threads.html#S3"/>
+<entry name="mv (File)" url="html/lib_standard.html#File.mv"/>
+<entry name="name (Module)" url="html/ref_c_module.html#Module.name"/>
+<entry name="Named Arguments (win32)" url="html/win32.html#UB"/>
+<entry name="Names (language)" url="html/language.html#S3"/>
+<entry name="Namespaces (modules)" url="html/tut_modules.html#S1"/>
+<entry name="nan? (Float)" url="html/ref_c_float.html#Float.nan_qm"/>
+<entry name="Nested Assignments (expressions)" url="html/tut_expressions.html#UD"/>
+<entry name="nesting (Module)" url="html/ref_c_module.html#Module.nesting"/>
+<entry name="Network and Web Libraries (network)" url="html/lib_network.html"/>
+<entry name="new (Array)" url="html/ref_c_array.html#Array.new"/>
+<entry name="new (CGI)" url="html/lib_network.html#CGI.new"/>
+<entry name="new (CGI::Session)" url="html/lib_network.html#CGI::Session.new"/>
+<entry name="new (Class)" url="html/ref_c_class.html#Class.new"/>
+<entry name="new (Complex)" url="html/lib_standard.html#Complex.new"/>
+<entry name="new (Date)" url="html/lib_standard.html#Date.new"/>
+<entry name="new (Dir)" url="html/ref_c_dir.html#Dir.new"/>
+<entry name="new (File)" url="html/ref_c_file.html#File.new"/>
+<entry name="new (GetoptLong)" url="html/lib_standard.html#GetoptLong.new"/>
+<entry name="new (Hash)" url="html/ref_c_hash.html#Hash.new"/>
+<entry name="new (intro)" url="html/intro.html"/>
+<entry name="new (IO)" url="html/ref_c_io.html#IO.new"/>
+<entry name="new (Module)" url="html/ref_c_module.html#Module.new"/>
+<entry name="new (Net::FTP)" url="html/lib_network.html#Net::FTP.new"/>
+<entry name="new (Net::HTTP)" url="html/lib_network.html#Net::HTTP.new"/>
+<entry name="new (Net::POP)" url="html/lib_network.html#Net::POP.new"/>
+<entry name="new (Net::SMTP)" url="html/lib_network.html#Net::SMTP.new"/>
+<entry name="new (Net::Telnet)" url="html/lib_network.html#Net::Telnet.new"/>
+<entry name="new (Proc)" url="html/ref_c_proc.html#Proc.new"/>
+<entry name="new (PStore)" url="html/lib_standard.html#PStore.new"/>
+<entry name="new (Range)" url="html/ref_c_range.html#Range.new"/>
+<entry name="new (Regexp)" url="html/ref_c_regexp.html#Regexp.new"/>
+<entry name="new (Socket)" url="html/lib_network.html#Socket.new"/>
+<entry name="new (SOCKSSocket)" url="html/lib_network.html#SOCKSSocket.new"/>
+<entry name="new (String)" url="html/ref_c_string.html#String.new"/>
+<entry name="new (Struct)" url="html/ref_c_struct.html#Struct.new"/>
+<entry name="new (TCPServer)" url="html/lib_network.html#TCPServer.new"/>
+<entry name="new (TCPSocket)" url="html/lib_network.html#TCPSocket.new"/>
+<entry name="new (Tempfile)" url="html/lib_standard.html#Tempfile.new"/>
+<entry name="new (Thread)" url="html/ref_c_thread.html#Thread.new"/>
+<entry name="new (ThreadGroup)" url="html/ref_c_threadgroup.html#ThreadGroup.new"/>
+<entry name="new (Time)" url="html/ref_c_time.html#Time.new"/>
+<entry name="new (UDPSocket)" url="html/lib_network.html#UDPSocket.new"/>
+<entry name="new (UNIXServer)" url="html/lib_network.html#UNIXServer.new"/>
+<entry name="new (UNIXSocket)" url="html/lib_network.html#UNIXSocket.new"/>
+<entry name="new (WeakRef)" url="html/lib_standard.html#WeakRef.new"/>
+<entry name="new (Win32API)" url="html/lib_windows.html#Win32API.new"/>
+<entry name="new (WIN32OLE)" url="html/lib_windows.html#WIN32OLE.new"/>
+<entry name="new (WIN32OLE_EVENT)" url="html/lib_windows.html#WIN32OLE_EVENT.new"/>
+<entry name="new1 (Date)" url="html/lib_standard.html#Date.new1"/>
+<entry name="new2 (Date)" url="html/lib_standard.html#Date.new2"/>
+<entry name="new3 (Date)" url="html/lib_standard.html#Date.new3"/>
+<entry name="newsg (Date)" url="html/lib_standard.html#Date.newsg"/>
+<entry name="neww (Date)" url="html/lib_standard.html#Date.neww"/>
+<entry name="next (Date)" url="html/lib_standard.html#Date.next"/>
+<entry name="next (Integer)" url="html/ref_c_integer.html#Integer.next"/>
+<entry name="next (String)" url="html/ref_c_string.html#String.next"/>
+<entry name="next! (String)" url="html/ref_c_string.html#String.next_oh"/>
+<entry name="nil? (NilClass)" url="html/ref_c_nilclass.html#NilClass.nil_qm"/>
+<entry name="nil? (Object)" url="html/ref_c_object.html#Object.nil_qm"/>
+<entry name="NilClass" url="html/ref_c_nilclass.html"/>
+<entry name="nitems (Array)" url="html/ref_c_array.html#Array.nitems"/>
+<entry name="nlink (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.nlink"/>
+<entry name="nonzero? (Numeric)" url="html/ref_c_numeric.html#Numeric.nonzero_qm"/>
+<entry name="Notation Conventions (preface)" url="html/preface.html#S10"/>
+<entry name="now (Time)" url="html/ref_c_time.html#Time.now"/>
+<entry name="NO_ARGUMENT (GetoptLong)" url="html/lib_standard.html#GetoptLong.NO_ARGUMENT"/>
+<entry name="ns? (Date)" url="html/lib_standard.html#Date.ns_qm"/>
+<entry name="Numbers (stdtypes)" url="html/tut_stdtypes.html#S1"/>
+<entry name="Numeric" url="html/ref_c_numeric.html"/>
+<entry name="Object" url="html/ref_c_object.html"/>
+<entry name="Object Creation (tk)" url="html/ext_tk.html#UF"/>
+<entry name="Object-Oriented Design Libraries (patterns)" url="html/lib_patterns.html"/>
+<entry name="Object-Oriented Regular Expressions (stdtypes)" url="html/tut_stdtypes.html#UM"/>
+<entry name="Object-Specific Classes (classes)" url="html/classes.html#UB"/>
+<entry name="Objects and Attributes (classes)" url="html/tut_classes.html#S2"/>
+<entry name="ObjectSpace" url="html/ref_m_objectspace.html"/>
+<entry name="oct (String)" url="html/ref_c_string.html#String.oct"/>
+<entry name="offset (MatchData)" url="html/ref_c_matchdata.html#MatchData.offset"/>
+<entry name="Onward and Upward (intro)" url="html/intro.html#S8"/>
+<entry name="on_event (WIN32OLE_EVENT)" url="html/lib_windows.html#WIN32OLE_EVENT.on_event"/>
+<entry name="open (Dir)" url="html/ref_c_dir.html#Dir.open"/>
+<entry name="open (File)" url="html/ref_c_file.html#File.open"/>
+<entry name="open (Kernel)" url="html/ref_m_kernel.html#Kernel.open"/>
+<entry name="open (Net::FTP)" url="html/lib_network.html#Net::FTP.open"/>
+<entry name="open (Socket)" url="html/lib_network.html#Socket.open"/>
+<entry name="open (SOCKSSocket)" url="html/lib_network.html#SOCKSSocket.open"/>
+<entry name="open (TCPServer)" url="html/lib_network.html#TCPServer.open"/>
+<entry name="open (TCPSocket)" url="html/lib_network.html#TCPSocket.open"/>
+<entry name="open (Tempfile)" url="html/lib_standard.html#Tempfile.open"/>
+<entry name="open (UDPSocket)" url="html/lib_network.html#UDPSocket.open"/>
+<entry name="open (UNIXServer)" url="html/lib_network.html#UNIXServer.open"/>
+<entry name="open (UNIXSocket)" url="html/lib_network.html#UNIXSocket.open"/>
+<entry name="Opening and Closing Files (io)" url="html/tut_io.html#S2"/>
+<entry name="Operator Expressions (expressions)" url="html/tut_expressions.html#S1"/>
+<entry name="Optimizing (win32)" url="html/win32.html#UE"/>
+<entry name="OPTIONAL_ARGUMENT (GetoptLong)" url="html/lib_standard.html#GetoptLong.OPTIONAL_ARGUMENT"/>
+<entry name="Options (tk)" url="html/ext_tk.html#UG"/>
+<entry name="ordering (GetoptLong)" url="html/lib_standard.html#GetoptLong.ordering"/>
+<entry name="ordering= (GetoptLong)" url="html/lib_standard.html#GetoptLong.ordering_eq"/>
+<entry name="os? (Date)" url="html/lib_standard.html#Date.os_qm"/>
+<entry name="Other Forms of Assignment (expressions)" url="html/tut_expressions.html#UE"/>
+<entry name="out (CGI)" url="html/lib_network.html#CGI.out"/>
+<entry name="owned? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.owned_qm"/>
+<entry name="owned? (FileTest)" url="html/ref_m_filetest.html#FileTest.owned_qm"/>
+<entry name="p (Kernel)" url="html/ref_m_kernel.html#Kernel.p"/>
+<entry name="pack (Array)" url="html/ref_c_array.html#Array.pack"/>
+<entry name="pair (Socket)" url="html/lib_network.html#Socket.pair"/>
+<entry name="Parallel Assignment (expressions)" url="html/tut_expressions.html#UC"/>
+<entry name="params (CGI)" url="html/lib_network.html#CGI.params"/>
+<entry name="parse (CGI)" url="html/lib_network.html#CGI.parse"/>
+<entry name="parsedate" url="html/lib_standard.html#ParseDate.parsedate"/>
+<entry name="pass (Thread)" url="html/ref_c_thread.html#Thread.pass"/>
+<entry name="passive (Net::FTP)" url="html/lib_network.html#Net::FTP.passive"/>
+<entry name="passive= (Net::FTP)" url="html/lib_network.html#Net::FTP.passive_eq"/>
+<entry name="path (File)" url="html/ref_c_file.html#File.path"/>
+<entry name="path (PStore)" url="html/lib_standard.html#PStore.path"/>
+<entry name="path (Tempfile)" url="html/lib_standard.html#Tempfile.path"/>
+<entry name="path (UNIXSocket)" url="html/lib_network.html#UNIXSocket.path"/>
+<entry name="Pattern-Based Substitution (stdtypes)" url="html/tut_stdtypes.html#UK"/>
+<entry name="Patterns (stdtypes)" url="html/tut_stdtypes.html#UE"/>
+<entry name="peeraddr (IPSocket)" url="html/lib_network.html#IPSocket.peeraddr"/>
+<entry name="peeraddr (UNIXSocket)" url="html/lib_network.html#UNIXSocket.peeraddr"/>
+<entry name="Performance Considerations (ospace)" url="html/ospace.html#UC"/>
+<entry name="PERMUTE (GetoptLong)" url="html/lib_standard.html#GetoptLong.PERMUTE"/>
+<entry name="PI (Math)" url="html/ref_m_math.html#Math.PI"/>
+<entry name="pid (IO)" url="html/ref_c_io.html#IO.pid"/>
+<entry name="pid (Process)" url="html/ref_m_process.html#Process.pid"/>
+<entry name="pipe (IO)" url="html/ref_c_io.html#IO.pipe"/>
+<entry name="pipe? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.pipe_qm"/>
+<entry name="pipe? (FileTest)" url="html/ref_m_filetest.html#FileTest.pipe_qm"/>
+<entry name="PLATFORM (mkmf)" url="html/lib_standard.html#mkmf.PLATFORM"/>
+<entry name="Play It Again (exceptions)" url="html/tut_exceptions.html#UB"/>
+<entry name="polar (Complex)" url="html/lib_standard.html#Complex.polar"/>
+<entry name="pop (Array)" url="html/ref_c_array.html#Array.pop"/>
+<entry name="popen (IO)" url="html/ref_c_io.html#IO.popen"/>
+<entry name="port (Net::HTTP)" url="html/lib_network.html#Net::HTTP.port"/>
+<entry name="pos (IO)" url="html/ref_c_io.html#IO.pos"/>
+<entry name="pos= (IO)" url="html/ref_c_io.html#IO.pos_eq"/>
+<entry name="post (Net::HTTP)" url="html/lib_network.html#Net::HTTP.post"/>
+<entry name="post_match (MatchData)" url="html/ref_c_matchdata.html#MatchData.post_match"/>
+<entry name="ppid (Process)" url="html/ref_m_process.html#Process.ppid"/>
+<entry name="Preface" url="html/preface.html"/>
+<entry name="pretty (CGI)" url="html/lib_network.html#CGI.pretty"/>
+<entry name="pre_match (MatchData)" url="html/ref_c_matchdata.html#MatchData.pre_match"/>
+<entry name="print (IO)" url="html/ref_c_io.html#IO.print"/>
+<entry name="print (Kernel)" url="html/ref_m_kernel.html#Kernel.print"/>
+<entry name="print (Net::Telnet)" url="html/lib_network.html#Net::Telnet.print"/>
+<entry name="printf (IO)" url="html/ref_c_io.html#IO.printf"/>
+<entry name="printf (Kernel)" url="html/ref_m_kernel.html#Kernel.printf"/>
+<entry name="priority (Thread)" url="html/ref_c_thread.html#Thread.priority"/>
+<entry name="priority= (Thread)" url="html/ref_c_thread.html#Thread.priority_eq"/>
+<entry name="PRIO_PGRP (Process)" url="html/ref_m_process.html#Process.PRIO_PGRP"/>
+<entry name="PRIO_PROCESS (Process)" url="html/ref_m_process.html#Process.PRIO_PROCESS"/>
+<entry name="PRIO_USER (Process)" url="html/ref_m_process.html#Process.PRIO_USER"/>
+<entry name="private (Module)" url="html/ref_c_module.html#Module.private"/>
+<entry name="private_class_method (Module)" url="html/ref_c_module.html#Module.private_class_method"/>
+<entry name="private_instance_methods (Module)" url="html/ref_c_module.html#Module.private_instance_methods"/>
+<entry name="private_methods (Object)" url="html/ref_c_object.html#Object.private_methods"/>
+<entry name="Proc" url="html/ref_c_proc.html"/>
+<entry name="proc (Kernel)" url="html/ref_m_kernel.html#Kernel.proc"/>
+<entry name="Process" url="html/ref_m_process.html"/>
+<entry name="Program Termination (rubyworld)" url="html/rubyworld.html#S2"/>
+<entry name="protected (Module)" url="html/ref_c_module.html#Module.protected"/>
+<entry name="protected_instance_methods (Module)" url="html/ref_c_module.html#Module.protected_instance_methods"/>
+<entry name="protected_methods (Object)" url="html/ref_c_object.html#Object.protected_methods"/>
+<entry name="prune (Find)" url="html/lib_standard.html#Find.prune"/>
+<entry name="public (Module)" url="html/ref_c_module.html#Module.public"/>
+<entry name="public_class_method (Module)" url="html/ref_c_module.html#Module.public_class_method"/>
+<entry name="public_instance_methods (Module)" url="html/ref_c_module.html#Module.public_instance_methods"/>
+<entry name="public_methods (Object)" url="html/ref_c_object.html#Object.public_methods"/>
+<entry name="push (Array)" url="html/ref_c_array.html#Array.push"/>
+<entry name="putbinaryfile (Net::FTP)" url="html/lib_network.html#Net::FTP.putbinaryfile"/>
+<entry name="putc (IO)" url="html/ref_c_io.html#IO.putc"/>
+<entry name="putc (Kernel)" url="html/ref_m_kernel.html#Kernel.putc"/>
+<entry name="puts (IO)" url="html/ref_c_io.html#IO.puts"/>
+<entry name="puts (Kernel)" url="html/ref_m_kernel.html#Kernel.puts"/>
+<entry name="puttextfile (Net::FTP)" url="html/lib_network.html#Net::FTP.puttextfile"/>
+<entry name="pwd (Dir)" url="html/ref_c_dir.html#Dir.pwd"/>
+<entry name="quiet (GetoptLong)" url="html/lib_standard.html#GetoptLong.quiet"/>
+<entry name="quiet= (GetoptLong)" url="html/lib_standard.html#GetoptLong.quiet_eq"/>
+<entry name="quiet? (GetoptLong)" url="html/lib_standard.html#GetoptLong.quiet_qm"/>
+<entry name="quote (Regexp)" url="html/ref_c_regexp.html#Regexp.quote"/>
+<entry name="Quoting (web)" url="html/web.html#UB"/>
+<entry name="raise (Kernel)" url="html/ref_m_kernel.html#Kernel.raise"/>
+<entry name="raise (Thread)" url="html/ref_c_thread.html#Thread.raise"/>
+<entry name="Raising Exceptions (exceptions)" url="html/tut_exceptions.html#S3"/>
+<entry name="rand (Kernel)" url="html/ref_m_kernel.html#Kernel.rand"/>
+<entry name="Range" url="html/ref_c_range.html"/>
+<entry name="Ranges (language)" url="html/language.html#UE"/>
+<entry name="Ranges (stdtypes)" url="html/tut_stdtypes.html#S3"/>
+<entry name="Ranges as Conditions (stdtypes)" url="html/tut_stdtypes.html#UC"/>
+<entry name="Ranges as Intervals (stdtypes)" url="html/tut_stdtypes.html#UD"/>
+<entry name="Ranges as Sequences (stdtypes)" url="html/tut_stdtypes.html#UB"/>
+<entry name="rassoc (Array)" url="html/ref_c_array.html#Array.rassoc"/>
+<entry name="rdev (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.rdev"/>
+<entry name="read (Dir)" url="html/ref_c_dir.html#Dir.read"/>
+<entry name="read (IO)" url="html/ref_c_io.html#IO.read"/>
+<entry name="readable? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.readable_qm"/>
+<entry name="readable? (FileTest)" url="html/ref_m_filetest.html#FileTest.readable_qm"/>
+<entry name="readable_real? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.readable_real_qm"/>
+<entry name="readable_real? (FileTest)" url="html/ref_m_filetest.html#FileTest.readable_real_qm"/>
+<entry name="readchar (IO)" url="html/ref_c_io.html#IO.readchar"/>
+<entry name="Reading and 'Riting (intro)" url="html/intro.html#S7"/>
+<entry name="Reading and Writing Files (io)" url="html/tut_io.html#S3"/>
+<entry name="readline (IO)" url="html/ref_c_io.html#IO.readline"/>
+<entry name="readline (Kernel)" url="html/ref_m_kernel.html#Kernel.readline"/>
+<entry name="readlines (IO)" url="html/ref_c_io.html#IO.readlines"/>
+<entry name="readlines (Kernel)" url="html/ref_m_kernel.html#Kernel.readlines"/>
+<entry name="readlink (File)" url="html/ref_c_file.html#File.readlink"/>
+<entry name="ready (Net::SMTP)" url="html/lib_network.html#Net::SMTP.ready"/>
+<entry name="real (Complex)" url="html/lib_standard.html#Complex.real"/>
+<entry name="recv (BasicSocket)" url="html/lib_network.html#BasicSocket.recv"/>
+<entry name="recvfrom (Socket)" url="html/lib_network.html#Socket.recvfrom"/>
+<entry name="recvfrom (TCPSocket)" url="html/lib_network.html#TCPSocket.recvfrom"/>
+<entry name="recvfrom (UDPSocket)" url="html/lib_network.html#UDPSocket.recvfrom"/>
+<entry name="recvfrom (UNIXSocket)" url="html/lib_network.html#UNIXSocket.recvfrom"/>
+<entry name="Reflection, ObjectSpace, and Distributed Ruby (ospace)" url="html/ospace.html"/>
+<entry name="Regexp" url="html/ref_c_regexp.html"/>
+<entry name="Regular Expression Options (language)" url="html/language.html#UK"/>
+<entry name="Regular Expression Patterns (language)" url="html/language.html#UL"/>
+<entry name="Regular Expressions (intro)" url="html/intro.html#S5"/>
+<entry name="Regular Expressions (language)" url="html/language.html#UJ"/>
+<entry name="Regular Expressions (stdtypes)" url="html/tut_stdtypes.html#S4"/>
+<entry name="rehash (Hash)" url="html/ref_c_hash.html#Hash.rehash"/>
+<entry name="reject (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.reject"/>
+<entry name="reject (Hash)" url="html/ref_c_hash.html#Hash.reject"/>
+<entry name="reject! (Array)" url="html/ref_c_array.html#Array.reject_oh"/>
+<entry name="reject! (Hash)" url="html/ref_c_hash.html#Hash.reject_oh"/>
+<entry name="remainder (Numeric)" url="html/ref_c_numeric.html#Numeric.remainder"/>
+<entry name="remove_const (Module)" url="html/ref_c_module.html#Module.remove_const"/>
+<entry name="remove_method (Module)" url="html/ref_c_module.html#Module.remove_method"/>
+<entry name="rename (File)" url="html/ref_c_file.html#File.rename"/>
+<entry name="reopen (IO)" url="html/ref_c_io.html#IO.reopen"/>
+<entry name="Repetition (stdtypes)" url="html/tut_stdtypes.html#UH"/>
+<entry name="replace (Array)" url="html/ref_c_array.html#Array.replace"/>
+<entry name="replace (Hash)" url="html/ref_c_hash.html#Hash.replace"/>
+<entry name="replace (String)" url="html/ref_c_string.html#String.replace"/>
+<entry name="require (Kernel)" url="html/ref_m_kernel.html#Kernel.require"/>
+<entry name="REQUIRED_ARGUMENT (GetoptLong)" url="html/lib_standard.html#GetoptLong.REQUIRED_ARGUMENT"/>
+<entry name="Requirements for a Hash Key (language)" url="html/language.html#UH"/>
+<entry name="REQUIRE_ORDER (GetoptLong)" url="html/lib_standard.html#GetoptLong.REQUIRE_ORDER"/>
+<entry name="Resources (preface)" url="html/preface.html#S8"/>
+<entry name="respond_to? (Object)" url="html/ref_c_object.html#Object.respond_to_qm"/>
+<entry name="restore (Marshal)" url="html/ref_m_marshal.html#Marshal.restore"/>
+<entry name="Restrictions (irb)" url="html/irb.html#S4"/>
+<entry name="resume (Net::FTP)" url="html/lib_network.html#Net::FTP.resume"/>
+<entry name="resume= (Net::FTP)" url="html/lib_network.html#Net::FTP.resume_eq"/>
+<entry name="retrbinary (Net::FTP)" url="html/lib_network.html#Net::FTP.retrbinary"/>
+<entry name="retrlines (Net::FTP)" url="html/lib_network.html#Net::FTP.retrlines"/>
+<entry name="Retry (expressions)" url="html/tut_expressions.html#UM"/>
+<entry name="return_code (Net::FTP)" url="html/lib_network.html#Net::FTP.return_code"/>
+<entry name="RETURN_IN_ORDER (GetoptLong)" url="html/lib_standard.html#GetoptLong.RETURN_IN_ORDER"/>
+<entry name="reverse (Array)" url="html/ref_c_array.html#Array.reverse"/>
+<entry name="reverse (String)" url="html/ref_c_string.html#String.reverse"/>
+<entry name="reverse! (Array)" url="html/ref_c_array.html#Array.reverse_oh"/>
+<entry name="reverse! (String)" url="html/ref_c_string.html#String.reverse_oh"/>
+<entry name="reverse_each (Array)" url="html/ref_c_array.html#Array.reverse_each"/>
+<entry name="rewind (Dir)" url="html/ref_c_dir.html#Dir.rewind"/>
+<entry name="rewind (IO)" url="html/ref_c_io.html#IO.rewind"/>
+<entry name="rfc1123_date (CGI)" url="html/lib_network.html#CGI.rfc1123_date"/>
+<entry name="rindex (Array)" url="html/ref_c_array.html#Array.rindex"/>
+<entry name="rindex (String)" url="html/ref_c_string.html#String.rindex"/>
+<entry name="rjust (String)" url="html/ref_c_string.html#String.rjust"/>
+<entry name="rmdir (Dir)" url="html/ref_c_dir.html#Dir.rmdir"/>
+<entry name="rm_f (File)" url="html/lib_standard.html#File.rm_f"/>
+<entry name="Roadmap" url="html/roadmap.html"/>
+<entry name="root? (PStore)" url="html/lib_standard.html#PStore.root_qm"/>
+<entry name="roots (PStore)" url="html/lib_standard.html#PStore.roots"/>
+<entry name="round (Float)" url="html/ref_c_float.html#Float.round"/>
+<entry name="rtags (irb)" url="html/irb.html#UB"/>
+<entry name="rtags, xmp, and the Frame Class (irb)" url="html/irb.html#S5"/>
+<entry name="Ruby and Its World (rubyworld)" url="html/rubyworld.html"/>
+<entry name="Ruby and Microsoft Windows (win32)" url="html/win32.html"/>
+<entry name="Ruby and the Web (web)" url="html/web.html"/>
+<entry name="Ruby C Language API (ruby)" url="html/ext_ruby.html#S8"/>
+<entry name="Ruby Compared with C++ and Java (containers)" url="html/tut_containers.html#UE"/>
+<entry name="Ruby Debugger (trouble)" url="html/trouble.html#S1"/>
+<entry name="Ruby Is an Object-Oriented Language (intro)" url="html/intro.html#S1"/>
+<entry name="Ruby Objects in C (ruby)" url="html/ext_ruby.html#S1"/>
+<entry name="Ruby Ports (win32)" url="html/win32.html#S1"/>
+<entry name="Ruby Programs (preface)" url="html/preface.html#UC"/>
+<entry name="Ruby Sparkles (preface)" url="html/preface.html#S1"/>
+<entry name="Ruby Tk (tk)" url="html/ext_tk.html"/>
+<entry name="Ruby Versions (preface)" url="html/preface.html#S5"/>
+<entry name="run (Thread)" url="html/ref_c_thread.html#Thread.run"/>
+<entry name="Running Multiple Processes (threads)" url="html/tut_threads.html#S4"/>
+<entry name="Running Ruby (preface)" url="html/preface.html#S7"/>
+<entry name="Running Ruby Under Windows (win32)" url="html/win32.html#S2"/>
+<entry name="Runtime Callbacks (ospace)" url="html/ospace.html#UD"/>
+<entry name="Safe Levels (taint)" url="html/taint.html#S1"/>
+<entry name="safe_level (Thread)" url="html/ref_c_thread.html#Thread.safe_level"/>
+<entry name="safe_unlink (File)" url="html/ref_c_file.html#File.safe_unlink"/>
+<entry name="Sample Application (tk)" url="html/ext_tk.html#UD"/>
+<entry name="scan (Kernel)" url="html/ref_m_kernel.html#Kernel.scan"/>
+<entry name="scan (String)" url="html/ref_c_string.html#String.scan"/>
+<entry name="Scope of Constants and Variables (language)" url="html/language.html#UP"/>
+<entry name="Scrolling (tk)" url="html/ext_tk.html#S5"/>
+<entry name="sec (Time)" url="html/ref_c_time.html#Time.sec"/>
+<entry name="seek (Dir)" url="html/ref_c_dir.html#Dir.seek"/>
+<entry name="seek (IO)" url="html/ref_c_io.html#IO.seek"/>
+<entry name="SEEK_CUR (IO)" url="html/ref_c_io.html#IO.SEEK_CUR"/>
+<entry name="SEEK_END (IO)" url="html/ref_c_io.html#IO.SEEK_END"/>
+<entry name="SEEK_SET (IO)" url="html/ref_c_io.html#IO.SEEK_SET"/>
+<entry name="select (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.select"/>
+<entry name="select (IO)" url="html/ref_c_io.html#IO.select"/>
+<entry name="select (Kernel)" url="html/ref_m_kernel.html#Kernel.select"/>
+<entry name="send (BasicSocket)" url="html/lib_network.html#BasicSocket.send"/>
+<entry name="send (Object)" url="html/ref_c_object.html#Object.send"/>
+<entry name="send (UDPSocket)" url="html/lib_network.html#UDPSocket.send"/>
+<entry name="sendmail (Net::SMTP)" url="html/lib_network.html#Net::SMTP.sendmail"/>
+<entry name="SEPARATOR (File)" url="html/ref_c_file.html#File.SEPARATOR"/>
+<entry name="Server commands (Net::FTP)" url="html/lib_network.html#Net::FTP.Servercommands"/>
+<entry name="Sessions (web)" url="html/web.html#UF"/>
+<entry name="setgid? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.setgid_qm"/>
+<entry name="setgid? (FileTest)" url="html/ref_m_filetest.html#FileTest.setgid_qm"/>
+<entry name="setpgid (Process)" url="html/ref_m_process.html#Process.setpgid"/>
+<entry name="setpgrp (Process)" url="html/ref_m_process.html#Process.setpgrp"/>
+<entry name="setpriority (Process)" url="html/ref_m_process.html#Process.setpriority"/>
+<entry name="setsid (Process)" url="html/ref_m_process.html#Process.setsid"/>
+<entry name="setsockopt (BasicSocket)" url="html/lib_network.html#BasicSocket.setsockopt"/>
+<entry name="Setting Widget Options (tk)" url="html/ext_tk.html#UA"/>
+<entry name="Setting/Getting Options Dynamically (tk)" url="html/ext_tk.html#UC"/>
+<entry name="setuid? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.setuid_qm"/>
+<entry name="setuid? (FileTest)" url="html/ref_m_filetest.html#FileTest.setuid_qm"/>
+<entry name="set_backtrace (Exception)" url="html/ref_c_exception.html#Exception.set_backtrace"/>
+<entry name="set_options (GetoptLong)" url="html/lib_standard.html#GetoptLong.set_options"/>
+<entry name="set_trace_func (Kernel)" url="html/ref_m_kernel.html#Kernel.set_trace_func"/>
+<entry name="sg (Date)" url="html/lib_standard.html#Date.sg"/>
+<entry name="Sharing Data Between Ruby and C (ruby)" url="html/ext_ruby.html#S3"/>
+<entry name="shift (Array)" url="html/ref_c_array.html#Array.shift"/>
+<entry name="shift (Hash)" url="html/ref_c_hash.html#Hash.shift"/>
+<entry name="shutdown (BasicSocket)" url="html/lib_network.html#BasicSocket.shutdown"/>
+<entry name="signal (ConditionVariable)" url="html/lib_standard.html#ConditionVariable.signal"/>
+<entry name="Simple Tk Application (tk)" url="html/ext_tk.html#S1"/>
+<entry name="sin (Math)" url="html/ref_m_math.html#Math.sin"/>
+<entry name="Singletons and Other Constructors (classes)" url="html/tut_classes.html#UF"/>
+<entry name="singleton_methods (Object)" url="html/ref_c_object.html#Object.singleton_methods"/>
+<entry name="singleton_method_added (Kernel)" url="html/ref_m_kernel.html#Kernel.singleton_method_added"/>
+<entry name="size (Array)" url="html/ref_c_array.html#Array.size"/>
+<entry name="size (Bignum)" url="html/ref_c_bignum.html#Bignum.size"/>
+<entry name="size (File)" url="html/ref_c_file.html#File.size"/>
+<entry name="size (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.size"/>
+<entry name="size (FileTest)" url="html/ref_m_filetest.html#FileTest.size"/>
+<entry name="size (Fixnum)" url="html/ref_c_fixnum.html#Fixnum.size"/>
+<entry name="size (Hash)" url="html/ref_c_hash.html#Hash.size"/>
+<entry name="size (MatchData)" url="html/ref_c_matchdata.html#MatchData.size"/>
+<entry name="size (Net::POPMail)" url="html/lib_network.html#Net::POPMail.size"/>
+<entry name="size (Range)" url="html/ref_c_range.html#Range.size"/>
+<entry name="size (String)" url="html/ref_c_string.html#String.size"/>
+<entry name="size (Struct)" url="html/ref_c_struct.html#Struct.size"/>
+<entry name="size? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.size_qm"/>
+<entry name="size? (FileTest)" url="html/ref_m_filetest.html#FileTest.size_qm"/>
+<entry name="sleep (Kernel)" url="html/ref_m_kernel.html#Kernel.sleep"/>
+<entry name="slice (Array)" url="html/ref_c_array.html#Array.slice"/>
+<entry name="slice (String)" url="html/ref_c_string.html#String.slice"/>
+<entry name="slice! (Array)" url="html/ref_c_array.html#Array.slice_oh"/>
+<entry name="slice! (String)" url="html/ref_c_string.html#String.slice_oh"/>
+<entry name="Socket-Level Access (network)" url="html/lib_network.html#S1"/>
+<entry name="socket? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.socket_qm"/>
+<entry name="socket? (FileTest)" url="html/ref_m_filetest.html#FileTest.socket_qm"/>
+<entry name="socketpair (Socket)" url="html/lib_network.html#Socket.socketpair"/>
+<entry name="Some Basic Ruby (intro)" url="html/intro.html#S2"/>
+<entry name="sort (Array)" url="html/ref_c_array.html#Array.sort"/>
+<entry name="sort (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.sort"/>
+<entry name="sort (Hash)" url="html/ref_c_hash.html#Hash.sort"/>
+<entry name="sort! (Array)" url="html/ref_c_array.html#Array.sort_oh"/>
+<entry name="source (Regexp)" url="html/ref_c_regexp.html#Regexp.source"/>
+<entry name="Source Layout (language)" url="html/language.html#S1"/>
+<entry name="Spawning New Processes (threads)" url="html/tut_threads.html#UG"/>
+<entry name="Specifying Access Control (classes)" url="html/tut_classes.html#UG"/>
+<entry name="split (File)" url="html/ref_c_file.html#File.split"/>
+<entry name="split (Kernel)" url="html/ref_m_kernel.html#Kernel.split"/>
+<entry name="split (String)" url="html/ref_c_string.html#String.split"/>
+<entry name="sprintf (Kernel)" url="html/ref_m_kernel.html#Kernel.sprintf"/>
+<entry name="sqrt (Math)" url="html/ref_m_math.html#Math.sqrt"/>
+<entry name="squeeze (String)" url="html/ref_c_string.html#String.squeeze"/>
+<entry name="squeeze! (String)" url="html/ref_c_string.html#String.squeeze_oh"/>
+<entry name="srand (Kernel)" url="html/ref_m_kernel.html#Kernel.srand"/>
+<entry name="Standard Library (standard)" url="html/lib_standard.html"/>
+<entry name="Standard Types (stdtypes)" url="html/tut_stdtypes.html"/>
+<entry name="start (GC)" url="html/ref_m_gc.html#GC.start"/>
+<entry name="start (Net::APOP)" url="html/lib_network.html#Net::APOP.start"/>
+<entry name="start (Net::HTTP)" url="html/lib_network.html#Net::HTTP.start"/>
+<entry name="start (Net::POP)" url="html/lib_network.html#Net::POP.start"/>
+<entry name="start (Net::SMTP)" url="html/lib_network.html#Net::SMTP.start"/>
+<entry name="start (Thread)" url="html/ref_c_thread.html#Thread.start"/>
+<entry name="Stat" url="html/ref_c_file__stat.html"/>
+<entry name="stat (File)" url="html/ref_c_file.html#File.stat"/>
+<entry name="stat (IO)" url="html/ref_c_io.html#IO.stat"/>
+<entry name="Static Linking (ruby)" url="html/ext_ruby.html#UH"/>
+<entry name="status (Thread)" url="html/ref_c_thread.html#Thread.status"/>
+<entry name="step (Date)" url="html/lib_standard.html#Date.step"/>
+<entry name="step (Integer)" url="html/ref_c_integer.html#Integer.step"/>
+<entry name="sticky? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.sticky_qm"/>
+<entry name="sticky? (FileTest)" url="html/ref_m_filetest.html#FileTest.sticky_qm"/>
+<entry name="stop (Thread)" url="html/ref_c_thread.html#Thread.stop"/>
+<entry name="stop? (Thread)" url="html/ref_c_thread.html#Thread.stop_qm"/>
+<entry name="storbinary (Net::FTP)" url="html/lib_network.html#Net::FTP.storbinary"/>
+<entry name="store (Hash)" url="html/ref_c_hash.html#Hash.store"/>
+<entry name="storlines (Net::FTP)" url="html/lib_network.html#Net::FTP.storlines"/>
+<entry name="strftime (Time)" url="html/ref_c_time.html#Time.strftime"/>
+<entry name="String" url="html/ref_c_string.html"/>
+<entry name="String (Kernel)" url="html/ref_m_kernel.html#Kernel.String"/>
+<entry name="string (MatchData)" url="html/ref_c_matchdata.html#MatchData.string"/>
+<entry name="Strings (language)" url="html/language.html#UD"/>
+<entry name="Strings (stdtypes)" url="html/tut_stdtypes.html#S2"/>
+<entry name="strip (String)" url="html/ref_c_string.html#String.strip"/>
+<entry name="strip! (String)" url="html/ref_c_string.html#String.strip_oh"/>
+<entry name="Struct" url="html/ref_c_struct.html"/>
+<entry name="sub (Kernel)" url="html/ref_m_kernel.html#Kernel.sub"/>
+<entry name="sub (String)" url="html/ref_c_string.html#String.sub"/>
+<entry name="sub! (Kernel)" url="html/ref_m_kernel.html#Kernel.sub_oh"/>
+<entry name="sub! (String)" url="html/ref_c_string.html#String.sub_oh"/>
+<entry name="Substitutions (language)" url="html/language.html#UM"/>
+<entry name="succ (Date)" url="html/lib_standard.html#Date.succ"/>
+<entry name="succ (Integer)" url="html/ref_c_integer.html#Integer.succ"/>
+<entry name="succ (String)" url="html/ref_c_string.html#String.succ"/>
+<entry name="succ! (String)" url="html/ref_c_string.html#String.succ_oh"/>
+<entry name="sum (String)" url="html/ref_c_string.html#String.sum"/>
+<entry name="superclass (Class)" url="html/ref_c_class.html#Class.superclass"/>
+<entry name="Support" url="html/support.html"/>
+<entry name="swapcase (String)" url="html/ref_c_string.html#String.swapcase"/>
+<entry name="swapcase! (String)" url="html/ref_c_string.html#String.swapcase_oh"/>
+<entry name="Symbol" url="html/ref_c_symbol.html"/>
+<entry name="Symbols (language)" url="html/language.html#UI"/>
+<entry name="symlink (File)" url="html/ref_c_file.html#File.symlink"/>
+<entry name="symlink? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.symlink_qm"/>
+<entry name="symlink? (FileTest)" url="html/ref_m_filetest.html#FileTest.symlink_qm"/>
+<entry name="sync (IO)" url="html/ref_c_io.html#IO.sync"/>
+<entry name="sync= (IO)" url="html/ref_c_io.html#IO.sync_eq"/>
+<entry name="synchronize (Mutex)" url="html/lib_standard.html#Mutex.synchronize"/>
+<entry name="syscall (Kernel)" url="html/ref_m_kernel.html#Kernel.syscall"/>
+<entry name="syscopy (File)" url="html/ref_c_file.html#File.syscopy"/>
+<entry name="sysread (IO)" url="html/ref_c_io.html#IO.sysread"/>
+<entry name="system (Kernel)" url="html/ref_m_kernel.html#Kernel.system"/>
+<entry name="System Hooks (ospace)" url="html/ospace.html#S4"/>
+<entry name="syswrite (IO)" url="html/ref_c_io.html#IO.syswrite"/>
+<entry name="taint (Object)" url="html/ref_c_object.html#Object.taint"/>
+<entry name="Tainted Objects (taint)" url="html/taint.html#S2"/>
+<entry name="tainted? (Object)" url="html/ref_c_object.html#Object.tainted_qm"/>
+<entry name="Talking to Networks (io)" url="html/tut_io.html#S4"/>
+<entry name="tan (Math)" url="html/ref_m_math.html#Math.tan"/>
+<entry name="tell (Dir)" url="html/ref_c_dir.html#Dir.tell"/>
+<entry name="tell (IO)" url="html/ref_c_io.html#IO.tell"/>
+<entry name="telnetmode (Net::Telnet)" url="html/lib_network.html#Net::Telnet.telnetmode"/>
+<entry name="telnetmode= (Net::Telnet)" url="html/lib_network.html#Net::Telnet.telnetmode_eq"/>
+<entry name="terminate (GetoptLong)" url="html/lib_standard.html#GetoptLong.terminate"/>
+<entry name="terminated? (GetoptLong)" url="html/lib_standard.html#GetoptLong.terminated_qm"/>
+<entry name="test (Kernel)" url="html/ref_m_kernel.html#Kernel.test"/>
+<entry name="thaw (Object)" url="html/ref_c_object.html#Object.thaw"/>
+<entry name="The Basic Types (language)" url="html/language.html#S2"/>
+<entry name="The Exception Class (exceptions)" url="html/tut_exceptions.html#S1"/>
+<entry name="The Frame Class (irb)" url="html/irb.html#UD"/>
+<entry name="The Mutex Class (threads)" url="html/tut_threads.html#UE"/>
+<entry name="The Ruby Language (language)" url="html/language.html"/>
+<entry name="The Visitor Pattern (patterns)" url="html/lib_patterns.html#S1"/>
+<entry name="Thread" url="html/ref_c_thread.html"/>
+<entry name="Thread Variables (threads)" url="html/tut_threads.html#UC"/>
+<entry name="ThreadGroup" url="html/ref_c_threadgroup.html"/>
+<entry name="Threads and Exceptions (threads)" url="html/tut_threads.html#UD"/>
+<entry name="Threads and Processes (threads)" url="html/tut_threads.html"/>
+<entry name="throw (Kernel)" url="html/ref_m_kernel.html#Kernel.throw"/>
+<entry name="Tidying Up (exceptions)" url="html/tut_exceptions.html#UA"/>
+<entry name="Time" url="html/ref_c_time.html"/>
+<entry name="times (Integer)" url="html/ref_c_integer.html#Integer.times"/>
+<entry name="times (Time)" url="html/ref_c_time.html#Time.times"/>
+<entry name="Tms" url="html/ref_c_struct__tms.html"/>
+<entry name="today (Date)" url="html/lib_standard.html#Date.today"/>
+<entry name="top (Net::POPMail)" url="html/lib_network.html#Net::POPMail.top"/>
+<entry name="Top-Level Execution Environment (classes)" url="html/classes.html#S3"/>
+<entry name="to_a (Array)" url="html/ref_c_array.html#Array.to_a"/>
+<entry name="to_a (Enumerable)" url="html/ref_m_enumerable.html#Enumerable.to_a"/>
+<entry name="to_a (Hash)" url="html/ref_c_hash.html#Hash.to_a"/>
+<entry name="to_a (MatchData)" url="html/ref_c_matchdata.html#MatchData.to_a"/>
+<entry name="to_a (NilClass)" url="html/ref_c_nilclass.html#NilClass.to_a"/>
+<entry name="to_a (Object)" url="html/ref_c_object.html#Object.to_a"/>
+<entry name="to_a (Struct)" url="html/ref_c_struct.html#Struct.to_a"/>
+<entry name="to_a (Time)" url="html/ref_c_time.html#Time.to_a"/>
+<entry name="to_ary (Array)" url="html/ref_c_array.html#Array.to_ary"/>
+<entry name="to_f (Bignum)" url="html/ref_c_bignum.html#Bignum.to_f"/>
+<entry name="to_f (Complex)" url="html/lib_standard.html#Complex.to_f"/>
+<entry name="to_f (Fixnum)" url="html/ref_c_fixnum.html#Fixnum.to_f"/>
+<entry name="to_f (Float)" url="html/ref_c_float.html#Float.to_f"/>
+<entry name="to_f (String)" url="html/ref_c_string.html#String.to_f"/>
+<entry name="to_f (Time)" url="html/ref_c_time.html#Time.to_f"/>
+<entry name="to_i (Bignum)" url="html/ref_c_bignum.html#Bignum.to_i"/>
+<entry name="to_i (Complex)" url="html/lib_standard.html#Complex.to_i"/>
+<entry name="to_i (Fixnum)" url="html/ref_c_fixnum.html#Fixnum.to_i"/>
+<entry name="to_i (Float)" url="html/ref_c_float.html#Float.to_i"/>
+<entry name="to_i (IO)" url="html/ref_c_io.html#IO.to_i"/>
+<entry name="to_i (NilClass)" url="html/ref_c_nilclass.html#NilClass.to_i"/>
+<entry name="to_i (String)" url="html/ref_c_string.html#String.to_i"/>
+<entry name="to_i (Symbol)" url="html/ref_c_symbol.html#Symbol.to_i"/>
+<entry name="to_i (Time)" url="html/ref_c_time.html#Time.to_i"/>
+<entry name="to_io (IO)" url="html/ref_c_io.html#IO.to_io"/>
+<entry name="to_proc (Method)" url="html/ref_c_method.html#Method.to_proc"/>
+<entry name="to_r (Complex)" url="html/lib_standard.html#Complex.to_r"/>
+<entry name="to_s (Array)" url="html/ref_c_array.html#Array.to_s"/>
+<entry name="to_s (Bignum)" url="html/ref_c_bignum.html#Bignum.to_s"/>
+<entry name="to_s (Complex)" url="html/lib_standard.html#Complex.to_s"/>
+<entry name="to_s (Date)" url="html/lib_standard.html#Date.to_s"/>
+<entry name="to_s (Fixnum)" url="html/ref_c_fixnum.html#Fixnum.to_s"/>
+<entry name="to_s (Float)" url="html/ref_c_float.html#Float.to_s"/>
+<entry name="to_s (Hash)" url="html/ref_c_hash.html#Hash.to_s"/>
+<entry name="to_s (MatchData)" url="html/ref_c_matchdata.html#MatchData.to_s"/>
+<entry name="to_s (NilClass)" url="html/ref_c_nilclass.html#NilClass.to_s"/>
+<entry name="to_s (Object)" url="html/ref_c_object.html#Object.to_s"/>
+<entry name="to_s (String)" url="html/ref_c_string.html#String.to_s"/>
+<entry name="to_s (Symbol)" url="html/ref_c_symbol.html#Symbol.to_s"/>
+<entry name="to_s (Time)" url="html/ref_c_time.html#Time.to_s"/>
+<entry name="to_str (String)" url="html/ref_c_string.html#String.to_str"/>
+<entry name="tr (String)" url="html/ref_c_string.html#String.tr"/>
+<entry name="tr! (String)" url="html/ref_c_string.html#String.tr_oh"/>
+<entry name="trace_var (Kernel)" url="html/ref_m_kernel.html#Kernel.trace_var"/>
+<entry name="Tracing Your Program's Execution (ospace)" url="html/ospace.html#S5"/>
+<entry name="transaction (PStore)" url="html/lib_standard.html#PStore.transaction"/>
+<entry name="Translating from Perl/Tk Documentation (tk)" url="html/ext_tk.html#S6"/>
+<entry name="trap (Kernel)" url="html/ref_m_kernel.html#Kernel.trap"/>
+<entry name="TrueClass" url="html/ref_c_trueclass.html"/>
+<entry name="truncate (File)" url="html/ref_c_file.html#File.truncate"/>
+<entry name="try_lock (Mutex)" url="html/lib_standard.html#Mutex.try_lock"/>
+<entry name="tr_s (String)" url="html/ref_c_string.html#String.tr_s"/>
+<entry name="tr_s! (String)" url="html/ref_c_string.html#String.tr_s_oh"/>
+<entry name="tty? (IO)" url="html/ref_c_io.html#IO.tty_qm"/>
+<entry name="tv_sec (Time)" url="html/ref_c_time.html#Time.tv_sec"/>
+<entry name="tv_usec (Time)" url="html/ref_c_time.html#Time.tv_usec"/>
+<entry name="type (Object)" url="html/ref_c_object.html#Object.type"/>
+<entry name="uid (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.uid"/>
+<entry name="uid (Process)" url="html/ref_m_process.html#Process.uid"/>
+<entry name="uid= (Process)" url="html/ref_m_process.html#Process.uid_eq"/>
+<entry name="uidl (Net::POPMail)" url="html/lib_network.html#Net::POPMail.uidl"/>
+<entry name="umask (File)" url="html/ref_c_file.html#File.umask"/>
+<entry name="undefine_finalizer (ObjectSpace)" url="html/ref_m_objectspace.html#ObjectSpace.undefine_finalizer"/>
+<entry name="undef_method (Module)" url="html/ref_c_module.html#Module.undef_method"/>
+<entry name="unescape (CGI)" url="html/lib_network.html#CGI.unescape"/>
+<entry name="unescapeElement (CGI)" url="html/lib_network.html#CGI.unescapeElement"/>
+<entry name="unescapeHTML (CGI)" url="html/lib_network.html#CGI.unescapeHTML"/>
+<entry name="ungetc (IO)" url="html/ref_c_io.html#IO.ungetc"/>
+<entry name="uniq (Array)" url="html/ref_c_array.html#Array.uniq"/>
+<entry name="uniq! (Array)" url="html/ref_c_array.html#Array.uniq_oh"/>
+<entry name="unlink (Dir)" url="html/ref_c_dir.html#Dir.unlink"/>
+<entry name="unlink (File)" url="html/ref_c_file.html#File.unlink"/>
+<entry name="unlock (Mutex)" url="html/lib_standard.html#Mutex.unlock"/>
+<entry name="unpack (String)" url="html/ref_c_string.html#String.unpack"/>
+<entry name="unshift (Array)" url="html/ref_c_array.html#Array.unshift"/>
+<entry name="untaint (Object)" url="html/ref_c_object.html#Object.untaint"/>
+<entry name="untrace_var (Kernel)" url="html/ref_m_kernel.html#Kernel.untrace_var"/>
+<entry name="upcase (String)" url="html/ref_c_string.html#String.upcase"/>
+<entry name="upcase! (String)" url="html/ref_c_string.html#String.upcase_oh"/>
+<entry name="update (CGI::Session)" url="html/lib_network.html#CGI::Session.update"/>
+<entry name="update (Hash)" url="html/ref_c_hash.html#Hash.update"/>
+<entry name="upto (Date)" url="html/lib_standard.html#Date.upto"/>
+<entry name="upto (Integer)" url="html/ref_c_integer.html#Integer.upto"/>
+<entry name="upto (String)" url="html/ref_c_string.html#String.upto"/>
+<entry name="Use the Profiler (trouble)" url="html/trouble.html#UC"/>
+<entry name="usec (Time)" url="html/ref_c_time.html#Time.usec"/>
+<entry name="Usenet Newsgroup (support)" url="html/support.html#S3"/>
+<entry name="Using cgi.rb (web)" url="html/web.html#UA"/>
+<entry name="Using eruby (web)" url="html/web.html#UG"/>
+<entry name="Using rdtool (rdtool)" url="html/rdtool.html#S5"/>
+<entry name="utc (Time)" url="html/ref_c_time.html#Time.utc"/>
+<entry name="utc? (Time)" url="html/ref_c_time.html#Time.utc_qm"/>
+<entry name="utime (File)" url="html/ref_c_file.html#File.utime"/>
+<entry name="value (Thread)" url="html/ref_c_thread.html#Thread.value"/>
+<entry name="VALUE as a Pointer (ruby)" url="html/ext_ruby.html#UA"/>
+<entry name="VALUE as an Immediate Object (ruby)" url="html/ext_ruby.html#UB"/>
+<entry name="value? (Hash)" url="html/ref_c_hash.html#Hash.value_qm"/>
+<entry name="values (Hash)" url="html/ref_c_hash.html#Hash.values"/>
+<entry name="values (Struct)" url="html/ref_c_struct.html#Struct.values"/>
+<entry name="Variable References (tk)" url="html/ext_tk.html#UH"/>
+<entry name="Variable Scope and Loops (expressions)" url="html/tut_expressions.html#S7"/>
+<entry name="Variable-Length Argument Lists (methods)" url="html/tut_methods.html#UA"/>
+<entry name="Variable/Method Ambiguity (language)" url="html/language.html#UO"/>
+<entry name="Variables (classes)" url="html/tut_classes.html#S5"/>
+<entry name="Variables and Constants (language)" url="html/language.html#S4"/>
+<entry name="VERSION (WIN32OLE)" url="html/lib_windows.html#WIN32OLE.WIN32OLE::VERSION"/>
+<entry name="Virtual Attributes (classes)" url="html/tut_classes.html#UC"/>
+<entry name="wait (ConditionVariable)" url="html/lib_standard.html#ConditionVariable.wait"/>
+<entry name="wait (Process)" url="html/ref_m_process.html#Process.wait"/>
+<entry name="wait2 (Process)" url="html/ref_m_process.html#Process.wait2"/>
+<entry name="waitfor (Net::Telnet)" url="html/lib_network.html#Net::Telnet.waitfor"/>
+<entry name="waitpid (Process)" url="html/ref_m_process.html#Process.waitpid"/>
+<entry name="waitpid2 (Process)" url="html/ref_m_process.html#Process.waitpid2"/>
+<entry name="wakeup (Thread)" url="html/ref_c_thread.html#Thread.wakeup"/>
+<entry name="wday (Time)" url="html/ref_c_time.html#Time.wday"/>
+<entry name="weakref_alive? (WeakRef)" url="html/lib_standard.html#WeakRef.weakref_alive_qm"/>
+<entry name="Web Sites (support)" url="html/support.html#S1"/>
+<entry name="welcome (Net::FTP)" url="html/lib_network.html#Net::FTP.welcome"/>
+<entry name="What Is an IO Object? (io)" url="html/tut_io.html#S1"/>
+<entry name="What Kind of Language Is Ruby? (preface)" url="html/preface.html#S2"/>
+<entry name="When Trouble Strikes (trouble)" url="html/trouble.html"/>
+<entry name="Where Ruby Finds Its Modules (rubyworld)" url="html/rubyworld.html#S4"/>
+<entry name="Why Did We Write This Book? (preface)" url="html/preface.html#S4"/>
+<entry name="Widgets (tk)" url="html/ext_tk.html#S2"/>
+<entry name="Win32API (win32)" url="html/win32.html#S3"/>
+<entry name="Windows Automation (win32)" url="html/win32.html#S4"/>
+<entry name="WNOHANG (Process)" url="html/ref_m_process.html#Process.WNOHANG"/>
+<entry name="Working with Strings (stdtypes)" url="html/tut_stdtypes.html#UA"/>
+<entry name="Wrapping C Structures (ruby)" url="html/ext_ruby.html#UE"/>
+<entry name="Writable Attributes (classes)" url="html/tut_classes.html#UB"/>
+<entry name="writable? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.writable_qm"/>
+<entry name="writable? (FileTest)" url="html/ref_m_filetest.html#FileTest.writable_qm"/>
+<entry name="writable_real? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.writable_real_qm"/>
+<entry name="writable_real? (FileTest)" url="html/ref_m_filetest.html#FileTest.writable_real_qm"/>
+<entry name="write (IO)" url="html/ref_c_io.html#IO.write"/>
+<entry name="write (Net::Telnet)" url="html/lib_network.html#Net::Telnet.write"/>
+<entry name="Writing CGI Scripts (web)" url="html/web.html#S1"/>
+<entry name="Writing Ruby in C (ruby)" url="html/ext_ruby.html#S2"/>
+<entry name="Writing to Environment Variables (rubyworld)" url="html/rubyworld.html#UC"/>
+<entry name="Writing to Files (io)" url="html/tut_io.html#UB"/>
+<entry name="WUNTRACED (Process)" url="html/ref_m_process.html#Process.WUNTRACED"/>
+<entry name="xmp (irb)" url="html/irb.html#UC"/>
+<entry name="yday (Time)" url="html/ref_c_time.html#Time.yday"/>
+<entry name="year (Time)" url="html/ref_c_time.html#Time.year"/>
+<entry name="Your Basic, Everyday Object (classes)" url="html/classes.html#UA"/>
+<entry name="zero? (File::Stat)" url="html/ref_c_file__stat.html#File::Stat.zero_qm"/>
+<entry name="zero? (FileTest)" url="html/ref_m_filetest.html#FileTest.zero_qm"/>
+<entry name="zero? (Numeric)" url="html/ref_c_numeric.html#Numeric.zero_qm"/>
+<entry name="zone (Time)" url="html/ref_c_time.html#Time.zone"/>
+<entry name="[] (Array)" url="html/ref_c_array.html#Array._ob_cb"/>
+<entry name="[] (Bignum)" url="html/ref_c_bignum.html#Bignum._ob_cb"/>
+<entry name="[] (CGI)" url="html/lib_network.html#CGI._ob_cb"/>
+<entry name="[] (CGI::Session)" url="html/lib_network.html#CGI::Session._ob_cb"/>
+<entry name="[] (Dir)" url="html/ref_c_dir.html#Dir._ob_cb"/>
+<entry name="[] (Fixnum)" url="html/ref_c_fixnum.html#Fixnum._ob_cb"/>
+<entry name="[] (Hash)" url="html/ref_c_hash.html#Hash._ob_cb"/>
+<entry name="[] (MatchData)" url="html/ref_c_matchdata.html#MatchData._ob_cb"/>
+<entry name="[] (Method)" url="html/ref_c_method.html#Method._ob_cb"/>
+<entry name="[] (Net::HTTPResponse)" url="html/lib_network.html#Net::HTTPResponse._ob_cb"/>
+<entry name="[] (Proc)" url="html/ref_c_proc.html#Proc._ob_cb"/>
+<entry name="[] (PStore)" url="html/lib_standard.html#PStore._ob_cb"/>
+<entry name="[] (String)" url="html/ref_c_string.html#String._ob_cb"/>
+<entry name="[] (Struct)" url="html/ref_c_struct.html#Struct._ob_cb"/>
+<entry name="[] (Thread)" url="html/ref_c_thread.html#Thread._ob_cb"/>
+<entry name="[] (WIN32OLE)" url="html/lib_windows.html#WIN32OLE._ob_cb"/>
+<entry name="[]= (Array)" url="html/ref_c_array.html#Array._ob_cb_eq"/>
+<entry name="[]= (CGI::Session)" url="html/lib_network.html#CGI::Session._ob_cb_eq"/>
+<entry name="[]= (Hash)" url="html/ref_c_hash.html#Hash._ob_cb_eq"/>
+<entry name="[]= (Net::HTTPResponse)" url="html/lib_network.html#Net::HTTPResponse._ob_cb_eq"/>
+<entry name="[]= (PStore)" url="html/lib_standard.html#PStore._ob_cb_eq"/>
+<entry name="[]= (String)" url="html/ref_c_string.html#String._ob_cb_eq"/>
+<entry name="[]= (Struct)" url="html/ref_c_struct.html#Struct._ob_cb_eq"/>
+<entry name="[]= (Thread)" url="html/ref_c_thread.html#Thread._ob_cb_eq"/>
+<entry name="[]= (WIN32OLE)" url="html/lib_windows.html#WIN32OLE._ob_cb_eq"/>
+<entry name="^ (FalseClass)" url="html/ref_c_falseclass.html#FalseClass._up"/>
+<entry name="^ (NilClass)" url="html/ref_c_nilclass.html#NilClass._up"/>
+<entry name="^ (TrueClass)" url="html/ref_c_trueclass.html#TrueClass._up"/>
+<entry name="_id2ref (ObjectSpace)" url="html/ref_m_objectspace.html#ObjectSpace._id2ref"/>
+<entry name="__id__ (Object)" url="html/ref_c_object.html#Object.__id__"/>
+<entry name="__send__ (Object)" url="html/ref_c_object.html#Object.__send__"/>
+<entry name="` (backquote) (Kernel)" url="html/ref_m_kernel.html#Kernel._bq"/>
+<entry name="` (Kernel)" url="html/ref_m_kernel.html#Kernel._bq"/>
+<entry name="| (Array)" url="html/ref_c_array.html#Array._ba"/>
+<entry name="| (FalseClass)" url="html/ref_c_falseclass.html#FalseClass._ba"/>
+<entry name="| (NilClass)" url="html/ref_c_nilclass.html#NilClass._ba"/>
+<entry name="| (TrueClass)" url="html/ref_c_trueclass.html#TrueClass._ba"/>
+<entry name="~ (Regexp)" url="html/ref_c_regexp.html#Regexp._sd"/>
+<entry name="~ (String)" url="html/ref_c_string.html#String._sd"/>
+</index>
+</kdeveloptoc>
+
diff --git a/languages/ruby/doc/ruby_bugs.toc b/languages/ruby/doc/ruby_bugs.toc
new file mode 100644
index 00000000..8e70566d
--- /dev/null
+++ b/languages/ruby/doc/ruby_bugs.toc
@@ -0,0 +1,7 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>Ruby bugs</title>
+<base href="http://www.rubyforge.org/"/>
+<tocsect1 name="Query" url="tracker/?atid=1698&amp;group_id=426&amp;func=browse">
+</tocsect1>
+</kdeveloptoc>
diff --git a/languages/ruby/file_templates/Makefile.am b/languages/ruby/file_templates/Makefile.am
new file mode 100644
index 00000000..7b449085
--- /dev/null
+++ b/languages/ruby/file_templates/Makefile.am
@@ -0,0 +1,5 @@
+templatedir = $(kde_datadir)/kdevfilecreate/file-templates
+template_DATA = rb rhtml rxml rjs js css html.erb xml.builder js.rjs
+
+
+
diff --git a/languages/ruby/file_templates/css b/languages/ruby/file_templates/css
new file mode 100644
index 00000000..23b3f500
--- /dev/null
+++ b/languages/ruby/file_templates/css
@@ -0,0 +1,11 @@
+//
+// C++ Implementation: $MODULE$
+//
+// Description:
+//
+//
+// Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
diff --git a/languages/ruby/file_templates/html.erb b/languages/ruby/file_templates/html.erb
new file mode 100644
index 00000000..43b3830e
--- /dev/null
+++ b/languages/ruby/file_templates/html.erb
@@ -0,0 +1,4 @@
+<!-- Copyright (C) $YEAR$ by $AUTHOR$ -->
+<!-- <$EMAIL$> -->
+
+<!-- Copyright: See COPYING file that comes with this distribution -->
diff --git a/languages/ruby/file_templates/js b/languages/ruby/file_templates/js
new file mode 100644
index 00000000..23b3f500
--- /dev/null
+++ b/languages/ruby/file_templates/js
@@ -0,0 +1,11 @@
+//
+// C++ Implementation: $MODULE$
+//
+// Description:
+//
+//
+// Author: $AUTHOR$ <$EMAIL$>, (C) $YEAR$
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
diff --git a/languages/ruby/file_templates/js.rjs b/languages/ruby/file_templates/js.rjs
new file mode 100644
index 00000000..64192c64
--- /dev/null
+++ b/languages/ruby/file_templates/js.rjs
@@ -0,0 +1,7 @@
+###########################################################################
+# Copyright (C) $YEAR$ by $AUTHOR$
+# <$EMAIL$>
+#
+# Copyright: See COPYING file that comes with this distribution
+#
+###########################################################################
diff --git a/languages/ruby/file_templates/rb b/languages/ruby/file_templates/rb
new file mode 100644
index 00000000..64192c64
--- /dev/null
+++ b/languages/ruby/file_templates/rb
@@ -0,0 +1,7 @@
+###########################################################################
+# Copyright (C) $YEAR$ by $AUTHOR$
+# <$EMAIL$>
+#
+# Copyright: See COPYING file that comes with this distribution
+#
+###########################################################################
diff --git a/languages/ruby/file_templates/rhtml b/languages/ruby/file_templates/rhtml
new file mode 100644
index 00000000..43b3830e
--- /dev/null
+++ b/languages/ruby/file_templates/rhtml
@@ -0,0 +1,4 @@
+<!-- Copyright (C) $YEAR$ by $AUTHOR$ -->
+<!-- <$EMAIL$> -->
+
+<!-- Copyright: See COPYING file that comes with this distribution -->
diff --git a/languages/ruby/file_templates/rjs b/languages/ruby/file_templates/rjs
new file mode 100644
index 00000000..64192c64
--- /dev/null
+++ b/languages/ruby/file_templates/rjs
@@ -0,0 +1,7 @@
+###########################################################################
+# Copyright (C) $YEAR$ by $AUTHOR$
+# <$EMAIL$>
+#
+# Copyright: See COPYING file that comes with this distribution
+#
+###########################################################################
diff --git a/languages/ruby/file_templates/rxml b/languages/ruby/file_templates/rxml
new file mode 100644
index 00000000..64192c64
--- /dev/null
+++ b/languages/ruby/file_templates/rxml
@@ -0,0 +1,7 @@
+###########################################################################
+# Copyright (C) $YEAR$ by $AUTHOR$
+# <$EMAIL$>
+#
+# Copyright: See COPYING file that comes with this distribution
+#
+###########################################################################
diff --git a/languages/ruby/file_templates/xml.builder b/languages/ruby/file_templates/xml.builder
new file mode 100644
index 00000000..64192c64
--- /dev/null
+++ b/languages/ruby/file_templates/xml.builder
@@ -0,0 +1,7 @@
+###########################################################################
+# Copyright (C) $YEAR$ by $AUTHOR$
+# <$EMAIL$>
+#
+# Copyright: See COPYING file that comes with this distribution
+#
+###########################################################################
diff --git a/languages/ruby/kdevrubysupport.desktop b/languages/ruby/kdevrubysupport.desktop
new file mode 100644
index 00000000..f3e8f67d
--- /dev/null
+++ b/languages/ruby/kdevrubysupport.desktop
@@ -0,0 +1,84 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Comment=Ruby Support
+Comment[ca]=Suport per a Ruby
+Comment[da]=Ruby-understøttelse
+Comment[de]=Ruby-Unterstützung für KDevelop
+Comment[el]=Υποστήριξη Ruby
+Comment[es]=Soporte para Ruby
+Comment[et]=Ruby toetus
+Comment[eu]=Ruby euskarria
+Comment[fa]=پشتیبانی رابی
+Comment[fr]=Prise en charge du langage Ruby
+Comment[ga]=Tacaíocht Ruby
+Comment[gl]=Soporte para Ruby
+Comment[hi]=रूबी समर्थन
+Comment[hu]=Ruby-támogatás
+Comment[is]=Ruby stuðningur
+Comment[it]=Supporto per Ruby
+Comment[ja]=Ruby サポート
+Comment[nds]=Ünnerstütten för Ruby
+Comment[ne]=रूबि समर्थन
+Comment[nl]=Ondersteuning voor Ruby
+Comment[pl]=Obsługa: Ruby
+Comment[pt]=Suporte a Ruby
+Comment[pt_BR]=Suporte ao Ruby
+Comment[ru]=Поддержка языка Ruby
+Comment[sk]=Ruby podpora
+Comment[sl]=Podpora za Ruby
+Comment[sr]=Подршка за Ruby
+Comment[sr@Latn]=Podrška za Ruby
+Comment[sv]=Ruby-stöd
+Comment[ta]=ருபி ஆதரவு
+Comment[tg]=Ёрӣ намудани забони Ruby
+Comment[tr]=Ruby Desteği
+Comment[zh_CN]=Ruby 支持
+Comment[zh_TW]=Ruby 支援
+Name=KDevRubySupport
+Name[da]=KDevelop Ruby-understøttelse
+Name[de]=Unterstützung für Ruby (KDevelop)
+Name[hi]=के-डेव-रूबी-समर्थन
+Name[nds]=Ünnerstütten för Ruby (KDevelop)
+Name[pl]=KDevObsługaRuby
+Name[sk]=KDev Ruby podpora
+Name[sv]=KDevelop Ruby-stöd
+Name[ta]=கெடெவ் ருபி ஆதரவு
+Name[zh_TW]=KDevelop Ruby 支援
+GenericName=Ruby Support
+GenericName[ca]=Suport per a Ruby
+GenericName[da]=Ruby-understøttelse
+GenericName[de]=Unterstützung für Ruby
+GenericName[el]=Υποστήριξη Ruby
+GenericName[es]=Soporte para Ruby
+GenericName[et]=Ruby toetus
+GenericName[eu]=Ruby euskarria
+GenericName[fa]=پشتیبانی رابی
+GenericName[fr]=Prise en charge du langage Ruby
+GenericName[ga]=Tacaíocht Ruby
+GenericName[gl]=Soporte para Ruby
+GenericName[hi]=रूबी समर्थन
+GenericName[hu]=Ruby-támogatás
+GenericName[it]=Supporto a Ruby
+GenericName[ja]=Ruby サポート
+GenericName[nds]=Ünnerstütten för Ruby
+GenericName[ne]=रूबि समर्थन
+GenericName[nl]=Ondersteuning voor Ruby
+GenericName[pl]=Obsługa: Ruby
+GenericName[pt]=Suporte a Ruby
+GenericName[pt_BR]=Suporte ao Ruby
+GenericName[ru]=Поддержка языка Ruby
+GenericName[sk]=Ruby podpora
+GenericName[sl]=Podpora za Ruby
+GenericName[sr]=Подршка за Ruby
+GenericName[sr@Latn]=Podrška za Ruby
+GenericName[sv]=Ruby-stöd
+GenericName[ta]=ருபி ஆதரவு
+GenericName[tg]=Ёрӣ намудани забони Ruby
+GenericName[tr]=Ruby Desteği
+GenericName[zh_CN]=Ruby 支持
+GenericName[zh_TW]=Ruby 支援
+ServiceTypes=KDevelop/LanguageSupport
+X-KDE-Library=libkdevrubysupport
+X-KDevelop-Version=5
+X-KDevelop-Language=Ruby
diff --git a/languages/ruby/kdevrubysupport.rc b/languages/ruby/kdevrubysupport.rc
new file mode 100644
index 00000000..b9269aa2
--- /dev/null
+++ b/languages/ruby/kdevrubysupport.rc
@@ -0,0 +1,20 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="KDevRubySupport" version="4">
+<MenuBar>
+ <Menu name="build" >
+ <Action name="build_execute" />
+ <Action name="build_execute_test_function" />
+ <Action name="build_launch_browser" />
+ </Menu>
+ <Menu name="tools" >
+ <Action name="switch_to_controller" group="tools_language_operations" />
+ <Action name="switch_to_model" group="tools_language_operations" />
+ <Action name="switch_to_view" group="tools_language_operations" />
+ <Action name="switch_to_test" group="tools_language_operations" />
+ </Menu>
+</MenuBar>
+<ToolBar name="buildToolBar">
+ <Action name="build_execute" group="build_operations" />
+ <Action name="build_launch_browser" group="build_operations" />
+</ToolBar>
+</kpartgui>
diff --git a/languages/ruby/play_run.psd b/languages/ruby/play_run.psd
new file mode 100644
index 00000000..f5a8e301
--- /dev/null
+++ b/languages/ruby/play_run.psd
Binary files differ
diff --git a/languages/ruby/qtdesignerrubyintegration.cpp b/languages/ruby/qtdesignerrubyintegration.cpp
new file mode 100644
index 00000000..8a89d0d4
--- /dev/null
+++ b/languages/ruby/qtdesignerrubyintegration.cpp
@@ -0,0 +1,93 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Alexander Dymo *
+ * Portions Copyright (C) 2003 Roberto Raggi ([email protected]) *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+#include "qtdesignerrubyintegration.h"
+
+#include <qpair.h>
+#include <qregexp.h>
+
+#include <klocale.h>
+#include <kdebug.h>
+#include <kmessagebox.h>
+#include <kurl.h>
+#include <ktexteditor/editinterface.h>
+#include <ktexteditor/view.h>
+#include <ktexteditor/viewcursorinterface.h>
+
+#include <domutil.h>
+#include <kdevpartcontroller.h>
+#include <kdevcreatefile.h>
+#include <kdevlanguagesupport.h>
+
+#include "codemodel_utils.h"
+#include "implementationwidget.h"
+
+QtDesignerRubyIntegration::QtDesignerRubyIntegration(KDevLanguageSupport *part,
+ ImplementationWidget *impl)
+ :QtDesignerIntegration(part, impl, false, 0)
+{
+}
+
+void QtDesignerRubyIntegration::addFunctionToClass(KInterfaceDesigner::Function function, ClassDom klass)
+{
+ m_part->partController()->editDocument( KURL( klass->fileName() ) );
+ KTextEditor::EditInterface* editIface = dynamic_cast<KTextEditor::EditInterface*>( m_part->partController()->activePart() );
+ if( !editIface ){
+ /// @todo show messagebox
+// QDialog::accept();
+ return;
+ }
+
+ kdDebug() << "===============" << endl;
+
+ int line, column;
+ klass->getStartPosition( &line, &column );
+
+ // compute the insertion point
+ QPair<int,int> point;
+ point.first = line + 1;
+ point.second = column;
+
+ const FunctionList functionList = klass->functionList();
+ if (functionList.count() > 0)
+ {
+ int funEndLine, funEndColumn;
+ functionList.first()->getEndPosition(&funEndLine, &funEndColumn);
+ point.second = funEndColumn;
+ }
+
+ QString str = function.function;
+ str += "\n \n end\n\n";
+ str = " def " + str;
+
+ kdDebug() << "insert " << str << " into " << point.first << endl;
+
+ editIface->insertText(point.first, 0 /*pt.second*/, str );
+
+ KTextEditor::View *activeView = dynamic_cast<KTextEditor::View*>( m_part->partController()->activePart()->widget() );
+ if (activeView)
+ {
+ KTextEditor::ViewCursorInterface* cursor = dynamic_cast<KTextEditor::ViewCursorInterface*>(activeView );
+ if (cursor)
+ cursor->setCursorPositionReal(point.first, 4);
+ }
+}
+
+#include "qtdesignerrubyintegration.moc"
diff --git a/languages/ruby/qtdesignerrubyintegration.h b/languages/ruby/qtdesignerrubyintegration.h
new file mode 100644
index 00000000..3f539286
--- /dev/null
+++ b/languages/ruby/qtdesignerrubyintegration.h
@@ -0,0 +1,35 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Alexander Dymo *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+#ifndef QTDESIGNERRUBYINTEGRATION_H
+#define QTDESIGNERRUBYINTEGRATION_H
+
+#include <qtdesignerintegration.h>
+
+class QtDesignerRubyIntegration : public QtDesignerIntegration
+{
+Q_OBJECT
+public:
+ QtDesignerRubyIntegration(KDevLanguageSupport *part, ImplementationWidget *impl);
+
+protected:
+ void addFunctionToClass(KInterfaceDesigner::Function function, ClassDom klass);
+};
+
+#endif
diff --git a/languages/ruby/ruby_config.png b/languages/ruby/ruby_config.png
new file mode 100644
index 00000000..bf8ac762
--- /dev/null
+++ b/languages/ruby/ruby_config.png
Binary files differ
diff --git a/languages/ruby/ruby_config.psd b/languages/ruby/ruby_config.psd
new file mode 100644
index 00000000..ebeff7dd
--- /dev/null
+++ b/languages/ruby/ruby_config.psd
Binary files differ
diff --git a/languages/ruby/ruby_run.png b/languages/ruby/ruby_run.png
new file mode 100644
index 00000000..fc4aa983
--- /dev/null
+++ b/languages/ruby/ruby_run.png
Binary files differ
diff --git a/languages/ruby/rubyconfigwidget.cpp b/languages/ruby/rubyconfigwidget.cpp
new file mode 100644
index 00000000..d0ffc5b4
--- /dev/null
+++ b/languages/ruby/rubyconfigwidget.cpp
@@ -0,0 +1,53 @@
+
+#include "rubyconfigwidget.h"
+#include "domutil.h"
+
+#include <stdlib.h>
+
+#include <klineedit.h>
+#include <qcheckbox.h>
+#include <qbuttongroup.h>
+#include <kurlrequester.h>
+#include <kurlcompletion.h>
+#include <kdebug.h>
+
+RubyConfigWidget::RubyConfigWidget(QDomDocument &projectDom, QWidget* parent, const char* name)
+: RubyConfigWidgetBase(parent,name), dom (projectDom) {
+ kdDebug (9019) << "Creating RubyConfigWidget" << endl;
+ interpreterEdit->setText(DomUtil::readEntry(dom, "/kdevrubysupport/run/interpreter"));
+ if (interpreterEdit->text().isEmpty()) {
+ interpreterEdit->setText("ruby");
+ }
+ shellEdit->setText(DomUtil::readEntry(dom, "/kdevrubysupport/run/shell"));
+ if (shellEdit->text().isEmpty()) {
+ shellEdit->setText("irb");
+ }
+ mainProgramEdit->setText(DomUtil::readEntry(dom, "/kdevrubysupport/run/mainprogram"));
+ programArgsEdit->setText(DomUtil::readEntry(dom, "/kdevrubysupport/run/programargs"));
+ runRadioBox->setButton(DomUtil::readIntEntry(dom, "/kdevrubysupport/run/runmainprogram"));
+ terminalCheckbox->setChecked(DomUtil::readBoolEntry(dom, "/kdevrubysupport/run/terminal"));
+ characterCodingRadioBox->setButton(DomUtil::readIntEntry(dom, "/kdevrubysupport/run/charactercoding"));
+ enableFloatingToolBarBox->setChecked( DomUtil::readBoolEntry(dom, "/kdevrbdebugger/general/floatingtoolbar", false));
+ showConstants->setChecked( DomUtil::readBoolEntry(dom, "/kdevrbdebugger/general/showconstants", false));
+ traceIntoRuby->setChecked( DomUtil::readBoolEntry(dom, "/kdevrbdebugger/general/traceintoruby", false));
+ workingDir->completionObject()->setMode(KURLCompletion::DirCompletion);
+ workingDir->setMode( KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly );
+ workingDir->setURL(DomUtil::readEntry(dom, "/kdevscriptproject/run/globalcwd", "") );
+}
+
+void RubyConfigWidget::accept() {
+ DomUtil::writeEntry(dom, "/kdevrubysupport/run/interpreter", interpreterEdit->text());
+ DomUtil::writeEntry(dom, "/kdevrubysupport/run/shell", shellEdit->text());
+ DomUtil::writeEntry(dom, "/kdevrubysupport/run/mainprogram", mainProgramEdit->text());
+ DomUtil::writeEntry(dom, "/kdevrubysupport/run/programargs", programArgsEdit->text());
+ DomUtil::writeIntEntry(dom, "/kdevrubysupport/run/runmainprogram", runRadioBox->selectedId());
+ DomUtil::writeBoolEntry(dom, "/kdevrubysupport/run/terminal", terminalCheckbox->isChecked());
+ DomUtil::writeIntEntry(dom, "/kdevrubysupport/run/charactercoding", characterCodingRadioBox->selectedId());
+ DomUtil::writeBoolEntry(dom, "/kdevrbdebugger/general/floatingtoolbar", enableFloatingToolBarBox->isChecked());
+ DomUtil::writeBoolEntry(dom, "/kdevrbdebugger/general/showconstants", showConstants->isChecked());
+ DomUtil::writeBoolEntry(dom, "/kdevrbdebugger/general/traceintoruby", traceIntoRuby->isChecked());
+ DomUtil::writeEntry(dom, "/kdevscriptproject/run/globalcwd", workingDir->url() );
+}
+
+#include "rubyconfigwidget.moc"
+
diff --git a/languages/ruby/rubyconfigwidget.h b/languages/ruby/rubyconfigwidget.h
new file mode 100644
index 00000000..a4efa6f9
--- /dev/null
+++ b/languages/ruby/rubyconfigwidget.h
@@ -0,0 +1,27 @@
+
+#ifndef RUBYCONFIGWIDGET_H
+#define RUBYCONFIGWIDGET_H
+
+#include "rubyconfigwidgetbase.h"
+
+class QDomDocument;
+
+class RubyConfigWidget : public RubyConfigWidgetBase
+{
+ Q_OBJECT
+public:
+ RubyConfigWidget(QDomDocument &projectDom, QWidget* parent = 0, const char* name = 0);
+
+public slots:
+ void accept();
+
+protected:
+
+protected slots:
+
+private:
+ QDomDocument &dom;
+};
+
+#endif
+
diff --git a/languages/ruby/rubyconfigwidgetbase.ui b/languages/ruby/rubyconfigwidgetbase.ui
new file mode 100644
index 00000000..64ae3e1c
--- /dev/null
+++ b/languages/ruby/rubyconfigwidgetbase.ui
@@ -0,0 +1,363 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>RubyConfigWidgetBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>RubyConfigWidgetBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>485</width>
+ <height>582</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>programArgsEdit</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>mainProgramEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Ru&amp;by shell:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>mainProgramEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This is the path (or just name, if in $PATH) to the Ruby shell. Defaults to "irb". Add this line to your .irbrc file:
+def cd(dir) Dir.chdir dir end</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>interpreterEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel1_2_3_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Program &amp;arguments:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>programArgsEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>These are the arguments passed to the Ruby interpreter</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Ruby interpreter:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>interpreterEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This is the path (or just name, if in $PATH) to the Ruby interpreter. Defaults to "ruby"</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel1_2_3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Main program:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>programArgsEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This is the name of the main program source file</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>shellEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>textLabel1_3</cstring>
+ </property>
+ <property name="text">
+ <string>Working Directory:</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester" row="4" column="1">
+ <property name="name">
+ <cstring>workingDir</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>runRadioBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Run</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton" row="0" column="0">
+ <property name="name">
+ <cstring>mainProgramRadio</cstring>
+ </property>
+ <property name="text">
+ <string>Main pr&amp;ogram</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="1" column="0">
+ <property name="name">
+ <cstring>selectedWindowRadio</cstring>
+ </property>
+ <property name="text">
+ <string>Selected wi&amp;ndow</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>terminalCheckbox</cstring>
+ </property>
+ <property name="text">
+ <string>R&amp;un applications in terminal</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this if you want your applications to be opened in terminal window.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>enableFloatingToolBarBox</cstring>
+ </property>
+ <property name="text">
+ <string>Enable &amp;debugger floating toolbar</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this if you want to control the debugger via a floating toolbar.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>showConstants</cstring>
+ </property>
+ <property name="text">
+ <string>Show &amp;constants in the debugger</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this if you want the debugger to show constants (with many constants this may be slow).</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>traceIntoRuby</cstring>
+ </property>
+ <property name="text">
+ <string>Trace &amp;into Ruby libraries</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Trace through the Ruby code installed under sitedir in the debugger</string>
+ </property>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>characterCodingRadioBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Character Coding</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>asciiOption</cstring>
+ </property>
+ <property name="text">
+ <string>ASCII</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>0</number>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>eucOption</cstring>
+ </property>
+ <property name="text">
+ <string>EUC</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>sjisOption</cstring>
+ </property>
+ <property name="text">
+ <string>S&amp;JIS</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>utf8Option</cstring>
+ </property>
+ <property name="text">
+ <string>UTF-&amp;8</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>3</number>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<tabstops>
+ <tabstop>interpreterEdit</tabstop>
+ <tabstop>shellEdit</tabstop>
+ <tabstop>mainProgramEdit</tabstop>
+ <tabstop>programArgsEdit</tabstop>
+ <tabstop>mainProgramRadio</tabstop>
+ <tabstop>selectedWindowRadio</tabstop>
+ <tabstop>terminalCheckbox</tabstop>
+ <tabstop>enableFloatingToolBarBox</tabstop>
+ <tabstop>showConstants</tabstop>
+ <tabstop>traceIntoRuby</tabstop>
+ <tabstop>asciiOption</tabstop>
+ <tabstop>eucOption</tabstop>
+ <tabstop>sjisOption</tabstop>
+ <tabstop>utf8Option</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>klineedit.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/languages/ruby/rubyimplementationwidget.cpp b/languages/ruby/rubyimplementationwidget.cpp
new file mode 100644
index 00000000..b035a283
--- /dev/null
+++ b/languages/ruby/rubyimplementationwidget.cpp
@@ -0,0 +1,70 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Alexander Dymo *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+#include "rubyimplementationwidget.h"
+
+#include <qdir.h>
+#include <qfile.h>
+#include <qregexp.h>
+#include <qfileinfo.h>
+#include <qtextstream.h>
+
+#include <klineedit.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+
+#include <filetemplate.h>
+#include <kdevlanguagesupport.h>
+#include <kdevproject.h>
+
+RubyImplementationWidget::RubyImplementationWidget(KDevLanguageSupport* part,
+ QWidget* parent, const char* name, bool modal)
+ :ImplementationWidget(part, parent, name, modal)
+{
+}
+
+QStringList RubyImplementationWidget::createClassFiles()
+{
+ QString template_rb = "require '$BASEFILENAME$'\n\nclass $CLASSNAME$ < $BASECLASSNAME$\n\n def initialize(*k)\n super(*k)\n end\n\nend\n";
+
+ QFileInfo formInfo(m_formName);
+ template_rb.replace(QRegExp("\\$BASEFILENAME\\$"), formInfo.baseName()+".rb");
+ template_rb.replace(QRegExp("\\$CLASSNAME\\$"), classNameEdit->text());
+ template_rb.replace(QRegExp("\\$BASECLASSNAME\\$"), m_baseClassName);
+
+ template_rb = FileTemplate::read(m_part, "rb") + template_rb;
+
+ QString file_rb = fileNameEdit->text() + ".rb";
+ if (!m_part->project()->activeDirectory().isEmpty())
+ file_rb = m_part->project()->activeDirectory() + "/" + file_rb;
+ QFile file(QDir::cleanDirPath(m_part->project()->projectDirectory() + "/" + file_rb));
+ if (!file.open(IO_WriteOnly)) {
+ KMessageBox::error(0, i18n("Cannot write to file"));
+ return QStringList();
+ }
+ QTextStream stream(&file);
+ stream << template_rb;
+ file.close();
+
+ QStringList files;
+ files.append(file_rb);
+ return files;
+}
+
+#include "rubyimplementationwidget.moc"
diff --git a/languages/ruby/rubyimplementationwidget.h b/languages/ruby/rubyimplementationwidget.h
new file mode 100644
index 00000000..5f79741e
--- /dev/null
+++ b/languages/ruby/rubyimplementationwidget.h
@@ -0,0 +1,35 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Alexander Dymo *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+#ifndef RUBYIMPLEMENTATIONWIDGET_H
+#define RUBYIMPLEMENTATIONWIDGET_H
+
+#include <implementationwidget.h>
+
+class RubyImplementationWidget : public ImplementationWidget {
+Q_OBJECT
+public:
+ RubyImplementationWidget(KDevLanguageSupport* part, QWidget* parent = 0,
+ const char* name = 0, bool modal = true);
+
+ virtual QStringList createClassFiles();
+
+};
+
+#endif
diff --git a/languages/ruby/rubysupport_part.cpp b/languages/ruby/rubysupport_part.cpp
new file mode 100644
index 00000000..c116c05d
--- /dev/null
+++ b/languages/ruby/rubysupport_part.cpp
@@ -0,0 +1,908 @@
+#include "rubysupport_part.h"
+#include "rubyconfigwidget.h"
+#include "domutil.h"
+
+#include "qtdesignerrubyintegration.h"
+#include "rubyimplementationwidget.h"
+
+#include "kdevcore.h"
+#include "kdevmainwindow.h"
+#include "kdevlanguagesupport.h"
+#include "kdevpartcontroller.h"
+#include "kdevproject.h"
+#include "kdevappfrontend.h"
+#include "kdevplugininfo.h"
+#include "kdevshellwidget.h"
+#include "kdevquickopen.h"
+
+#include <qdir.h>
+#include <qwhatsthis.h>
+#include <qtimer.h>
+#include <qfileinfo.h>
+#include <qpopupmenu.h>
+#include <qregexp.h>
+
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kdevgenericfactory.h>
+#include <kprocess.h>
+#include <kdebug.h>
+#include <kaction.h>
+#include <kparts/part.h>
+#include <kdialogbase.h>
+#include <kapplication.h>
+#include <klibloader.h>
+
+#include <ktexteditor/viewcursorinterface.h>
+
+#include <codemodel_utils.h>
+
+typedef KDevGenericFactory<RubySupportPart> RubySupportFactory;
+static const KDevPluginInfo data("kdevrubysupport");
+K_EXPORT_COMPONENT_FACTORY( libkdevrubysupport, RubySupportFactory( data ) )
+
+RubySupportPart::RubySupportPart(QObject *parent, const char *name, const QStringList& )
+ : KDevLanguageSupport (&data, parent, name ? name : "RubySupportPart" )
+{
+ setInstance(RubySupportFactory::instance());
+ setXMLFile("kdevrubysupport.rc");
+
+ KAction *action;
+ action = new KAction( i18n("&Run"), "exec", SHIFT + Key_F9,
+ this, SLOT(slotRun()),
+ actionCollection(), "build_execute" );
+ action->setToolTip(i18n("Run"));
+ action->setWhatsThis(i18n("<b>Run</b><p>Starts an application."));
+ action->setIcon("ruby_run.png");
+
+ action = new KAction( i18n("Run Test Under Cursor"), "exec", ALT + Key_F9,
+ this, SLOT(slotRunTestUnderCursor()),
+ actionCollection(), "build_execute_test_function" );
+ action->setToolTip(i18n("Run Test Under Cursor"));
+ action->setWhatsThis(i18n("<b>Run Test Under Cursor</b><p>Runs the function under the cursor as test."));
+
+ action = new KAction( i18n("Launch Browser"), "network", 0, this, SLOT(slotBrowse()), actionCollection(), "build_launch_browser" );
+ action->setToolTip(i18n("Launch Browser"));
+ action->setWhatsThis(i18n("<b>Launch Browser</b><p>Opens a web browser pointing to the Ruby Rails server") );
+
+ action = new KAction( i18n("Switch To Controller"), 0, CTRL+ALT+Key_1, this, SLOT(slotSwitchToController()), actionCollection(), "switch_to_controller" );
+ action = new KAction( i18n("Switch To Model"), 0, CTRL+ALT+Key_2, this, SLOT(slotSwitchToModel()), actionCollection(), "switch_to_model" );
+ action = new KAction( i18n("Switch To View"), 0, CTRL+ALT+Key_3, this, SLOT(slotSwitchToView()), actionCollection(), "switch_to_view" );
+ action = new KAction( i18n("Switch To Test"), 0, CTRL+ALT+Key_4, this, SLOT(slotSwitchToTest()), actionCollection(), "switch_to_test" );
+
+ kdDebug() << "Creating RubySupportPart" << endl;
+
+ m_shellWidget = new KDevShellWidget( 0, "irb console");
+ m_shellWidget->setIcon( SmallIcon("ruby_config.png", KIcon::SizeMedium, KIcon::DefaultState, RubySupportPart::instance()));
+ m_shellWidget->setCaption(i18n("Ruby Shell"));
+ mainWindow()->embedOutputView( m_shellWidget, i18n("Ruby Shell"), i18n("Ruby Shell"));
+ mainWindow()->raiseView( m_shellWidget );
+
+ connect( core(), SIGNAL(projectOpened()), this, SLOT(projectOpened()) );
+ connect( core(), SIGNAL(projectClosed()), this, SLOT(projectClosed()) );
+ connect( core(), SIGNAL(contextMenu(QPopupMenu *, const Context *)),
+ this, SLOT(contextMenu(QPopupMenu *, const Context *)) );
+ connect( partController(), SIGNAL(savedFile(const KURL&)),
+ this, SLOT(savedFile(const KURL&)) );
+ connect( core(), SIGNAL(projectConfigWidget(KDialogBase*)),
+ this, SLOT(projectConfigWidget(KDialogBase*)) );
+}
+
+
+RubySupportPart::~RubySupportPart()
+{
+ if ( m_shellWidget )
+ mainWindow()->removeView( m_shellWidget );
+ delete m_shellWidget;
+}
+
+
+void RubySupportPart::projectConfigWidget(KDialogBase *dlg)
+{
+ QVBox *vbox = dlg->addVBoxPage(i18n("Ruby"), i18n("Ruby"), BarIcon("ruby_config.png", KIcon::SizeMedium, KIcon::DefaultState, RubySupportPart::instance()));
+ RubyConfigWidget *w = new RubyConfigWidget(*projectDom(), (QWidget *)vbox, "ruby config widget");
+ connect( dlg, SIGNAL(okClicked()), w, SLOT(accept()) );
+}
+
+void RubySupportPart::projectOpened()
+{
+ kdDebug() << "projectOpened()" << endl;
+
+ QStrList l;
+ l.append( shell().latin1() ) ;
+ m_shellWidget->setShell( shell().latin1(), l );
+ m_shellWidget->activate();
+ m_shellWidget->setAutoReactivateOnClose( true );
+
+ connect( project(), SIGNAL(addedFilesToProject(const QStringList &)),
+ this, SLOT(addedFilesToProject(const QStringList &)) );
+ connect( project(), SIGNAL(removedFilesFromProject(const QStringList &)),
+ this, SLOT(removedFilesFromProject(const QStringList &)) );
+
+ QFileInfo program(mainProgram());
+
+ // If it's a Rails project, create the project files if they're missing
+ if (mainProgram().endsWith("script/server")) {
+ QString cmd;
+ QFileInfo server(project()->projectDirectory() + "/script/server");
+ if (! server.exists()) {
+ cmd += "rails " + project()->projectDirectory();
+ if (KDevAppFrontend *appFrontend = extension<KDevAppFrontend>("KDevelop/AppFrontend"))
+ appFrontend->startAppCommand(project()->projectDirectory(), cmd, false);
+ }
+ }
+
+ // We want to parse only after all components have been
+ // properly initialized
+ QTimer::singleShot(0, this, SLOT(initialParse()));
+}
+
+void RubySupportPart::maybeParse(const QString fileName)
+{
+ QFileInfo fi(fileName);
+
+ if (fi.extension() == "rb") {
+ if (codeModel()->hasFile(fileName)) {
+ emit aboutToRemoveSourceInfo(fileName);
+ codeModel()->removeFile(codeModel()->fileByName(fileName));
+ }
+
+ parse(fileName);
+ emit addedSourceInfo( fileName );
+ }
+}
+
+void RubySupportPart::initialParse()
+{
+ kdDebug() << "initialParse()" << endl;
+
+ if (project()) {
+ kapp->setOverrideCursor(waitCursor);
+ QStringList files = project()->allFiles();
+ for (QStringList::Iterator it = files.begin(); it != files.end() ;++it) {
+ kdDebug() << "maybe parse " << project()->projectDirectory() + "/" + (*it) << endl;
+ maybeParse(project()->projectDirectory() + "/" + *it);
+ }
+
+ emit updatedSourceInfo();
+ kapp->restoreOverrideCursor();
+ } else {
+ kdDebug() << "No project" << endl;
+ }
+}
+
+void RubySupportPart::addedFilesToProject(const QStringList &fileList)
+{
+ kdDebug() << "addedFilesToProject()" << endl;
+
+ QStringList::ConstIterator it;
+
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ QString fileName = project()->projectDirectory() + "/" + ( *it );
+ maybeParse( fileName );
+ }
+}
+
+void RubySupportPart::removedFilesFromProject(const QStringList &fileList)
+{
+ kdDebug() << "removedFilesFromProject()" << endl;
+
+ QStringList::ConstIterator it;
+
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ QString fileName = project()->projectDirectory() + "/" + ( *it );
+
+ if( codeModel()->hasFile(fileName) ){
+ emit aboutToRemoveSourceInfo( fileName );
+ codeModel()->removeFile( codeModel()->fileByName(fileName) );
+ }
+ }
+}
+
+void RubySupportPart::savedFile(const KURL &fileName)
+{
+ kdDebug() << "savedFile()" << endl;
+
+ if (project()->allFiles().contains(fileName.path().mid ( project()->projectDirectory().length() + 1 ))) {
+ maybeParse(fileName.path());
+ emit addedSourceInfo( fileName.path() );
+ }
+}
+
+KDevLanguageSupport::Features RubySupportPart::features()
+{
+ return Features(Classes | Functions | Variables | Declarations | Signals | Slots);
+}
+
+void RubySupportPart::parse(const QString &fileName)
+{
+ QFile f(QFile::encodeName(fileName));
+ if (!f.open(IO_ReadOnly))
+ return;
+ QTextStream stream(&f);
+
+ QRegExp classre("^\\s*(class|module)\\s+([A-Z][A-Za-z0-9_]+::)*([A-Z][A-Za-z0-9_]+)\\s*(<\\s*([A-Z][A-Za-z0-9_:]+))?$");
+ QRegExp methodre("^(\\s*)def\\s+(([A-Z][A-Za-z0-9_:]+|self)\\.)?([A-Za-z0-9_]+[!?=]?|\\[\\]=?|\\*\\*||\\-|[!~+*/%&|><^]|>>|<<||<=>|<=|>=|==|===|!=|=~|!~).*$");
+ QRegExp accessre("^\\s*(private|protected|public)\\s*((:([A-Za-z0-9_]+[!?=]?|\\[\\]=?|\\*\\*||\\-|[!~+*/%&|><^]|>>|<<||<=>|<=|>=|==|===|!=|=~|!~),?\\s*)*)$");
+ QRegExp attr_accessorre("^\\s*(attr_accessor|attr_reader|attr_writer)\\s*((:([A-Za-z0-9_]+),?\\s*)*)$");
+ QRegExp symbolre(":([^,]+),?");
+ QRegExp line_contre(",\\s*$");
+ QRegExp slot_signalre("^\\s*(slots|signals|k_dcop|k_dcop_signals)\\s*(('[^)]+\\)',?\\s*)*)$");
+ QRegExp memberre("'([A-Za-z0-9_ &*]+\\s)?([A-Za-z0-9_]+)\\([^)]*\\)',?");
+ QRegExp begin_commentre("^*=begin");
+ QRegExp end_commentre("^*=end");
+ QRegExp variablere("(@@?[A-Za-z0-9_]+)\\s*=\\s*((?:([A-Za-z0-9_:.]+)\\.new)|[\\[\"'%:/\\?\\{]|%r|<<|true|false|^\\?|0[0-7]+|[-+]?0b[01]+|[-+]?0x[1-9a-fA-F]+|[-+]?[0-9_\\.e]+|nil)?");
+ QRegExp endre("^(\\s*)end\\s*$");
+
+ FileDom m_file = codeModel()->create<FileModel>();
+ m_file->setName(fileName);
+
+ ClassDom lastClass;
+ FunctionDom lastMethod;
+ QString lastMethodIndentation;
+ int lastAccess = CodeModelItem::Public;
+ QString rawline;
+ QCString line;
+ int lineNo = 0;
+
+ while (!stream.atEnd()) {
+ rawline = stream.readLine();
+ line = rawline.stripWhiteSpace().local8Bit();
+ if (classre.search(line) != -1) {
+ if (m_file->hasClass(classre.cap(3))) {
+ lastClass = m_file->classByName( classre.cap(3) )[ 0 ];
+ } else {
+ lastClass = codeModel()->create<ClassModel>();
+ lastClass->setName(classre.cap(3));
+ lastClass->setFileName( fileName );
+ lastClass->setStartPosition( lineNo, 0 );
+ m_file->addClass( lastClass );
+ }
+
+ QString parent = classre.cap(5);
+ if (!parent.isEmpty())
+ {
+ kdDebug() << "Add parent " << parent << endl;
+ lastClass->addBaseClass( parent );
+ }
+
+ lastAccess = CodeModelItem::Public;
+ } else if (methodre.search(line) != -1) {
+ FunctionDom methodDecl;
+ if ( lastClass != 0 && lastClass->hasFunction( methodre.cap(4) ) ) {
+ FunctionList methods = lastClass->functionByName( methodre.cap(4) );
+ methodDecl = methods[0];
+ } else {
+ methodDecl = codeModel()->create<FunctionModel>();
+ methodDecl->setFileName( fileName );
+ methodDecl->setStartPosition( lineNo, 0 );
+ methodDecl->setName(methodre.cap(4));
+ }
+ FunctionDefinitionDom method = codeModel()->create<FunctionDefinitionModel>();
+ method->setName(methodre.cap(4));
+ kdDebug() << "Add method: " << method->name() << endl;
+ method->setFileName( fileName );
+ method->setStartPosition( lineNo, 0 );
+ if (methodDecl->name() == "initialize") {
+ // Ruby constructors are alway private
+ methodDecl->setAccess( CodeModelItem::Private );
+ } else {
+ methodDecl->setAccess( lastAccess );
+ }
+ if (methodre.cap(2) != "") {
+ // A ruby class/singleton method of the form <classname>.<methodname>
+ methodDecl->setStatic( true );
+ }
+
+ lastMethodIndentation = methodre.cap(1);
+
+ lastMethod = method;
+
+ if (lastClass != 0) {
+ QStringList scope( lastClass->name() );
+ method->setScope( scope );
+ methodDecl->setScope( scope );
+ if( !lastClass->hasFunction(methodDecl->name()) ) {
+ lastClass->addFunction( methodDecl );
+ }
+ if( !lastClass->hasFunctionDefinition(method->name()) ) {
+ lastClass->addFunctionDefinition( method );
+ }
+ } else if( !m_file->hasFunctionDefinition(method->name()) ){
+ m_file->addFunction( methodDecl );
+ m_file->addFunctionDefinition( method );
+ lastClass = 0;
+ }
+ } else if (endre.search(line) != -1 && lastMethod != 0 && endre.cap(1) == lastMethodIndentation ) {
+ int endCol, endLine;
+ lastMethod->getEndPosition(&endCol, &endLine);
+ if (endLine == 0) {
+ //hack to set end position of the previous method to the line
+ //where its corresponding "end" is found
+ //there's an assumption that method's "def" statement will have the same
+ //indentation level as method's "end"
+ lastMethod->setEndPosition(lineNo, 0);
+ }
+ }
+ else if (accessre.search(line) != -1 && lastClass != 0) {
+ int currentAccess = lastAccess;
+ if (accessre.cap(1) == "public") {
+ currentAccess = CodeModelItem::Public;
+ } else if (accessre.cap(1) == "protected") {
+ currentAccess = CodeModelItem::Protected;
+ } else if (accessre.cap(1) == "private") {
+ currentAccess = CodeModelItem::Private;
+ }
+
+ if (accessre.cap(2) == "") {
+ lastAccess = currentAccess;
+ } else {
+ QString symbolList( accessre.cap(2) );
+ int pos = 0;
+
+ while ( pos >= 0 ) {
+ pos = symbolre.search( symbolList, pos );
+ if (pos == -1) {
+ if (line_contre.search(line) != -1) {
+ rawline = stream.readLine();
+ if (!stream.atEnd()) {
+ line = rawline.stripWhiteSpace().local8Bit();
+ ++lineNo;
+ symbolList = line;
+ pos = 0;
+ }
+ }
+ } else {
+ if ( lastClass->hasFunction( symbolre.cap(1) ) ) {
+ FunctionList methods = lastClass->functionByName( symbolre.cap(1) );
+ methods[0]->setAccess( currentAccess );
+ }
+ pos += symbolre.matchedLength();
+ }
+ }
+ }
+ } else if (slot_signalre.search(line) != -1 && lastClass != 0) {
+ QString memberList( slot_signalre.cap(2) );
+ int pos = 0;
+
+ while ( pos >= 0 ) {
+ pos = memberre.search( memberList, pos );
+ if (pos == -1) {
+ if (line_contre.search(line) != -1) {
+ rawline = stream.readLine();
+ if (!stream.atEnd()) {
+ line = rawline.stripWhiteSpace().local8Bit();
+ ++lineNo;
+ memberList = line;
+ pos = 0;
+ }
+ }
+ } else {
+ FunctionDom method;
+ if ( lastClass->hasFunction( memberre.cap(2) ) ) {
+ FunctionList methods = lastClass->functionByName( memberre.cap(2) );
+ method = methods[0];
+ } else {
+ method = codeModel()->create<FunctionModel>();
+ }
+ QStringList scope( lastClass->name() );
+ method->setScope( scope );
+ method->setName(memberre.cap(2));
+ method->setFileName( fileName );
+ method->setStartPosition( lineNo, 0 );
+
+ if (slot_signalre.cap(1) == "slots" || slot_signalre.cap(1) == "k_dcop") {
+ method->setSlot( true );
+ } else {
+ method->setSignal( true );
+ }
+ if ( !lastClass->hasFunction(method->name()) ) {
+ lastClass->addFunction( method );
+ }
+ pos += memberre.matchedLength();
+ }
+ }
+ } else if (attr_accessorre.search(line) != -1 && lastClass != 0) {
+ QString attr( attr_accessorre.cap(1) );
+ QString symbolList( attr_accessorre.cap(2) );
+ int pos = 0;
+
+ while ( pos >= 0 ) {
+ pos = symbolre.search( symbolList, pos );
+ if (pos == -1) {
+ if (line_contre.search(line) != -1) {
+ rawline = stream.readLine();
+ if (!stream.atEnd()) {
+ line = rawline.stripWhiteSpace().local8Bit();
+ ++lineNo;
+ symbolList = line;
+ pos = 0;
+ }
+ }
+ } else {
+ QStringList scope( lastClass->name() );
+ if ( !lastClass->hasFunction(symbolre.cap(1))
+ && (attr == "attr_accessor" || attr == "attr_reader") )
+ {
+ FunctionDefinitionDom method = codeModel()->create<FunctionDefinitionModel>();
+ method->setName(symbolre.cap(1));
+ kdDebug() << "Add method: " << method->name() << endl;
+ method->setFileName( fileName );
+ method->setStartPosition( lineNo, 0 );
+ method->setScope(scope);
+ lastClass->addFunction( model_cast<FunctionDom>(method) );
+ lastClass->addFunctionDefinition( method );
+ }
+
+ if ( !lastClass->hasFunction(symbolre.cap(1) + "=")
+ && (attr == "attr_accessor" || attr == "attr_writer") )
+ {
+ FunctionDefinitionDom method = codeModel()->create<FunctionDefinitionModel>();
+ method->setName(symbolre.cap(1) + "=");
+ kdDebug() << "Add method: " << method->name() << endl;
+ method->setFileName( fileName );
+ method->setStartPosition( lineNo, 0 );
+ method->setScope(scope);
+ lastClass->addFunction( model_cast<FunctionDom>(method) );
+ lastClass->addFunctionDefinition( method );
+ }
+
+ pos += symbolre.matchedLength();
+ }
+ }
+ } else if (variablere.search(line) != -1 && lastClass != 0) {
+ VariableDom attr;
+ if ( lastClass->hasVariable( variablere.cap(1) ) ) {
+ attr = lastClass->variableByName( variablere.cap(1) );
+ } else {
+ attr = codeModel()->create<VariableModel>();
+ attr->setName( variablere.cap(1) );
+ attr->setFileName( fileName );
+ attr->setStartPosition( lineNo, 0 );
+ attr->setAccess( CodeModelItem::Private );
+ if (QRegExp("^@@").search(attr->name()) != -1) {
+ attr->setStatic( true );
+ }
+ lastClass->addVariable( attr );
+ }
+
+ // Give priority to any variable initialized in the constructor
+ // Otherwise, take the first one found in the source file
+ if (lastMethod != 0 && lastMethod->name() == "initialize") {
+ attr->setFileName( fileName );
+ attr->setStartPosition( lineNo, 0 );
+ }
+
+ if (QRegExp("^(/|%r)").search(variablere.cap(2)) != -1) {
+ attr->setType( "Regexp" );
+ } else if (QRegExp("^[\"'%<]").search(variablere.cap(2)) != -1) {
+ attr->setType( "String" );
+ } else if (QRegExp("^\\[").search(variablere.cap(2)) != -1) {
+ attr->setType( "Array" );
+ } else if (QRegExp("^\\{").search(variablere.cap(2)) != -1) {
+ attr->setType( "Hash" );
+ } else if (QRegExp("^:").search(variablere.cap(2)) != -1) {
+ attr->setType( "Symbol" );
+ } else if (QRegExp("\\.\\.").search(variablere.cap(2)) != -1) {
+ attr->setType( "Range" );
+ } else if (variablere.cap(2) == "true" || variablere.cap(2) == "false") {
+ attr->setType( "Boolean" );
+ } else if ( QRegExp("^[-+]?[0-9_]+").exactMatch(variablere.cap(2))
+ || QRegExp("^[-+]?(0x|0|0b|\\?)").search(variablere.cap(2)) != -1 )
+ {
+ attr->setType( "Integer" );
+ } else if (QRegExp("[0-9._]+(e[-+0-9]+)?").exactMatch(variablere.cap(2))) {
+ attr->setType( "Float" );
+ } else if (variablere.cap(2) != "nil" && variablere.cap(3) != "") {
+ attr->setType( variablere.cap(3) );
+ }
+ } else if (begin_commentre.search(line) != -1) {
+ while (!stream.atEnd() && end_commentre.search(line) == -1) {
+ rawline = stream.readLine();
+ line = rawline.stripWhiteSpace().local8Bit();
+ ++lineNo;
+ }
+ }
+
+ ++lineNo;
+ }
+
+ f.close();
+
+ codeModel()->addFile( m_file );
+}
+
+
+void RubySupportPart::slotRun ()
+{
+ // if we can't save all parts, then the user canceled
+ if ( partController()->saveAllFiles() == false )
+ return;
+ QFileInfo program(mainProgram());
+ if (mainProgram().endsWith("script/server")) {
+ QString cmd;
+ QFileInfo server(project()->projectDirectory() + "/script/server");
+
+ // Starting WEBrick for a Rails app. Translate a SIGTERM signal sent by KDevelop
+ // to a SIGINT expected by WEBrick (ie control&c) to terminate it.
+ cmd += "script/server& \n trap \"kill -s SIGINT $!\" TERM \n wait \n exit 0";
+ if (KDevAppFrontend *appFrontend = extension<KDevAppFrontend>("KDevelop/AppFrontend"))
+ appFrontend->startAppCommand(project()->projectDirectory(), cmd, false);
+ } else {
+ QString cmd = QString("%1 -K%2 -C\"%3\" -I\"%4\" \"%5\" %6")
+ .arg(interpreter())
+ .arg(characterCoding())
+ .arg(runDirectory())
+ .arg(program.dirPath())
+ .arg(program.fileName())
+ .arg(programArgs());
+ startApplication(cmd);
+ }
+}
+
+QString RubySupportPart::interpreter() {
+ QString prog = DomUtil::readEntry(*projectDom(), "/kdevrubysupport/run/interpreter");
+ if (prog.isEmpty()) prog = "ruby";
+ return prog;
+}
+
+QString RubySupportPart::shell() {
+ QString shell = DomUtil::readEntry(*projectDom(), "/kdevrubysupport/run/shell");
+ if (shell.isEmpty()) shell = "irb";
+ return shell;
+}
+
+QString RubySupportPart::mainProgram() {
+ QString prog;
+ int runMainProgram = DomUtil::readIntEntry(*projectDom(), "/kdevrubysupport/run/runmainprogram");
+
+ if (runMainProgram == 0) {
+ prog = project()->projectDirectory() + "/" + DomUtil::readEntry(*projectDom(), "/kdevrubysupport/run/mainprogram");
+ } else {
+ KParts::ReadOnlyPart *ro_part = dynamic_cast<KParts::ReadOnlyPart*>(partController()->activePart());
+ if (ro_part != 0) {
+ prog = ro_part->url().path();
+ }
+ }
+
+ return prog;
+}
+
+QString RubySupportPart::runDirectory() {
+ QString cwd = DomUtil::readEntry(*projectDom(), "/kdevscriptproject/run/globalcwd");
+ if (cwd.isEmpty())
+ {
+ QString mainProg = DomUtil::readEntry(*projectDom(), "/kdevrubysupport/run/mainprogram");
+ KParts::ReadOnlyPart *ro_part = dynamic_cast<KParts::ReadOnlyPart*>(partController()->activePart());
+ if (mainProg.isEmpty() && ro_part)
+ cwd = ro_part->url().directory();
+ else
+ cwd = project()->buildDirectory();
+ }
+ return cwd;
+}
+
+QString RubySupportPart::programArgs() {
+ QString args = DomUtil::readEntry(*projectDom(), "/kdevrubysupport/run/programargs");
+ return args;
+}
+
+QString RubySupportPart::characterCoding() {
+ int coding = DomUtil::readIntEntry(*projectDom(), "/kdevrubysupport/run/charactercoding");
+ QString code("A");
+
+ switch (coding) {
+ case 0:
+ code = "A";
+ break;
+ case 1:
+ code = "E";
+ break;
+ case 2:
+ code = "S";
+ break;
+ case 3:
+ code = "U";
+ break;
+ }
+ return code;
+}
+
+
+void RubySupportPart::startApplication(const QString &program) {
+ bool inTerminal = DomUtil::readBoolEntry(*projectDom(), "/kdevrubysupport/run/terminal");
+ if (KDevAppFrontend *appFrontend = extension<KDevAppFrontend>("KDevelop/AppFrontend"))
+ appFrontend->startAppCommand(QString::QString(), program, inTerminal);
+}
+
+
+KMimeType::List RubySupportPart::mimeTypes( )
+{
+ KMimeType::List list;
+ KMimeType::Ptr mime = KMimeType::mimeType( "text/x-ruby" );
+ if( mime )
+ list << mime;
+ return list;
+}
+
+KDevDesignerIntegration *RubySupportPart::designer(KInterfaceDesigner::DesignerType type)
+{
+ KDevDesignerIntegration *des = 0;
+ switch (type)
+ {
+ case KInterfaceDesigner::QtDesigner:
+ des = m_designers[type];
+ if (des == 0)
+ {
+ RubyImplementationWidget *impl = new RubyImplementationWidget(this);
+ des = new QtDesignerRubyIntegration(this, impl);
+ des->loadSettings(*project()->projectDom(),
+ "kdevrubysupport/designerintegration");
+ m_designers[type] = des;
+ }
+ break;
+ case KInterfaceDesigner::Glade:
+ break;
+ }
+ return des;
+}
+
+void RubySupportPart::projectClosed( )
+{
+ for (QMap<KInterfaceDesigner::DesignerType, KDevDesignerIntegration*>::const_iterator it = m_designers.begin();
+ it != m_designers.end(); ++it)
+ {
+ kdDebug() << "calling save settings fro designer integration" << endl;
+ it.data()->saveSettings(*project()->projectDom(), "kdevrubysupport/designerintegration");
+ }
+}
+
+void RubySupportPart::contextMenu( QPopupMenu * popup, const Context * context )
+{
+ if (context->hasType(Context::FileContext)){
+ const FileContext *fc = static_cast<const FileContext*>(context);
+ //this is a .ui file and only selection contains only one such file
+ KURL url = fc->urls().first();
+ if (url.fileName().endsWith(".ui"))
+ {
+ m_contextFileName = url.fileName();
+ int id = popup->insertItem(i18n("Create or Select Implementation..."), this, SLOT(slotCreateSubclass()));
+ popup->setWhatsThis(id, i18n("<b>Create or select implementation</b><p>Creates or selects a subclass of selected form for use with integrated KDevDesigner."));
+ }
+ }
+}
+
+void RubySupportPart::slotCreateSubclass()
+{
+ QFileInfo fi(m_contextFileName);
+ if (fi.extension(false) != "ui")
+ return;
+ QtDesignerRubyIntegration *des = dynamic_cast<QtDesignerRubyIntegration*>(designer(KInterfaceDesigner::QtDesigner));
+ if (des)
+ des->selectImplementation(m_contextFileName);
+}
+
+void RubySupportPart::slotBrowse()
+{
+ kapp->invokeBrowser("http://localhost:3000/");
+}
+
+void RubySupportPart::slotSwitchToController()
+{
+ KParts::Part *activePart = partController()->activePart();
+ if (!activePart)
+ return;
+ KParts::ReadOnlyPart *ropart = dynamic_cast<KParts::ReadOnlyPart*>(activePart);
+ if (!ropart)
+ return;
+ QFileInfo file(ropart->url().path());
+ if (!file.exists())
+ return;
+ QString ext = file.extension();
+ QString name = file.baseName();
+ QString switchTo = "";
+ if ((ext == "rb") && !name.endsWith("_controller"))
+ {
+ if (name.endsWith("_test"))
+ {
+ switchTo = name.remove(QRegExp("_test$")); //the file is the test
+ switchTo = name.remove(QRegExp("_controller$")); //remove functional test name parts
+ }
+ else
+ switchTo = name;
+ }
+ else if (ext == "rjs" || ext == "rxml" || ext == "rhtml" || ext == "js.rjs" || ext == "xml.builder" || ext == "html.erb")
+ {
+ //this is a view, we need to find the directory of this view and try to find
+ //the controller basing on the directory information
+ switchTo = file.dir().dirName();
+ }
+ QString controllersDir = project()->projectDirectory() + "/app/controllers/";
+ if (!switchTo.isEmpty())
+ {
+ if (switchTo.endsWith("s"))
+ switchTo = switchTo.mid(0, switchTo.length()-1);
+ QString singular = controllersDir + switchTo + "_controller.rb";
+ QString plural = controllersDir + switchTo + "s_controller.rb";
+ KURL url = KURL::fromPathOrURL(QFile::exists(singular) ? singular : plural);
+ partController()->editDocument(url);
+ }
+}
+
+void RubySupportPart::slotSwitchToTest()
+{
+ KParts::Part *activePart = partController()->activePart();
+ if (!activePart)
+ return;
+ KParts::ReadOnlyPart *ropart = dynamic_cast<KParts::ReadOnlyPart*>(activePart);
+ if (!ropart)
+ return;
+ QFileInfo file(ropart->url().path());
+ if (!file.exists())
+ return;
+ QString ext = file.extension();
+ QString name = file.baseName();
+ QString switchTo = "";
+
+ if (ext == "rjs" || ext == "rxml" || ext == "rhtml" || ext == "js.rjs" || ext == "xml.builder" || ext == "html.erb")
+ {
+ //this is a view already, let's show the list of all views for this model
+ switchTo = file.dir().dirName();
+ }
+ else if (ext == "rb")
+ switchTo = name.remove(QRegExp("_controller$")).remove(QRegExp("_controller_test$")).remove(QRegExp("_test$"));
+
+ if (switchTo.isEmpty())
+ return;
+
+ if (switchTo.endsWith("s"))
+ switchTo = switchTo.mid(0, switchTo.length() - 1);
+
+ KURL::List urls;
+ QString testDir = project()->projectDirectory() + "/test/";
+ QString functionalTestS = testDir + "functional/" + switchTo + "_controller_test.rb";
+ QString functionalTestP = testDir + "functional/" + switchTo + "s_controller_test.rb";
+ QString integrationTestS = testDir + "integration/" + switchTo + "_test.rb";
+ QString integrationTestP = testDir + "integration/" + switchTo + "s_test.rb";
+ QString unitTestS = testDir + "unit/" + switchTo + "_test.rb";
+ QString unitTestP = testDir + "unit/" + switchTo + "s_test.rb";
+ if (QFile::exists(functionalTestP)) urls << KURL::fromPathOrURL(functionalTestP);
+ if (QFile::exists(integrationTestP)) urls << KURL::fromPathOrURL(integrationTestP);
+ if (QFile::exists(unitTestP)) urls << KURL::fromPathOrURL(unitTestP);
+ if (QFile::exists(functionalTestS)) urls << KURL::fromPathOrURL(functionalTestS);
+ if (QFile::exists(integrationTestS)) urls << KURL::fromPathOrURL(integrationTestS);
+ if (QFile::exists(unitTestS)) urls << KURL::fromPathOrURL(unitTestS);
+
+ KDevQuickOpen *qo = extension<KDevQuickOpen>("KDevelop/QuickOpen");
+ if (qo && !urls.isEmpty())
+ qo->quickOpenFile(urls);
+}
+
+void RubySupportPart::slotSwitchToModel()
+{
+ KParts::Part *activePart = partController()->activePart();
+ if (!activePart)
+ return;
+ KParts::ReadOnlyPart *ropart = dynamic_cast<KParts::ReadOnlyPart*>(activePart);
+ if (!ropart)
+ return;
+ QFileInfo file(ropart->url().path());
+ if (!file.exists())
+ return;
+ QString ext = file.extension();
+ QString name = file.baseName();
+ QString switchTo = "";
+
+ if (ext == "rjs" || ext == "rxml" || ext == "rhtml" || ext == "js.rjs" || ext == "xml.builder" || ext == "html.erb")
+ {
+ //this is a view already, let's show the list of all views for this model
+ switchTo = file.dir().dirName();
+ }
+ else if (ext == "rb" && (name.endsWith("_controller") || name.endsWith("_test")))
+ {
+ switchTo = name.remove(QRegExp("_controller$")).remove(QRegExp("_controller_test$")).remove(QRegExp("_test$"));
+ }
+
+ if (switchTo.isEmpty())
+ return;
+
+ if (switchTo.endsWith("s"))
+ switchTo = switchTo.mid(0, switchTo.length() - 1);
+
+ QString modelsDir = project()->projectDirectory() + "/app/models/";
+ QString singular = modelsDir + switchTo + "_controller.rb";
+ QString plural = modelsDir + switchTo + "s_controller.rb";
+ KURL url = KURL::fromPathOrURL(QFile::exists(singular) ? singular : plural);
+
+ partController()->editDocument(KURL::fromPathOrURL(modelsDir + switchTo + ".rb"));
+}
+
+void RubySupportPart::slotSwitchToView()
+{
+ KParts::Part *activePart = partController()->activePart();
+ if (!activePart)
+ return;
+ KParts::ReadOnlyPart *ropart = dynamic_cast<KParts::ReadOnlyPart*>(activePart);
+ if (!ropart)
+ return;
+ QFileInfo file(ropart->url().path());
+ if (!file.exists())
+ return;
+ QString ext = file.extension();
+ QString name = file.baseName();
+ QString switchTo = "";
+
+ if (ext == "rjs" || ext == "rxml" || ext == "rhtml" || ext == "js.rjs" || ext == "xml.builder" || ext == "html.erb")
+ {
+ //this is a view already, let's show the list of all views for this model
+ switchTo = file.dir().dirName();
+ }
+ else if (ext == "rb")
+ switchTo = name.remove(QRegExp("_controller$")).remove(QRegExp("_controller_test$")).remove(QRegExp("_test$"));
+
+ if (switchTo.isEmpty())
+ return;
+
+ if (switchTo.endsWith("s"))
+ switchTo = switchTo.mid(0, switchTo.length() - 1);
+
+ KURL::List urls;
+ QDir viewsDir;
+ QDir viewsDirS = QDir(project()->projectDirectory() + "/app/views/" + switchTo);
+ QDir viewsDirP = QDir(project()->projectDirectory() + "/app/views/" + switchTo + "s");
+ if (viewsDirS.exists())
+ viewsDir = viewsDirS;
+ else if (viewsDirP.exists())
+ viewsDir = viewsDirP;
+ else
+ return;
+
+ QStringList views = viewsDir.entryList();
+
+ for (QStringList::const_iterator it = views.begin(); it != views.end(); ++it)
+ {
+ QString viewName = *it;
+ if ( !(viewName.endsWith("~") || viewName == "." || viewName == "..") )
+ urls << KURL::fromPathOrURL(viewsDir.absPath() + "/" + viewName);
+ }
+ KDevQuickOpen *qo = extension<KDevQuickOpen>("KDevelop/QuickOpen");
+ if (qo)
+ qo->quickOpenFile(urls);
+}
+
+void RubySupportPart::slotRunTestUnderCursor()
+{
+ // if we can't save all parts, then the user canceled
+ if ( partController()->saveAllFiles() == false )
+ return;
+
+ KParts::ReadOnlyPart *ro_part = dynamic_cast<KParts::ReadOnlyPart*>(partController()->activePart());
+ QString prog;
+ if (ro_part != 0) {
+ prog = ro_part->url().path();
+ } else
+ return;
+
+ KTextEditor::ViewCursorInterface* activeViewCursor = dynamic_cast<KTextEditor::ViewCursorInterface*>( ro_part->widget() );
+ if (!activeViewCursor) return;
+
+ unsigned int line, column;
+ activeViewCursor->cursorPositionReal(&line, &column);
+ CodeModelUtils::CodeModelHelper hlp(codeModel(), codeModel()->fileByName(prog));
+ FunctionDom fun = hlp.functionAt(line, column);
+ if (fun == 0) return;
+
+ QFileInfo program(prog);
+ QString cmd = QString("%1 -K%2 -C\"%3\" -I\"%4\" \"%5\" %6")
+ .arg(interpreter())
+ .arg(characterCoding())
+ .arg(runDirectory())
+ .arg(program.dirPath())
+ .arg(program.fileName())
+ .arg(" -n " + fun->name());
+ startApplication(cmd);
+}
+
+#include "rubysupport_part.moc"
diff --git a/languages/ruby/rubysupport_part.h b/languages/ruby/rubysupport_part.h
new file mode 100644
index 00000000..0d420cff
--- /dev/null
+++ b/languages/ruby/rubysupport_part.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2003 Marek Janukowicz <[email protected]>
+ */
+
+
+#ifndef __KDEVPART_RUBYSUPPORT_H__
+#define __KDEVPART_RUBYSUPPORT_H__
+
+#include <qguardedptr.h>
+
+#include "kdevlanguagesupport.h"
+
+class KDialogBase;
+class QPopupMenu;
+class Context;
+class KDevShellWidget;
+
+class RubySupportPart : public KDevLanguageSupport
+{
+ Q_OBJECT
+
+public:
+
+ RubySupportPart(QObject *parent, const char *name, const QStringList &);
+ virtual ~RubySupportPart();
+
+ virtual KDevDesignerIntegration *designer(KInterfaceDesigner::DesignerType type);
+
+protected:
+ virtual Features features();
+ virtual KMimeType::List mimeTypes();
+
+private slots:
+ void projectConfigWidget(KDialogBase *dlg);
+ void projectOpened();
+ void projectClosed();
+ void savedFile(const KURL &fileName);
+ void addedFilesToProject(const QStringList &fileList);
+ void removedFilesFromProject(const QStringList &fileList);
+ void slotRun();
+ void slotRunTestUnderCursor();
+ void slotCreateSubclass();
+ void contextMenu(QPopupMenu *popup, const Context *context);
+ void slotBrowse();
+
+ void initialParse();
+
+ void slotSwitchToController();
+ void slotSwitchToView();
+ void slotSwitchToModel();
+ void slotSwitchToTest();
+
+private:
+ void startApplication(const QString &program);
+ QString interpreter();
+ QString shell();
+ QString mainProgram();
+ QString runDirectory();
+ QString programArgs();
+ QString characterCoding();
+
+ void maybeParse(const QString fileName);
+ void parse(const QString &fileName);
+
+ QMap<KInterfaceDesigner::DesignerType, KDevDesignerIntegration*> m_designers;
+
+ QString m_contextFileName;
+ QCString m_shell;
+
+ QGuardedPtr<KDevShellWidget> m_shellWidget;
+};
+
+
+#endif
diff --git a/languages/ruby/rubytemplates b/languages/ruby/rubytemplates
new file mode 100644
index 00000000..00135842
--- /dev/null
+++ b/languages/ruby/rubytemplates
@@ -0,0 +1,101 @@
+<!DOCTYPE Templates>
+<Templates>
+ <Template code="if |
+else
+end" name="ife" description="if else" suffixes="Ruby (rb,rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)"/>
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;% | %>" name="e" description="embedded ruby code" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;% | -%>" name="en" description="embedded ruby code with newlines stripped" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;%- | -%>" name="enn" description="embedded ruby code with newlines stripped" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;%= | %>" name="pp" description="embedded ruby code that prints a result" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;%= | -%>" name="pn" description="embedded ruby code that prints a result with newlines stripped" />
+ <Template suffixes="Ruby (rb,rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="class |
+
+end" name="classd" description="class declaration" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;a&gt;|&lt;/a&gt;" name="a" description="a html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;abbr&gt;|&lt;/abbr&gt;" name="abbr" description="abbr html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;acronym&gt;|&lt;/acronym&gt;" name="acronym" description="acronym html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;address&gt;|&lt;/address&gt;" name="address" description="address html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;applet&gt;|&lt;/applet&gt;" name="applet" description="applet html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;area&gt;|&lt;/area&gt;" name="area" description="area html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;b&gt;|&lt;/b&gt;" name="b" description="b html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;base&gt;|&lt;/base&gt;" name="base" description="base html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;basefont&gt;|&lt;/basefont&gt;" name="basefont" description="basefont html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;bdo&gt;|&lt;/bdo&gt;" name="bdo" description="bdo html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;big&gt;|&lt;/big&gt;" name="big" description="big html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;blockquote&gt;|&lt;/blockquote&gt;" name="blockquote" description="blockquote html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;body&gt;|&lt;/body&gt;" name="body" description="body html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;br&gt;|&lt;/br&gt;" name="br" description="br html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;button&gt;|&lt;/button&gt;" name="button" description="button html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;caption&gt;|&lt;/caption&gt;" name="caption" description="caption html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;center&gt;|&lt;/center&gt;" name="center" description="center html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;cite&gt;|&lt;/cite&gt;" name="cite" description="cite html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;code&gt;|&lt;/code&gt;" name="code" description="code html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;col&gt;|&lt;/col&gt;" name="col" description="col html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;colgroup&gt;|&lt;/colgroup&gt;" name="colgroup" description="colgroup html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;dd&gt;|&lt;/dd&gt;" name="dd" description="dd html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;del&gt;|&lt;/del&gt;" name="del" description="del html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;dir&gt;|&lt;/dir&gt;" name="dir" description="dir html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;div&gt;|&lt;/div&gt;" name="div" description="div html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;dfn&gt;|&lt;/dfn&gt;" name="dfn" description="dfn html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;dl&gt;|&lt;/dl&gt;" name="dl" description="dl html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;dt&gt;|&lt;/dt&gt;" name="dt" description="dt html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;em&gt;|&lt;/em&gt;" name="em" description="em html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;fieldset&gt;|&lt;/fieldset&gt;" name="fieldset" description="fieldset html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;font&gt;|&lt;/font&gt;" name="font" description="font html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;form&gt;|&lt;/form&gt;" name="form" description="form html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;frame&gt;|&lt;/frame&gt;" name="frame" description="frame html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;frameset&gt;|&lt;/frameset&gt;" name="frameset" description="frameset html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;h1&gt;|&lt;/h1&gt;" name="h1" description="h1 html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;head&gt;|&lt;/head&gt;" name="head" description="head html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;hr&gt;|&lt;/hr&gt;" name="hr" description="hr html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;html&gt;|&lt;/html&gt;" name="html" description="html html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;i&gt;|&lt;/i&gt;" name="i" description="i html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;iframe&gt;|&lt;/iframe&gt;" name="iframe" description="iframe html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;img&gt;|&lt;/img&gt;" name="img" description="img html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;input&gt;|&lt;/input&gt;" name="input" description="input html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;ins&gt;|&lt;/ins&gt;" name="ins" description="ins html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;isindex&gt;|&lt;/isindex&gt;" name="isindex" description="isindex html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;kbd&gt;|&lt;/kbd&gt;" name="kbd" description="kbd html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;label&gt;|&lt;/label&gt;" name="label" description="label html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;legend&gt;|&lt;/legend&gt;" name="legend" description="legend html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;li&gt;|&lt;/li&gt;" name="li" description="li html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;link&gt;|&lt;/link&gt;" name="link" description="link html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;map&gt;|&lt;/map&gt;" name="map" description="map html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;menu&gt;|&lt;/menu&gt;" name="menu" description="menu html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;meta&gt;|&lt;/meta&gt;" name="meta" description="meta html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;noframes&gt;|&lt;/noframes&gt;" name="noframes" description="noframes html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;noscript&gt;|&lt;/noscript&gt;" name="noscript" description="noscript html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;object&gt;|&lt;/object&gt;" name="object" description="object html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;ol&gt;|&lt;/ol&gt;" name="ol" description="ol html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;optgroup&gt;|&lt;/optgroup&gt;" name="optgroup" description="optgroup html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;option&gt;|&lt;/option&gt;" name="option" description="option html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;p&gt;|&lt;/p&gt;" name="p" description="p html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;param&gt;|&lt;/param&gt;" name="param" description="param html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;pre&gt;|&lt;/pre&gt;" name="pre" description="pre html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;q&gt;|&lt;/q&gt;" name="q" description="q html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;s&gt;|&lt;/s&gt;" name="s" description="s html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;samp&gt;|&lt;/samp&gt;" name="samp" description="samp html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;script&gt;|&lt;/script&gt;" name="script" description="script html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;select&gt;|&lt;/select&gt;" name="select" description="select html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;small&gt;|&lt;/small&gt;" name="small" description="small html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;span&gt;|&lt;/span&gt;" name="span" description="span html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;strike&gt;|&lt;/strike&gt;" name="strike" description="strike html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;strong&gt;|&lt;/strong&gt;" name="strong" description="strong html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;style&gt;|&lt;/style&gt;" name="style" description="style html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;sub&gt;|&lt;/sub&gt;" name="sub" description="sub html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;sup&gt;|&lt;/sup&gt;" name="sup" description="sup html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;table&gt;|&lt;/table&gt;" name="table" description="table html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;tbody&gt;|&lt;/tbody&gt;" name="tbody" description="tbody html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;td&gt;|&lt;/td&gt;" name="td" description="td html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;textarea&gt;|&lt;/textarea&gt;" name="textarea" description="textarea html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;tfoot&gt;|&lt;/tfoot&gt;" name="tfoot" description="tfoot html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;th&gt;|&lt;/th&gt;" name="th" description="th html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;thead&gt;|&lt;/thead&gt;" name="thead" description="thead html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;title&gt;|&lt;/title&gt;" name="title" description="title html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;tr&gt;|&lt;/tr&gt;" name="tr" description="tr html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;tt&gt;|&lt;/tt&gt;" name="tt" description="tt html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;u&gt;|&lt;/u&gt;" name="u" description="u html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;ul&gt;|&lt;/ul&gt;" name="ul" description="ul html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;var&gt;|&lt;/var&gt;" name="var" description="var html tag" />
+ <Template suffixes="Ruby (rhtml,rjs,rxml,html.erb,js.rjs,xml.builder)" code="&lt;xmp&gt;|&lt;/xmp&gt;" name="xmp" description="xmp html tag" />
+</Templates>